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.
 | ||||
|   // 4. remove the configurable latency.
 | ||||
| 
 | ||||
|   logic [`XLEN/8-1:0] 		  ByteMaskM; | ||||
|   logic [31:0]        HWADDR, A; | ||||
|   logic				  prevHREADYRam, risingHREADYRam; | ||||
|   logic [`XLEN/8-1:0] 		  ByteMask; | ||||
|   logic [31:0]        HADDRD, RamAddr; | ||||
|   //logic				  prevHREADYRam, risingHREADYRam;
 | ||||
|   logic				  initTrans; | ||||
|   logic				  memwrite; | ||||
|   logic [3:0] 		  busycount; | ||||
|   logic				  memwrite, memwriteD; | ||||
|   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
 | ||||
|   flopenr #(1) memwritereg(HCLK, 1'b0, initTrans | ~HRESETn, HSELRam &  HWRITE, memwrite); | ||||
|   flopenr #(32)   haddrreg(HCLK, 1'b0, initTrans | ~HRESETn, HADDR, A); | ||||
|   flopen #(1) memwritereg(HCLK, initTrans | ~HRESETn, memwrite, memwriteD); // probably drop ~HRESETn in all this
 | ||||
|   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)  | ||||
|     if (~HRESETn) begin | ||||
|       busycount <= 0; | ||||
| @ -80,48 +82,38 @@ module ram #(parameter BASE=0, RANGE = 65535) ( | ||||
|           busycount <= busycount + 1; | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|     end */ | ||||
| 
 | ||||
| 
 | ||||
|   assign nextHREADYRam = ~(memwriteD & ~memwrite); | ||||
|   flopr #(1) readyreg(HCLK, ~HRESETn, nextHREADYRam, HREADYRam); | ||||
| //  assign HREADYRam = ~(memwriteD & ~memwrite);
 | ||||
|   assign HRESPRam = 0; // OK
 | ||||
| 
 | ||||
|   localparam ADDR_WDITH = $clog2(RANGE/8); | ||||
|   localparam ADDR_WIDTH = $clog2(RANGE/8); | ||||
|   localparam OFFSET = $clog2(`XLEN/8); | ||||
|    | ||||
|   // Rising HREADY edge detector
 | ||||
| /*  // Rising HREADY edge detector
 | ||||
|   //   Indicates when ram is finishing up
 | ||||
|   //   Needed because HREADY may go high for other reasons,
 | ||||
|   //   and we only want to write data when finishing up.
 | ||||
|   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), | ||||
| 		 .addrA(A[ADDR_WDITH+OFFSET-1:OFFSET]), .doutA(HREADRam), | ||||
| 		 .weB(memwrite & risingHREADYRam), .bweB(ByteMaskM), | ||||
| 		 .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 | ||||
| 	   );*/ | ||||
| 		 .addrB(HWADDR[ADDR_WDITH+OFFSET-1:OFFSET]), .dinB(HWDATA)); */ | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|   // 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 | ||||
|    | ||||
|  | ||||
| @ -92,7 +92,7 @@ module uncore ( | ||||
| //  generate
 | ||||
|     // on-chip RAM
 | ||||
|     if (`RAM_SUPPORTED) begin : ram | ||||
|       ram #( | ||||
|       ram_orig #( | ||||
|         .BASE(`RAM_BASE), .RANGE(`RAM_RANGE)) ram ( | ||||
|         .HCLK, .HRESETn,  | ||||
|         .HSELRam, .HADDR, | ||||
| @ -102,7 +102,7 @@ module uncore ( | ||||
|     end | ||||
| 
 | ||||
|     if (`BOOTROM_SUPPORTED) begin : bootrom | ||||
|       ram #(.BASE(`BOOTROM_BASE), .RANGE(`BOOTROM_RANGE)) | ||||
|       ram_orig #(.BASE(`BOOTROM_BASE), .RANGE(`BOOTROM_RANGE)) | ||||
|       bootrom( | ||||
|         .HCLK, .HRESETn,  | ||||
|         .HSELRam(HSELBootRom), .HADDR, | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user