mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Modified RAM for single-cycle latency
This commit is contained in:
parent
3c8eafc8ee
commit
5240bd1c90
@ -49,22 +49,24 @@ module ram #(parameter BASE=0, RANGE = 65535) (
|
|||||||
// 3. implement burst.
|
// 3. implement burst.
|
||||||
// 4. remove the configurable latency.
|
// 4. remove the configurable latency.
|
||||||
|
|
||||||
logic [`XLEN/8-1:0] ByteMaskM;
|
logic [`XLEN/8-1:0] ByteMask;
|
||||||
logic [31:0] HWADDR, A;
|
logic [31:0] HADDRD, RamAddr;
|
||||||
logic prevHREADYRam, risingHREADYRam;
|
//logic prevHREADYRam, risingHREADYRam;
|
||||||
logic initTrans;
|
logic initTrans;
|
||||||
logic memwrite;
|
logic memwrite, memwriteD;
|
||||||
logic [3:0] busycount;
|
logic nextHREADYRam;
|
||||||
|
//logic [3:0] busycount;
|
||||||
|
|
||||||
swbytemask swbytemask(.Size(HSIZED[1:0]), .Adr(HWADDR[2:0]), .ByteMask(ByteMaskM));
|
swbytemask swbytemask(.Size(HSIZED[1:0]), .Adr(HADDRD[2:0]), .ByteMask(ByteMask));
|
||||||
|
|
||||||
assign initTrans = HREADY & HSELRam & (HTRANS != 2'b00);
|
assign initTrans = HREADY & HSELRam & (HTRANS != 2'b00); // *** add burst support, or disable on busy
|
||||||
|
assign memwrite = initTrans & HWRITE;
|
||||||
|
|
||||||
// *** this seems like a weird way to use reset
|
// *** this seems like a weird way to use reset
|
||||||
flopenr #(1) memwritereg(HCLK, 1'b0, initTrans | ~HRESETn, HSELRam & HWRITE, memwrite);
|
flopen #(1) memwritereg(HCLK, initTrans | ~HRESETn, memwrite, memwriteD); // probably drop ~HRESETn in all this
|
||||||
flopenr #(32) haddrreg(HCLK, 1'b0, initTrans | ~HRESETn, HADDR, A);
|
flopen #(32) haddrreg(HCLK, initTrans | ~HRESETn, HADDR, HADDRD);
|
||||||
|
|
||||||
// busy FSM to extend READY signal
|
/* // busy FSM to extend READY signal
|
||||||
always @(posedge HCLK, negedge HRESETn)
|
always @(posedge HCLK, negedge HRESETn)
|
||||||
if (~HRESETn) begin
|
if (~HRESETn) begin
|
||||||
busycount <= 0;
|
busycount <= 0;
|
||||||
@ -80,48 +82,38 @@ module ram #(parameter BASE=0, RANGE = 65535) (
|
|||||||
busycount <= busycount + 1;
|
busycount <= busycount + 1;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end */
|
||||||
|
|
||||||
|
|
||||||
|
assign nextHREADYRam = ~(memwriteD & ~memwrite);
|
||||||
|
flopr #(1) readyreg(HCLK, ~HRESETn, nextHREADYRam, HREADYRam);
|
||||||
|
// assign HREADYRam = ~(memwriteD & ~memwrite);
|
||||||
assign HRESPRam = 0; // OK
|
assign HRESPRam = 0; // OK
|
||||||
|
|
||||||
localparam ADDR_WDITH = $clog2(RANGE/8);
|
localparam ADDR_WIDTH = $clog2(RANGE/8);
|
||||||
localparam OFFSET = $clog2(`XLEN/8);
|
localparam OFFSET = $clog2(`XLEN/8);
|
||||||
|
|
||||||
// Rising HREADY edge detector
|
/* // Rising HREADY edge detector
|
||||||
// Indicates when ram is finishing up
|
// Indicates when ram is finishing up
|
||||||
// Needed because HREADY may go high for other reasons,
|
// Needed because HREADY may go high for other reasons,
|
||||||
// and we only want to write data when finishing up.
|
// and we only want to write data when finishing up.
|
||||||
flopenr #(1) prevhreadyRamreg(HCLK,~HRESETn, 1'b1, HREADYRam,prevHREADYRam);
|
flopenr #(1) prevhreadyRamreg(HCLK,~HRESETn, 1'b1, HREADYRam,prevHREADYRam);
|
||||||
assign risingHREADYRam = HREADYRam & ~prevHREADYRam;
|
assign risingHREADYRam = HREADYRam & ~prevHREADYRam;*/
|
||||||
|
|
||||||
always @(posedge HCLK)
|
|
||||||
HWADDR <= #1 A;
|
|
||||||
|
|
||||||
|
/*
|
||||||
bram2p1r1w #(`XLEN/8, 8, ADDR_WDITH, `FPGA)
|
bram2p1r1w #(`XLEN/8, 8, ADDR_WDITH, `FPGA)
|
||||||
memory(.clk(HCLK), .reA(1'b1),
|
memory(.clk(HCLK), .reA(1'b1),
|
||||||
.addrA(A[ADDR_WDITH+OFFSET-1:OFFSET]), .doutA(HREADRam),
|
.addrA(A[ADDR_WDITH+OFFSET-1:OFFSET]), .doutA(HREADRam),
|
||||||
.weB(memwrite & risingHREADYRam), .bweB(ByteMaskM),
|
.weB(memwrite & risingHREADYRam), .bweB(ByteMaskM),
|
||||||
.addrB(HWADDR[ADDR_WDITH+OFFSET-1:OFFSET]), .dinB(HWDATA));
|
.addrB(HWADDR[ADDR_WDITH+OFFSET-1:OFFSET]), .dinB(HWDATA)); */
|
||||||
/*
|
|
||||||
bram1p1r1w #(`XLEN/8, 8, ADDR_WDITH)
|
|
||||||
memory(.clk(HCLK), .we(memwrite), .bwe(ByteMaskM), . addr(A***), .dout(HREADRam), .din(HWDATA));
|
|
||||||
|
|
||||||
#(
|
|
||||||
//--------------------------------------------------------------------------
|
|
||||||
parameter NUM_COL = 8,
|
|
||||||
parameter COL_WIDTH = 8,
|
|
||||||
parameter ADDR_WIDTH = 10,
|
|
||||||
// Addr Width in bits : 2 *ADDR_WIDTH = RAM Depth
|
|
||||||
parameter DATA_WIDTH = NUM_COL*COL_WIDTH // Data Width in bits
|
|
||||||
//----------------------------------------------------------------------
|
|
||||||
) (
|
|
||||||
input logic clk,
|
|
||||||
input logic ena,
|
|
||||||
input logic [NUM_COL-1:0] we,
|
|
||||||
input logic [ADDR_WIDTH-1:0] addr,
|
|
||||||
output logic [DATA_WIDTH-1:0] dout,
|
|
||||||
input logic [DATA_WIDTH-1:0] din
|
|
||||||
);*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// On writes, use address delayed by one cycle to sync with HWDATA
|
||||||
|
mux2 #(32) adrmux(HADDR, HADDRD, memwriteD, RamAddr);
|
||||||
|
|
||||||
|
// single-ported RAM
|
||||||
|
bram1p1rw #(`XLEN/8, 8, ADDR_WIDTH)
|
||||||
|
memory(.clk(HCLK), .we(memwriteD), .bwe(ByteMask), .addr(RamAddr[ADDR_WIDTH+OFFSET-1:OFFSET]), .dout(HREADRam), .din(HWDATA));
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
@ -92,7 +92,7 @@ module uncore (
|
|||||||
// generate
|
// generate
|
||||||
// on-chip RAM
|
// on-chip RAM
|
||||||
if (`RAM_SUPPORTED) begin : ram
|
if (`RAM_SUPPORTED) begin : ram
|
||||||
ram #(
|
ram_orig #(
|
||||||
.BASE(`RAM_BASE), .RANGE(`RAM_RANGE)) ram (
|
.BASE(`RAM_BASE), .RANGE(`RAM_RANGE)) ram (
|
||||||
.HCLK, .HRESETn,
|
.HCLK, .HRESETn,
|
||||||
.HSELRam, .HADDR,
|
.HSELRam, .HADDR,
|
||||||
@ -102,7 +102,7 @@ module uncore (
|
|||||||
end
|
end
|
||||||
|
|
||||||
if (`BOOTROM_SUPPORTED) begin : bootrom
|
if (`BOOTROM_SUPPORTED) begin : bootrom
|
||||||
ram #(.BASE(`BOOTROM_BASE), .RANGE(`BOOTROM_RANGE))
|
ram_orig #(.BASE(`BOOTROM_BASE), .RANGE(`BOOTROM_RANGE))
|
||||||
bootrom(
|
bootrom(
|
||||||
.HCLK, .HRESETn,
|
.HCLK, .HRESETn,
|
||||||
.HSELRam(HSELBootRom), .HADDR,
|
.HSELRam(HSELBootRom), .HADDR,
|
||||||
|
Loading…
Reference in New Issue
Block a user