mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Improved tlbcontrol to fault on R=0,W=1; fixed more coverage testsin tlbmisc.S; changed integer type to try to speed up CoreMark; comments in Verilate
This commit is contained in:
		
							parent
							
								
									f98edeb746
								
							
						
					
					
						commit
						0781cd4a44
					
				| @ -109,7 +109,8 @@ typedef unsigned short ee_u16; | ||||
| typedef signed int ee_s32; | ||||
| typedef double ee_f32; | ||||
| typedef unsigned char ee_u8; | ||||
| typedef unsigned int ee_u32; | ||||
| //typedef unsigned int ee_u32;
 | ||||
| typedef signed int ee_u32; // replaced with signed to improve performance per https://github.com/sifive/benchmark-coremark/blob/master/linux64/core_portme.h#L102
 | ||||
| #if (XLEN==64)  | ||||
| 	typedef unsigned long long ee_ptr_int; | ||||
| #else | ||||
|  | ||||
| @ -1,7 +1,8 @@ | ||||
| #!/bin/bash | ||||
| # simulate with Verilator | ||||
| 
 | ||||
| # verilator --timescale "1ns/1ns" --timing --binary -GTEST="arch64i" --top-module testbench "-I../config/shared" "-I../config/rv64gc" ../src/cvw.sv ../testbench/testbench.sv ../testbench/common/*.sv ../src/*/*.sv ../src/*/*/*.sv --relative-includes | ||||
| # verilator -CFLAGS -DVL_DEBUG -CFLAGS -D_GLIBCXX_DEBUG -CFLAGS -ggdb -LDFLAGS -ggdb -CFLAGS -fsanitize=address,undefined -LDFLAGS -fsanitize=address,undefined --timescale "1ns/1ns" --timing --binary --top-module testbench "-I../config/shared" "-I../config/rv64gc" ../src/cvw.sv ../testbench/testbench.sv ../testbench/common/*.sv ../src/*/*.sv ../src/*/*/*.sv --relative-includes | ||||
| # verilator -GTEST="arch64i" --timescale "1ns/1ns" --timing --binary --top-module testbench "-I../config/shared" "-I../config/rv64gc" ../src/cvw.sv ../testbench/testbench.sv ../testbench/common/*.sv ../src/*/*.sv ../src/*/*/*.sv --relative-includes | ||||
| 
 | ||||
| export PATH=$PATH:/usr/local/bin/ | ||||
| verilator=`which verilator` | ||||
|  | ||||
| @ -97,7 +97,7 @@ module tlbcontrol import cvw::*;  #(parameter cvw_t P, ITLB = 0) ( | ||||
|     assign PreUpdateDA = ~PTE_A; | ||||
|     assign InvalidAccess = ~PTE_X; | ||||
|  end else begin:dtlb // Data TLB fault checking
 | ||||
|     logic InvalidRead, InvalidWrite; | ||||
|     logic InvalidRead, InvalidWrite, ReservtedEncoding; | ||||
|     logic InvalidCBOM, InvalidCBOZ; | ||||
| 
 | ||||
|     // User mode may only load/store from user mode pages, and supervisor mode
 | ||||
| @ -108,12 +108,12 @@ module tlbcontrol import cvw::*;  #(parameter cvw_t P, ITLB = 0) ( | ||||
|     // (and executable pages are not readable) or when the page is neither
 | ||||
|     // readable nor executable (and executable pages are readable).
 | ||||
|     assign InvalidRead = ReadAccess & ~PTE_R & (~STATUS_MXR | ~PTE_X); | ||||
|     // Check for write error. Writes are invalid when the page's write bit is
 | ||||
|     // low.
 | ||||
|     // Check for write error. Writes are invalid when the page's write bit is 0.
 | ||||
|     assign InvalidWrite = WriteAccess & ~PTE_W; | ||||
|     assign InvalidCBOM = (|CMOpM[2:0]) & (~PTE_W & (~PTE_R & (~STATUS_MXR | ~PTE_X))); | ||||
|     assign InvalidCBOM = (|CMOpM[2:0]) & (~PTE_R & (~STATUS_MXR | ~PTE_X)); | ||||
|     assign InvalidCBOZ = CMOpM[3] & ~PTE_W; | ||||
|     assign InvalidAccess = InvalidRead | InvalidWrite | InvalidCBOM | InvalidCBOZ; | ||||
|     assign ReservedEncoding = PTE_W & ~PTE_R; // fault on reserved encoding with R=0, W=1 to match ImperasDV behavior
 | ||||
|     assign InvalidAccess = InvalidRead | InvalidWrite | InvalidCBOM | InvalidCBOZ | ReservedEncoding; | ||||
|     assign PreUpdateDA = ~PTE_A | WriteAccess & ~PTE_D; | ||||
|   end | ||||
| 
 | ||||
|  | ||||
| @ -59,7 +59,7 @@ main: | ||||
|     li t0, 0x80200000 | ||||
|     jalr ra, t0 # jump to misaligned megapage | ||||
| 
 | ||||
|     # exercise ebufsmarb | ||||
|     # exercise ebufsmarb (not yet providing coverage 1/1/24 DH & RT) | ||||
|     li t0, 0x80000000 | ||||
|     lw t1, 0(t0)        # fetch from an address to warm up tlb entries | ||||
|     li t0, 0x80A00000 | ||||
| @ -80,6 +80,20 @@ main: | ||||
|     sw t1, 0(t0)    # write to page | ||||
|     jalr ra, t0     # jump to page | ||||
| 
 | ||||
|     # jump to address for TLB miss to trigger HPTW to make access with DisableTranslation = 1, Translate = 0 | ||||
|     li t0, 0x80805000 | ||||
|     jalr ra, t0          | ||||
| 
 | ||||
|     # Good PBMT with menvcfg.PBMTE = 0 | ||||
|     li t0, 3 | ||||
|     ecall   # switch to machine mode | ||||
|     li t5, 0x1 | ||||
|     slli t5, t5, 62 | ||||
|     csrc menvcfg, t5  # menvcfg.PBMTE = 0 | ||||
|     li t0, 1 | ||||
|     ecall   # switch back to supervisor mode | ||||
|     li t0, 0x80806000 | ||||
|     jalr ra, t0      # jump to page to exercise ITLB with PBMT !=0 when ENVCFG_BPMTE=0 | ||||
| 
 | ||||
|     # change back to default trap handler after checking everything that might cause an instruction page fault | ||||
|     jal changetodefaulthandler | ||||
| @ -136,7 +150,6 @@ main: | ||||
|     li a0, 1 | ||||
|     ecall | ||||
| 
 | ||||
| 
 | ||||
|     # wrap up | ||||
|     li a0, 3 # switch back to machine mode because code at 0x80000000 may not have clean page table entry | ||||
|     ecall | ||||
| @ -327,7 +340,8 @@ pagetable: | ||||
|     .8byte 0x00000000200000CF   # valid rwx for VA 80800000 | ||||
|     .8byte 0x00000000200000CB   # valid r x for VA 80801000 | ||||
|     .8byte 0x00000000200000C3   # valid r   for VA 80802000 | ||||
|     .8byte 0x00000000200000C5   # valid   x for VA 80803000 | ||||
|     .8byte 0x00000000200000C9   # valid   x for VA 80803000 | ||||
|     .8byte 0x00000000200000CD   # valid  wx for VA 80804000 (illegal combination, but used to test tlbcontrol) | ||||
| 
 | ||||
|     .8byte 0x000000002000000F   # valid rwx for VA 80805000  for covering ITLB translate and UpdateDA | ||||
|     .8byte 0x20000000200000CF   # PBMT=1    for VA 80806000  for covering ITLB BadPBMT | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user