From 99a15e7897e46fffdbc6f3bfd1a28f1c9c5dd229 Mon Sep 17 00:00:00 2001 From: Skylar Litz Date: Thu, 11 Nov 2021 09:35:51 -0800 Subject: [PATCH 2/5] fix timing of delayed interrupt --- wally-pipelined/testbench/testbench-linux.sv | 24 ++++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/wally-pipelined/testbench/testbench-linux.sv b/wally-pipelined/testbench/testbench-linux.sv index 249cf3902..2ca31e582 100644 --- a/wally-pipelined/testbench/testbench-linux.sv +++ b/wally-pipelined/testbench/testbench-linux.sv @@ -470,8 +470,12 @@ module testbench(); if(CheckMIPFutureE) CheckMIPFutureE <= 0; CheckMIPFutureM <= CheckMIPFutureE; if(CheckMIPFutureM) begin - if((ExpectedPCM != MepcExpected) & ((MepcExpected - ExpectedPCM) * (MepcExpected - ExpectedPCM) <= 16)) begin - RequestDelayedMIP = 1; + $display("%tns: ExpectedPCM %x",$time,ExpectedPCM); + $display("%tns: ExpectedPCE %x",$time,ExpectedPCE); + $display("%tns: ExpectedPCW %x",$time,ExpectedPCW); + if((ExpectedPCE != MepcExpected) & ((MepcExpected - ExpectedPCE) * (MepcExpected - ExpectedPCE) <= 16)) begin + // if((ExpectedPCM != MepcExpected) & ((MepcExpected - ExpectedPCM) * (MepcExpected - ExpectedPCM) <= 16)) begin + RequestDelayedMIP <= 1; $display("%tns: Requesting Delayed MIP. Current MEPC value is %x",$time,MepcExpected); end else begin // update MIP immediately $display("%tns: Updating MIP to %x",$time,NextMIPexpected); @@ -488,14 +492,14 @@ module testbench(); $display("%tn: ExpectedCSRArrayM[NumCSRM] %x",$time,ExpectedCSRArrayM[NumCSRM]); $display("%tn: ExpectedCSRArrayValueM[NumCSRM] %x",$time,ExpectedCSRArrayValueM[NumCSRM]); - if((ExpectedPCM != MepcExpected) & ((MepcExpected - ExpectedPCM) * (MepcExpected - ExpectedPCM) <= 16)) begin - RequestDelayedMIP = 1; - $display("%tns: Requesting Delayed MIP. Current MEPC value is %x",$time,MepcExpected); - end else begin - $display("%tns: Updating MIP to %x",$time,NextMIPexpected); - MIPexpected = NextMIPexpected; - force dut.hart.priv.csr.genblk1.csri.MIP_REGW = MIPexpected; - end + // if((ExpectedPCM != MepcExpected) & ((MepcExpected - ExpectedPCM) * (MepcExpected - ExpectedPCM) <= 16)) begin + // RequestDelayedMIP = 1; + // $display("%tns: Requesting Delayed MIP. Current MEPC value is %x",$time,MepcExpected); + // end else begin + // $display("%tns: Updating MIP to %x",$time,NextMIPexpected); + // MIPexpected = NextMIPexpected; + // force dut.hart.priv.csr.genblk1.csri.MIP_REGW = MIPexpected; + // end end if(RequestDelayedMIP) begin $display("%tns: Executing Delayed MIP. Current MEPC value is %x",$time,dut.hart.priv.csr.genblk1.csrm.MEPC_REGW); From 23bd24323bfccd35768320a3c0c8dd67c41db661 Mon Sep 17 00:00:00 2001 From: bbracker Date: Mon, 15 Nov 2021 14:49:00 -0800 Subject: [PATCH 3/5] get current privilege level from GDB for checkpoints --- tests/linux-testgen/testvector-generation/parseState.py | 5 +++-- wally-pipelined/testbench/testbench-linux.sv | 6 ++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/tests/linux-testgen/testvector-generation/parseState.py b/tests/linux-testgen/testvector-generation/parseState.py index 9a2173b04..bbbf535ba 100755 --- a/tests/linux-testgen/testvector-generation/parseState.py +++ b/tests/linux-testgen/testvector-generation/parseState.py @@ -34,7 +34,8 @@ stateGDBpath = outDir+'intermediate-outputs/stateGDB.txt' if not os.path.exists(stateGDBpath): sys.exit('Error input file '+stateGDBpath+'not found') -singleCSRs = ['pc','mip','mie','mscratch','mcause','mepc','mtvec','medeleg','mideleg','sscratch','scause','sepc','stvec','sedeleg','sideleg','satp','mstatus'] +singleCSRs = ['pc','mip','mie','mscratch','mcause','mepc','mtvec','medeleg','mideleg','sscratch','scause','sepc','stvec','sedeleg','sideleg','satp','mstatus','priv'] +# priv (current privilege mode) isn't technically a CSR but we can log it with the same machinery thirtyTwoBitCSRs = ['mcounteren','scounteren'] listCSRs = ['hpmcounter','pmpaddr'] pmpcfg = ['pmpcfg'] @@ -75,7 +76,7 @@ with open(stateGDBpath, 'r') as stateGDB: outFile = open(outDir+outFileName, 'w') outFile.write(val+'\n') outFile.close() - if name in thirtyTwoBitCSRs: + elif name in thirtyTwoBitCSRs: outFileName = 'checkpoint-'+name.upper() outFile = open(outDir+outFileName, 'w') val = int(val,16) & 0xffffffff diff --git a/wally-pipelined/testbench/testbench-linux.sv b/wally-pipelined/testbench/testbench-linux.sv index 2ca31e582..eb820c131 100644 --- a/wally-pipelined/testbench/testbench-linux.sv +++ b/wally-pipelined/testbench/testbench-linux.sv @@ -197,7 +197,7 @@ module testbench(); `define STATUS_MIE `CSR_BASE.csrsr.STATUS_MIE `define STATUS_SIE `CSR_BASE.csrsr.STATUS_SIE `define STATUS_UIE `CSR_BASE.csrsr.STATUS_UIE - `define CURR_PRIV dut.hart.priv.privmodereg.q + `define PRIV dut.hart.priv.privmodereg.q `define INSTRET dut.hart.priv.csr.genblk1.counters.genblk1.genblk2.INSTRETreg.q // Common Macros `define checkCSR(CSR) \ @@ -289,11 +289,11 @@ module testbench(); `INIT_CHECKPOINT_VAL(MTVEC, [`XLEN-1:0]); `INIT_CHECKPOINT_VAL(STVEC, [`XLEN-1:0]); `INIT_CHECKPOINT_VAL(SATP, [`XLEN-1:0]); + `INIT_CHECKPOINT_VAL(PRIV, [1:0]); `MAKE_CHECKPOINT_INIT_SIGNAL(MSTATUS, [`XLEN-1:0],0,0); integer ramFile; integer readResult; - assign initPriv = (initPC[0][`XLEN-1]) ? 2'h1 : 2'h3; // *** a hacky way to detect initial privilege level initial begin force dut.hart.priv.SwIntM = 0; force dut.hart.priv.TimerIntM = 0; @@ -325,7 +325,6 @@ module testbench(); force {`STATUS_SPIE,`STATUS_UPIE,`STATUS_MIE} = initMSTATUS[0][5:3]; force {`STATUS_SIE,`STATUS_UIE} = initMSTATUS[0][1:0]; force `INSTRET = CHECKPOINT; - force `CURR_PRIV = initPriv; while (reset!==1) #1; while (reset!==0) #1; #1; @@ -335,7 +334,6 @@ module testbench(); release {`STATUS_SPIE,`STATUS_UPIE,`STATUS_MIE}; release {`STATUS_SIE,`STATUS_UIE}; release `INSTRET; - release `CURR_PRIV; end // Get the E-stage trace reader ahead of the M-stage trace reader matchCountE = $fgets(lineE,traceFileE); From 984a7a6ccdc4ed8ff0eec30ee4195761b5a4f183 Mon Sep 17 00:00:00 2001 From: davidharrishmc <74973295+davidharrishmc@users.noreply.github.com> Date: Tue, 16 Nov 2021 12:33:47 -0800 Subject: [PATCH 4/5] Update README.md updated linux_testvectors path --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b97a5efd3..bbde26148 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ cd ../wally-riscv-arch-test make make XLEN=32 exe2memfile.pl work/*/*/*.elf # converts ELF files to a format that can be read by Modelsim -cd ../../tests/linux-testgen/linux-testvectors +cd ../linux-testgen/linux-testvectors ./tvLinker.sh ``` From e35faa9b8a0557d180898951a613e3facd666657 Mon Sep 17 00:00:00 2001 From: Skylar Litz Date: Tue, 16 Nov 2021 16:46:17 -0800 Subject: [PATCH 5/5] fixed interrupt timing bug --- wally-pipelined/testbench/testbench-linux.sv | 48 +++++--------------- 1 file changed, 12 insertions(+), 36 deletions(-) diff --git a/wally-pipelined/testbench/testbench-linux.sv b/wally-pipelined/testbench/testbench-linux.sv index eb820c131..3db2f8cbc 100644 --- a/wally-pipelined/testbench/testbench-linux.sv +++ b/wally-pipelined/testbench/testbench-linux.sv @@ -419,18 +419,6 @@ module testbench(); CheckMIPFutureE = 1; \ NextMIPexpected = ExpectedCSRArrayValueE[NumCSRE]; \ end \ - // $display("%tn: ExpectedCSRArrayM[7] (MEPC) = %x",$time,ExpectedCSRArrayM[7]); \ - // $display("%tn: ExpectedPCM = %x",$time,ExpectedPCM); \ - // // if PC does not equal MEPC, request delayed MIP is True \ - // if(ExpectedPCM != ExpectedCSRArrayM[7]) begin \ - // RequestDelayedMIP = 1; \ - // end else begin \ - // $display("%tns: Updating MIP to %x",$time,ExpectedCSRArrayValueM[NumCSRM]); \ - // MIPexpected = ExpectedCSRArrayValueM[NumCSRM]; \ - // force dut.hart.priv.csr.genblk1.csri.MIP_REGW = MIPexpected; \ - // end \ - // end \ - // $display("%tns: ExpectedCSRArrayM::: %p",$time,ExpectedCSRArrayM); \ if(ExpectedCSRArrayE[NumCSRE].substr(0,3) == "mepc") begin \ $display("hello! we are here."); \ MepcExpected = ExpectedCSRArrayValueE[NumCSRE]; \ @@ -468,11 +456,10 @@ module testbench(); if(CheckMIPFutureE) CheckMIPFutureE <= 0; CheckMIPFutureM <= CheckMIPFutureE; if(CheckMIPFutureM) begin - $display("%tns: ExpectedPCM %x",$time,ExpectedPCM); - $display("%tns: ExpectedPCE %x",$time,ExpectedPCE); - $display("%tns: ExpectedPCW %x",$time,ExpectedPCW); + // $display("%tns: ExpectedPCM %x",$time,ExpectedPCM); + // $display("%tns: ExpectedPCE %x",$time,ExpectedPCE); + // $display("%tns: ExpectedPCW %x",$time,ExpectedPCW); if((ExpectedPCE != MepcExpected) & ((MepcExpected - ExpectedPCE) * (MepcExpected - ExpectedPCE) <= 16)) begin - // if((ExpectedPCM != MepcExpected) & ((MepcExpected - ExpectedPCM) * (MepcExpected - ExpectedPCM) <= 16)) begin RequestDelayedMIP <= 1; $display("%tns: Requesting Delayed MIP. Current MEPC value is %x",$time,MepcExpected); end else begin // update MIP immediately @@ -480,29 +467,18 @@ module testbench(); MIPexpected = NextMIPexpected; force dut.hart.priv.csr.genblk1.csri.MIP_REGW = MIPexpected; end - $display("%tn: ExpectedCSRArrayM = %p",$time,ExpectedCSRArrayM); - $display("%tn: ExpectedCSRArrayValueM = %p",$time,ExpectedCSRArrayValueM); - $display("%tn: ExpectedTokens = %p",$time,ExpectedTokensM); - $display("%tn: MepcExpected = %x",$time,MepcExpected); - $display("%tn: ExpectedPCM = %x",$time,ExpectedPCM); - // if PC does not equal MEPC, request delayed MIP is True - $display("%tns: Difference/multiplication thing: %x",$time,(MepcExpected - ExpectedPCM) * (MepcExpected - ExpectedPCM)); - $display("%tn: ExpectedCSRArrayM[NumCSRM] %x",$time,ExpectedCSRArrayM[NumCSRM]); - $display("%tn: ExpectedCSRArrayValueM[NumCSRM] %x",$time,ExpectedCSRArrayValueM[NumCSRM]); - - // if((ExpectedPCM != MepcExpected) & ((MepcExpected - ExpectedPCM) * (MepcExpected - ExpectedPCM) <= 16)) begin - // RequestDelayedMIP = 1; - // $display("%tns: Requesting Delayed MIP. Current MEPC value is %x",$time,MepcExpected); - // end else begin - // $display("%tns: Updating MIP to %x",$time,NextMIPexpected); - // MIPexpected = NextMIPexpected; - // force dut.hart.priv.csr.genblk1.csri.MIP_REGW = MIPexpected; - // end + // $display("%tn: ExpectedCSRArrayM = %p",$time,ExpectedCSRArrayM); + // $display("%tn: ExpectedCSRArrayValueM = %p",$time,ExpectedCSRArrayValueM); + // $display("%tn: ExpectedTokens = %p",$time,ExpectedTokensM); + // $display("%tn: MepcExpected = %x",$time,MepcExpected); + // $display("%tn: ExpectedPCE = %x",$time,ExpectedPCE); + // $display("%tns: Difference/multiplication thing: %x",$time,(MepcExpected - ExpectedPCE) * (MepcExpected - ExpectedPCE)); + // $display("%tn: ExpectedCSRArrayM[NumCSRM] %x",$time,ExpectedCSRArrayM[NumCSRM]); + // $display("%tn: ExpectedCSRArrayValueM[NumCSRM] %x",$time,ExpectedCSRArrayValueM[NumCSRM]); end - if(RequestDelayedMIP) begin + if(RequestDelayedMIP & checkInstrM) begin $display("%tns: Executing Delayed MIP. Current MEPC value is %x",$time,dut.hart.priv.csr.genblk1.csrm.MEPC_REGW); $display("%tns: Updating MIP to %x",$time,NextMIPexpected); - $display("%tns: MepcExpected %x",$time,MepcExpected); MIPexpected = NextMIPexpected; force dut.hart.priv.csr.genblk1.csri.MIP_REGW = MIPexpected; $display("%tns: Finished Executing Delayed MIP. Current MEPC value is %x",$time,dut.hart.priv.csr.genblk1.csrm.MEPC_REGW);