mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Reverted to fetched the demand cache line first then doing the eviction. This is important because of an optimization in the replacement policy. The replacement policy updates the LRU 1 cycle late and reads the LRU 1 cycle late for critical path timing. This means doing the eviction first requires an initial 1 cycle delay but this delay has to be applied to all misses because we don't know if an eviction is required. Since reading the demand line first is logically ok so long as it is not written to the sram until after the eviction.
This commit is contained in:
		
							parent
							
								
									a79e5e11f6
								
							
						
					
					
						commit
						8698799077
					
				@ -316,8 +316,10 @@ add wave -noupdate -expand -group lsu -expand -group dcache -group status /testb
 | 
				
			|||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group status -color {Medium Orchid} /testbench/dut/core/lsu/bus/dcache/dcache/CacheHit
 | 
					add wave -noupdate -expand -group lsu -expand -group dcache -group status -color {Medium Orchid} /testbench/dut/core/lsu/bus/dcache/dcache/CacheHit
 | 
				
			||||||
add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Memory Side} /testbench/dut/core/lsu/bus/dcache/dcache/CacheFetchLine
 | 
					add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Memory Side} /testbench/dut/core/lsu/bus/dcache/dcache/CacheFetchLine
 | 
				
			||||||
add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Memory Side} /testbench/dut/core/lsu/bus/dcache/dcache/CacheWriteLine
 | 
					add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Memory Side} /testbench/dut/core/lsu/bus/dcache/dcache/CacheWriteLine
 | 
				
			||||||
 | 
					add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Memory Side} /testbench/dut/core/lsu/bus/dcache/dcache/CacheBusAdr
 | 
				
			||||||
add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Memory Side} /testbench/dut/core/lsu/bus/dcache/dcache/CacheBusWriteData
 | 
					add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Memory Side} /testbench/dut/core/lsu/bus/dcache/dcache/CacheBusWriteData
 | 
				
			||||||
add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Memory Side} /testbench/dut/core/lsu/bus/dcache/dcache/CacheBusAck
 | 
					add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Memory Side} /testbench/dut/core/lsu/bus/dcache/dcache/CacheBusAck
 | 
				
			||||||
 | 
					add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Memory Side} /testbench/dut/core/lsu/bus/dcache/dcache/ReadDataWord
 | 
				
			||||||
add wave -noupdate -expand -group lsu -expand -group dcache /testbench/dut/core/lsu/bus/dcache/dcache/FlushWay
 | 
					add wave -noupdate -expand -group lsu -expand -group dcache /testbench/dut/core/lsu/bus/dcache/dcache/FlushWay
 | 
				
			||||||
add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/VAdr
 | 
					add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/VAdr
 | 
				
			||||||
add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/EffectivePrivilegeMode
 | 
					add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/EffectivePrivilegeMode
 | 
				
			||||||
@ -515,7 +517,7 @@ add wave -noupdate /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/Upd
 | 
				
			|||||||
add wave -noupdate {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/FinalByteMask}
 | 
					add wave -noupdate {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/FinalByteMask}
 | 
				
			||||||
add wave -noupdate {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/SelectedWriteWordEn}
 | 
					add wave -noupdate {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/SelectedWriteWordEn}
 | 
				
			||||||
TreeUpdate [SetDefaultTree]
 | 
					TreeUpdate [SetDefaultTree]
 | 
				
			||||||
WaveRestoreCursors {{Cursor 5} {307575 ns} 1} {{Cursor 2} {307965 ns} 1} {{Cursor 3} {307661 ns} 0}
 | 
					WaveRestoreCursors {{Cursor 5} {307575 ns} 1} {{Cursor 2} {307965 ns} 1} {{Cursor 3} {112734 ns} 0}
 | 
				
			||||||
quietly wave cursor active 3
 | 
					quietly wave cursor active 3
 | 
				
			||||||
configure wave -namecolwidth 250
 | 
					configure wave -namecolwidth 250
 | 
				
			||||||
configure wave -valuecolwidth 314
 | 
					configure wave -valuecolwidth 314
 | 
				
			||||||
@ -531,4 +533,4 @@ configure wave -griddelta 40
 | 
				
			|||||||
configure wave -timeline 0
 | 
					configure wave -timeline 0
 | 
				
			||||||
configure wave -timelineunits ns
 | 
					configure wave -timelineunits ns
 | 
				
			||||||
update
 | 
					update
 | 
				
			||||||
WaveRestoreZoom {0 ns} {3158332 ns}
 | 
					WaveRestoreZoom {112550 ns} {112886 ns}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										22
									
								
								pipelined/src/cache/cachefsm.sv
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								pipelined/src/cache/cachefsm.sv
									
									
									
									
										vendored
									
									
								
							@ -141,10 +141,12 @@ module cachefsm
 | 
				
			|||||||
      STATE_READY: if(IgnoreRequest)                 NextState = STATE_READY;
 | 
					      STATE_READY: if(IgnoreRequest)                 NextState = STATE_READY;
 | 
				
			||||||
                   else if(DoFlush)                  NextState = STATE_FLUSH;
 | 
					                   else if(DoFlush)                  NextState = STATE_FLUSH;
 | 
				
			||||||
                   else if(DoAnyHit & CPUBusy)       NextState = STATE_CPU_BUSY;
 | 
					                   else if(DoAnyHit & CPUBusy)       NextState = STATE_CPU_BUSY;
 | 
				
			||||||
                   else if(DoAnyMiss & VictimDirty)  NextState = STATE_MISS_EVICT_DIRTY_START; // change
 | 
					                   else if(DoAnyMiss)                NextState = STATE_MISS_FETCH_WDV;
 | 
				
			||||||
                   else if(DoAnyMiss & ~VictimDirty) NextState = STATE_MISS_FETCH_WDV; // change      
 | 
					                   //else if(DoAnyMiss & VictimDirty)  NextState = STATE_MISS_EVICT_DIRTY_START; // change
 | 
				
			||||||
 | 
					                   //else if(DoAnyMiss & ~VictimDirty) NextState = STATE_MISS_FETCH_WDV; // change      
 | 
				
			||||||
                   else                              NextState = STATE_READY;
 | 
					                   else                              NextState = STATE_READY;
 | 
				
			||||||
      STATE_MISS_FETCH_WDV: if(CacheBusAck)          NextState = STATE_MISS_WRITE_CACHE_LINE;
 | 
					      STATE_MISS_FETCH_WDV: if(CacheBusAck & ~VictimDirty) NextState = STATE_MISS_WRITE_CACHE_LINE;
 | 
				
			||||||
 | 
					                            else if(CacheBusAck & VictimDirty) NextState = STATE_MISS_EVICT_DIRTY_START;
 | 
				
			||||||
                            else                     NextState = STATE_MISS_FETCH_WDV;
 | 
					                            else                     NextState = STATE_MISS_FETCH_WDV;
 | 
				
			||||||
      STATE_MISS_WRITE_CACHE_LINE:                   NextState = STATE_READY;
 | 
					      STATE_MISS_WRITE_CACHE_LINE:                   NextState = STATE_READY;
 | 
				
			||||||
      STATE_MISS_READ_WORD: if(CacheRW[0] & ~AMO)    NextState = STATE_MISS_WRITE_WORD;
 | 
					      STATE_MISS_READ_WORD: if(CacheRW[0] & ~AMO)    NextState = STATE_MISS_WRITE_WORD;
 | 
				
			||||||
@ -153,9 +155,11 @@ module cachefsm
 | 
				
			|||||||
                                  else               NextState = STATE_READY;
 | 
					                                  else               NextState = STATE_READY;
 | 
				
			||||||
      STATE_MISS_WRITE_WORD: if(CPUBusy)             NextState = STATE_CPU_BUSY;
 | 
					      STATE_MISS_WRITE_WORD: if(CPUBusy)             NextState = STATE_CPU_BUSY;
 | 
				
			||||||
                             else                    NextState = STATE_READY;
 | 
					                             else                    NextState = STATE_READY;
 | 
				
			||||||
      STATE_MISS_EVICT_DIRTY_START:                  NextState = STATE_MISS_EVICT_DIRTY; // start needed for the delayed lru update.
 | 
					      STATE_MISS_EVICT_DIRTY: if(CacheBusAck)        NextState = STATE_MISS_WRITE_CACHE_LINE;
 | 
				
			||||||
      STATE_MISS_EVICT_DIRTY: if(CacheBusAck)        NextState = STATE_MISS_EVICT_DIRTY_DONE;
 | 
					 | 
				
			||||||
                              else                   NextState = STATE_MISS_EVICT_DIRTY;
 | 
					                              else                   NextState = STATE_MISS_EVICT_DIRTY;
 | 
				
			||||||
 | 
					      STATE_MISS_EVICT_DIRTY_START:                  NextState = STATE_MISS_EVICT_DIRTY; // start needed for the delayed lru update.
 | 
				
			||||||
 | 
					//      STATE_MISS_EVICT_DIRTY: if(CacheBusAck)        NextState = STATE_MISS_EVICT_DIRTY_DONE;
 | 
				
			||||||
 | 
					//                              else                   NextState = STATE_MISS_EVICT_DIRTY;
 | 
				
			||||||
      STATE_MISS_EVICT_DIRTY_DONE:                   NextState = STATE_MISS_FETCH_WDV;
 | 
					      STATE_MISS_EVICT_DIRTY_DONE:                   NextState = STATE_MISS_FETCH_WDV;
 | 
				
			||||||
      STATE_CPU_BUSY: if(CPUBusy)                    NextState = STATE_CPU_BUSY;
 | 
					      STATE_CPU_BUSY: if(CPUBusy)                    NextState = STATE_CPU_BUSY;
 | 
				
			||||||
                      else                           NextState = STATE_READY;
 | 
					                      else                           NextState = STATE_READY;
 | 
				
			||||||
@ -199,7 +203,7 @@ module cachefsm
 | 
				
			|||||||
  assign LRUWriteEn = (CurrState == STATE_READY & DoAnyHit) |
 | 
					  assign LRUWriteEn = (CurrState == STATE_READY & DoAnyHit) |
 | 
				
			||||||
                      (CurrState == STATE_MISS_WRITE_CACHE_LINE);
 | 
					                      (CurrState == STATE_MISS_WRITE_CACHE_LINE);
 | 
				
			||||||
  // Flush and eviction controls
 | 
					  // Flush and eviction controls
 | 
				
			||||||
  assign SelEvict = (CurrState == STATE_READY & DoAnyMiss & VictimDirty) |
 | 
					  assign SelEvict = //(CurrState == STATE_MISS_FETCH_WDV & CacheBusAck & VictimDirty) |
 | 
				
			||||||
                    (CurrState == STATE_MISS_EVICT_DIRTY_START) |
 | 
					                    (CurrState == STATE_MISS_EVICT_DIRTY_START) |
 | 
				
			||||||
                    (CurrState == STATE_MISS_EVICT_DIRTY);
 | 
					                    (CurrState == STATE_MISS_EVICT_DIRTY);
 | 
				
			||||||
  assign SelFlush = (CurrState == STATE_FLUSH) | (CurrState == STATE_FLUSH_CHECK) |
 | 
					  assign SelFlush = (CurrState == STATE_FLUSH) | (CurrState == STATE_FLUSH_CHECK) |
 | 
				
			||||||
@ -213,9 +217,9 @@ module cachefsm
 | 
				
			|||||||
  assign FlushAdrCntRst = (CurrState == STATE_READY);
 | 
					  assign FlushAdrCntRst = (CurrState == STATE_READY);
 | 
				
			||||||
  assign FlushWayCntRst = (CurrState == STATE_READY) | (CurrState == STATE_FLUSH_INCR);
 | 
					  assign FlushWayCntRst = (CurrState == STATE_READY) | (CurrState == STATE_FLUSH_INCR);
 | 
				
			||||||
  // Bus interface controls
 | 
					  // Bus interface controls
 | 
				
			||||||
  assign CacheFetchLine = (CurrState == STATE_READY & DoAnyMiss & ~VictimDirty) |
 | 
					  assign CacheFetchLine = (CurrState == STATE_READY & DoAnyMiss);
 | 
				
			||||||
                          (CurrState == STATE_MISS_EVICT_DIRTY_DONE);
 | 
					//  assign CacheWriteLine = (CurrState == STATE_MISS_FETCH_WDV & VictimDirty & CacheBusAck) |
 | 
				
			||||||
  assign CacheWriteLine = (CurrState == STATE_READY & DoAnyMiss & VictimDirty) |
 | 
					    assign CacheWriteLine = (CurrState == STATE_MISS_EVICT_DIRTY_START) |
 | 
				
			||||||
                          (CurrState == STATE_FLUSH_CHECK & VictimDirty);
 | 
					                          (CurrState == STATE_FLUSH_CHECK & VictimDirty);
 | 
				
			||||||
  // handle cpu stall.
 | 
					  // handle cpu stall.
 | 
				
			||||||
  assign restore = ((CurrState == STATE_CPU_BUSY)) & ~`REPLAY;
 | 
					  assign restore = ((CurrState == STATE_CPU_BUSY)) & ~`REPLAY;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user