mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-03 10:15:19 +00:00
Merge pull request #272 from davidharrishmc/dev
fdivsqrt coverage and fix bug of not trapping on access to odd-numbered pmpcfg
This commit is contained in:
commit
a353bbc3f1
@ -1,6 +1,29 @@
|
||||
# CORE-V Wally Test Plan
|
||||
# CORE-V Wally Design Verification Test Plan
|
||||
|
||||
CORE-V Wally is functionally tested in the following ways. Each test is run in lock-step against ImperasDV to ensure all architectural state is correct after each instruction.
|
||||
|
||||
| Functions | Coverage Method | Status |
|
||||
| ----------- | ----------- |----|
|
||||
| Instructions | riscv-arch-test | Pass |
|
||||
| Privileged Unit | wally-riscv-arch-test | Pass |
|
||||
| Virtual Memory | wally-riscv-arch-test | Pass |
|
||||
| PMP | wally-riscv-arch-test | Pass
|
||||
| Peripherals | wally-riscv-arch-test | Pass |
|
||||
| Floating-Point | TestFloat | Pass |
|
||||
| General | Code Coverage | 91% |
|
||||
| General | Boot Linux in Sim | Pass |
|
||||
| General | Boot Linux on FPGA | Pass |
|
||||
|
||||
|
||||
The following performance validation is also run:
|
||||
| Function | Method | Status |
|
||||
| --- | --- | --- |
|
||||
| Overall Performance | embench | Pass|
|
||||
| Overall Performance | coremark | Pass |
|
||||
| Branch Predictor | *** | Pass |
|
||||
| Cache Miss Rate | *** | Pass |
|
||||
|
||||
|
||||
CORE-V Wally is tested in the following ways:
|
||||
|
||||
* Run [RISC-V Architecture Compatibility Tests](https://github.com/riscv-non-isa/riscv-arch-test) in lock-step against the ImperasDV reference model.
|
||||
* Run custom tests to cover virtual memory, PMP, privileged unit, and peripherals in lock step against ImperasDV.
|
||||
|
@ -31,11 +31,14 @@
|
||||
do GetLineNum.do
|
||||
|
||||
# LZA (i<64) statement confuses coverage tool
|
||||
# This is ugly to exlcude the whole file - is there a better option? // coverage off isn't working
|
||||
# DH 4/22/23: Exclude all LZAs
|
||||
coverage exclude -srcfile lzc.sv
|
||||
|
||||
# FDIVSQRT has
|
||||
# DH 4/22/23: FDIVSQRT can't go directly from done to busy again
|
||||
coverage exclude -scope /dut/core/fpu/fpu/fdivsqrt/fdivsqrtfsm -ftrans state DONE->BUSY
|
||||
# DH 4/22/23: The busy->idle transition only occurs if a FlushE occurs while the divider is busy. The flush is caused by a trap or return,
|
||||
# which won't happen while the divider is busy.
|
||||
coverage exclude -scope /dut/core/fpu/fpu/fdivsqrt/fdivsqrtfsm -ftrans state BUSY->IDLE
|
||||
|
||||
### Exclude D$ states and logic for the I$ instance
|
||||
# This is cleaner than trying to set an I$-specific pragma in cachefsm.sv (which would exclude it for the D$ instance too)
|
||||
|
2
src/cache/cachefsm.sv
vendored
2
src/cache/cachefsm.sv
vendored
@ -159,7 +159,7 @@ module cachefsm #(parameter READ_ONLY_CACHE = 0) (
|
||||
assign SelFlush = (CurrState == STATE_READY & FlushCache) |
|
||||
(CurrState == STATE_FLUSH) |
|
||||
(CurrState == STATE_FLUSH_WRITEBACK);
|
||||
// coverage off -item e -fecexprrow 1
|
||||
// coverage off -item e 1 -fecexprrow 1
|
||||
// (state is always FLUSH_WRITEBACK when FlushWayFlag & CacheBusAck)
|
||||
assign FlushAdrCntEn = (CurrState == STATE_FLUSH_WRITEBACK & FlushWayFlag & CacheBusAck) |
|
||||
(CurrState == STATE_FLUSH & FlushWayFlag & ~LineDirty);
|
||||
|
@ -66,7 +66,6 @@ module fdivsqrtfsm(
|
||||
if (reset | FlushE) begin
|
||||
state <= #1 IDLE;
|
||||
end else if (IFDivStartE) begin // IFDivStartE implies stat is IDLE
|
||||
// end else if ((state == IDLE) & IFDivStartE) begin // IFDivStartE implies stat is IDLE
|
||||
step <= CyclesE;
|
||||
if (SpecialCaseE) state <= #1 DONE;
|
||||
else state <= #1 BUSY;
|
||||
|
@ -171,7 +171,8 @@ module csrm #(parameter
|
||||
IllegalCSRMAccessM = !(`S_SUPPORTED) & (CSRAdrM == MEDELEG | CSRAdrM == MIDELEG); // trap on DELEG register access when no S or N-mode
|
||||
if (CSRAdrM >= PMPADDR0 & CSRAdrM < PMPADDR0 + `PMP_ENTRIES) // reading a PMP entry
|
||||
CSRMReadValM = {{(`XLEN-(`PA_BITS-2)){1'b0}}, PMPADDR_ARRAY_REGW[CSRAdrM - PMPADDR0]};
|
||||
else if (CSRAdrM >= PMPCFG0 & CSRAdrM < PMPCFG0 + `PMP_ENTRIES/4) begin
|
||||
else if (CSRAdrM >= PMPCFG0 & CSRAdrM < PMPCFG0 + `PMP_ENTRIES/4 & (`XLEN==32 | CSRAdrM[0] == 0)) begin
|
||||
// only odd-numbered PMPCFG entries exist in RV64
|
||||
if (`XLEN==64) begin
|
||||
entry = ({CSRAdrM[11:1], 1'b0} - PMPCFG0)*4; // disregard odd entries in RV64
|
||||
CSRMReadValM = {PMPCFG_ARRAY_REGW[entry+7],PMPCFG_ARRAY_REGW[entry+6],PMPCFG_ARRAY_REGW[entry+5],PMPCFG_ARRAY_REGW[entry+4],
|
||||
|
@ -63,6 +63,9 @@ trap_handler:
|
||||
bgez t0, exception # if msb is clear, it is an exception
|
||||
|
||||
interrupt: # must be a timer interrupt
|
||||
li t0, -1 # set mtimecmp to biggest number so it doesnt interrupt again
|
||||
li t1, 0x02004000 # MTIMECMP in CLINT
|
||||
sd t0, 0(t1)
|
||||
j trap_return # clean up and return
|
||||
|
||||
exception:
|
||||
|
@ -28,7 +28,7 @@
|
||||
|
||||
main:
|
||||
|
||||
#bseti t0, zero, 14 # turn on FPU
|
||||
bseti t0, zero, 14 # turn on FPU
|
||||
csrs mstatus, t0
|
||||
|
||||
#Pull denormalized FP number from memory and pass it to fclass.S for coverage
|
||||
@ -105,6 +105,25 @@ main:
|
||||
# fcvt.w.q a0, ft0
|
||||
# fcvt.q.d ft3, ft0
|
||||
|
||||
// fdivsqrt: test busy->idle transition caused by a FlushE while divider is busy (when interrupt arrives)
|
||||
// This code doesn't actually trigger a busy->idle transition because the pending timer interrupt doesn't occur until the division finishes.
|
||||
li t0, 0x3F812345 # random value slightly bigger than 1
|
||||
li t1, 0x3F823456
|
||||
fmv.w.x ft0, t0 # move int to fp register
|
||||
fmv.w.x ft1, t1
|
||||
li t0, -1 # set mtimecmp to biggest number so it doesnt interrupt again
|
||||
li t1, 0x02004000 # MTIMECMP in CLINT
|
||||
sd t0, 0(t1)
|
||||
csrsi mstatus, 0b1000 # enable interrupts with mstatus.MIE
|
||||
li t1, 0x0200bff8 # read MTIME in CLINT
|
||||
ld t0, 0(t1)
|
||||
addi t0, t0, 11
|
||||
li t1, 0x02004000 # MTIMECMP in CLINT
|
||||
sd t0, 0(t1) # write mtime+10 to cause interrupt soon This is very touchy timing and is sensitive to cache line fetch latency
|
||||
nop
|
||||
fdiv.s ft2, ft1, ft0 # should get interrupted, triggering a flush
|
||||
csrci mstatus, 0b1000 # disable interrupts with mstatus.MIE
|
||||
|
||||
# Completing branch coverage in fctrl.sv
|
||||
.word 0x38007553 // Testing the all False case for 119 - funct7 under, op = 101 0011
|
||||
.word 0x40000053 // Line 145 All False Test case - illegal instruction?
|
||||
@ -146,3 +165,4 @@ TestData2:
|
||||
.int 0xbf800000 #FP -1.0
|
||||
.int 0x7fa00000 #SNaN
|
||||
.int 0x3fffffff #OverFlow Test
|
||||
DivTestData:
|
||||
|
Loading…
Reference in New Issue
Block a user