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);
 | 
			
		||||
  
 | 
			
		||||
  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]),
 | 
			
		||||
      .din(LineWriteData[SRAMLEN*(words+1)-1:SRAMLEN*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
 | 
			
		||||
 | 
			
		||||
  // 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.
 | 
			
		||||
          //.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]),
 | 
			
		||||
          .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),
 | 
			
		||||
          .cacheWord(cacheWord),
 | 
			
		||||
          .CacheData(CacheData[way][index][cacheWord]),
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user