mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	No dcache now supported. Does not pass regression tests however.
This commit is contained in:
		
							parent
							
								
									c79e14fec5
								
							
						
					
					
						commit
						6b59c03d1b
					
				@ -274,8 +274,8 @@ module lsu
 | 
				
			|||||||
  // 2. cache `MEM_DCACHE
 | 
					  // 2. cache `MEM_DCACHE
 | 
				
			||||||
  // 3. wire pass-through
 | 
					  // 3. wire pass-through
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  localparam integer   WORDSPERLINE = `MEM_DCACHE ? `DCACHE_BLOCKLENINBITS/`XLEN : `XLEN/8;
 | 
					  localparam integer   WORDSPERLINE = `MEM_DCACHE ? `DCACHE_BLOCKLENINBITS/`XLEN : 1;
 | 
				
			||||||
  localparam integer   LOGWPL = $clog2(WORDSPERLINE);
 | 
					  localparam integer   LOGWPL = `MEM_DCACHE ? $clog2(WORDSPERLINE) : 1;
 | 
				
			||||||
  localparam integer   BLOCKLEN = `MEM_DCACHE ? `DCACHE_BLOCKLENINBITS : `XLEN;
 | 
					  localparam integer   BLOCKLEN = `MEM_DCACHE ? `DCACHE_BLOCKLENINBITS : `XLEN;
 | 
				
			||||||
  localparam integer   WordCountThreshold = `MEM_DCACHE ? WORDSPERLINE - 1 : 0;
 | 
					  localparam integer   WordCountThreshold = `MEM_DCACHE ? WORDSPERLINE - 1 : 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -365,68 +365,74 @@ module DCacheFlushFSM
 | 
				
			|||||||
   input logic start,
 | 
					   input logic start,
 | 
				
			||||||
   output logic done);
 | 
					   output logic done);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  localparam integer numlines = testbench.dut.hart.lsu.dcache.dcache.NUMLINES;
 | 
					 | 
				
			||||||
  localparam integer numways = testbench.dut.hart.lsu.dcache.dcache.NUMWAYS;
 | 
					 | 
				
			||||||
  localparam integer blockbytelen = testbench.dut.hart.lsu.dcache.dcache.BLOCKBYTELEN;
 | 
					 | 
				
			||||||
  localparam integer numwords = testbench.dut.hart.lsu.dcache.dcache.BLOCKLEN/`XLEN;  
 | 
					 | 
				
			||||||
  localparam integer lognumlines = $clog2(numlines);
 | 
					 | 
				
			||||||
  localparam integer logblockbytelen = $clog2(blockbytelen);
 | 
					 | 
				
			||||||
  localparam integer lognumways = $clog2(numways);
 | 
					 | 
				
			||||||
  localparam integer tagstart = lognumlines + logblockbytelen;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  genvar index, way, cacheWord;
 | 
					 | 
				
			||||||
  logic [`XLEN-1:0]  CacheData [numways-1:0] [numlines-1:0] [numwords-1:0];
 | 
					 | 
				
			||||||
  logic [`XLEN-1:0]  CacheTag [numways-1:0] [numlines-1:0] [numwords-1:0];
 | 
					 | 
				
			||||||
  logic CacheValid  [numways-1:0] [numlines-1:0] [numwords-1:0];
 | 
					 | 
				
			||||||
  logic CacheDirty  [numways-1:0] [numlines-1:0] [numwords-1:0];
 | 
					 | 
				
			||||||
  logic [`PA_BITS-1:0] CacheAdr [numways-1:0] [numlines-1:0] [numwords-1:0];
 | 
					 | 
				
			||||||
  genvar adr;
 | 
					  genvar adr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  logic [`XLEN-1:0] ShadowRAM[`RAM_BASE>>(1+`XLEN/32):(`RAM_RANGE+`RAM_BASE)>>1+(`XLEN/32)];
 | 
					  logic [`XLEN-1:0] ShadowRAM[`RAM_BASE>>(1+`XLEN/32):(`RAM_RANGE+`RAM_BASE)>>1+(`XLEN/32)];
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  generate
 | 
					  generate
 | 
				
			||||||
    for(index = 0; index < numlines; index++) begin
 | 
						if(`MEM_DCACHE) begin
 | 
				
			||||||
      for(way = 0; way < numways; way++) begin
 | 
						  localparam integer numlines = testbench.dut.hart.lsu.dcache.dcache.NUMLINES;
 | 
				
			||||||
	for(cacheWord = 0; cacheWord < numwords; cacheWord++) begin
 | 
						  localparam integer numways = testbench.dut.hart.lsu.dcache.dcache.NUMWAYS;
 | 
				
			||||||
	  copyShadow #(.tagstart(tagstart),
 | 
						  localparam integer blockbytelen = testbench.dut.hart.lsu.dcache.dcache.BLOCKBYTELEN;
 | 
				
			||||||
		       .logblockbytelen(logblockbytelen))
 | 
						  localparam integer numwords = testbench.dut.hart.lsu.dcache.dcache.BLOCKLEN/`XLEN;  
 | 
				
			||||||
	  copyShadow(.clk,
 | 
						  localparam integer lognumlines = $clog2(numlines);
 | 
				
			||||||
		     .start,
 | 
						  localparam integer logblockbytelen = $clog2(blockbytelen);
 | 
				
			||||||
		     .tag(testbench.dut.hart.lsu.dcache.dcache.MemWay[way].CacheTagMem.StoredData[index]),
 | 
						  localparam integer lognumways = $clog2(numways);
 | 
				
			||||||
		     .valid(testbench.dut.hart.lsu.dcache.dcache.MemWay[way].ValidBits[index]),
 | 
						  localparam integer tagstart = lognumlines + logblockbytelen;
 | 
				
			||||||
		     .dirty(testbench.dut.hart.lsu.dcache.dcache.MemWay[way].DirtyBits[index]),
 | 
					
 | 
				
			||||||
		     .data(testbench.dut.hart.lsu.dcache.dcache.MemWay[way].word[cacheWord].CacheDataMem.StoredData[index]),
 | 
					
 | 
				
			||||||
		     .index(index),
 | 
					
 | 
				
			||||||
		     .cacheWord(cacheWord),
 | 
						  genvar 			 index, way, cacheWord;
 | 
				
			||||||
		     .CacheData(CacheData[way][index][cacheWord]),
 | 
						  logic [`XLEN-1:0]  CacheData [numways-1:0] [numlines-1:0] [numwords-1:0];
 | 
				
			||||||
		     .CacheAdr(CacheAdr[way][index][cacheWord]),
 | 
						  logic [`XLEN-1:0]  CacheTag [numways-1:0] [numlines-1:0] [numwords-1:0];
 | 
				
			||||||
		     .CacheTag(CacheTag[way][index][cacheWord]),
 | 
						  logic 			 CacheValid  [numways-1:0] [numlines-1:0] [numwords-1:0];
 | 
				
			||||||
		     .CacheValid(CacheValid[way][index][cacheWord]),
 | 
						  logic 			 CacheDirty  [numways-1:0] [numlines-1:0] [numwords-1:0];
 | 
				
			||||||
		     .CacheDirty(CacheDirty[way][index][cacheWord]));
 | 
						  logic [`PA_BITS-1:0] CacheAdr [numways-1:0] [numlines-1:0] [numwords-1:0];
 | 
				
			||||||
	end
 | 
					      for(index = 0; index < numlines; index++) begin
 | 
				
			||||||
 | 
							for(way = 0; way < numways; way++) begin
 | 
				
			||||||
 | 
							  for(cacheWord = 0; cacheWord < numwords; cacheWord++) begin
 | 
				
			||||||
 | 
								copyShadow #(.tagstart(tagstart),
 | 
				
			||||||
 | 
											 .logblockbytelen(logblockbytelen))
 | 
				
			||||||
 | 
								copyShadow(.clk,
 | 
				
			||||||
 | 
										   .start,
 | 
				
			||||||
 | 
										   .tag(testbench.dut.hart.lsu.dcache.dcache.MemWay[way].CacheTagMem.StoredData[index]),
 | 
				
			||||||
 | 
										   .valid(testbench.dut.hart.lsu.dcache.dcache.MemWay[way].ValidBits[index]),
 | 
				
			||||||
 | 
										   .dirty(testbench.dut.hart.lsu.dcache.dcache.MemWay[way].DirtyBits[index]),
 | 
				
			||||||
 | 
										   .data(testbench.dut.hart.lsu.dcache.dcache.MemWay[way].word[cacheWord].CacheDataMem.StoredData[index]),
 | 
				
			||||||
 | 
										   .index(index),
 | 
				
			||||||
 | 
										   .cacheWord(cacheWord),
 | 
				
			||||||
 | 
										   .CacheData(CacheData[way][index][cacheWord]),
 | 
				
			||||||
 | 
										   .CacheAdr(CacheAdr[way][index][cacheWord]),
 | 
				
			||||||
 | 
										   .CacheTag(CacheTag[way][index][cacheWord]),
 | 
				
			||||||
 | 
										   .CacheValid(CacheValid[way][index][cacheWord]),
 | 
				
			||||||
 | 
										   .CacheDirty(CacheDirty[way][index][cacheWord]));
 | 
				
			||||||
 | 
							  end
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    end
 | 
					
 | 
				
			||||||
 | 
						  integer i, j, k;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						  always @(posedge clk) begin
 | 
				
			||||||
 | 
							if (start) begin #1
 | 
				
			||||||
 | 
							  #1
 | 
				
			||||||
 | 
								for(i = 0; i < numlines; i++) begin
 | 
				
			||||||
 | 
								  for(j = 0; j < numways; j++) begin
 | 
				
			||||||
 | 
									for(k = 0; k < numwords; k++) begin
 | 
				
			||||||
 | 
									  if (CacheValid[j][i][k] && CacheDirty[j][i][k]) begin
 | 
				
			||||||
 | 
										ShadowRAM[CacheAdr[j][i][k] >> $clog2(`XLEN/8)] = CacheData[j][i][k];
 | 
				
			||||||
 | 
									  end
 | 
				
			||||||
 | 
									end	
 | 
				
			||||||
 | 
								  end
 | 
				
			||||||
 | 
								end
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
						  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						  
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
  endgenerate
 | 
					  endgenerate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  integer i, j, k;
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  always @(posedge clk) begin
 | 
					 | 
				
			||||||
    if (start) begin #1
 | 
					 | 
				
			||||||
      #1
 | 
					 | 
				
			||||||
      for(i = 0; i < numlines; i++) begin
 | 
					 | 
				
			||||||
	for(j = 0; j < numways; j++) begin
 | 
					 | 
				
			||||||
	  for(k = 0; k < numwords; k++) begin
 | 
					 | 
				
			||||||
	  if (CacheValid[j][i][k] && CacheDirty[j][i][k]) begin
 | 
					 | 
				
			||||||
	    ShadowRAM[CacheAdr[j][i][k] >> $clog2(`XLEN/8)] = CacheData[j][i][k];
 | 
					 | 
				
			||||||
	    end
 | 
					 | 
				
			||||||
	  end	
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  flop #(1) doneReg(.clk(clk),
 | 
					  flop #(1) doneReg(.clk(clk),
 | 
				
			||||||
		    .d(start),
 | 
							    .d(start),
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user