forked from Github_Repos/cvw
		
	Merge branch 'main' of https://github.com/davidharrishmc/riscv-wally into main
This commit is contained in:
		
						commit
						f38fc7bb73
					
				| @ -126,3 +126,4 @@ | |||||||
| `define TESTSBP 0 | `define TESTSBP 0 | ||||||
| 
 | 
 | ||||||
| `define REPLAY 0 | `define REPLAY 0 | ||||||
|  | `define HPTW_WRITES_SUPPORTED 1 | ||||||
|  | |||||||
| @ -132,3 +132,4 @@ | |||||||
| `define TESTSBP 1 | `define TESTSBP 1 | ||||||
| 
 | 
 | ||||||
| `define REPLAY 0 | `define REPLAY 0 | ||||||
|  | `define HPTW_WRITES_SUPPORTED 1 | ||||||
|  | |||||||
| @ -130,3 +130,4 @@ | |||||||
| `define TESTSBP 0 | `define TESTSBP 0 | ||||||
| 
 | 
 | ||||||
| `define REPLAY 0 | `define REPLAY 0 | ||||||
|  | `define HPTW_WRITES_SUPPORTED 0 | ||||||
|  | |||||||
| @ -128,3 +128,4 @@ | |||||||
| `define TESTSBP 0 | `define TESTSBP 0 | ||||||
| 
 | 
 | ||||||
| `define REPLAY 0 | `define REPLAY 0 | ||||||
|  | `define HPTW_WRITES_SUPPORTED 0 | ||||||
|  | |||||||
| @ -128,3 +128,4 @@ | |||||||
| `define TESTSBP 0 | `define TESTSBP 0 | ||||||
| 
 | 
 | ||||||
| `define REPLAY 0 | `define REPLAY 0 | ||||||
|  | `define HPTW_WRITES_SUPPORTED 0 | ||||||
|  | |||||||
| @ -131,3 +131,4 @@ | |||||||
| `define TESTSBP 1 | `define TESTSBP 1 | ||||||
| 
 | 
 | ||||||
| `define REPLAY 0 | `define REPLAY 0 | ||||||
|  | `define HPTW_WRITES_SUPPORTED 0 | ||||||
|  | |||||||
| @ -131,3 +131,4 @@ | |||||||
| `define TESTSBP 0 | `define TESTSBP 0 | ||||||
| 
 | 
 | ||||||
| `define REPLAY 0 | `define REPLAY 0 | ||||||
|  | `define HPTW_WRITES_SUPPORTED 0 | ||||||
|  | |||||||
| @ -131,3 +131,4 @@ | |||||||
| `define TESTSBP 0 | `define TESTSBP 0 | ||||||
| 
 | 
 | ||||||
| `define REPLAY 0 | `define REPLAY 0 | ||||||
|  | `define HPTW_WRITES_SUPPORTED 0 | ||||||
|  | |||||||
| @ -22,7 +22,7 @@ def main(): | |||||||
|             break |             break | ||||||
|         checkpoint = checkpointList[0] |         checkpoint = checkpointList[0] | ||||||
|         logFile = logDir+"checkpoint"+str(checkpoint)+".log" |         logFile = logDir+"checkpoint"+str(checkpoint)+".log" | ||||||
|         runCommand="{\nvsim -c <<!\ndo wally-buildroot-batch.do 0 "+str(checkpoint+1)+" "+str(checkpoint)+"\n!\n} | tee "+logFile  |         runCommand="{\nvsim -c <<!\ndo wally-pipelined-batch.do buildroot buildroot 0 "+str(checkpoint+1)+" "+str(checkpoint)+"\n!\n} | tee "+logFile  | ||||||
|         print(runCommand) |         print(runCommand) | ||||||
|         os.system(runCommand) |         os.system(runCommand) | ||||||
|         try: |         try: | ||||||
|  | |||||||
| @ -192,200 +192,205 @@ add wave -noupdate -group ifu -expand -group icache -expand -group memory /testb | |||||||
| add wave -noupdate -group ifu -expand -group itlb /testbench/dut/core/ifu/immu/immu/TLBWrite | add wave -noupdate -group ifu -expand -group itlb /testbench/dut/core/ifu/immu/immu/TLBWrite | ||||||
| add wave -noupdate -group ifu -expand -group itlb /testbench/dut/core/ifu/ITLBMissF | add wave -noupdate -group ifu -expand -group itlb /testbench/dut/core/ifu/ITLBMissF | ||||||
| add wave -noupdate -group ifu -expand -group itlb /testbench/dut/core/ifu/immu/immu/PhysicalAddress | add wave -noupdate -group ifu -expand -group itlb /testbench/dut/core/ifu/immu/immu/PhysicalAddress | ||||||
| add wave -noupdate -group lsu /testbench/dut/core/lsu/IEUAdrM | add wave -noupdate -expand -group lsu /testbench/dut/core/lsu/IEUAdrM | ||||||
| add wave -noupdate -group lsu /testbench/dut/core/lsu/LSUPAdrM | add wave -noupdate -expand -group lsu /testbench/dut/core/lsu/LSUPAdrM | ||||||
| add wave -noupdate -group lsu -color Gold /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/interlockfsm/InterlockCurrState | add wave -noupdate -expand -group lsu -color Gold /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/interlockfsm/InterlockCurrState | ||||||
| add wave -noupdate -group lsu /testbench/dut/core/lsu/SelHPTW | add wave -noupdate -expand -group lsu /testbench/dut/core/lsu/SelHPTW | ||||||
| add wave -noupdate -group lsu /testbench/dut/core/lsu/InterlockStall | add wave -noupdate -expand -group lsu /testbench/dut/core/lsu/InterlockStall | ||||||
| add wave -noupdate -group lsu /testbench/dut/core/lsu/LSUStallM | add wave -noupdate -expand -group lsu /testbench/dut/core/lsu/LSUStallM | ||||||
| add wave -noupdate -group lsu /testbench/dut/core/lsu/ReadDataWordMuxM | add wave -noupdate -expand -group lsu /testbench/dut/core/lsu/ReadDataWordMuxM | ||||||
| add wave -noupdate -group lsu /testbench/dut/core/lsu/ReadDataM | add wave -noupdate -expand -group lsu /testbench/dut/core/lsu/ReadDataM | ||||||
| add wave -noupdate -group lsu /testbench/dut/core/lsu/WriteDataM | add wave -noupdate -expand -group lsu /testbench/dut/core/lsu/WriteDataM | ||||||
| add wave -noupdate -group lsu /testbench/dut/core/lsu/bus/busdp/SelUncachedAdr | add wave -noupdate -expand -group lsu /testbench/dut/core/lsu/bus/busdp/SelUncachedAdr | ||||||
| add wave -noupdate -group lsu -group bus -color Gold /testbench/dut/core/lsu/bus/busdp/busfsm/BusCurrState | add wave -noupdate -expand -group lsu -group bus -color Gold /testbench/dut/core/lsu/bus/busdp/busfsm/BusCurrState | ||||||
| add wave -noupdate -group lsu -group bus /testbench/dut/core/lsu/BusStall | add wave -noupdate -expand -group lsu -group bus /testbench/dut/core/lsu/BusStall | ||||||
| add wave -noupdate -group lsu -group bus /testbench/dut/core/lsu/LSUBusRead | add wave -noupdate -expand -group lsu -group bus /testbench/dut/core/lsu/LSUBusRead | ||||||
| add wave -noupdate -group lsu -group bus /testbench/dut/core/lsu/LSUBusWrite | add wave -noupdate -expand -group lsu -group bus /testbench/dut/core/lsu/LSUBusWrite | ||||||
| add wave -noupdate -group lsu -group bus /testbench/dut/core/lsu/LSUBusAdr | add wave -noupdate -expand -group lsu -group bus /testbench/dut/core/lsu/LSUBusAdr | ||||||
| add wave -noupdate -group lsu -group bus /testbench/dut/core/lsu/LSUBusAck | add wave -noupdate -expand -group lsu -group bus /testbench/dut/core/lsu/LSUBusAck | ||||||
| add wave -noupdate -group lsu -group bus /testbench/dut/core/lsu/LSUBusHRDATA | add wave -noupdate -expand -group lsu -group bus /testbench/dut/core/lsu/LSUBusHRDATA | ||||||
| add wave -noupdate -group lsu -group bus /testbench/dut/core/lsu/LSUBusHWDATA | add wave -noupdate -expand -group lsu -group bus /testbench/dut/core/lsu/LSUBusHWDATA | ||||||
| add wave -noupdate -group lsu -group dcache -color Gold /testbench/dut/core/lsu/bus/dcache/dcache/cachefsm/CurrState | add wave -noupdate -expand -group lsu -expand -group dcache -color Gold /testbench/dut/core/lsu/bus/dcache/dcache/cachefsm/CurrState | ||||||
| add wave -noupdate -group lsu -group dcache /testbench/dut/core/lsu/bus/dcache/dcache/HitWay | add wave -noupdate -expand -group lsu -expand -group dcache /testbench/dut/core/lsu/bus/dcache/dcache/HitWay | ||||||
| add wave -noupdate -group lsu -group dcache /testbench/dut/core/lsu/bus/dcache/dcache/SetValid | add wave -noupdate -expand -group lsu -expand -group dcache /testbench/dut/core/lsu/bus/dcache/dcache/SetValid | ||||||
| add wave -noupdate -group lsu -group dcache /testbench/dut/core/lsu/bus/dcache/dcache/SetDirty | add wave -noupdate -expand -group lsu -expand -group dcache /testbench/dut/core/lsu/bus/dcache/dcache/SetDirty | ||||||
| add wave -noupdate -group lsu -group dcache /testbench/dut/core/lsu/bus/dcache/dcache/SelAdr | add wave -noupdate -expand -group lsu -expand -group dcache /testbench/dut/core/lsu/bus/dcache/dcache/SelAdr | ||||||
| add wave -noupdate -group lsu -group dcache /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/SelReplayCPURequest | add wave -noupdate -expand -group lsu -expand -group dcache /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/SelReplayCPURequest | ||||||
| add wave -noupdate -group lsu -group dcache /testbench/dut/core/lsu/IEUAdrE | add wave -noupdate -expand -group lsu -expand -group dcache /testbench/dut/core/lsu/IEUAdrE | ||||||
| add wave -noupdate -group lsu -group dcache /testbench/dut/core/lsu/IEUAdrM | add wave -noupdate -expand -group lsu -expand -group dcache /testbench/dut/core/lsu/IEUAdrM | ||||||
| add wave -noupdate -group lsu -group dcache /testbench/dut/core/lsu/bus/dcache/dcache/RAdr | add wave -noupdate -expand -group lsu -expand -group dcache /testbench/dut/core/lsu/bus/dcache/dcache/RAdr | ||||||
| add wave -noupdate -group lsu -group dcache {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/RAdrD} | add wave -noupdate -expand -group lsu -expand -group dcache {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/RAdrD} | ||||||
| add wave -noupdate -group lsu -group dcache {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/ClearDirtyWay} | add wave -noupdate -expand -group lsu -expand -group dcache {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/ClearDirtyWay} | ||||||
| add wave -noupdate -group lsu -group dcache {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/Dirty} | add wave -noupdate -expand -group lsu -expand -group dcache {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/Dirty} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group flush -radix unsigned /testbench/dut/core/lsu/bus/dcache/dcache/FlushAdr | add wave -noupdate -expand -group lsu -expand -group dcache -expand -group flush -radix unsigned /testbench/dut/core/lsu/bus/dcache/dcache/FlushAdr | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group flush /testbench/dut/core/lsu/bus/dcache/dcache/FlushWay | add wave -noupdate -expand -group lsu -expand -group dcache -expand -group flush /testbench/dut/core/lsu/bus/dcache/dcache/FlushWay | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group flush /testbench/dut/core/lsu/bus/dcache/dcache/VictimDirtyWay | add wave -noupdate -expand -group lsu -expand -group dcache -expand -group flush /testbench/dut/core/lsu/bus/dcache/dcache/VictimDirtyWay | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group flush /testbench/dut/core/lsu/bus/dcache/dcache/VictimTag | add wave -noupdate -expand -group lsu -expand -group dcache -expand -group flush /testbench/dut/core/lsu/bus/dcache/dcache/VictimTag | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group flush /testbench/dut/core/lsu/CacheableM | add wave -noupdate -expand -group lsu -expand -group dcache -expand -group flush /testbench/dut/core/lsu/CacheableM | ||||||
| add wave -noupdate -group lsu -group dcache /testbench/dut/core/lsu/bus/dcache/dcache/CacheBusWriteData | add wave -noupdate -expand -group lsu -expand -group dcache /testbench/dut/core/lsu/bus/dcache/dcache/CacheBusWriteData | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} /testbench/dut/core/lsu/bus/dcache/dcache/ClearDirty | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} /testbench/dut/core/lsu/bus/dcache/dcache/ClearDirty | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/SelectedWriteWordEn} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/SelectedWriteWordEn} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/SetValidWay} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/SetValidWay} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/SetDirtyWay} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/SetDirtyWay} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way0 -label TAG {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/CacheTagMem/StoredData} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way0 -label TAG {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/CacheTagMem/StoredData} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/DirtyBits} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/DirtyBits} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/ValidBits} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/ValidBits} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[0]/CacheDataMem/StoredData} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way0 -expand -group Way0Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[0]/CacheDataMem/StoredData} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[0]/CacheDataMem/WriteEnable} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way0 -expand -group Way0Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[0]/CacheDataMem/WriteEnable} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[1]/CacheDataMem/StoredData} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way0 -expand -group Way0Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[1]/CacheDataMem/StoredData} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[1]/CacheDataMem/WriteEnable} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way0 -expand -group Way0Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[1]/CacheDataMem/WriteEnable} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[2]/CacheDataMem/WriteEnable} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way0 -expand -group Way0Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[2]/CacheDataMem/WriteEnable} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[2]/CacheDataMem/StoredData} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way0 -expand -group Way0Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[2]/CacheDataMem/StoredData} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[3]/CacheDataMem/WriteEnable} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way0 -expand -group Way0Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[3]/CacheDataMem/WriteEnable} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[3]/CacheDataMem/StoredData} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way0 -expand -group Way0Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[3]/CacheDataMem/StoredData} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/SelectedWriteWordEn} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/SelectedWriteWordEn} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/SetValidWay} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/SetValidWay} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/SetDirtyWay} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/SetDirtyWay} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way1 -label TAG {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/CacheTagMem/StoredData} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -label TAG {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/CacheTagMem/StoredData} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/DirtyBits} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/DirtyBits} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/ValidBits} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/ValidBits} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way1 -expand -group Way1Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[0]/CacheDataMem/StoredData} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -expand -group Way1Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[0]/CacheDataMem/StoredData} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way1 -expand -group Way1Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[0]/CacheDataMem/WriteEnable} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -expand -group Way1Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[0]/CacheDataMem/WriteEnable} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way1 -expand -group Way1Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[1]/CacheDataMem/StoredData} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -expand -group Way1Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[1]/CacheDataMem/StoredData} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way1 -expand -group Way1Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[1]/CacheDataMem/WriteEnable} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -expand -group Way1Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[1]/CacheDataMem/WriteEnable} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way1 -expand -group Way1Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[2]/CacheDataMem/WriteEnable} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -expand -group Way1Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[2]/CacheDataMem/WriteEnable} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way1 -expand -group Way1Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[2]/CacheDataMem/StoredData} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -expand -group Way1Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[2]/CacheDataMem/StoredData} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way1 -expand -group Way1Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[3]/CacheDataMem/WriteEnable} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -expand -group Way1Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[3]/CacheDataMem/WriteEnable} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way1 -expand -group Way1Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[3]/CacheDataMem/StoredData} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -expand -group Way1Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[3]/CacheDataMem/StoredData} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/SelectedWriteWordEn} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/SelectedWriteWordEn} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/SetValidWay} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/SetValidWay} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/SetDirtyWay} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/SetDirtyWay} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way2 -label TAG {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/CacheTagMem/StoredData} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way2 -label TAG {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/CacheTagMem/StoredData} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/DirtyBits} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/DirtyBits} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/ValidBits} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/ValidBits} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way2 -expand -group Way2Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[0]/CacheDataMem/StoredData} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way2 -expand -group Way2Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[0]/CacheDataMem/StoredData[69]} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way2 -expand -group Way2Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[0]/CacheDataMem/WriteEnable} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way2 -expand -group Way2Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[0]/CacheDataMem/StoredData} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way2 -expand -group Way2Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[1]/CacheDataMem/StoredData} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way2 -expand -group Way2Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[0]/CacheDataMem/WriteEnable} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way2 -expand -group Way2Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[1]/CacheDataMem/WriteEnable} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way2 -expand -group Way2Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[1]/CacheDataMem/StoredData} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way2 -expand -group Way2Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[2]/CacheDataMem/WriteEnable} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way2 -expand -group Way2Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[1]/CacheDataMem/WriteEnable} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way2 -expand -group Way2Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[2]/CacheDataMem/StoredData} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way2 -expand -group Way2Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[2]/CacheDataMem/WriteEnable} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way2 -expand -group Way2Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[3]/CacheDataMem/WriteEnable} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way2 -expand -group Way2Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[2]/CacheDataMem/StoredData} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way2 -expand -group Way2Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[3]/CacheDataMem/StoredData} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way2 -expand -group Way2Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[3]/CacheDataMem/WriteEnable} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/SelectedWriteWordEn} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way2 -expand -group Way2Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[3]/CacheDataMem/StoredData} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/SetValidWay} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/SelectedWriteWordEn} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/SetDirtyWay} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/SetValidWay} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way3 -label TAG {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/CacheTagMem/StoredData} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/SetDirtyWay} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/DirtyBits} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -label TAG {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/CacheTagMem/StoredData} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/ValidBits} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/DirtyBits} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way3 -expand -group Way3Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[0]/CacheDataMem/StoredData} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/ValidBits} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way3 -expand -group Way3Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[0]/CacheDataMem/WriteEnable} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -expand -group Way3Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[0]/CacheDataMem/StoredData} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way3 -expand -group Way3Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[0]/CacheDataMem/StoredData} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -expand -group Way3Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[0]/CacheDataMem/WriteEnable} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way3 -expand -group Way3Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[0]/CacheDataMem/WriteEnable} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -expand -group Way3Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[0]/CacheDataMem/StoredData} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way3 -expand -group Way3Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[1]/CacheDataMem/StoredData} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -expand -group Way3Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[0]/CacheDataMem/WriteEnable} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way3 -expand -group Way3Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[1]/CacheDataMem/WriteEnable} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -expand -group Way3Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[1]/CacheDataMem/StoredData} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way3 -expand -group Way3Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[1]/CacheDataMem/StoredData} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -expand -group Way3Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[1]/CacheDataMem/WriteEnable} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way3 -expand -group Way3Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[1]/CacheDataMem/WriteEnable} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -expand -group Way3Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[1]/CacheDataMem/StoredData} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way3 -expand -group Way3Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[2]/CacheDataMem/WriteEnable} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -expand -group Way3Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[1]/CacheDataMem/WriteEnable} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way3 -expand -group Way3Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[2]/CacheDataMem/StoredData} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -expand -group Way3Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[2]/CacheDataMem/WriteEnable} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way3 -expand -group Way3Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[2]/CacheDataMem/WriteEnable} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -expand -group Way3Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[2]/CacheDataMem/StoredData} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way3 -expand -group Way3Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[2]/CacheDataMem/StoredData} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -expand -group Way3Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[2]/CacheDataMem/WriteEnable} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way3 -expand -group Way3Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[3]/CacheDataMem/WriteEnable} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -expand -group Way3Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[2]/CacheDataMem/StoredData} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way3 -expand -group Way3Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[3]/CacheDataMem/StoredData} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -expand -group Way3Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[3]/CacheDataMem/WriteEnable} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way3 -expand -group Way3Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[3]/CacheDataMem/WriteEnable} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -expand -group Way3Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[3]/CacheDataMem/StoredData} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -expand -group way3 -expand -group Way3Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[3]/CacheDataMem/StoredData} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -expand -group Way3Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[3]/CacheDataMem/WriteEnable} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group valid/dirty /testbench/dut/core/lsu/bus/dcache/dcache/SetValid | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -expand -group Way3Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[3]/CacheDataMem/StoredData} | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group valid/dirty /testbench/dut/core/lsu/bus/dcache/dcache/ClearValid | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group valid/dirty /testbench/dut/core/lsu/bus/dcache/dcache/SetValid | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group valid/dirty /testbench/dut/core/lsu/bus/dcache/dcache/SetDirty | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group valid/dirty /testbench/dut/core/lsu/bus/dcache/dcache/ClearValid | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group valid/dirty /testbench/dut/core/lsu/bus/dcache/dcache/ClearDirty | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group valid/dirty /testbench/dut/core/lsu/bus/dcache/dcache/SetDirty | ||||||
| add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} /testbench/dut/core/lsu/bus/dcache/dcache/RAdr | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group valid/dirty /testbench/dut/core/lsu/bus/dcache/dcache/ClearDirty | ||||||
| add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/HitWay} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} /testbench/dut/core/lsu/bus/dcache/dcache/RAdr | ||||||
| add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/Valid} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/HitWay} | ||||||
| add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/Dirty} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/Valid} | ||||||
| add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/ReadTag} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/Dirty} | ||||||
| add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/HitWay} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/ReadTag} | ||||||
| add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/Valid} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/HitWay} | ||||||
| add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/Dirty} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/Valid} | ||||||
| add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/ReadTag} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/Dirty} | ||||||
| add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/HitWay} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/ReadTag} | ||||||
| add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/Valid} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -expand -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/HitWay} | ||||||
| add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/Dirty} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -expand -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/Valid} | ||||||
| add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/ReadTag} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -expand -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/Dirty} | ||||||
| add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/HitWay} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -expand -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/ReadTag} | ||||||
| add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/Valid} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/HitWay} | ||||||
| add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/Dirty} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/Valid} | ||||||
| add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/ReadTag} | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/Dirty} | ||||||
| add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} /testbench/dut/core/lsu/bus/dcache/dcache/HitWay | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/ReadTag} | ||||||
| add wave -noupdate -group lsu -group dcache -group Victim /testbench/dut/core/lsu/bus/dcache/dcache/VictimTag | add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} /testbench/dut/core/lsu/bus/dcache/dcache/HitWay | ||||||
| add wave -noupdate -group lsu -group dcache -group Victim /testbench/dut/core/lsu/bus/dcache/dcache/VictimWay | add wave -noupdate -expand -group lsu -expand -group dcache -group Victim /testbench/dut/core/lsu/bus/dcache/dcache/VictimTag | ||||||
| add wave -noupdate -group lsu -group dcache -group Victim /testbench/dut/core/lsu/bus/dcache/dcache/VictimDirtyWay | add wave -noupdate -expand -group lsu -expand -group dcache -group Victim /testbench/dut/core/lsu/bus/dcache/dcache/VictimWay | ||||||
| add wave -noupdate -group lsu -group dcache -group Victim /testbench/dut/core/lsu/bus/dcache/dcache/VictimDirty | add wave -noupdate -expand -group lsu -expand -group dcache -group Victim /testbench/dut/core/lsu/bus/dcache/dcache/VictimDirtyWay | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {CPU side} /testbench/dut/core/lsu/bus/dcache/dcache/RW | add wave -noupdate -expand -group lsu -expand -group dcache -group Victim /testbench/dut/core/lsu/bus/dcache/dcache/VictimDirty | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {CPU side} /testbench/dut/core/lsu/bus/dcache/dcache/NextAdr | add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {CPU side} /testbench/dut/core/lsu/bus/dcache/dcache/RW | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {CPU side} /testbench/dut/core/lsu/bus/dcache/dcache/PAdr | add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {CPU side} /testbench/dut/core/lsu/bus/dcache/dcache/NextAdr | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {CPU side} /testbench/dut/core/lsu/bus/dcache/dcache/Atomic | add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {CPU side} /testbench/dut/core/lsu/bus/dcache/dcache/PAdr | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {CPU side} /testbench/dut/core/lsu/bus/dcache/dcache/FlushCache | add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {CPU side} /testbench/dut/core/lsu/bus/dcache/dcache/Atomic | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {CPU side} /testbench/dut/core/lsu/bus/dcache/dcache/CacheStall | add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {CPU side} /testbench/dut/core/lsu/bus/dcache/dcache/FlushCache | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {CPU side} /testbench/dut/core/lsu/ReadDataWordM | add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {CPU side} /testbench/dut/core/lsu/bus/dcache/dcache/CacheStall | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {CPU side} /testbench/dut/core/lsu/FinalWriteDataM | add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {CPU side} /testbench/dut/core/lsu/ReadDataWordM | ||||||
| add wave -noupdate -group lsu -group dcache -group status /testbench/dut/core/lsu/bus/dcache/dcache/HitWay | add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {CPU side} /testbench/dut/core/lsu/FinalWriteDataM | ||||||
| add wave -noupdate -group lsu -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 /testbench/dut/core/lsu/bus/dcache/dcache/HitWay | ||||||
| add wave -noupdate -group lsu -group dcache -expand -group {Memory Side} /testbench/dut/core/lsu/bus/dcache/dcache/CacheFetchLine | 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 -group lsu -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/CacheFetchLine | ||||||
| add wave -noupdate -group lsu -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/CacheWriteLine | ||||||
| add wave -noupdate -group lsu -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/CacheBusWriteData | ||||||
| add wave -noupdate -group lsu -group dcache /testbench/dut/core/lsu/bus/dcache/dcache/FlushWay | add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Memory Side} /testbench/dut/core/lsu/bus/dcache/dcache/CacheBusAck | ||||||
| add wave -noupdate -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/VAdr | add wave -noupdate -expand -group lsu -expand -group dcache /testbench/dut/core/lsu/bus/dcache/dcache/FlushWay | ||||||
| add wave -noupdate -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/VAdr | ||||||
| add wave -noupdate -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/PTE | add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/EffectivePrivilegeMode | ||||||
| add wave -noupdate -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/HitPageType | add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/PTE | ||||||
| add wave -noupdate -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/Translate | add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/HitPageType | ||||||
| add wave -noupdate -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/DisableTranslation | add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/Translate | ||||||
| add wave -noupdate -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/TLBMiss | add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/DisableTranslation | ||||||
| add wave -noupdate -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/TLBHit | add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/TLBMiss | ||||||
| add wave -noupdate -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/PhysicalAddress | add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/TLBHit | ||||||
| add wave -noupdate -group lsu -group dtlb -expand -group faults /testbench/dut/core/lsu/dmmu/dmmu/TLBPageFault | add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/PhysicalAddress | ||||||
| add wave -noupdate -group lsu -group dtlb -expand -group faults /testbench/dut/core/lsu/dmmu/dmmu/LoadAccessFaultM | add wave -noupdate -expand -group lsu -group dtlb -expand -group Status /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/PTE_D | ||||||
| add wave -noupdate -group lsu -group dtlb -expand -group faults /testbench/dut/core/lsu/dmmu/dmmu/StoreAmoAccessFaultM | add wave -noupdate -expand -group lsu -group dtlb -expand -group Status /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/PTE_A | ||||||
| add wave -noupdate -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/TLBPAdr | add wave -noupdate -expand -group lsu -group dtlb -expand -group Status /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/PTE_U | ||||||
| add wave -noupdate -group lsu -group dtlb -expand -group write /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/PTE | add wave -noupdate -expand -group lsu -group dtlb -expand -group Status /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/PTE_X | ||||||
| add wave -noupdate -group lsu -group dtlb -expand -group write /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/PageTypeWriteVal | add wave -noupdate -expand -group lsu -group dtlb -expand -group Status /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/PTE_W | ||||||
| add wave -noupdate -group lsu -group dtlb -expand -group write /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/TLBWrite | add wave -noupdate -expand -group lsu -group dtlb -expand -group Status /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/PTE_R | ||||||
| add wave -noupdate -group lsu -group dtlb -group {dtlb stats} /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/ImproperPrivilege | add wave -noupdate -expand -group lsu -group dtlb -expand -group Status /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/PTE_V | ||||||
| add wave -noupdate -group lsu -group dtlb -group {dtlb stats} /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/PTE_D | add wave -noupdate -expand -group lsu -group dtlb -expand -group Status -color Maroon /testbench/dut/core/lsu/dmmu/dmmu/DAPageFault | ||||||
| add wave -noupdate -group lsu -group dtlb -group {dtlb stats} /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/PTE_A | add wave -noupdate -expand -group lsu -group dtlb -expand -group Status /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/ImproperPrivilege | ||||||
| add wave -noupdate -group lsu -group dtlb -group {dtlb stats} /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/PTE_U | add wave -noupdate -expand -group lsu -group dtlb -expand -group Status /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/UpperBitsUnequalPageFault | ||||||
| add wave -noupdate -group lsu -group dtlb -group {dtlb stats} /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/PTE_X | add wave -noupdate -expand -group lsu -group dtlb -expand -group Status /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/Misaligned | ||||||
| add wave -noupdate -group lsu -group dtlb -group {dtlb stats} /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/PTE_W | add wave -noupdate -expand -group lsu -group dtlb -expand -group Status /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/dtlb/InvalidRead | ||||||
| add wave -noupdate -group lsu -group dtlb -group {dtlb stats} /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/PTE_R | add wave -noupdate -expand -group lsu -group dtlb -expand -group Status /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/dtlb/InvalidWrite | ||||||
| add wave -noupdate -group lsu -group dtlb -group {dtlb stats} /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/PTE_V | add wave -noupdate -expand -group lsu -group dtlb -group faults /testbench/dut/core/lsu/dmmu/dmmu/TLBPageFault | ||||||
| add wave -noupdate -group lsu -group dtlb -group {dtlb stats} /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/UpperBitsUnequalPageFault | add wave -noupdate -expand -group lsu -group dtlb -group faults /testbench/dut/core/lsu/dmmu/dmmu/LoadAccessFaultM | ||||||
| add wave -noupdate -group lsu -group dtlb -group {dtlb stats} /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/Misaligned | add wave -noupdate -expand -group lsu -group dtlb -group faults /testbench/dut/core/lsu/dmmu/dmmu/StoreAmoAccessFaultM | ||||||
| add wave -noupdate -group lsu -group pma /testbench/dut/core/lsu/dmmu/dmmu/pmachecker/PhysicalAddress | add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/TLBPAdr | ||||||
| add wave -noupdate -group lsu -group pma /testbench/dut/core/lsu/dmmu/dmmu/pmachecker/SelRegions | add wave -noupdate -expand -group lsu -group dtlb -group write /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/PTE | ||||||
| add wave -noupdate -group lsu -group pma /testbench/dut/core/lsu/dmmu/dmmu/Cacheable | add wave -noupdate -expand -group lsu -group dtlb -group write /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/PageTypeWriteVal | ||||||
| add wave -noupdate -group lsu -group pma /testbench/dut/core/lsu/dmmu/dmmu/Idempotent | add wave -noupdate -expand -group lsu -group dtlb -group write /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/TLBWrite | ||||||
| add wave -noupdate -group lsu -group pma /testbench/dut/core/lsu/dmmu/dmmu/AtomicAllowed | add wave -noupdate -expand -group lsu -group pma /testbench/dut/core/lsu/dmmu/dmmu/pmachecker/PhysicalAddress | ||||||
| add wave -noupdate -group lsu -group pma /testbench/dut/core/lsu/dmmu/dmmu/pmachecker/PMAAccessFault | add wave -noupdate -expand -group lsu -group pma /testbench/dut/core/lsu/dmmu/dmmu/pmachecker/SelRegions | ||||||
| add wave -noupdate -group lsu -group pma /testbench/dut/core/lsu/dmmu/dmmu/PMAInstrAccessFaultF | add wave -noupdate -expand -group lsu -group pma /testbench/dut/core/lsu/dmmu/dmmu/Cacheable | ||||||
| add wave -noupdate -group lsu -group pma /testbench/dut/core/lsu/dmmu/dmmu/PMALoadAccessFaultM | add wave -noupdate -expand -group lsu -group pma /testbench/dut/core/lsu/dmmu/dmmu/Idempotent | ||||||
| add wave -noupdate -group lsu -group pma /testbench/dut/core/lsu/dmmu/dmmu/PMAStoreAmoAccessFaultM | add wave -noupdate -expand -group lsu -group pma /testbench/dut/core/lsu/dmmu/dmmu/AtomicAllowed | ||||||
| add wave -noupdate -group lsu -group pmp /testbench/dut/core/lsu/dmmu/dmmu/pmpchecker/PhysicalAddress | add wave -noupdate -expand -group lsu -group pma /testbench/dut/core/lsu/dmmu/dmmu/pmachecker/PMAAccessFault | ||||||
| add wave -noupdate -group lsu -group pmp /testbench/dut/core/lsu/dmmu/dmmu/pmpchecker/ReadAccessM | add wave -noupdate -expand -group lsu -group pma /testbench/dut/core/lsu/dmmu/dmmu/PMAInstrAccessFaultF | ||||||
| add wave -noupdate -group lsu -group pmp /testbench/dut/core/lsu/dmmu/dmmu/pmpchecker/WriteAccessM | add wave -noupdate -expand -group lsu -group pma /testbench/dut/core/lsu/dmmu/dmmu/PMALoadAccessFaultM | ||||||
| add wave -noupdate -group lsu -group pmp /testbench/dut/core/lsu/dmmu/dmmu/pmpchecker/PMPADDR_ARRAY_REGW | add wave -noupdate -expand -group lsu -group pma /testbench/dut/core/lsu/dmmu/dmmu/PMAStoreAmoAccessFaultM | ||||||
| add wave -noupdate -group lsu -group pmp /testbench/dut/core/lsu/dmmu/dmmu/pmpchecker/PMPCFG_ARRAY_REGW | add wave -noupdate -expand -group lsu -group pmp /testbench/dut/core/lsu/dmmu/dmmu/pmpchecker/PhysicalAddress | ||||||
| add wave -noupdate -group lsu -group pmp /testbench/dut/core/lsu/dmmu/dmmu/PMPInstrAccessFaultF | add wave -noupdate -expand -group lsu -group pmp /testbench/dut/core/lsu/dmmu/dmmu/pmpchecker/ReadAccessM | ||||||
| add wave -noupdate -group lsu -group pmp /testbench/dut/core/lsu/dmmu/dmmu/PMPLoadAccessFaultM | add wave -noupdate -expand -group lsu -group pmp /testbench/dut/core/lsu/dmmu/dmmu/pmpchecker/WriteAccessM | ||||||
| add wave -noupdate -group lsu -group pmp /testbench/dut/core/lsu/dmmu/dmmu/PMPStoreAmoAccessFaultM | add wave -noupdate -expand -group lsu -group pmp /testbench/dut/core/lsu/dmmu/dmmu/pmpchecker/PMPADDR_ARRAY_REGW | ||||||
| add wave -noupdate -group lsu -group ptwalker -color Gold /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/WalkerState | add wave -noupdate -expand -group lsu -group pmp /testbench/dut/core/lsu/dmmu/dmmu/pmpchecker/PMPCFG_ARRAY_REGW | ||||||
| add wave -noupdate -group lsu -group ptwalker /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/PCF | add wave -noupdate -expand -group lsu -group pmp /testbench/dut/core/lsu/dmmu/dmmu/PMPInstrAccessFaultF | ||||||
| add wave -noupdate -group lsu -group ptwalker /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/HPTWReadPTE | add wave -noupdate -expand -group lsu -group pmp /testbench/dut/core/lsu/dmmu/dmmu/PMPLoadAccessFaultM | ||||||
| add wave -noupdate -group lsu -group ptwalker /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/HPTWAdr | add wave -noupdate -expand -group lsu -group pmp /testbench/dut/core/lsu/dmmu/dmmu/PMPStoreAmoAccessFaultM | ||||||
| add wave -noupdate -group lsu -group ptwalker /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/PTE | add wave -noupdate -expand -group lsu -expand -group ptwalker -color Gold /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/WalkerState | ||||||
| add wave -noupdate -group lsu -group ptwalker -group types /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/ITLBMissF | add wave -noupdate -expand -group lsu -expand -group ptwalker /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/PCF | ||||||
| add wave -noupdate -group lsu -group ptwalker -group types /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/DTLBMissM | add wave -noupdate -expand -group lsu -expand -group ptwalker /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/HPTWReadPTE | ||||||
| add wave -noupdate -group lsu -group ptwalker -group types /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/ITLBWriteF | add wave -noupdate -expand -group lsu -expand -group ptwalker /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/HPTWAdr | ||||||
| add wave -noupdate -group lsu -group ptwalker -group types /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/DTLBWriteM | add wave -noupdate -expand -group lsu -expand -group ptwalker /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/PTE | ||||||
|  | add wave -noupdate -expand -group lsu -expand -group ptwalker -expand -group types /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/ITLBMissF | ||||||
|  | add wave -noupdate -expand -group lsu -expand -group ptwalker -expand -group types /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/ITLBMissOrDAFaultF | ||||||
|  | add wave -noupdate -expand -group lsu -expand -group ptwalker -expand -group types /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/DTLBMissM | ||||||
|  | add wave -noupdate -expand -group lsu -expand -group ptwalker -expand -group types /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/ITLBWriteF | ||||||
|  | add wave -noupdate -expand -group lsu -expand -group ptwalker -expand -group types /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/DTLBWriteM | ||||||
| add wave -noupdate -group AHB -color Gold /testbench/dut/core/ebu/BusState | add wave -noupdate -group AHB -color Gold /testbench/dut/core/ebu/BusState | ||||||
| add wave -noupdate -group AHB /testbench/dut/core/ebu/NextBusState | add wave -noupdate -group AHB /testbench/dut/core/ebu/NextBusState | ||||||
| add wave -noupdate -group AHB -expand -group {input requests} /testbench/dut/core/ebu/AtomicMaskedM | add wave -noupdate -group AHB -expand -group {input requests} /testbench/dut/core/ebu/AtomicMaskedM | ||||||
| @ -520,9 +525,15 @@ add wave -noupdate /testbench/dut/core/ifu/SpillSupport/spillsupport/CurrState | |||||||
| add wave -noupdate /testbench/dut/core/ifu/SpillSupport/spillsupport/TakeSpillF | add wave -noupdate /testbench/dut/core/ifu/SpillSupport/spillsupport/TakeSpillF | ||||||
| add wave -noupdate /testbench/dut/core/ifu/SpillSupport/spillsupport/SpillF | add wave -noupdate /testbench/dut/core/ifu/SpillSupport/spillsupport/SpillF | ||||||
| add wave -noupdate /testbench/dut/core/ifu/SpillSupport/spillsupport/IFUCacheBusStallF | add wave -noupdate /testbench/dut/core/ifu/SpillSupport/spillsupport/IFUCacheBusStallF | ||||||
|  | add wave -noupdate -color Yellow /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/DAPageFault | ||||||
|  | add wave -noupdate /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/OtherPageFault | ||||||
|  | add wave -noupdate /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/ITLBMissF | ||||||
|  | add wave -noupdate /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/Accessed | ||||||
|  | add wave -noupdate /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/WriteAccess | ||||||
|  | add wave -noupdate /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/TLBPageFault | ||||||
| TreeUpdate [SetDefaultTree] | TreeUpdate [SetDefaultTree] | ||||||
| WaveRestoreCursors {{Cursor 7} {14114436 ns} 0} {{Cursor 5} {49445 ns} 1} {{Cursor 3} {235459 ns} 1} {{Cursor 4} {217231 ns} 1} | WaveRestoreCursors {{Cursor 7} {62997113 ns} 1} {{Cursor 5} {65676608 ns} 1} {{Cursor 3} {65665947 ns} 1} {{Cursor 4} {65431218 ns} 0} | ||||||
| quietly wave cursor active 1 | quietly wave cursor active 4 | ||||||
| configure wave -namecolwidth 250 | configure wave -namecolwidth 250 | ||||||
| configure wave -valuecolwidth 314 | configure wave -valuecolwidth 314 | ||||||
| configure wave -justifyvalue left | configure wave -justifyvalue left | ||||||
| @ -537,4 +548,4 @@ configure wave -griddelta 40 | |||||||
| configure wave -timeline 0 | configure wave -timeline 0 | ||||||
| configure wave -timelineunits ns | configure wave -timelineunits ns | ||||||
| update | update | ||||||
| WaveRestoreZoom {14114376 ns} {14114586 ns} | WaveRestoreZoom {65430777 ns} {65431305 ns} | ||||||
|  | |||||||
| @ -36,7 +36,7 @@ if {$2 eq "buildroot" || $2 eq "buildroot-checkpoint"} { | |||||||
|     vlog -lint -work work_${1}_${2} +incdir+../config/$1 +incdir+../config/shared ../testbench/testbench-linux.sv ../testbench/common/*.sv ../src/*/*.sv ../src/*/*/*.sv -suppress 2583 |     vlog -lint -work work_${1}_${2} +incdir+../config/$1 +incdir+../config/shared ../testbench/testbench-linux.sv ../testbench/common/*.sv ../src/*/*.sv ../src/*/*/*.sv -suppress 2583 | ||||||
|     # start and run simulation |     # start and run simulation | ||||||
|     vopt work_${1}_${2}.testbench -work work_${1}_${2} -G INSTR_LIMIT=$3 -G INSTR_WAVEON=$4 -G CHECKPOINT=$5 -o testbenchopt  |     vopt work_${1}_${2}.testbench -work work_${1}_${2} -G INSTR_LIMIT=$3 -G INSTR_WAVEON=$4 -G CHECKPOINT=$5 -o testbenchopt  | ||||||
|     vsim -lib work_${1}_${2} testbenchopt -suppress 8852,12070 |     vsim -lib work_${1}_${2} testbenchopt -suppress 8852,12070,3084 | ||||||
| 
 | 
 | ||||||
|     run -all |     run -all | ||||||
|     run -all |     run -all | ||||||
|  | |||||||
| @ -35,7 +35,7 @@ if {$2 eq "buildroot" || $2 eq "buildroot-checkpoint"} { | |||||||
|     vlog -lint -work work_${1}_${2} +incdir+../config/$1 +incdir+../config/shared ../testbench/testbench-linux.sv ../testbench/common/*.sv ../src/*/*.sv ../src/*/*/*.sv -suppress 2583 |     vlog -lint -work work_${1}_${2} +incdir+../config/$1 +incdir+../config/shared ../testbench/testbench-linux.sv ../testbench/common/*.sv ../src/*/*.sv ../src/*/*/*.sv -suppress 2583 | ||||||
|     # start and run simulation |     # start and run simulation | ||||||
|     vopt +acc work_${1}_${2}.testbench -work work_${1}_${2} -G INSTR_LIMIT=$3 -G INSTR_WAVEON=$4 -G CHECKPOINT=$5 -o testbenchopt  |     vopt +acc work_${1}_${2}.testbench -work work_${1}_${2} -G INSTR_LIMIT=$3 -G INSTR_WAVEON=$4 -G CHECKPOINT=$5 -o testbenchopt  | ||||||
|     vsim -lib work_${1}_${2} testbenchopt -suppress 8852,12070 |     vsim -lib work_${1}_${2} testbenchopt -suppress 8852,12070,3084 | ||||||
| 
 | 
 | ||||||
|     #-- Run the Simulation  |     #-- Run the Simulation  | ||||||
|     add log -recursive /* |     add log -recursive /* | ||||||
|  | |||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								pipelined/src/cache/cache.sv
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								pipelined/src/cache/cache.sv
									
									
									
									
										vendored
									
									
								
							| @ -118,7 +118,7 @@ module cache #(parameter LINELEN,  NUMLINES,  NUMWAYS, DCACHE = 1) ( | |||||||
|     .Invalidate(InvalidateCacheM)); |     .Invalidate(InvalidateCacheM)); | ||||||
|   if(NUMWAYS > 1) begin:vict |   if(NUMWAYS > 1) begin:vict | ||||||
|     cachereplacementpolicy #(NUMWAYS, SETLEN, OFFSETLEN, NUMLINES) cachereplacementpolicy( |     cachereplacementpolicy #(NUMWAYS, SETLEN, OFFSETLEN, NUMLINES) cachereplacementpolicy( | ||||||
|       .clk, .reset, .HitWay(HitWayFinal), .VictimWay, .PAdr, .RAdr, .LRUWriteEn); |       .clk, .reset, .HitWay(HitWayFinal), .VictimWay, .RAdr, .LRUWriteEn); | ||||||
|   end else assign VictimWay = 1'b1; // one hot.
 |   end else assign VictimWay = 1'b1; // one hot.
 | ||||||
|   assign CacheHit = | HitWay; |   assign CacheHit = | HitWay; | ||||||
|   assign VictimDirty = | VictimDirtyWay; |   assign VictimDirty = | VictimDirtyWay; | ||||||
|  | |||||||
| @ -34,7 +34,6 @@ module cachereplacementpolicy | |||||||
|    input logic                clk, reset, |    input logic                clk, reset, | ||||||
|    input logic [NUMWAYS-1:0]  HitWay, |    input logic [NUMWAYS-1:0]  HitWay, | ||||||
|    output logic [NUMWAYS-1:0] VictimWay, |    output logic [NUMWAYS-1:0] VictimWay, | ||||||
|    input logic [`PA_BITS-1:0] PAdr, |  | ||||||
|    input logic [SETLEN-1:0]   RAdr, |    input logic [SETLEN-1:0]   RAdr, | ||||||
|    input logic                LRUWriteEn); |    input logic                LRUWriteEn); | ||||||
| 
 | 
 | ||||||
| @ -53,7 +52,6 @@ module cachereplacementpolicy | |||||||
|    |    | ||||||
|   // Pipeline Delay Registers
 |   // Pipeline Delay Registers
 | ||||||
|   flopr #(SETLEN) RAdrDelayReg(clk, reset, RAdr, RAdrD); |   flopr #(SETLEN) RAdrDelayReg(clk, reset, RAdr, RAdrD); | ||||||
|   flopr #(SETLEN) PAdrDelayReg(clk, reset, PAdr[SETLEN+OFFSETLEN-1:OFFSETLEN], PAdrD); |  | ||||||
|   flopr #(1) LRUWriteEnDelayReg(clk, reset, LRUWriteEn, LRUWriteEnD); |   flopr #(1) LRUWriteEnDelayReg(clk, reset, LRUWriteEn, LRUWriteEnD); | ||||||
|   flopr #(NUMWAYS-1) NewReplacementDelayReg(clk, reset, NewReplacement, NewReplacementD); |   flopr #(NUMWAYS-1) NewReplacementDelayReg(clk, reset, NewReplacement, NewReplacementD); | ||||||
| 
 | 
 | ||||||
| @ -61,7 +59,7 @@ module cachereplacementpolicy | |||||||
|   // Needs to be resettable for simulation, but could omit reset for synthesis ***
 |   // Needs to be resettable for simulation, but could omit reset for synthesis ***
 | ||||||
|   always_ff @(posedge clk)  |   always_ff @(posedge clk)  | ||||||
|     if (reset) for (int set = 0; set < NUMLINES; set++) ReplacementBits[set] = '0; |     if (reset) for (int set = 0; set < NUMLINES; set++) ReplacementBits[set] = '0; | ||||||
|     else if (LRUWriteEnD) ReplacementBits[PAdrD[SETLEN+OFFSETLEN-1:OFFSETLEN]] = NewReplacementD; |     else if (LRUWriteEnD) ReplacementBits[RAdrD] = NewReplacementD; | ||||||
|   assign LineReplacementBits = ReplacementBits[RAdrD]; |   assign LineReplacementBits = ReplacementBits[RAdrD]; | ||||||
| 
 | 
 | ||||||
|   genvar 		      index; |   genvar 		      index; | ||||||
|  | |||||||
| @ -111,7 +111,7 @@ module ahblite ( | |||||||
|             else if (IFUBusRead)   NextBusState = INSTRREAD; |             else if (IFUBusRead)   NextBusState = INSTRREAD; | ||||||
|             else                   NextBusState = IDLE; |             else                   NextBusState = IDLE; | ||||||
|       INSTRREAD: if (~HREADY)      NextBusState = INSTRREAD; |       INSTRREAD: if (~HREADY)      NextBusState = INSTRREAD; | ||||||
|             else                   NextBusState = IDLE;  // if (IFUBusRead still high)
 |             else                   NextBusState = IDLE;  // if (IFUBusRead still high) *** need to wait?
 | ||||||
|       default:                     NextBusState = IDLE; |       default:                     NextBusState = IDLE; | ||||||
|     endcase |     endcase | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -49,6 +49,7 @@ module regfile ( | |||||||
|   // register 0 hardwired to 0
 |   // register 0 hardwired to 0
 | ||||||
|    |    | ||||||
|   // reset is intended for simulation only, not synthesis
 |   // reset is intended for simulation only, not synthesis
 | ||||||
|  |   // can logic be adjusted to not need resettable registers?
 | ||||||
|      |      | ||||||
|   always_ff @(negedge clk) // or posedge reset) // *** make this a preload in testbench rather than reset
 |   always_ff @(negedge clk) // or posedge reset) // *** make this a preload in testbench rather than reset
 | ||||||
|     if (reset) for(i=1; i<NUMREGS; i++) rf[i] <= 0; |     if (reset) for(i=1; i<NUMREGS; i++) rf[i] <= 0; | ||||||
|  | |||||||
| @ -75,7 +75,7 @@ module ifu ( | |||||||
| 	input logic 				STATUS_MXR, STATUS_SUM, STATUS_MPRV, | 	input logic 				STATUS_MXR, STATUS_SUM, STATUS_MPRV, | ||||||
| 	input logic [1:0] 			STATUS_MPP, | 	input logic [1:0] 			STATUS_MPP, | ||||||
| 	input logic 				ITLBWriteF, ITLBFlushF, | 	input logic 				ITLBWriteF, ITLBFlushF, | ||||||
| 	output logic 				ITLBMissF, | 	output logic 				ITLBMissF, InstrDAPageFaultF, | ||||||
|   // pmp/pma (inside mmu) signals.  *** temporarily from AHB bus but eventually replace with internal versions pre H
 |   // pmp/pma (inside mmu) signals.  *** temporarily from AHB bus but eventually replace with internal versions pre H
 | ||||||
| 	input 						var logic [7:0] PMPCFG_ARRAY_REGW[`PMP_ENTRIES-1:0], | 	input 						var logic [7:0] PMPCFG_ARRAY_REGW[`PMP_ENTRIES-1:0], | ||||||
| 	input 						var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW[`PMP_ENTRIES-1:0],  | 	input 						var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW[`PMP_ENTRIES-1:0],  | ||||||
| @ -156,6 +156,7 @@ module ifu ( | |||||||
|          .InstrAccessFaultF, .LoadAccessFaultM(), .StoreAmoAccessFaultM(), |          .InstrAccessFaultF, .LoadAccessFaultM(), .StoreAmoAccessFaultM(), | ||||||
|          .InstrPageFaultF, .LoadPageFaultM(), .StoreAmoPageFaultM(), |          .InstrPageFaultF, .LoadPageFaultM(), .StoreAmoPageFaultM(), | ||||||
|          .LoadMisalignedFaultM(), .StoreAmoMisalignedFaultM(), |          .LoadMisalignedFaultM(), .StoreAmoMisalignedFaultM(), | ||||||
|  |          .DAPageFault(InstrDAPageFaultF), | ||||||
|          .AtomicAccessM(1'b0),.ExecuteAccessF(1'b1), .WriteAccessM(1'b0), .ReadAccessM(1'b0), |          .AtomicAccessM(1'b0),.ExecuteAccessF(1'b1), .WriteAccessM(1'b0), .ReadAccessM(1'b0), | ||||||
|          .PMPCFG_ARRAY_REGW, .PMPADDR_ARRAY_REGW); |          .PMPCFG_ARRAY_REGW, .PMPADDR_ARRAY_REGW); | ||||||
| 
 | 
 | ||||||
| @ -190,20 +191,25 @@ module ifu ( | |||||||
|     logic                ICacheBusAck; |     logic                ICacheBusAck; | ||||||
|     logic                save,restore; |     logic                save,restore; | ||||||
|     logic [31:0]         temp; |     logic [31:0]         temp; | ||||||
|  |     logic                SelUncachedAdr; | ||||||
|      |      | ||||||
|     busdp #(WORDSPERLINE, LINELEN, 32, LOGWPL)  |     busdp #(WORDSPERLINE, LINELEN, LOGWPL)  | ||||||
|     busdp(.clk, .reset, |     busdp(.clk, .reset, | ||||||
|           .LSUBusHRDATA(IFUBusHRDATA), .LSUBusAck(IFUBusAck), .LSUBusWrite(), .LSUBusWriteCrit(), |           .LSUBusHRDATA(IFUBusHRDATA), .LSUBusAck(IFUBusAck), .LSUBusWrite(), .LSUBusWriteCrit(), | ||||||
|           .LSUBusRead(IFUBusRead), .LSUBusSize(),  |           .LSUBusRead(IFUBusRead), .LSUBusSize(),  | ||||||
|           .LSUFunct3M(3'b010), .LSUBusAdr(IFUBusAdr), .DCacheBusAdr(ICacheBusAdr), |           .LSUFunct3M(3'b010), .LSUBusAdr(IFUBusAdr), .DCacheBusAdr(ICacheBusAdr), | ||||||
|           .WordCount(), .LSUBusHWDATA(), |           .WordCount(),  | ||||||
|           .DCacheFetchLine(ICacheFetchLine), |           .DCacheFetchLine(ICacheFetchLine), | ||||||
|           .DCacheWriteLine(1'b0), .DCacheBusAck(ICacheBusAck),  |           .DCacheWriteLine(1'b0), .DCacheBusAck(ICacheBusAck),  | ||||||
|           .DCacheBusWriteData(ICacheBusWriteData), .LSUPAdrM(PCPF), |           .DCacheBusWriteData(ICacheBusWriteData), .LSUPAdrM(PCPF), | ||||||
|           .FinalAMOWriteDataM(), .ReadDataWordM(FinalInstrRawF), .ReadDataWordMuxM(AllInstrRawF[31:0]),  |           .FinalWriteDataM(), .SelUncachedAdr, | ||||||
|           .IgnoreRequest(ITLBMissF), .LSURWM(2'b10), .CPUBusy, .CacheableM(CacheableF), |           .IgnoreRequest(ITLBMissF), .LSURWM(2'b10), .CPUBusy, .CacheableM(CacheableF), | ||||||
|           .BusStall, .BusCommittedM()); |           .BusStall, .BusCommittedM()); | ||||||
| 
 | 
 | ||||||
|  |     mux2 #(32) UnCachedDataMux(.d0(FinalInstrRawF), .d1(ICacheBusWriteData[32-1:0]), | ||||||
|  |       .s(SelUncachedAdr), .y(AllInstrRawF[31:0])); | ||||||
|  |      | ||||||
|  | 
 | ||||||
|     if(`IMEM == `MEM_CACHE) begin : icache |     if(`IMEM == `MEM_CACHE) begin : icache | ||||||
|       logic [1:0] IFURWF; |       logic [1:0] IFURWF; | ||||||
|       assign IFURWF = CacheableF ? 2'b10 : 2'b00; |       assign IFURWF = CacheableF ? 2'b10 : 2'b00; | ||||||
|  | |||||||
| @ -34,7 +34,7 @@ | |||||||
| 
 | 
 | ||||||
| `include "wally-config.vh" | `include "wally-config.vh" | ||||||
| 
 | 
 | ||||||
| module busdp #(parameter WORDSPERLINE, LINELEN, WORDLEN, LOGWPL, LSU=0) | module busdp #(parameter WORDSPERLINE, LINELEN, LOGWPL, LSU=0) | ||||||
|   ( |   ( | ||||||
|   input logic                 clk, reset, |   input logic                 clk, reset, | ||||||
|   // bus interface
 |   // bus interface
 | ||||||
| @ -42,7 +42,6 @@ module busdp #(parameter WORDSPERLINE, LINELEN, WORDLEN, LOGWPL, LSU=0) | |||||||
|   input logic                 LSUBusAck, |   input logic                 LSUBusAck, | ||||||
|   output logic                LSUBusWrite, |   output logic                LSUBusWrite, | ||||||
|   output logic                LSUBusRead, |   output logic                LSUBusRead, | ||||||
|   output logic [`XLEN-1:0]    LSUBusHWDATA, |  | ||||||
|   output logic [2:0]          LSUBusSize,  |   output logic [2:0]          LSUBusSize,  | ||||||
|   input logic [2:0]           LSUFunct3M, |   input logic [2:0]           LSUFunct3M, | ||||||
|   output logic [`PA_BITS-1:0] LSUBusAdr, |   output logic [`PA_BITS-1:0] LSUBusAdr, | ||||||
| @ -53,12 +52,11 @@ module busdp #(parameter WORDSPERLINE, LINELEN, WORDLEN, LOGWPL, LSU=0) | |||||||
|   input logic                 DCacheWriteLine, |   input logic                 DCacheWriteLine, | ||||||
|   output logic                DCacheBusAck, |   output logic                DCacheBusAck, | ||||||
|   output logic [LINELEN-1:0]  DCacheBusWriteData, |   output logic [LINELEN-1:0]  DCacheBusWriteData, | ||||||
|  |   output logic                SelUncachedAdr, | ||||||
|   |   | ||||||
|   // lsu interface
 |   // lsu interface
 | ||||||
|   input logic [`PA_BITS-1:0]  LSUPAdrM, |   input logic [`PA_BITS-1:0]  LSUPAdrM, | ||||||
|   input logic [`XLEN-1:0]     FinalAMOWriteDataM, |   input logic [`XLEN-1:0]     FinalWriteDataM, | ||||||
|   input logic [WORDLEN-1:0]   ReadDataWordM, |  | ||||||
|   output logic [WORDLEN-1:0]  ReadDataWordMuxM, |  | ||||||
|   input logic                 IgnoreRequest, |   input logic                 IgnoreRequest, | ||||||
|   input logic [1:0]           LSURWM, |   input logic [1:0]           LSURWM, | ||||||
|   input logic                 CPUBusy, |   input logic                 CPUBusy, | ||||||
| @ -70,26 +68,17 @@ module busdp #(parameter WORDSPERLINE, LINELEN, WORDLEN, LOGWPL, LSU=0) | |||||||
| 
 | 
 | ||||||
|   localparam integer   WordCountThreshold = (`DMEM == `MEM_CACHE) ? WORDSPERLINE - 1 : 0; |   localparam integer   WordCountThreshold = (`DMEM == `MEM_CACHE) ? WORDSPERLINE - 1 : 0; | ||||||
| 
 | 
 | ||||||
|   logic [`XLEN-1:0]           PreLSUBusHWDATA; |  | ||||||
|   logic [`PA_BITS-1:0]        LocalLSUBusAdr; |   logic [`PA_BITS-1:0]        LocalLSUBusAdr; | ||||||
|   logic                       SelUncachedAdr; |  | ||||||
|   genvar                      index; |   genvar                      index; | ||||||
| 
 | 
 | ||||||
|   for (index = 0; index < WORDSPERLINE; index++) begin:fetchbuffer |   for (index = 0; index < WORDSPERLINE; index++) begin:fetchbuffer | ||||||
|     flopen #(`XLEN) fb(.clk, .en(LSUBusAck & LSUBusRead & (index == WordCount)), |     flopen #(`XLEN) fb(.clk, .en(LSUBusAck & LSUBusRead & (index == WordCount)), | ||||||
|                        .d(LSUBusHRDATA), .q(DCacheBusWriteData[(index+1)*`XLEN-1:index*`XLEN])); |                        .d(LSUBusHRDATA), .q(DCacheBusWriteData[(index+1)*`XLEN-1:index*`XLEN])); | ||||||
|   end |   end | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|   mux2 #(`PA_BITS) localadrmux(DCacheBusAdr, LSUPAdrM, SelUncachedAdr, LocalLSUBusAdr); |   mux2 #(`PA_BITS) localadrmux(DCacheBusAdr, LSUPAdrM, SelUncachedAdr, LocalLSUBusAdr); | ||||||
|   assign LSUBusAdr = ({{`PA_BITS-LOGWPL{1'b0}}, WordCount} << $clog2(`XLEN/8)) + LocalLSUBusAdr; |   assign LSUBusAdr = ({{`PA_BITS-LOGWPL{1'b0}}, WordCount} << $clog2(`XLEN/8)) + LocalLSUBusAdr; | ||||||
|   if(LSU == 1) mux2 #(`XLEN) lsubushwdatamux( .d0(ReadDataWordM), .d1(FinalAMOWriteDataM), |  | ||||||
|                  .s(SelUncachedAdr), .y(LSUBusHWDATA)); |  | ||||||
|   else assign LSUBusHWDATA = '0; |  | ||||||
|    mux2 #(3) lsubussizemux(.d0(`XLEN == 32 ? 3'b010 : 3'b011), .d1(LSUFunct3M),  |    mux2 #(3) lsubussizemux(.d0(`XLEN == 32 ? 3'b010 : 3'b011), .d1(LSUFunct3M),  | ||||||
|     .s(SelUncachedAdr), .y(LSUBusSize)); |     .s(SelUncachedAdr), .y(LSUBusSize)); | ||||||
|   mux2 #(WORDLEN) UnCachedDataMux(.d0(ReadDataWordM), .d1(DCacheBusWriteData[WORDLEN-1:0]), |  | ||||||
|     .s(SelUncachedAdr), .y(ReadDataWordMuxM)); |  | ||||||
| 
 | 
 | ||||||
|   busfsm #(WordCountThreshold, LOGWPL, (`DMEM == `MEM_CACHE)) // *** cleanup  Icache? must fix.
 |   busfsm #(WordCountThreshold, LOGWPL, (`DMEM == `MEM_CACHE)) // *** cleanup  Icache? must fix.
 | ||||||
|   busfsm(.clk, .reset, .IgnoreRequest, .LSURWM, .DCacheFetchLine, .DCacheWriteLine, |   busfsm(.clk, .reset, .IgnoreRequest, .LSURWM, .DCacheFetchLine, .DCacheWriteLine, | ||||||
|  | |||||||
| @ -35,9 +35,9 @@ module interlockfsm | |||||||
|   (input logic clk, |   (input logic clk, | ||||||
|    input logic  reset, |    input logic  reset, | ||||||
|    input logic  AnyCPUReqM, |    input logic  AnyCPUReqM, | ||||||
|    input logic  ITLBMissF, |    input logic  ITLBMissOrDAFaultF, | ||||||
|    input logic  ITLBWriteF, |    input logic  ITLBWriteF, | ||||||
|    input logic  DTLBMissM, |    input logic  DTLBMissOrDAFaultM, | ||||||
|    input logic  DTLBWriteM, |    input logic  DTLBWriteM, | ||||||
|    input logic  TrapM, |    input logic  TrapM, | ||||||
|    input logic  DCacheStallM, |    input logic  DCacheStallM, | ||||||
| @ -66,10 +66,10 @@ module interlockfsm | |||||||
|   always_comb begin |   always_comb begin | ||||||
| 	case(InterlockCurrState) | 	case(InterlockCurrState) | ||||||
| 	  STATE_T0_READY: if (TrapM)                       InterlockNextState = STATE_T0_READY; | 	  STATE_T0_READY: if (TrapM)                       InterlockNextState = STATE_T0_READY; | ||||||
| 	  else if(~ITLBMissF & DTLBMissM & AnyCPUReqM)     InterlockNextState = STATE_T3_DTLB_MISS; | 	  else if(~ITLBMissOrDAFaultF & DTLBMissOrDAFaultM & AnyCPUReqM)     InterlockNextState = STATE_T3_DTLB_MISS; | ||||||
| 	  else if(ITLBMissF & ~DTLBMissM & ~AnyCPUReqM)    InterlockNextState = STATE_T4_ITLB_MISS; | 	  else if(ITLBMissOrDAFaultF & ~DTLBMissOrDAFaultM & ~AnyCPUReqM)    InterlockNextState = STATE_T4_ITLB_MISS; | ||||||
|       else if(ITLBMissF & ~DTLBMissM & AnyCPUReqM)     InterlockNextState = STATE_T5_ITLB_MISS; |       else if(ITLBMissOrDAFaultF & ~DTLBMissOrDAFaultM & AnyCPUReqM)     InterlockNextState = STATE_T5_ITLB_MISS; | ||||||
| 	  else if(ITLBMissF & DTLBMissM & AnyCPUReqM)      InterlockNextState = STATE_T7_DITLB_MISS; | 	  else if(ITLBMissOrDAFaultF & DTLBMissOrDAFaultM & AnyCPUReqM)      InterlockNextState = STATE_T7_DITLB_MISS; | ||||||
| 	  else                                             InterlockNextState = STATE_T0_READY; | 	  else                                             InterlockNextState = STATE_T0_READY; | ||||||
| 	  STATE_T0_REPLAY:       if(DCacheStallM)                                  InterlockNextState = STATE_T0_REPLAY; | 	  STATE_T0_REPLAY:       if(DCacheStallM)                                  InterlockNextState = STATE_T0_REPLAY; | ||||||
| 	  else                                             InterlockNextState = STATE_T0_READY; | 	  else                                             InterlockNextState = STATE_T0_READY; | ||||||
| @ -90,7 +90,7 @@ module interlockfsm | |||||||
|    // this code has a problem with imperas64mmu as it reads in an invalid uninitalized instruction.  InterlockStall becomes x and it propagates
 |    // this code has a problem with imperas64mmu as it reads in an invalid uninitalized instruction.  InterlockStall becomes x and it propagates
 | ||||||
|    // everywhere.  The case statement below implements the same logic but any x on the inputs will resolve to 0.
 |    // everywhere.  The case statement below implements the same logic but any x on the inputs will resolve to 0.
 | ||||||
|    // Note this will cause a problem for post synthesis gate simulation.
 |    // Note this will cause a problem for post synthesis gate simulation.
 | ||||||
|    assign InterlockStall = (InterlockCurrState == STATE_T0_READY & (DTLBMissM | ITLBMissF)) |  |    assign InterlockStall = (InterlockCurrState == STATE_T0_READY & (DTLBMissOrDAFaultM | ITLBMissOrDAFaultF)) |  | ||||||
|    (InterlockCurrState == STATE_T3_DTLB_MISS) | (InterlockCurrState == STATE_T4_ITLB_MISS) | |    (InterlockCurrState == STATE_T3_DTLB_MISS) | (InterlockCurrState == STATE_T4_ITLB_MISS) | | ||||||
|    (InterlockCurrState == STATE_T5_ITLB_MISS) | (InterlockCurrState == STATE_T7_DITLB_MISS); |    (InterlockCurrState == STATE_T5_ITLB_MISS) | (InterlockCurrState == STATE_T7_DITLB_MISS); | ||||||
| 
 | 
 | ||||||
| @ -99,7 +99,7 @@ module interlockfsm | |||||||
|   always_comb begin |   always_comb begin | ||||||
| 	InterlockStall = 1'b0; | 	InterlockStall = 1'b0; | ||||||
| 	case(InterlockCurrState)  | 	case(InterlockCurrState)  | ||||||
| 	  STATE_T0_READY: if((DTLBMissM | ITLBMissF) & ~TrapM) InterlockStall = 1'b1; | 	  STATE_T0_READY: if((DTLBMissOrDAFaultM | ITLBMissOrDAFaultF) & ~TrapM) InterlockStall = 1'b1; | ||||||
| 	  STATE_T3_DTLB_MISS: InterlockStall = 1'b1; | 	  STATE_T3_DTLB_MISS: InterlockStall = 1'b1; | ||||||
| 	  STATE_T4_ITLB_MISS: InterlockStall = 1'b1; | 	  STATE_T4_ITLB_MISS: InterlockStall = 1'b1; | ||||||
| 	  STATE_T5_ITLB_MISS: InterlockStall = 1'b1; | 	  STATE_T5_ITLB_MISS: InterlockStall = 1'b1; | ||||||
| @ -112,7 +112,7 @@ module interlockfsm | |||||||
|   assign SelReplayCPURequest = (InterlockNextState == STATE_T0_REPLAY); |   assign SelReplayCPURequest = (InterlockNextState == STATE_T0_REPLAY); | ||||||
|   assign SelHPTW = (InterlockCurrState == STATE_T3_DTLB_MISS) | (InterlockCurrState == STATE_T4_ITLB_MISS) | |   assign SelHPTW = (InterlockCurrState == STATE_T3_DTLB_MISS) | (InterlockCurrState == STATE_T4_ITLB_MISS) | | ||||||
| 				   (InterlockCurrState == STATE_T5_ITLB_MISS) | (InterlockCurrState == STATE_T7_DITLB_MISS); | 				   (InterlockCurrState == STATE_T5_ITLB_MISS) | (InterlockCurrState == STATE_T7_DITLB_MISS); | ||||||
|   assign IgnoreRequestTLB = (InterlockCurrState == STATE_T0_READY & (ITLBMissF | DTLBMissM)); |   assign IgnoreRequestTLB = (InterlockCurrState == STATE_T0_READY & (ITLBMissOrDAFaultF | DTLBMissOrDAFaultM)); | ||||||
|   assign IgnoreRequestTrapM = (InterlockCurrState == STATE_T0_READY & (TrapM)) | |   assign IgnoreRequestTrapM = (InterlockCurrState == STATE_T0_READY & (TrapM)) | | ||||||
| 							  ((InterlockCurrState == STATE_T0_REPLAY) & (TrapM)); | 							  ((InterlockCurrState == STATE_T0_REPLAY) & (TrapM)); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -74,6 +74,7 @@ module lsu ( | |||||||
|    input logic [1:0]        STATUS_MPP, |    input logic [1:0]        STATUS_MPP, | ||||||
|    input logic [`XLEN-1:0]  PCF, |    input logic [`XLEN-1:0]  PCF, | ||||||
|    input logic              ITLBMissF, |    input logic              ITLBMissF, | ||||||
|  |    input logic              InstrDAPageFaultF, | ||||||
|    output logic [`XLEN-1:0] PTE, |    output logic [`XLEN-1:0] PTE, | ||||||
|    output logic [1:0]       PageType, |    output logic [1:0]       PageType, | ||||||
|    output logic             ITLBWriteF, |    output logic             ITLBWriteF, | ||||||
| @ -101,7 +102,8 @@ module lsu ( | |||||||
|   logic                     IgnoreRequestTLB, IgnoreRequestTrapM; |   logic                     IgnoreRequestTLB, IgnoreRequestTrapM; | ||||||
|   logic                     BusCommittedM, DCacheCommittedM; |   logic                     BusCommittedM, DCacheCommittedM; | ||||||
|   logic                     LSUBusWriteCrit; |   logic                     LSUBusWriteCrit; | ||||||
| 
 |   logic                     DataDAPageFaultM; | ||||||
|  |    | ||||||
|   flopenrc #(`XLEN) AddressMReg(clk, reset, FlushM, ~StallM, IEUAdrE, IEUAdrM); |   flopenrc #(`XLEN) AddressMReg(clk, reset, FlushM, ~StallM, IEUAdrE, IEUAdrM); | ||||||
|   assign IEUAdrExtM = {2'b00, IEUAdrM};  |   assign IEUAdrExtM = {2'b00, IEUAdrM};  | ||||||
|   assign LSUStallM = DCacheStallM | InterlockStall | BusStall; |   assign LSUStallM = DCacheStallM | InterlockStall | BusStall; | ||||||
| @ -113,7 +115,9 @@ module lsu ( | |||||||
| 
 | 
 | ||||||
|   if(`VIRTMEM_SUPPORTED) begin : VIRTMEM_SUPPORTED |   if(`VIRTMEM_SUPPORTED) begin : VIRTMEM_SUPPORTED | ||||||
|     lsuvirtmem lsuvirtmem(.clk, .reset, .StallW, .MemRWM, .AtomicM, .ITLBMissF, .ITLBWriteF, |     lsuvirtmem lsuvirtmem(.clk, .reset, .StallW, .MemRWM, .AtomicM, .ITLBMissF, .ITLBWriteF, | ||||||
|                           .DTLBMissM, .DTLBWriteM, .TrapM, .DCacheStallM, .SATP_REGW, .PCF, |                           .DTLBMissM, .DTLBWriteM, .InstrDAPageFaultF, .DataDAPageFaultM,  | ||||||
|  |                           .TrapM, .DCacheStallM, .SATP_REGW, .PCF, | ||||||
|  |                           .STATUS_MXR, .STATUS_SUM, .STATUS_MPRV, .STATUS_MPP, .PrivilegeModeW, | ||||||
|                           .ReadDataM, .Funct3M, .LSUFunct3M, .Funct7M, .LSUFunct7M, .IEUAdrM, |                           .ReadDataM, .Funct3M, .LSUFunct3M, .Funct7M, .LSUFunct7M, .IEUAdrM, | ||||||
|                           .IEUAdrExtM, .PTE, .PageType, .PreLSURWM, .LSUAtomicM, .IEUAdrE, |                           .IEUAdrExtM, .PTE, .PageType, .PreLSURWM, .LSUAtomicM, .IEUAdrE, | ||||||
|                           .LSUAdrE, .PreLSUPAdrM, .CPUBusy, .InterlockStall, .SelHPTW, |                           .LSUAdrE, .PreLSUPAdrM, .CPUBusy, .InterlockStall, .SelHPTW, | ||||||
| @ -152,7 +156,8 @@ module lsu ( | |||||||
|       .Cacheable(CacheableM), .Idempotent(), .AtomicAllowed(), |       .Cacheable(CacheableM), .Idempotent(), .AtomicAllowed(), | ||||||
|       .InstrAccessFaultF(), .LoadAccessFaultM, .StoreAmoAccessFaultM, |       .InstrAccessFaultF(), .LoadAccessFaultM, .StoreAmoAccessFaultM, | ||||||
|       .InstrPageFaultF(),.LoadPageFaultM, .StoreAmoPageFaultM, |       .InstrPageFaultF(),.LoadPageFaultM, .StoreAmoPageFaultM, | ||||||
|       .LoadMisalignedFaultM, .StoreAmoMisalignedFaultM,          |       .LoadMisalignedFaultM, .StoreAmoMisalignedFaultM,   | ||||||
|  |       .DAPageFault(DataDAPageFaultM), | ||||||
|       .AtomicAccessM(|LSUAtomicM), .ExecuteAccessF(1'b0), // **** change this to just use PreLSURWM
 |       .AtomicAccessM(|LSUAtomicM), .ExecuteAccessF(1'b0), // **** change this to just use PreLSURWM
 | ||||||
|       .WriteAccessM(PreLSURWM[0]), .ReadAccessM(PreLSURWM[1]), |       .WriteAccessM(PreLSURWM[0]), .ReadAccessM(PreLSURWM[1]), | ||||||
|       .PMPCFG_ARRAY_REGW, .PMPADDR_ARRAY_REGW); |       .PMPCFG_ARRAY_REGW, .PMPADDR_ARRAY_REGW); | ||||||
| @ -168,7 +173,7 @@ module lsu ( | |||||||
|   //  Memory System
 |   //  Memory System
 | ||||||
|   //  Either Data Cache or Data Tightly Integrated Memory or just bus interface
 |   //  Either Data Cache or Data Tightly Integrated Memory or just bus interface
 | ||||||
|   /////////////////////////////////////////////////////////////////////////////////////////////
 |   /////////////////////////////////////////////////////////////////////////////////////////////
 | ||||||
|   logic [`XLEN-1:0]    FinalAMOWriteDataM, FinalWriteDataM; |   logic [`XLEN-1:0]    FinalAMOWriteDataM, FinalWriteDataM, PostSWWWriteDataM; | ||||||
|   logic [`XLEN-1:0]    ReadDataWordM; |   logic [`XLEN-1:0]    ReadDataWordM; | ||||||
|   logic [`XLEN-1:0]    ReadDataWordMuxM; |   logic [`XLEN-1:0]    ReadDataWordMuxM; | ||||||
|   logic                IgnoreRequest; |   logic                IgnoreRequest; | ||||||
| @ -194,16 +199,21 @@ module lsu ( | |||||||
|     logic [`PA_BITS-1:0] WordOffsetAddr; |     logic [`PA_BITS-1:0] WordOffsetAddr; | ||||||
|     logic                SelBus; |     logic                SelBus; | ||||||
|     logic [LOGWPL-1:0]   WordCount; |     logic [LOGWPL-1:0]   WordCount; | ||||||
|  |     logic                SelUncachedAdr; | ||||||
|              |              | ||||||
|     busdp #(WORDSPERLINE, LINELEN, `XLEN, LOGWPL, 1) busdp( |     busdp #(WORDSPERLINE, LINELEN, LOGWPL, 1) busdp( | ||||||
|       .clk, .reset, |       .clk, .reset, | ||||||
|       .LSUBusHRDATA, .LSUBusHWDATA, .LSUBusAck, .LSUBusWrite, .LSUBusRead, .LSUBusSize, |       .LSUBusHRDATA, .LSUBusAck, .LSUBusWrite, .LSUBusRead, .LSUBusSize, | ||||||
|       .WordCount, .LSUBusWriteCrit, |       .WordCount, .LSUBusWriteCrit, | ||||||
|       .LSUFunct3M, .LSUBusAdr, .DCacheBusAdr, .DCacheFetchLine, |       .LSUFunct3M, .LSUBusAdr, .DCacheBusAdr, .DCacheFetchLine, | ||||||
|       .DCacheWriteLine, .DCacheBusAck, .DCacheBusWriteData, .LSUPAdrM, .FinalAMOWriteDataM, |       .DCacheWriteLine, .DCacheBusAck, .DCacheBusWriteData, .LSUPAdrM, .FinalWriteDataM, | ||||||
|       .ReadDataWordM, .ReadDataWordMuxM, .IgnoreRequest, .LSURWM, .CPUBusy, .CacheableM, |       .SelUncachedAdr, .IgnoreRequest, .LSURWM, .CPUBusy, .CacheableM, | ||||||
|       .BusStall, .BusCommittedM); |       .BusStall, .BusCommittedM); | ||||||
| 
 | 
 | ||||||
|  |     mux2 #(`XLEN) UnCachedDataMux(.d0(ReadDataWordM), .d1(DCacheBusWriteData[`XLEN-1:0]), | ||||||
|  |       .s(SelUncachedAdr), .y(ReadDataWordMuxM)); | ||||||
|  |     mux2 #(`XLEN) lsubushwdatamux( .d0(ReadDataWordM), .d1(FinalWriteDataM), | ||||||
|  |       .s(SelUncachedAdr), .y(LSUBusHWDATA)); | ||||||
|     assign WordOffsetAddr = LSUBusWriteCrit ? ({{`PA_BITS-LOGWPL{1'b0}}, WordCount} << $clog2(`XLEN/8)) : LSUPAdrM; |     assign WordOffsetAddr = LSUBusWriteCrit ? ({{`PA_BITS-LOGWPL{1'b0}}, WordCount} << $clog2(`XLEN/8)) : LSUPAdrM; | ||||||
|      |      | ||||||
|     if(`DMEM == `MEM_CACHE) begin : dcache |     if(`DMEM == `MEM_CACHE) begin : dcache | ||||||
| @ -234,13 +244,16 @@ module lsu ( | |||||||
|   subwordread subwordread(.ReadDataWordMuxM, .LSUPAdrM(LSUPAdrM[2:0]), |   subwordread subwordread(.ReadDataWordMuxM, .LSUPAdrM(LSUPAdrM[2:0]), | ||||||
| 		.Funct3M(LSUFunct3M), .ReadDataM); | 		.Funct3M(LSUFunct3M), .ReadDataM); | ||||||
| 
 | 
 | ||||||
|   // this might only get instantiated if there is a dcache or dtim.
 |   if(`DMEM != `MEM_BUS) begin | ||||||
|   // There is a copy in the ebu. *** is it needed there, or can data come in from ebu, get 
 |     logic [`XLEN-1:0] ReadDataWordMaskedM; | ||||||
|   // muxed here and sent back out.
 |     assign ReadDataWordMaskedM = CacheableM ? ReadDataWordM : '0; // AND-gate
 | ||||||
|   // Explore changing feedback path from output of AMOALU to subword write ***
 |     subwordwrite subwordwrite(.HRDATA(ReadDataWordMaskedM), .HADDRD(LSUPAdrM[2:0]), | ||||||
|   subwordwrite subwordwrite(.HRDATA(ReadDataWordM), .HADDRD(LSUPAdrM[2:0]), |       .HSIZED({LSUFunct3M[2], 1'b0, LSUFunct3M[1:0]}), | ||||||
| 		.HSIZED({LSUFunct3M[2], 1'b0, LSUFunct3M[1:0]}), | 	  .HWDATAIN(FinalAMOWriteDataM), .HWDATA(PostSWWWriteDataM)); | ||||||
| 		.HWDATAIN(FinalAMOWriteDataM), .HWDATA(FinalWriteDataM)); |   end else  | ||||||
|  |     assign PostSWWWriteDataM = FinalAMOWriteDataM; | ||||||
|  | 
 | ||||||
|  |   assign FinalWriteDataM = SelHPTW ? PTE : PostSWWWriteDataM; | ||||||
| 
 | 
 | ||||||
|   /////////////////////////////////////////////////////////////////////////////////////////////
 |   /////////////////////////////////////////////////////////////////////////////////////////////
 | ||||||
|   // Atomic operations
 |   // Atomic operations
 | ||||||
|  | |||||||
| @ -37,9 +37,14 @@ module lsuvirtmem( | |||||||
|   output logic                ITLBWriteF, |   output logic                ITLBWriteF, | ||||||
|   input logic                 DTLBMissM, |   input logic                 DTLBMissM, | ||||||
|   output logic                DTLBWriteM, |   output logic                DTLBWriteM, | ||||||
|  |   input logic                 InstrDAPageFaultF, | ||||||
|  |   input logic                 DataDAPageFaultM, | ||||||
|   input logic                 TrapM, |   input logic                 TrapM, | ||||||
|   input logic                 DCacheStallM, |   input logic                 DCacheStallM, | ||||||
|   input logic [`XLEN-1:0]     SATP_REGW, // from csr
 |   input logic [`XLEN-1:0]     SATP_REGW, // from csr
 | ||||||
|  |   input logic                 STATUS_MXR, STATUS_SUM, STATUS_MPRV, | ||||||
|  |   input logic [1:0]           STATUS_MPP, | ||||||
|  |   input logic [1:0]           PrivilegeModeW, | ||||||
|   input logic [`XLEN-1:0]     PCF, |   input logic [`XLEN-1:0]     PCF, | ||||||
|   input logic [`XLEN-1:0]     ReadDataM, |   input logic [`XLEN-1:0]     ReadDataM, | ||||||
|   input logic [2:0]           Funct3M, |   input logic [2:0]           Funct3M, | ||||||
| @ -69,23 +74,26 @@ module lsuvirtmem( | |||||||
|   logic [2:0]                 HPTWSize; |   logic [2:0]                 HPTWSize; | ||||||
|   logic                       SelReplayCPURequest; |   logic                       SelReplayCPURequest; | ||||||
|   logic [11:0]                PreLSUAdrE;   |   logic [11:0]                PreLSUAdrE;   | ||||||
| 
 |   logic                       ITLBMissOrDAFaultF; | ||||||
| 
 |   logic                       DTLBMissOrDAFaultM;   | ||||||
|  |   logic                       HPTWWrite; | ||||||
| 
 | 
 | ||||||
|   assign AnyCPUReqM = (|MemRWM) | (|AtomicM); |   assign AnyCPUReqM = (|MemRWM) | (|AtomicM); | ||||||
| 
 |   assign ITLBMissOrDAFaultF = ITLBMissF | (`HPTW_WRITES_SUPPORTED & InstrDAPageFaultF); | ||||||
|  |   assign DTLBMissOrDAFaultM = DTLBMissM | (`HPTW_WRITES_SUPPORTED & DataDAPageFaultM);   | ||||||
|   interlockfsm interlockfsm ( |   interlockfsm interlockfsm ( | ||||||
|     .clk, .reset, .AnyCPUReqM, .ITLBMissF, .ITLBWriteF, |     .clk, .reset, .AnyCPUReqM, .ITLBMissOrDAFaultF, .ITLBWriteF, | ||||||
|     .DTLBMissM, .DTLBWriteM, .TrapM, .DCacheStallM, |     .DTLBMissOrDAFaultM, .DTLBWriteM, .TrapM, .DCacheStallM, | ||||||
|     .InterlockStall, .SelReplayCPURequest, .SelHPTW, .IgnoreRequestTLB, .IgnoreRequestTrapM); |     .InterlockStall, .SelReplayCPURequest, .SelHPTW, .IgnoreRequestTLB, .IgnoreRequestTrapM); | ||||||
|   hptw hptw( // *** remove logic from (), mention this in style guide CH3
 |   hptw hptw( // *** remove logic from (), mention this in style guide CH3
 | ||||||
|     .clk, .reset, .SATP_REGW, .PCF, .IEUAdrM, |     .clk, .reset, .SATP_REGW, .PCF, .IEUAdrM, .MemRWM, .AtomicM, | ||||||
|     .ITLBMissF(ITLBMissF & ~TrapM), .DTLBMissM(DTLBMissM & ~TrapM), |     .STATUS_MXR, .STATUS_SUM, .STATUS_MPRV, .STATUS_MPP, .PrivilegeModeW, | ||||||
|  |     .ITLBMissF(ITLBMissOrDAFaultF & ~TrapM), .DTLBMissM(DTLBMissOrDAFaultM & ~TrapM), // *** Fix me.  *** I'm not sure ITLBMiss should be suppressed on TrapM.
 | ||||||
|     .PTE, .PageType, .ITLBWriteF, .DTLBWriteM, .HPTWReadPTE(ReadDataM), |     .PTE, .PageType, .ITLBWriteF, .DTLBWriteM, .HPTWReadPTE(ReadDataM), | ||||||
|     .DCacheStallM, .HPTWAdr, .HPTWRead, .HPTWSize); |     .DCacheStallM, .HPTWAdr, .HPTWRead, .HPTWWrite, .HPTWSize); | ||||||
| 
 | 
 | ||||||
|   // multiplex the outputs to LSU
 |   // multiplex the outputs to LSU
 | ||||||
|   mux2 #(2) rwmux(MemRWM, {HPTWRead, 1'b0}, SelHPTW, PreLSURWM); |   mux2 #(2) rwmux(MemRWM, {HPTWRead, HPTWWrite}, SelHPTW, PreLSURWM); | ||||||
|   mux2 #(3) sizemux(Funct3M, HPTWSize, SelHPTW, LSUFunct3M); |   mux2 #(3) sizemux(Funct3M, HPTWSize, SelHPTW, LSUFunct3M); | ||||||
|   mux2 #(7) funct7mux(Funct7M, 7'b0, SelHPTW, LSUFunct7M);     |   mux2 #(7) funct7mux(Funct7M, 7'b0, SelHPTW, LSUFunct7M);     | ||||||
|   mux2 #(2) atomicmux(AtomicM, 2'b00, SelHPTW, LSUAtomicM); |   mux2 #(2) atomicmux(AtomicM, 2'b00, SelHPTW, LSUAtomicM); | ||||||
|  | |||||||
| @ -32,31 +32,37 @@ | |||||||
| 
 | 
 | ||||||
| module hptw | module hptw | ||||||
|   ( |   ( | ||||||
|    input logic 				   clk, reset, |    input logic                 clk, reset, | ||||||
|    input logic [`XLEN-1:0] 	   SATP_REGW, // includes SATP.MODE to determine number of levels in page table
 |    input logic [`XLEN-1:0]     SATP_REGW, // includes SATP.MODE to determine number of levels in page table
 | ||||||
|    input logic [`XLEN-1:0] 	   PCF, IEUAdrM, // addresses to translate
 |    input logic [`XLEN-1:0]     PCF, IEUAdrM, // addresses to translate
 | ||||||
|    (* mark_debug = "true" *) input logic 				   ITLBMissF, DTLBMissM, // TLB Miss
 |    input logic [1:0]           MemRWM, AtomicM, | ||||||
|    input logic [`XLEN-1:0] 	   HPTWReadPTE, // page table entry from LSU
 |    // system status
 | ||||||
|    input logic 				   DCacheStallM, // stall from LSU
 |    input logic                 STATUS_MXR, STATUS_SUM, STATUS_MPRV, | ||||||
|  |    input logic [1:0]           STATUS_MPP, | ||||||
|  |    input logic [1:0]           PrivilegeModeW, | ||||||
|  |    (* mark_debug = "true" *) input logic ITLBMissF, DTLBMissM, // TLB Miss
 | ||||||
|  |    input logic [`XLEN-1:0]     HPTWReadPTE, // page table entry from LSU
 | ||||||
|  |    input logic                 DCacheStallM, // stall from LSU
 | ||||||
|    output logic [`XLEN-1:0]    PTE, // page table entry to TLBs
 |    output logic [`XLEN-1:0]    PTE, // page table entry to TLBs
 | ||||||
|    output logic [1:0] 		   PageType, // page type to TLBs
 |    output logic [1:0]          PageType, // page type to TLBs
 | ||||||
|    (* mark_debug = "true" *) output logic 			   ITLBWriteF, DTLBWriteM, // write TLB with new entry
 |    (* mark_debug = "true" *) output logic ITLBWriteF, DTLBWriteM, // write TLB with new entry
 | ||||||
|    output logic [`PA_BITS-1:0] HPTWAdr, |    output logic [`PA_BITS-1:0] HPTWAdr, | ||||||
|    output logic 			   HPTWRead, // HPTW requesting to read memory
 |    output logic                HPTWRead, // HPTW requesting to read memory
 | ||||||
|    output logic [2:0] 		   HPTWSize // 32 or 64 bit access.
 |    output logic                HPTWWrite, | ||||||
|  |    output logic [2:0]          HPTWSize // 32 or 64 bit access.
 | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| 	typedef enum logic [3:0] {L0_ADR, L0_RD,  | 	typedef enum logic [3:0] {L0_ADR, L0_RD,  | ||||||
| 					L1_ADR, L1_RD,  | 					L1_ADR, L1_RD,  | ||||||
| 					L2_ADR, L2_RD,  | 					L2_ADR, L2_RD,  | ||||||
| 					L3_ADR, L3_RD,  | 					L3_ADR, L3_RD,  | ||||||
| 					LEAF, IDLE} statetype; | 					LEAF, IDLE, UPDATE_PTE} statetype; | ||||||
| 
 | 
 | ||||||
| 	logic			    DTLBWalk; // register TLBs translation miss requests
 | 	logic			    DTLBWalk; // register TLBs translation miss requests
 | ||||||
| 	logic [`PPN_BITS-1:0]	    BasePageTablePPN; | 	logic [`PPN_BITS-1:0]	    BasePageTablePPN; | ||||||
| 	logic [`PPN_BITS-1:0]	    CurrentPPN; | 	logic [`PPN_BITS-1:0]	    CurrentPPN; | ||||||
| 	logic			    MemWrite; | 	logic			    MemWrite; | ||||||
| 	logic			    Executable, Writable, Readable, Valid; | 	logic			    Executable, Writable, Readable, Valid, PTE_U; | ||||||
| 	logic 			Misaligned, MegapageMisaligned; | 	logic 			Misaligned, MegapageMisaligned; | ||||||
| 	logic			    ValidPTE, LeafPTE, ValidLeafPTE, ValidNonLeafPTE; | 	logic			    ValidPTE, LeafPTE, ValidLeafPTE, ValidNonLeafPTE; | ||||||
| 	logic			    StartWalk; | 	logic			    StartWalk; | ||||||
| @ -65,7 +71,11 @@ module hptw | |||||||
| 	logic [1:0]       NextPageType; | 	logic [1:0]       NextPageType; | ||||||
| 	logic [`SVMODE_BITS-1:0]	    SvMode; | 	logic [`SVMODE_BITS-1:0]	    SvMode; | ||||||
| 	logic [`XLEN-1:0] 	    TranslationVAdr; | 	logic [`XLEN-1:0] 	    TranslationVAdr; | ||||||
| 
 |   logic [`XLEN-1:0]         NextPTE; | ||||||
|  |   logic                     UpdatePTE; | ||||||
|  |   logic                     DAPageFault; | ||||||
|  |   logic [`PA_BITS-1:0]      HPTWReadAdr; | ||||||
|  |                         | ||||||
| 	(* mark_debug = "true" *)      statetype WalkerState, NextWalkerState, InitialWalkerState; | 	(* mark_debug = "true" *)      statetype WalkerState, NextWalkerState, InitialWalkerState; | ||||||
| 
 | 
 | ||||||
| 	// Extract bits from CSRs and inputs
 | 	// Extract bits from CSRs and inputs
 | ||||||
| @ -80,21 +90,89 @@ module hptw | |||||||
| 	// State flops
 | 	// State flops
 | ||||||
| 	flopenr #(1) TLBMissMReg(clk, reset, StartWalk, DTLBMissM, DTLBWalk); // when walk begins, record whether it was for DTLB (or record 0 for ITLB)
 | 	flopenr #(1) TLBMissMReg(clk, reset, StartWalk, DTLBMissM, DTLBWalk); // when walk begins, record whether it was for DTLB (or record 0 for ITLB)
 | ||||||
| 	assign PRegEn = HPTWRead & ~DCacheStallM; | 	assign PRegEn = HPTWRead & ~DCacheStallM; | ||||||
| 	flopenr #(`XLEN) PTEReg(clk, reset, PRegEn, HPTWReadPTE, PTE); // Capture page table entry from data cache
 |    | ||||||
|  | 	flopenr #(`XLEN) PTEReg(clk, reset, PRegEn | UpdatePTE, NextPTE, PTE); // Capture page table entry from data cache
 | ||||||
| 
 | 
 | ||||||
|  |      | ||||||
| 	// Assign PTE descriptors common across all XLEN values
 | 	// Assign PTE descriptors common across all XLEN values
 | ||||||
| 	// For non-leaf PTEs, D, A, U bits are reserved and ignored.  They do not cause faults while walking the page table
 | 	// For non-leaf PTEs, D, A, U bits are reserved and ignored.  They do not cause faults while walking the page table
 | ||||||
| 	assign {Executable, Writable, Readable, Valid} = PTE[3:0];  | 	assign {PTE_U, Executable, Writable, Readable, Valid} = PTE[4:0]; | ||||||
| 	assign LeafPTE = Executable | Writable | Readable;  | 	assign LeafPTE = Executable | Writable | Readable;  | ||||||
| 	assign ValidPTE = Valid & ~(Writable & ~Readable); | 	assign ValidPTE = Valid & ~(Writable & ~Readable); | ||||||
| 	assign ValidLeafPTE = ValidPTE & LeafPTE; | 	assign ValidLeafPTE = ValidPTE & LeafPTE; | ||||||
| 	assign ValidNonLeafPTE = ValidPTE & ~LeafPTE; | 	assign ValidNonLeafPTE = ValidPTE & ~LeafPTE; | ||||||
| 
 | 
 | ||||||
|  |   if(`HPTW_WRITES_SUPPORTED) begin : hptwwrites | ||||||
|  | 
 | ||||||
|  |     logic                     SV39Mode; | ||||||
|  |     logic                     ReadAccess, WriteAccess; | ||||||
|  |     logic                     InvalidRead, InvalidWrite; | ||||||
|  |     logic                     UpperBitsUnequalPageFault;  | ||||||
|  |     logic                     OtherPageFault; | ||||||
|  |     logic [1:0]               EffectivePrivilegeMode; | ||||||
|  |     logic                     ImproperPrivilege; | ||||||
|  |     logic                     SaveHPTWAdr, SelHPTWWriteAdr; | ||||||
|  |     logic [`PA_BITS-1:0]      HPTWWriteAdr;   | ||||||
|  |     logic                     SetDirty; | ||||||
|  |     logic                     Dirty, Accessed; | ||||||
|  | 
 | ||||||
|  |     assign NextPTE = UpdatePTE ? {PTE[`XLEN-1:8], (SetDirty | PTE[7]), 1'b1, PTE[5:0]} : HPTWReadPTE;  // This will be  HPTWReadPTE if not handling DAPageFault.
 | ||||||
|  |     flopenr #(`PA_BITS) HPTWAdrWriteReg(clk, reset, SaveHPTWAdr, HPTWReadAdr, HPTWWriteAdr); | ||||||
|  |     assign SaveHPTWAdr = WalkerState == L0_ADR; | ||||||
|  |     assign SelHPTWWriteAdr = UpdatePTE | HPTWWrite; | ||||||
|  |     mux2 #(`PA_BITS) HPTWWriteAdrMux(HPTWReadAdr, HPTWWriteAdr, SelHPTWWriteAdr, HPTWAdr);  // HPTWAdr = HPTWReadAdr if not handling DAPageFault.
 | ||||||
|  |      | ||||||
|  | 
 | ||||||
|  |     assign {Dirty, Accessed} = PTE[7:6]; | ||||||
|  |     assign WriteAccess = (MemRWM[0] | |AtomicM); | ||||||
|  |     assign SetDirty = ~Dirty & & DTLBWalk & WriteAccess; | ||||||
|  |     assign ReadAccess = MemRWM[1]; | ||||||
|  | 
 | ||||||
|  |     assign EffectivePrivilegeMode = (DTLBWalk == 0) ? PrivilegeModeW : (STATUS_MPRV ? STATUS_MPP : PrivilegeModeW); // DTLB uses MPP mode when MPRV is 1
 | ||||||
|  |     assign ImproperPrivilege = ((EffectivePrivilegeMode == `U_MODE) & ~PTE_U) | | ||||||
|  |                                ((EffectivePrivilegeMode == `S_MODE) & PTE_U & (~STATUS_SUM & DTLBWalk)); | ||||||
|  | 
 | ||||||
|  |     // *** turn into module
 | ||||||
|  |     if (`XLEN==64) begin:rv64 | ||||||
|  |       assign SV39Mode = (SATP_REGW[`XLEN-1:`XLEN-`SVMODE_BITS] == `SV39); | ||||||
|  |       // page fault if upper bits aren't all the same
 | ||||||
|  |       logic UpperEqual39, UpperEqual48; | ||||||
|  |       assign UpperEqual39 = &(TranslationVAdr[63:38]) | ~|(TranslationVAdr[63:38]); | ||||||
|  |       assign UpperEqual48 = &(TranslationVAdr[63:47]) | ~|(TranslationVAdr[63:47]);  | ||||||
|  |       assign UpperBitsUnequalPageFault = SV39Mode ? ~UpperEqual39 : ~UpperEqual48; | ||||||
|  |     end else begin | ||||||
|  |       assign SV39Mode = 0; | ||||||
|  |       assign UpperBitsUnequalPageFault = 0; | ||||||
|  |     end            | ||||||
|  | 
 | ||||||
|  |     assign InvalidRead = ReadAccess & ~Readable & (~STATUS_MXR | ~Executable); | ||||||
|  |     assign InvalidWrite = WriteAccess & ~Writable; | ||||||
|  |     assign OtherPageFault = DTLBWalk? ImproperPrivilege | InvalidRead | InvalidWrite | UpperBitsUnequalPageFault | Misaligned | ~Valid : | ||||||
|  |                             ImproperPrivilege | ~Executable | UpperBitsUnequalPageFault | Misaligned | ~Valid; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     // hptw needs to know if there is a Dirty or Access fault occuring on this
 | ||||||
|  |     // memory access.  If there is the PTE needs to be updated seting Access
 | ||||||
|  |     // and possibly also Dirty.  Dirty is set if the operation is a store/amo.
 | ||||||
|  |     // However any other fault should not cause the update.
 | ||||||
|  |     assign DAPageFault = ValidLeafPTE & (~Accessed | SetDirty) & ~OtherPageFault; // set to 0 if not handling DAPageFault.
 | ||||||
|  | 
 | ||||||
|  |     assign HPTWWrite = (WalkerState == UPDATE_PTE); | ||||||
|  |     assign UpdatePTE = WalkerState == LEAF & DAPageFault; | ||||||
|  |   end else begin // block: hptwwrites
 | ||||||
|  |     assign NextPTE = HPTWReadPTE; | ||||||
|  |     assign HPTWAdr = HPTWReadAdr; | ||||||
|  |     assign DAPageFault = '0; | ||||||
|  |     assign UpdatePTE = '0; | ||||||
|  |     assign HPTWWrite = '0; | ||||||
|  |   end | ||||||
|  | 
 | ||||||
| 	// Enable and select signals based on states
 | 	// Enable and select signals based on states
 | ||||||
| 	assign StartWalk = (WalkerState == IDLE) & TLBMiss; | 	assign StartWalk = (WalkerState == IDLE) & TLBMiss; | ||||||
| 	assign HPTWRead = (WalkerState == L3_RD) | (WalkerState == L2_RD) | (WalkerState == L1_RD) | (WalkerState == L0_RD); | 	assign HPTWRead = (WalkerState == L3_RD) | (WalkerState == L2_RD) | (WalkerState == L1_RD) | (WalkerState == L0_RD); | ||||||
| 	assign DTLBWriteM = (WalkerState == LEAF) & DTLBWalk; | 	assign DTLBWriteM = (WalkerState == LEAF & ~DAPageFault) & DTLBWalk; | ||||||
| 	assign ITLBWriteF = (WalkerState == LEAF) & ~DTLBWalk; | 	assign ITLBWriteF = (WalkerState == LEAF & ~DAPageFault) & ~DTLBWalk; | ||||||
|  |    | ||||||
| 
 | 
 | ||||||
| 	// FSM to track PageType based on the levels of the page table traversed
 | 	// FSM to track PageType based on the levels of the page table traversed
 | ||||||
| 	flopr #(2) PageTypeReg(clk, reset, NextPageType, PageType); | 	flopr #(2) PageTypeReg(clk, reset, NextPageType, PageType); | ||||||
| @ -113,7 +191,7 @@ module hptw | |||||||
| 	logic [`PPN_BITS-1:0] PPN; | 	logic [`PPN_BITS-1:0] PPN; | ||||||
| 	assign VPN = ((WalkerState == L1_ADR) | (WalkerState == L1_RD)) ? TranslationVAdr[31:22] : TranslationVAdr[21:12]; // select VPN field based on HPTW state
 | 	assign VPN = ((WalkerState == L1_ADR) | (WalkerState == L1_RD)) ? TranslationVAdr[31:22] : TranslationVAdr[21:12]; // select VPN field based on HPTW state
 | ||||||
| 	assign PPN = ((WalkerState == L1_ADR) | (WalkerState == L1_RD)) ? BasePageTablePPN : CurrentPPN;  | 	assign PPN = ((WalkerState == L1_ADR) | (WalkerState == L1_RD)) ? BasePageTablePPN : CurrentPPN;  | ||||||
| 	assign HPTWAdr = {PPN, VPN, 2'b00}; | 	assign HPTWReadAdr = {PPN, VPN, 2'b00}; | ||||||
| 	assign HPTWSize = 3'b010; | 	assign HPTWSize = 3'b010; | ||||||
| 	end else begin // RV64
 | 	end else begin // RV64
 | ||||||
| 	logic [8:0] VPN; | 	logic [8:0] VPN; | ||||||
| @ -127,7 +205,7 @@ module hptw | |||||||
| 		endcase | 		endcase | ||||||
| 	assign PPN = ((WalkerState == L3_ADR) | (WalkerState == L3_RD) |  | 	assign PPN = ((WalkerState == L3_ADR) | (WalkerState == L3_RD) |  | ||||||
| 					(SvMode != `SV48 & ((WalkerState == L2_ADR) | (WalkerState == L2_RD)))) ? BasePageTablePPN : CurrentPPN; | 					(SvMode != `SV48 & ((WalkerState == L2_ADR) | (WalkerState == L2_RD)))) ? BasePageTablePPN : CurrentPPN; | ||||||
| 	assign HPTWAdr = {PPN, VPN, 3'b000}; | 	assign HPTWReadAdr = {PPN, VPN, 3'b000}; | ||||||
| 	assign HPTWSize = 3'b011; | 	assign HPTWSize = 3'b011; | ||||||
| 	end | 	end | ||||||
| 
 | 
 | ||||||
| @ -151,46 +229,42 @@ module hptw | |||||||
| 	// to decrease the latency of the HPTW.  However, if the D$ is a cycle limiter, it's better to leave the
 | 	// to decrease the latency of the HPTW.  However, if the D$ is a cycle limiter, it's better to leave the
 | ||||||
| 	// HPTW as shown below to keep the D$ setup time out of the critical path.
 | 	// HPTW as shown below to keep the D$ setup time out of the critical path.
 | ||||||
| 	// *** Is this really true.  Talk with Ross.  Seems like it's the next state logic on critical path instead.
 | 	// *** Is this really true.  Talk with Ross.  Seems like it's the next state logic on critical path instead.
 | ||||||
|  | 	// *** address TYPE(statetype)
 | ||||||
| 	flopenl #(.TYPE(statetype)) WalkerStateReg(clk, reset, 1'b1, NextWalkerState, IDLE, WalkerState);  | 	flopenl #(.TYPE(statetype)) WalkerStateReg(clk, reset, 1'b1, NextWalkerState, IDLE, WalkerState);  | ||||||
| 	always_comb  | 	always_comb  | ||||||
| 	case (WalkerState) | 	case (WalkerState) | ||||||
| 	IDLE: if (TLBMiss)	 		NextWalkerState = InitialWalkerState; | 	IDLE: if (TLBMiss)	 		NextWalkerState = InitialWalkerState; | ||||||
| 			else 					NextWalkerState = IDLE; | 		  else 					NextWalkerState = IDLE; | ||||||
| 	L3_ADR: 			NextWalkerState = L3_RD; // first access in SV48
 | 	L3_ADR:                     NextWalkerState = L3_RD; // first access in SV48
 | ||||||
| 	L3_RD: if (DCacheStallM) NextWalkerState = L3_RD; | 	L3_RD: if (DCacheStallM)    NextWalkerState = L3_RD; | ||||||
| 				else 			NextWalkerState = L2_ADR; |            else     			NextWalkerState = L2_ADR; | ||||||
| 	//	    LEVEL3: if (ValidLeafPTE & ~Misaligned) NextWalkerState = LEAF;
 | 	L2_ADR: if (InitialWalkerState == L2_ADR)    NextWalkerState = L2_RD; // first access in SV39
 | ||||||
| 	//		  		else if (ValidNonLeafPTE) NextWalkerState = L2_ADR;
 |  | ||||||
| 	//		 		else 				NextWalkerState = FAULT;
 |  | ||||||
| 	L2_ADR: if (InitialWalkerState == L2_ADR) NextWalkerState = L2_RD; // first access in SV39
 |  | ||||||
| 			else if (ValidLeafPTE & ~Misaligned) NextWalkerState = LEAF; // could shortcut this by a cyle for all Lx_ADR superpages
 | 			else if (ValidLeafPTE & ~Misaligned) NextWalkerState = LEAF; // could shortcut this by a cyle for all Lx_ADR superpages
 | ||||||
| 			else if (ValidNonLeafPTE) NextWalkerState = L2_RD; | 			else if (ValidNonLeafPTE)            NextWalkerState = L2_RD; | ||||||
| 			else 				NextWalkerState = LEAF; | 			else 				                 NextWalkerState = LEAF; | ||||||
| 	L2_RD: if (DCacheStallM) NextWalkerState = L2_RD; | 	L2_RD: if (DCacheStallM)                     NextWalkerState = L2_RD; | ||||||
| 				else 			NextWalkerState = L1_ADR; |            else                                  NextWalkerState = L1_ADR; | ||||||
| 	//	    LEVEL2: if (ValidLeafPTE & ~Misaligned) NextWalkerState = LEAF;
 | 	L1_ADR: if (InitialWalkerState == L1_ADR)    NextWalkerState = L1_RD; // first access in SV32
 | ||||||
| 	//				else if (ValidNonLeafPTE) NextWalkerState = L1_ADR;
 |  | ||||||
| 	//				else 				NextWalkerState = FAULT;
 |  | ||||||
| 	L1_ADR: if (InitialWalkerState == L1_ADR) NextWalkerState = L1_RD; // first access in SV32
 |  | ||||||
| 			else if (ValidLeafPTE & ~Misaligned) NextWalkerState = LEAF; // could shortcut this by a cyle for all Lx_ADR superpages
 | 			else if (ValidLeafPTE & ~Misaligned) NextWalkerState = LEAF; // could shortcut this by a cyle for all Lx_ADR superpages
 | ||||||
| 			else if (ValidNonLeafPTE) NextWalkerState = L1_RD; | 			else if (ValidNonLeafPTE)            NextWalkerState = L1_RD; | ||||||
| 			else 				NextWalkerState = LEAF;	 | 			else 				                 NextWalkerState = LEAF;	 | ||||||
| 	L1_RD: if (DCacheStallM) NextWalkerState = L1_RD; | 	L1_RD: if (DCacheStallM)                     NextWalkerState = L1_RD; | ||||||
| 				else 			NextWalkerState = L0_ADR; |            else                                  NextWalkerState = L0_ADR; | ||||||
| 	//	    LEVEL1: if (ValidLeafPTE & ~Misaligned) NextWalkerState = LEAF;
 | 	L0_ADR: if (ValidLeafPTE & ~Misaligned)      NextWalkerState = LEAF; // could shortcut this by a cyle for all Lx_ADR superpages
 | ||||||
| 	//	      		else if (ValidNonLeafPTE) NextWalkerState = L0_ADR;
 | 			else if (ValidNonLeafPTE)            NextWalkerState = L0_RD; | ||||||
| 	//				else 				NextWalkerState = FAULT;
 | 			else                                 NextWalkerState = LEAF; | ||||||
| 	L0_ADR: if (ValidLeafPTE & ~Misaligned) NextWalkerState = LEAF; // could shortcut this by a cyle for all Lx_ADR superpages
 | 	L0_RD: if (DCacheStallM)                     NextWalkerState = L0_RD; | ||||||
| 			else if (ValidNonLeafPTE) NextWalkerState = L0_RD; |            else                                  NextWalkerState = LEAF; | ||||||
| 			else 				NextWalkerState = LEAF; |     LEAF: if (DAPageFault) NextWalkerState = UPDATE_PTE; | ||||||
| 	L0_RD: if (DCacheStallM) NextWalkerState = L0_RD; |           else NextWalkerState = IDLE; | ||||||
| 				else 			NextWalkerState = LEAF; |       // *** TODO update PTE with dirty/access.  write to TLB and update memory.
 | ||||||
| 	//	    LEVEL0: if (ValidLeafPTE) 	NextWalkerState = LEAF;
 |       // probably want to write the PTE in UPDATE_PTE then go to leaf and update TLB.
 | ||||||
| 	//				else 				NextWalkerState = FAULT;
 |     UPDATE_PTE: if(`HPTW_WRITES_SUPPORTED & DCacheStallM) NextWalkerState = UPDATE_PTE; | ||||||
| 	LEAF:                       NextWalkerState = IDLE; // updates TLB
 |                 else NextWalkerState = LEAF; | ||||||
| 	default: begin | 	default: begin | ||||||
| 		// synthesis translate_off
 | 		// synthesis translate_off
 | ||||||
| 		$error("Default state in HPTW should be unreachable; was %d", WalkerState); | 		if (WalkerState !== 'x)  | ||||||
|  | 			$error("Default state in HPTW should be unreachable; was %d", WalkerState); | ||||||
| 		// synthesis translate_on
 | 		// synthesis translate_on
 | ||||||
| 		NextWalkerState = IDLE; // should never be reached
 | 		NextWalkerState = IDLE; // should never be reached
 | ||||||
| 	end | 	end | ||||||
|  | |||||||
| @ -34,20 +34,20 @@ | |||||||
| module mmu #(parameter TLB_ENTRIES = 8, // number of TLB Entries
 | module mmu #(parameter TLB_ENTRIES = 8, // number of TLB Entries
 | ||||||
|              parameter IMMU = 0) ( |              parameter IMMU = 0) ( | ||||||
| 
 | 
 | ||||||
|   input logic              clk, reset, |   input logic                 clk, reset, | ||||||
|   // Current value of satp CSR (from privileged unit)
 |   // Current value of satp CSR (from privileged unit)
 | ||||||
|   input logic  [`XLEN-1:0] SATP_REGW, |   input logic [`XLEN-1:0]     SATP_REGW, | ||||||
|   input logic              STATUS_MXR, STATUS_SUM, STATUS_MPRV, |   input logic                 STATUS_MXR, STATUS_SUM, STATUS_MPRV, | ||||||
|   input logic  [1:0]       STATUS_MPP, |   input logic [1:0]           STATUS_MPP, | ||||||
| 
 | 
 | ||||||
|   // Current privilege level of the processeor
 |   // Current privilege level of the processeor
 | ||||||
|   input logic  [1:0]       PrivilegeModeW, |   input logic [1:0]           PrivilegeModeW, | ||||||
| 
 | 
 | ||||||
|   // 00 - TLB is not being accessed
 |   // 00 - TLB is not being accessed
 | ||||||
|   // 1x - TLB is accessed for a read (or an instruction)
 |   // 1x - TLB is accessed for a read (or an instruction)
 | ||||||
|   // x1 - TLB is accessed for a write
 |   // x1 - TLB is accessed for a write
 | ||||||
|   // 11 - TLB is accessed for both read and write
 |   // 11 - TLB is accessed for both read and write
 | ||||||
|   input logic              DisableTranslation, |   input logic                 DisableTranslation, | ||||||
| 
 | 
 | ||||||
|   // VAdr goes to the TLB only. Virtual if the TLB is active.
 |   // VAdr goes to the TLB only. Virtual if the TLB is active.
 | ||||||
|   // PAdr goes to address mux bypassing the TLB.  PAdr used when there is no translation.
 |   // PAdr goes to address mux bypassing the TLB.  PAdr used when there is no translation.
 | ||||||
| @ -57,32 +57,33 @@ module mmu #(parameter TLB_ENTRIES = 8, // number of TLB Entries | |||||||
|   // performed.  
 |   // performed.  
 | ||||||
|   // PhysicalAddress is selected to be PAdr when no translation or the translated VAdr (TLBPAdr)
 |   // PhysicalAddress is selected to be PAdr when no translation or the translated VAdr (TLBPAdr)
 | ||||||
|   // when there is translation.
 |   // when there is translation.
 | ||||||
|   input logic  [`PA_BITS-1:0] PAdr,  // *** consider renaming this.
 |   input logic [`PA_BITS-1:0]  PAdr, // *** consider renaming this.
 | ||||||
|   input logic  [`XLEN-1:0] VAdr, |   input logic [`XLEN-1:0]     VAdr, | ||||||
|   input logic  [1:0]       Size, // 00 = 8 bits, 01 = 16 bits, 10 = 32 bits , 11 = 64 bits
 |   input logic [1:0]           Size, // 00 = 8 bits, 01 = 16 bits, 10 = 32 bits , 11 = 64 bits
 | ||||||
| 
 | 
 | ||||||
|   // Controls for writing a new entry to the TLB
 |   // Controls for writing a new entry to the TLB
 | ||||||
|   input logic  [`XLEN-1:0] PTE, |   input logic [`XLEN-1:0]     PTE, | ||||||
|   input logic  [1:0]       PageTypeWriteVal, |   input logic [1:0]           PageTypeWriteVal, | ||||||
|   input logic              TLBWrite, |   input logic                 TLBWrite, | ||||||
| 
 | 
 | ||||||
|   // Invalidate all TLB entries
 |   // Invalidate all TLB entries
 | ||||||
|   input logic              TLBFlush, |   input logic                 TLBFlush, | ||||||
| 
 | 
 | ||||||
|   // Physical address outputs
 |   // Physical address outputs
 | ||||||
|   output logic [`PA_BITS-1:0] PhysicalAddress, |   output logic [`PA_BITS-1:0] PhysicalAddress, | ||||||
|   output logic             TLBMiss, |   output logic                TLBMiss, | ||||||
|   output logic             Cacheable, Idempotent, AtomicAllowed, |   output logic                Cacheable, Idempotent, AtomicAllowed, | ||||||
| 
 | 
 | ||||||
|   // Faults
 |   // Faults
 | ||||||
|   output logic             InstrAccessFaultF, LoadAccessFaultM, StoreAmoAccessFaultM, |   output logic                InstrAccessFaultF, LoadAccessFaultM, StoreAmoAccessFaultM, | ||||||
|   output logic 			   InstrPageFaultF, LoadPageFaultM, StoreAmoPageFaultM, |   output logic                InstrPageFaultF, LoadPageFaultM, StoreAmoPageFaultM, | ||||||
|   output logic 			   LoadMisalignedFaultM, StoreAmoMisalignedFaultM, |   output logic                DAPageFault, | ||||||
|  |   output logic                LoadMisalignedFaultM, StoreAmoMisalignedFaultM, | ||||||
| 
 | 
 | ||||||
|   // PMA checker signals
 |   // PMA checker signals
 | ||||||
|   input  logic             AtomicAccessM, ExecuteAccessF, WriteAccessM, ReadAccessM, |   input logic                 AtomicAccessM, ExecuteAccessF, WriteAccessM, ReadAccessM, | ||||||
|   input  var logic [7:0]   PMPCFG_ARRAY_REGW[`PMP_ENTRIES-1:0], |   input var                   logic [7:0] PMPCFG_ARRAY_REGW[`PMP_ENTRIES-1:0], | ||||||
|   input  var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [`PMP_ENTRIES-1:0] |   input var                   logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [`PMP_ENTRIES-1:0] | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
|   logic [`PA_BITS-1:0] TLBPAdr; |   logic [`PA_BITS-1:0] TLBPAdr; | ||||||
| @ -109,7 +110,7 @@ module mmu #(parameter TLB_ENTRIES = 8, // number of TLB Entries | |||||||
|           .PrivilegeModeW, .ReadAccess, .WriteAccess, |           .PrivilegeModeW, .ReadAccess, .WriteAccess, | ||||||
|           .DisableTranslation, .PTE, .PageTypeWriteVal, |           .DisableTranslation, .PTE, .PageTypeWriteVal, | ||||||
|           .TLBWrite, .TLBFlush, .TLBPAdr, .TLBMiss, .TLBHit,  |           .TLBWrite, .TLBFlush, .TLBPAdr, .TLBMiss, .TLBHit,  | ||||||
|           .Translate, .TLBPageFault); |           .Translate, .TLBPageFault, .DAPageFault); | ||||||
|   end else begin:tlb// just pass address through as physical
 |   end else begin:tlb// just pass address through as physical
 | ||||||
|     assign Translate = 0; |     assign Translate = 0; | ||||||
|     assign TLBMiss = 0; |     assign TLBMiss = 0; | ||||||
|  | |||||||
| @ -56,43 +56,44 @@ | |||||||
| // The TLB will have 2**ENTRY_BITS total entries
 | // The TLB will have 2**ENTRY_BITS total entries
 | ||||||
| module tlb #(parameter TLB_ENTRIES = 8, | module tlb #(parameter TLB_ENTRIES = 8, | ||||||
|              parameter ITLB = 0) ( |              parameter ITLB = 0) ( | ||||||
|   input logic              clk, reset, |   input logic                    clk, reset, | ||||||
| 
 | 
 | ||||||
|   // Current value of satp CSR (from privileged unit)
 |   // Current value of satp CSR (from privileged unit)
 | ||||||
|   input logic  [`SVMODE_BITS-1:0] SATP_MODE, |   input logic [`SVMODE_BITS-1:0] SATP_MODE, | ||||||
|   input logic  [`ASID_BITS-1:0] SATP_ASID, |   input logic [`ASID_BITS-1:0]   SATP_ASID, | ||||||
|   input logic              STATUS_MXR, STATUS_SUM, STATUS_MPRV, |   input logic                    STATUS_MXR, STATUS_SUM, STATUS_MPRV, | ||||||
|   input logic  [1:0]       STATUS_MPP, |   input logic [1:0]              STATUS_MPP, | ||||||
| 
 | 
 | ||||||
|   // Current privilege level of the processeor
 |   // Current privilege level of the processeor
 | ||||||
|   input logic  [1:0]       PrivilegeModeW, |   input logic [1:0]              PrivilegeModeW, | ||||||
| 
 | 
 | ||||||
|   // 00 - TLB is not being accessed
 |   // 00 - TLB is not being accessed
 | ||||||
|   // 1x - TLB is accessed for a read (or an instruction)
 |   // 1x - TLB is accessed for a read (or an instruction)
 | ||||||
|   // x1 - TLB is accessed for a write
 |   // x1 - TLB is accessed for a write
 | ||||||
|   // 11 - TLB is accessed for both read and write
 |   // 11 - TLB is accessed for both read and write
 | ||||||
|   input logic              ReadAccess, WriteAccess, |   input logic                    ReadAccess, WriteAccess, | ||||||
|   input logic              DisableTranslation, |   input logic                    DisableTranslation, | ||||||
| 
 | 
 | ||||||
|   // address input before translation (could be physical or virtual)
 |   // address input before translation (could be physical or virtual)
 | ||||||
|   input logic  [`XLEN-1:0] VAdr, |   input logic [`XLEN-1:0]        VAdr, | ||||||
| 
 | 
 | ||||||
|   // Controls for writing a new entry to the TLB
 |   // Controls for writing a new entry to the TLB
 | ||||||
|   input logic  [`XLEN-1:0] PTE, |   input logic [`XLEN-1:0]        PTE, | ||||||
|   input logic  [1:0]       PageTypeWriteVal, |   input logic [1:0]              PageTypeWriteVal, | ||||||
|   input logic              TLBWrite, |   input logic                    TLBWrite, | ||||||
| 
 | 
 | ||||||
|   // Invalidate all TLB entries
 |   // Invalidate all TLB entries
 | ||||||
|   input logic              TLBFlush, |   input logic                    TLBFlush, | ||||||
| 
 | 
 | ||||||
|   // Physical address outputs
 |   // Physical address outputs
 | ||||||
|   output logic [`PA_BITS-1:0] TLBPAdr, |   output logic [`PA_BITS-1:0]    TLBPAdr, | ||||||
|   output logic             TLBMiss, |   output logic                   TLBMiss, | ||||||
|   output logic             TLBHit, |   output logic                   TLBHit, | ||||||
|   output logic             Translate, |   output logic                   Translate, | ||||||
| 
 | 
 | ||||||
|   // Faults
 |   // Faults
 | ||||||
|   output logic             TLBPageFault |   output logic                   TLBPageFault, | ||||||
|  |   output logic                   DAPageFault | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
|   logic [TLB_ENTRIES-1:0] Matches, WriteEnables, PTE_Gs; // used as the one-hot encoding of WriteIndex
 |   logic [TLB_ENTRIES-1:0] Matches, WriteEnables, PTE_Gs; // used as the one-hot encoding of WriteIndex
 | ||||||
| @ -132,7 +133,7 @@ module tlb #(parameter TLB_ENTRIES = 8, | |||||||
|   tlbcontrol #(ITLB) tlbcontrol(.SATP_MODE, .VAdr, .STATUS_MXR, .STATUS_SUM, .STATUS_MPRV, .STATUS_MPP, |   tlbcontrol #(ITLB) tlbcontrol(.SATP_MODE, .VAdr, .STATUS_MXR, .STATUS_SUM, .STATUS_MPRV, .STATUS_MPP, | ||||||
|                         .PrivilegeModeW, .ReadAccess, .WriteAccess, .DisableTranslation, .TLBFlush, |                         .PrivilegeModeW, .ReadAccess, .WriteAccess, .DisableTranslation, .TLBFlush, | ||||||
|                         .PTEAccessBits, .CAMHit, .Misaligned, .TLBMiss, .TLBHit, .TLBPageFault,  |                         .PTEAccessBits, .CAMHit, .Misaligned, .TLBMiss, .TLBHit, .TLBPageFault,  | ||||||
|                         .SV39Mode, .Translate); |                         .DAPageFault, .SV39Mode, .Translate); | ||||||
| 
 | 
 | ||||||
|   tlblru #(TLB_ENTRIES) lru(.clk, .reset, .TLBWrite, .TLBFlush, .Matches, .CAMHit, .WriteEnables); |   tlblru #(TLB_ENTRIES) lru(.clk, .reset, .TLBWrite, .TLBFlush, .Matches, .CAMHit, .WriteEnables); | ||||||
|   tlbcam #(TLB_ENTRIES, `VPN_BITS + `ASID_BITS, `VPN_SEGMENT_BITS)  |   tlbcam #(TLB_ENTRIES, `VPN_BITS + `ASID_BITS, `VPN_SEGMENT_BITS)  | ||||||
|  | |||||||
| @ -33,27 +33,28 @@ | |||||||
| module tlbcontrol #(parameter ITLB = 0) ( | module tlbcontrol #(parameter ITLB = 0) ( | ||||||
| 
 | 
 | ||||||
|   // Current value of satp CSR (from privileged unit)
 |   // Current value of satp CSR (from privileged unit)
 | ||||||
|   input logic  [`SVMODE_BITS-1:0] SATP_MODE, |   input logic [`SVMODE_BITS-1:0] SATP_MODE, | ||||||
|   input logic  [`XLEN-1:0] VAdr, |   input logic [`XLEN-1:0]        VAdr, | ||||||
|   input logic              STATUS_MXR, STATUS_SUM, STATUS_MPRV, |   input logic                    STATUS_MXR, STATUS_SUM, STATUS_MPRV, | ||||||
|   input logic  [1:0]       STATUS_MPP, |   input logic [1:0]              STATUS_MPP, | ||||||
|   input logic  [1:0]       PrivilegeModeW, // Current privilege level of the processeor
 |   input logic [1:0]              PrivilegeModeW, // Current privilege level of the processeor
 | ||||||
| 
 | 
 | ||||||
|   // 00 - TLB is not being accessed
 |   // 00 - TLB is not being accessed
 | ||||||
|   // 1x - TLB is accessed for a read (or an instruction)
 |   // 1x - TLB is accessed for a read (or an instruction)
 | ||||||
|   // x1 - TLB is accessed for a write
 |   // x1 - TLB is accessed for a write
 | ||||||
|   // 11 - TLB is accessed for both read and write
 |   // 11 - TLB is accessed for both read and write
 | ||||||
|   input logic              ReadAccess, WriteAccess, |   input logic                    ReadAccess, WriteAccess, | ||||||
|   input logic              DisableTranslation, |   input logic                    DisableTranslation, | ||||||
|   input logic              TLBFlush, // Invalidate all TLB entries
 |   input logic                    TLBFlush, // Invalidate all TLB entries
 | ||||||
|   input logic [7:0]        PTEAccessBits, |   input logic [7:0]              PTEAccessBits, | ||||||
|   input logic              CAMHit, |   input logic                    CAMHit, | ||||||
|   input logic              Misaligned, |   input logic                    Misaligned, | ||||||
|   output logic             TLBMiss, |   output logic                   TLBMiss, | ||||||
|   output logic             TLBHit, |   output logic                   TLBHit, | ||||||
|   output logic             TLBPageFault, |   output logic                   TLBPageFault, | ||||||
|   output logic             SV39Mode, |   output logic                   DAPageFault, | ||||||
|   output logic             Translate |   output logic                   SV39Mode, | ||||||
|  |   output logic                   Translate | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
|   // Sections of the page table entry
 |   // Sections of the page table entry
 | ||||||
| @ -63,7 +64,6 @@ module tlbcontrol #(parameter ITLB = 0) ( | |||||||
| 
 | 
 | ||||||
|   logic PTE_D, PTE_A, PTE_U, PTE_X, PTE_W, PTE_R, PTE_V; // Useful PTE Control Bits
 |   logic PTE_D, PTE_A, PTE_U, PTE_X, PTE_W, PTE_R, PTE_V; // Useful PTE Control Bits
 | ||||||
|   logic                  UpperBitsUnequalPageFault; |   logic                  UpperBitsUnequalPageFault; | ||||||
|   logic                  DAPageFault; |  | ||||||
|   logic                  TLBAccess; |   logic                  TLBAccess; | ||||||
|   logic ImproperPrivilege; |   logic ImproperPrivilege; | ||||||
| 
 | 
 | ||||||
| @ -97,9 +97,14 @@ module tlbcontrol #(parameter ITLB = 0) ( | |||||||
|     // only execute non-user mode pages.
 |     // only execute non-user mode pages.
 | ||||||
|     assign ImproperPrivilege = ((EffectivePrivilegeMode == `U_MODE) & ~PTE_U) | |     assign ImproperPrivilege = ((EffectivePrivilegeMode == `U_MODE) & ~PTE_U) | | ||||||
|       ((EffectivePrivilegeMode == `S_MODE) & PTE_U); |       ((EffectivePrivilegeMode == `S_MODE) & PTE_U); | ||||||
|  |     if(`HPTW_WRITES_SUPPORTED) begin : hptwwrites | ||||||
|  |       assign DAPageFault = Translate & TLBHit & ~PTE_A & ~TLBPageFault; | ||||||
|  |       assign TLBPageFault = (Translate  & TLBHit & (ImproperPrivilege | ~PTE_X | UpperBitsUnequalPageFault | Misaligned | ~PTE_V)); | ||||||
|  |     end else begin | ||||||
|     // fault for software handling if access bit is off
 |     // fault for software handling if access bit is off
 | ||||||
|     assign DAPageFault = ~PTE_A; |       assign DAPageFault = ~PTE_A; | ||||||
|     assign TLBPageFault = (Translate  & TLBHit & (ImproperPrivilege | ~PTE_X | DAPageFault | UpperBitsUnequalPageFault | Misaligned | ~PTE_V)); |       assign TLBPageFault = (Translate  & TLBHit & (ImproperPrivilege | ~PTE_X | DAPageFault | UpperBitsUnequalPageFault | Misaligned | ~PTE_V)); | ||||||
|  |     end | ||||||
|   end else begin:dtlb // Data TLB fault checking
 |   end else begin:dtlb // Data TLB fault checking
 | ||||||
|     logic InvalidRead, InvalidWrite; |     logic InvalidRead, InvalidWrite; | ||||||
| 
 | 
 | ||||||
| @ -114,9 +119,14 @@ module tlbcontrol #(parameter ITLB = 0) ( | |||||||
|     // Check for write error. Writes are invalid when the page's write bit is
 |     // Check for write error. Writes are invalid when the page's write bit is
 | ||||||
|     // low.
 |     // low.
 | ||||||
|     assign InvalidWrite = WriteAccess & ~PTE_W; |     assign InvalidWrite = WriteAccess & ~PTE_W; | ||||||
|     // Fault for software handling if access bit is off or writing a page with dirty bit off
 |     if(`HPTW_WRITES_SUPPORTED) begin : hptwwrites | ||||||
|     assign DAPageFault = ~PTE_A | WriteAccess & ~PTE_D;  |       assign DAPageFault = Translate & TLBHit & (~PTE_A | WriteAccess & ~PTE_D) & ~TLBPageFault;  | ||||||
|     assign TLBPageFault =  (Translate & TLBHit & (ImproperPrivilege | InvalidRead | InvalidWrite | DAPageFault | UpperBitsUnequalPageFault | Misaligned | ~PTE_V)); |       assign TLBPageFault =  (Translate & TLBHit & (ImproperPrivilege | InvalidRead | InvalidWrite | UpperBitsUnequalPageFault | Misaligned | ~PTE_V)); | ||||||
|  |     end else begin | ||||||
|  |       // Fault for software handling if access bit is off or writing a page with dirty bit off
 | ||||||
|  |       assign DAPageFault = ~PTE_A | WriteAccess & ~PTE_D;  | ||||||
|  |       assign TLBPageFault = (Translate & TLBHit & (ImproperPrivilege | InvalidRead | InvalidWrite | DAPageFault | UpperBitsUnequalPageFault | Misaligned | ~PTE_V)); | ||||||
|  |     end | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   assign TLBHit = CAMHit & TLBAccess; |   assign TLBHit = CAMHit & TLBAccess; | ||||||
|  | |||||||
| @ -49,7 +49,7 @@ module privdec ( | |||||||
|   assign ecallM =     PrivilegedM & (InstrM[31:20] == 12'b000000000000); |   assign ecallM =     PrivilegedM & (InstrM[31:20] == 12'b000000000000); | ||||||
|   assign ebreakM =    PrivilegedM & (InstrM[31:20] == 12'b000000000001); |   assign ebreakM =    PrivilegedM & (InstrM[31:20] == 12'b000000000001); | ||||||
|   assign wfiM =       PrivilegedM & (InstrM[31:20] == 12'b000100000101); |   assign wfiM =       PrivilegedM & (InstrM[31:20] == 12'b000100000101); | ||||||
|   assign sfencevmaM = PrivilegedM & (InstrM[31:25] ==  7'b0001001); |   assign sfencevmaM = PrivilegedM & (InstrM[31:25] ==  7'b0001001); // *** & (PrivilegedModeW == `M_MODE | ~STATUS_TVM); // *** does this work in U mode?
 | ||||||
|   assign IllegalPrivilegedInstrM = PrivilegedM & ~(sretM|mretM|ecallM|ebreakM|wfiM|sfencevmaM); |   assign IllegalPrivilegedInstrM = PrivilegedM & ~(sretM|mretM|ecallM|ebreakM|wfiM|sfencevmaM); | ||||||
|   assign IllegalInstrFaultM = (IllegalIEUInstrFaultM & IllegalFPUInstrM) | IllegalPrivilegedInstrM | IllegalCSRAccessM | TrappedSRETM; // *** generalize this for other instructions
 |   assign IllegalInstrFaultM = (IllegalIEUInstrFaultM & IllegalFPUInstrM) | IllegalPrivilegedInstrM | IllegalCSRAccessM | TrappedSRETM; // *** generalize this for other instructions
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -90,12 +90,14 @@ module uncore ( | |||||||
|   // unswizzle HSEL signals
 |   // unswizzle HSEL signals
 | ||||||
|   assign {HSELEXT, HSELBootRom, HSELRam, HSELCLINT, HSELGPIO, HSELUART, HSELPLIC, HSELSDC} = HSELRegions[7:0]; |   assign {HSELEXT, HSELBootRom, HSELRam, HSELCLINT, HSELGPIO, HSELUART, HSELPLIC, HSELSDC} = HSELRegions[7:0]; | ||||||
| 
 | 
 | ||||||
|   // subword accesses: converts HWDATAIN to HWDATA
 |   // subword accesses: converts HWDATAIN to HWDATA only if no dtim or cache.
 | ||||||
|   // *** can this be merged into LSU instead of replicated?
 |   if(`DMEM == `MEM_BUS) | ||||||
|   subwordwrite sww( |     subwordwrite sww( | ||||||
|     .HRDATA,  |       .HRDATA, | ||||||
|     .HADDRD, .HSIZED,  |       .HADDRD, .HSIZED,  | ||||||
|     .HWDATAIN, .HWDATA); |       .HWDATAIN, .HWDATA); | ||||||
|  |   else assign HWDATA = HWDATAIN; | ||||||
|  |    | ||||||
| 
 | 
 | ||||||
| //  generate
 | //  generate
 | ||||||
|     // on-chip RAM
 |     // on-chip RAM
 | ||||||
|  | |||||||
| @ -163,7 +163,7 @@ module wallypipelinedcore ( | |||||||
|   logic 		    ICacheMiss; |   logic 		    ICacheMiss; | ||||||
|   logic 		    ICacheAccess; |   logic 		    ICacheAccess; | ||||||
|   logic 		    BreakpointFaultM, EcallFaultM; |   logic 		    BreakpointFaultM, EcallFaultM; | ||||||
| 
 |   logic             InstrDAPageFaultF; | ||||||
|    |    | ||||||
|   ifu ifu( |   ifu ifu( | ||||||
|     .clk, .reset, |     .clk, .reset, | ||||||
| @ -201,8 +201,8 @@ module wallypipelinedcore ( | |||||||
| 
 | 
 | ||||||
|     // pmp/pma (inside mmu) signals.  *** temporarily from AHB bus but eventually replace with internal versions pre H
 |     // pmp/pma (inside mmu) signals.  *** temporarily from AHB bus but eventually replace with internal versions pre H
 | ||||||
|     .PMPCFG_ARRAY_REGW,  .PMPADDR_ARRAY_REGW, |     .PMPCFG_ARRAY_REGW,  .PMPADDR_ARRAY_REGW, | ||||||
|     .InstrAccessFaultF |     .InstrAccessFaultF, | ||||||
| 
 |     .InstrDAPageFaultF | ||||||
| 	   | 	   | ||||||
| 	  ); // instruction fetch unit: PC, branch prediction, instruction cache
 | 	  ); // instruction fetch unit: PC, branch prediction, instruction cache
 | ||||||
|      |      | ||||||
| @ -276,6 +276,7 @@ module wallypipelinedcore ( | |||||||
| 	.LoadAccessFaultM,         // connects to privilege
 | 	.LoadAccessFaultM,         // connects to privilege
 | ||||||
| 	.StoreAmoMisalignedFaultM, // connects to privilege
 | 	.StoreAmoMisalignedFaultM, // connects to privilege
 | ||||||
| 	.StoreAmoAccessFaultM,     // connects to privilege
 | 	.StoreAmoAccessFaultM,     // connects to privilege
 | ||||||
|  |     .InstrDAPageFaultF, | ||||||
|      |      | ||||||
| 	.PCF, .ITLBMissF, .PTE, .PageType, .ITLBWriteF, | 	.PCF, .ITLBMissF, .PTE, .PageType, .ITLBWriteF, | ||||||
| 	.LSUStallM);                     // change to LSUStallM
 | 	.LSUStallM);                     // change to LSUStallM
 | ||||||
|  | |||||||
| @ -21,10 +21,39 @@ hash := $(shell git rev-parse --short HEAD) | |||||||
| export OUTPUTDIR := runs/$(DESIGN)_$(CONFIG)_$(TECH)nm_$(FREQ)_MHz_$(time)_$(hash) | export OUTPUTDIR := runs/$(DESIGN)_$(CONFIG)_$(TECH)nm_$(FREQ)_MHz_$(time)_$(hash) | ||||||
| export SAIFPOWER ?= 0 | export SAIFPOWER ?= 0 | ||||||
| 
 | 
 | ||||||
|  | CONFIGDIR ?= ~/riscv-wally/pipelined/config | ||||||
|  | #CONFIGS	?= $(shell find $(CONFIGDIR) -name "rv*")
 | ||||||
|  | CONFIGS ?= ("rv32e", "rv32ic") | ||||||
|  | 
 | ||||||
|  | print: | ||||||
|  | 	echo "files in $(CONFIGDIR) are $(CONFIGS)." | ||||||
|  | 
 | ||||||
| default: | default: | ||||||
| 	@echo "Basic synthesis procedure for OSU/HMC/UNLV:" | 	@echo "Basic synthesis procedure for Wally:" | ||||||
| 	@echo " adapt Makefile to your liking..." | 	@echo "  Invoke with make synth" | ||||||
| 	@echo | 
 | ||||||
|  | test: rv% | ||||||
|  | 	echo "Running test on $<" | ||||||
|  | 
 | ||||||
|  | rv%.log: rv% | ||||||
|  | 	echo $< | ||||||
|  | 
 | ||||||
|  | flavors: | ||||||
|  | 	rm -rf $(CONFIGDIR)/rv32em | ||||||
|  | 	cp -r $(CONFIGDIR)/rv32e $(CONFIGDIR)/rv32em | ||||||
|  | 	sed -i 's/h00000010/h00001010/' $(CONFIGDIR)/rv32em/wally-config.vh | ||||||
|  | 	# rv32e, 32ic, 32gc 64ic, 64gc | ||||||
|  | 	# 64gc - FPU | ||||||
|  | 	# PMP16 | ||||||
|  | 	# PMP0 | ||||||
|  | 	# No virtual memory | ||||||
|  | 	# Muldiv | ||||||
|  | 	 | ||||||
|  | 
 | ||||||
|  | allsynth:  | ||||||
|  | 	make flavors | ||||||
|  | 	make synth DESIGN=wallypipelinedcore CONFIG=rv32e TECH=sky90 FREQ=500 MAXCORES=1 | ||||||
|  | 	make synth DESIGN=wallypipelinedcore CONFIG=rv32em TECH=sky90 FREQ=500 MAXCORES=1 | ||||||
| 
 | 
 | ||||||
| synth: | synth: | ||||||
| 	@echo "DC Synthesis" | 	@echo "DC Synthesis" | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user