mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	add ram1p1rwe for read-only cache ways (remove byte-enable)
- increases coverage
This commit is contained in:
		
							parent
							
								
									2553321158
								
							
						
					
					
						commit
						8b6b96012d
					
				
							
								
								
									
										10
									
								
								src/cache/cacheway.sv
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								src/cache/cacheway.sv
									
									
									
									
										vendored
									
									
								
							@ -128,10 +128,18 @@ module cacheway #(parameter NUMLINES=512, LINELEN = 256, TAGLEN = 26,
 | 
				
			|||||||
  localparam           LOGNUMSRAM = $clog2(NUMSRAM);
 | 
					  localparam           LOGNUMSRAM = $clog2(NUMSRAM);
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  for(words = 0; words < NUMSRAM; words++) begin: word
 | 
					  for(words = 0; words < NUMSRAM; words++) begin: word
 | 
				
			||||||
    ram1p1rwbe #(.DEPTH(NUMLINES), .WIDTH(SRAMLEN)) CacheDataMem(.clk, .ce(CacheEn), .addr(CacheSet),
 | 
					    if (!READ_ONLY_CACHE) begin:wordram
 | 
				
			||||||
 | 
					      ram1p1rwbe #(.DEPTH(NUMLINES), .WIDTH(SRAMLEN)) CacheDataMem(.clk, .ce(CacheEn), .addr(CacheSet),
 | 
				
			||||||
      .dout(ReadDataLine[SRAMLEN*(words+1)-1:SRAMLEN*words]),
 | 
					      .dout(ReadDataLine[SRAMLEN*(words+1)-1:SRAMLEN*words]),
 | 
				
			||||||
      .din(LineWriteData[SRAMLEN*(words+1)-1:SRAMLEN*words]),
 | 
					      .din(LineWriteData[SRAMLEN*(words+1)-1:SRAMLEN*words]),
 | 
				
			||||||
      .we(SelectedWriteWordEn), .bwe(FinalByteMask[SRAMLENINBYTES*(words+1)-1:SRAMLENINBYTES*words]));
 | 
					      .we(SelectedWriteWordEn), .bwe(FinalByteMask[SRAMLENINBYTES*(words+1)-1:SRAMLENINBYTES*words]));
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					    else begin:wordram // no byte-enable needed for i$.
 | 
				
			||||||
 | 
					      ram1p1rwe #(.DEPTH(NUMLINES), .WIDTH(SRAMLEN)) CacheDataMem(.clk, .ce(CacheEn), .addr(CacheSet),
 | 
				
			||||||
 | 
					      .dout(ReadDataLine[SRAMLEN*(words+1)-1:SRAMLEN*words]),
 | 
				
			||||||
 | 
					      .din(LineWriteData[SRAMLEN*(words+1)-1:SRAMLEN*words]),
 | 
				
			||||||
 | 
					      .we(SelectedWriteWordEn));
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // AND portion of distributed read multiplexers
 | 
					  // AND portion of distributed read multiplexers
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										95
									
								
								src/generic/mem/ram1p1rwe.sv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								src/generic/mem/ram1p1rwe.sv
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,95 @@
 | 
				
			|||||||
 | 
					///////////////////////////////////////////
 | 
				
			||||||
 | 
					// 1 port sram.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Written: avercruysse@hmc.edu (Modified from ram1p1rwbe, by ross1728@gmail.com)
 | 
				
			||||||
 | 
					// Created: 04 April 2023
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Purpose: ram1p1wre, but without byte-enable. Used for icache data.
 | 
				
			||||||
 | 
					// 
 | 
				
			||||||
 | 
					// Documentation: 
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// A component of the CORE-V-WALLY configurable RISC-V project.
 | 
				
			||||||
 | 
					// 
 | 
				
			||||||
 | 
					// Copyright (C) 2021-23 Harvey Mudd College & Oklahoma State University
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Licensed under the Solderpad Hardware License v 2.1 (the “License”); you may not use this file 
 | 
				
			||||||
 | 
					// except in compliance with the License, or, at your option, the Apache License version 2.0. You 
 | 
				
			||||||
 | 
					// may obtain a copy of the License at
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// https://solderpad.org/licenses/SHL-2.1/
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Unless required by applicable law or agreed to in writing, any work distributed under the 
 | 
				
			||||||
 | 
					// License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 
 | 
				
			||||||
 | 
					// either express or implied. See the License for the specific language governing permissions 
 | 
				
			||||||
 | 
					// and limitations under the License.
 | 
				
			||||||
 | 
					////////////////////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// WIDTH is number of bits in one "word" of the memory, DEPTH is number of such words
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`include "wally-config.vh"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module ram1p1rwe #(parameter DEPTH=64, WIDTH=44) (
 | 
				
			||||||
 | 
					  input logic                     clk,
 | 
				
			||||||
 | 
					  input logic                     ce,
 | 
				
			||||||
 | 
					  input logic [$clog2(DEPTH)-1:0] addr,
 | 
				
			||||||
 | 
					  input logic [WIDTH-1:0]         din,
 | 
				
			||||||
 | 
					  input logic                     we,
 | 
				
			||||||
 | 
					  output logic [WIDTH-1:0]        dout
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  logic [WIDTH-1:0]               RAM[DEPTH-1:0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // ***************************************************************************
 | 
				
			||||||
 | 
					  // TRUE SRAM macro
 | 
				
			||||||
 | 
					  // ***************************************************************************
 | 
				
			||||||
 | 
					  if ((`USE_SRAM == 1) & (WIDTH == 128) & (DEPTH == 64)) begin // Cache data subarray
 | 
				
			||||||
 | 
					    // 64 x 128-bit SRAM
 | 
				
			||||||
 | 
					    ram1p1rwbe_64x128 sram1A (.CLK(clk), .CEB(~ce), .WEB(~we),
 | 
				
			||||||
 | 
					      .A(addr), .D(din), 
 | 
				
			||||||
 | 
					      .BWEB('0), .Q(dout));
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  end else if ((`USE_SRAM == 1) & (WIDTH == 44)  & (DEPTH == 64)) begin // RV64 cache tag
 | 
				
			||||||
 | 
					    // 64 x 44-bit SRAM
 | 
				
			||||||
 | 
					    ram1p1rwbe_64x44 sram1B (.CLK(clk), .CEB(~ce), .WEB(~we),
 | 
				
			||||||
 | 
					      .A(addr), .D(din), 
 | 
				
			||||||
 | 
					      .BWEB('0), .Q(dout));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  end else if ((`USE_SRAM == 1) & (WIDTH == 22)  & (DEPTH == 64)) begin // RV32 cache tag
 | 
				
			||||||
 | 
					    // 64 x 22-bit SRAM
 | 
				
			||||||
 | 
					    ram1p1rwbe_64x22 sram1B (.CLK(clk), .CEB(~ce), .WEB(~we),
 | 
				
			||||||
 | 
					      .A(addr), .D(din), 
 | 
				
			||||||
 | 
					      .BWEB('0), .Q(dout));     
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // ***************************************************************************
 | 
				
			||||||
 | 
					    // READ first SRAM model
 | 
				
			||||||
 | 
					    // ***************************************************************************
 | 
				
			||||||
 | 
					  end else begin: ram
 | 
				
			||||||
 | 
					    integer i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Read
 | 
				
			||||||
 | 
					    logic [$clog2(DEPTH)-1:0] addrd;
 | 
				
			||||||
 | 
					    flopen #($clog2(DEPTH)) adrreg(clk, ce, addr, addrd);
 | 
				
			||||||
 | 
					    assign dout = RAM[addrd];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*      // Read
 | 
				
			||||||
 | 
					     always_ff @(posedge clk) 
 | 
				
			||||||
 | 
					     if(ce) dout <= #1 mem[addr]; */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Write divided into part for bytes and part for extra msbs
 | 
				
			||||||
 | 
					    // Questa sim version 2022.3_2 does not allow multiple drivers for RAM when using always_ff.
 | 
				
			||||||
 | 
					    // Therefore these always blocks use the older always @(posedge clk) 
 | 
				
			||||||
 | 
					    if(WIDTH >= 8) 
 | 
				
			||||||
 | 
					      always @(posedge clk) 
 | 
				
			||||||
 | 
					        if (ce & we) 
 | 
				
			||||||
 | 
					          for(i = 0; i < WIDTH/8; i++) 
 | 
				
			||||||
 | 
					            RAM[addr][i*8 +: 8] <= #1 din[i*8 +: 8];
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    if (WIDTH%8 != 0) // handle msbs if width not a multiple of 8
 | 
				
			||||||
 | 
					      always @(posedge clk) 
 | 
				
			||||||
 | 
					        if (ce & we)
 | 
				
			||||||
 | 
					          RAM[addr][WIDTH-1:WIDTH-WIDTH%8] <= #1 din[WIDTH-1:WIDTH-WIDTH%8];
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					endmodule
 | 
				
			||||||
@ -713,7 +713,7 @@ module DCacheFlushFSM
 | 
				
			|||||||
                           // these dirty bit selections would be needed if dirty is moved inside the tag array.
 | 
					                           // these dirty bit selections would be needed if dirty is moved inside the tag array.
 | 
				
			||||||
          //.dirty(testbench.dut.core.lsu.bus.dcache.dcache.CacheWays[way].dirty.DirtyMem.RAM[index]),
 | 
					          //.dirty(testbench.dut.core.lsu.bus.dcache.dcache.CacheWays[way].dirty.DirtyMem.RAM[index]),
 | 
				
			||||||
          //.dirty(testbench.dut.core.lsu.bus.dcache.dcache.CacheWays[way].CacheTagMem.RAM[index][`PA_BITS+tagstart]),
 | 
					          //.dirty(testbench.dut.core.lsu.bus.dcache.dcache.CacheWays[way].CacheTagMem.RAM[index][`PA_BITS+tagstart]),
 | 
				
			||||||
          .data(testbench.dut.core.lsu.bus.dcache.dcache.CacheWays[way].word[cacheWord].CacheDataMem.RAM[index]),
 | 
					          .data(testbench.dut.core.lsu.bus.dcache.dcache.CacheWays[way].word[cacheWord].wordram.CacheDataMem.RAM[index]),
 | 
				
			||||||
          .index(index),
 | 
					          .index(index),
 | 
				
			||||||
          .cacheWord(cacheWord),
 | 
					          .cacheWord(cacheWord),
 | 
				
			||||||
          .CacheData(CacheData[way][index][cacheWord]),
 | 
					          .CacheData(CacheData[way][index][cacheWord]),
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user