From 017b3e987237a35fe5d0fa573a4c8d46769c9217 Mon Sep 17 00:00:00 2001 From: Jordan Carlin Date: Wed, 13 Nov 2024 17:01:01 -0800 Subject: [PATCH 1/5] Fix 32 bit CSRs in wallyTracer --- testbench/common/wallyTracer.sv | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/testbench/common/wallyTracer.sv b/testbench/common/wallyTracer.sv index 83eeacf5f..991f6719e 100644 --- a/testbench/common/wallyTracer.sv +++ b/testbench/common/wallyTracer.sv @@ -158,7 +158,6 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); end CSRArray[12'h300] = testbench.dut.core.priv.priv.csr.csrm.MSTATUS_REGW; - CSRArray[12'h310] = testbench.dut.core.priv.priv.csr.csrm.MSTATUSH_REGW; CSRArray[12'h305] = testbench.dut.core.priv.priv.csr.csrm.MTVEC_REGW; CSRArray[12'h341] = testbench.dut.core.priv.priv.csr.csrm.MEPC_REGW; CSRArray[12'h306] = testbench.dut.core.priv.priv.csr.csrm.MCOUNTEREN_REGW; @@ -215,7 +214,6 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); CSRArray[csrid] = CSRArrayOld[csrid]; CSRArray[12'h300] = CSRArrayOld[12'h300]; - CSRArray[12'h310] = CSRArrayOld[12'h310]; CSRArray[12'h305] = CSRArrayOld[12'h305]; CSRArray[12'h341] = CSRArrayOld[12'h341]; CSRArray[12'h306] = CSRArrayOld[12'h306]; @@ -255,6 +253,11 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); CSRArray[12'h001] = CSRArrayOld[12'h001]; CSRArray[12'h002] = CSRArrayOld[12'h002]; CSRArray[12'h003] = CSRArrayOld[12'h003]; + if (P.XLEN == 32) begin + CSRArray[12'h310] = CSRArrayOld[12'h310]; + CSRArray[12'h31A] = CSRArrayOld[12'h31A]; + CSRArray[12'h15D] = CSRArrayOld[12'h15D]; + end end end @@ -347,7 +350,6 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); integer index4; always_ff @(posedge clk) begin CSRArrayOld[12'h300] = CSRArray[12'h300]; - CSRArrayOld[12'h310] = CSRArray[12'h310]; CSRArrayOld[12'h305] = CSRArray[12'h305]; CSRArrayOld[12'h341] = CSRArray[12'h341]; CSRArrayOld[12'h306] = CSRArray[12'h306]; @@ -387,6 +389,11 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); CSRArrayOld[12'h001] = CSRArray[12'h001]; CSRArrayOld[12'h002] = CSRArray[12'h002]; CSRArrayOld[12'h003] = CSRArray[12'h003]; + if (P.XLEN == 32) begin + CSRArrayOld[12'h310] = CSRArray[12'h310]; + CSRArrayOld[12'h31A] = CSRArray[12'h31A]; + CSRArrayOld[12'h15D] = CSRArray[12'h15D]; + end // PMP CFG 3A0 to 3AF for(index4='h3A0; index4<='h3AF; index4++) @@ -399,7 +406,6 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); // check for csr value change. assign CSR_W[12'h300] = (CSRArrayOld[12'h300] != CSRArray[12'h300]) ? 1 : 0; - assign CSR_W[12'h310] = (CSRArrayOld[12'h310] != CSRArray[12'h310]) ? 1 : 0; assign CSR_W[12'h305] = (CSRArrayOld[12'h305] != CSRArray[12'h305]) ? 1 : 0; assign CSR_W[12'h341] = (CSRArrayOld[12'h341] != CSRArray[12'h341]) ? 1 : 0; assign CSR_W[12'h306] = (CSRArrayOld[12'h306] != CSRArray[12'h306]) ? 1 : 0; @@ -436,9 +442,13 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); assign CSR_W[12'h001] = (CSRArrayOld[12'h001] != CSRArray[12'h001]) ? 1 : 0; assign CSR_W[12'h002] = (CSRArrayOld[12'h002] != CSRArray[12'h002]) ? 1 : 0; assign CSR_W[12'h003] = (CSRArrayOld[12'h003] != CSRArray[12'h003]) ? 1 : 0; + if (P.XLEN == 32) begin + assign CSR_W[12'h310] = (CSRArrayOld[12'h310] != CSRArray[12'h310]) ? 1 : 0; + assign CSR_W[12'h31A] = (CSRArrayOld[12'h31A] != CSRArray[12'h31A]) ? 1 : 0; + assign CSR_W[12'h15D] = (CSRArrayOld[12'h15D] != CSRArray[12'h15D]) ? 1 : 0; + end assign rvvi.csr_wb[0][0][12'h300] = CSR_W[12'h300]; - assign rvvi.csr_wb[0][0][12'h310] = CSR_W[12'h310]; assign rvvi.csr_wb[0][0][12'h305] = CSR_W[12'h305]; assign rvvi.csr_wb[0][0][12'h341] = CSR_W[12'h341]; assign rvvi.csr_wb[0][0][12'h306] = CSR_W[12'h306]; @@ -475,9 +485,13 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); assign rvvi.csr_wb[0][0][12'h001] = CSR_W[12'h001]; assign rvvi.csr_wb[0][0][12'h002] = CSR_W[12'h002]; assign rvvi.csr_wb[0][0][12'h003] = CSR_W[12'h003]; + if (P.XLEN == 32) begin + assign rvvi.csr_wb[0][0][12'h310] = CSR_W[12'h310]; + assign rvvi.csr_wb[0][0][12'h31A] = CSR_W[12'h31A]; + assign rvvi.csr_wb[0][0][12'h15D] = CSR_W[12'h15D]; + end assign rvvi.csr[0][0][12'h300] = CSRArray[12'h300]; - assign rvvi.csr[0][0][12'h310] = CSRArray[12'h310]; assign rvvi.csr[0][0][12'h305] = CSRArray[12'h305]; assign rvvi.csr[0][0][12'h341] = CSRArray[12'h341]; assign rvvi.csr[0][0][12'h306] = CSRArray[12'h306]; @@ -514,6 +528,11 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); assign rvvi.csr[0][0][12'h001] = CSRArray[12'h001]; assign rvvi.csr[0][0][12'h002] = CSRArray[12'h002]; assign rvvi.csr[0][0][12'h003] = CSRArray[12'h003]; + if (P.XLEN == 32) begin + assign rvvi.csr[0][0][12'h310] = CSRArray[12'h310]; + assign rvvi.csr[0][0][12'h31A] = CSRArray[12'h31A]; + assign rvvi.csr[0][0][12'h15D] = CSRArray[12'h15D]; + end // PMP CFG 3A0 to 3AF for(index='h3A0; index<='h3AF; index++) begin From d666a0dd7b1c2faa7b02664049d9200ed9f8bb03 Mon Sep 17 00:00:00 2001 From: Jordan Carlin Date: Wed, 13 Nov 2024 18:26:53 -0800 Subject: [PATCH 2/5] Update formatting in an attempt to understand what's happening in this file --- testbench/common/wallyTracer.sv | 388 ++++++++++++++++---------------- 1 file changed, 193 insertions(+), 195 deletions(-) diff --git a/testbench/common/wallyTracer.sv b/testbench/common/wallyTracer.sv index 991f6719e..b4089f70b 100644 --- a/testbench/common/wallyTracer.sv +++ b/testbench/common/wallyTracer.sv @@ -35,37 +35,36 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); localparam NUMREGS = P.E_SUPPORTED ? 16 : 32; // wally specific signals - logic reset; - logic clk; - logic InstrValidD, InstrValidE; - logic StallF, StallD; - logic STATUS_SXL, STATUS_UXL; - logic [P.XLEN-1:0] PCNextF, PCF, PCD, PCE, PCM, PCW; - logic [31:0] InstrRawD, InstrRawE, InstrRawM, InstrRawW; - logic InstrValidM, InstrValidW; - logic StallE, StallM, StallW; - logic FlushD, FlushE, FlushM, FlushW; - logic TrapM, TrapW; - logic HaltM, HaltW; - logic [1:0] PrivilegeModeW; - logic [P.XLEN-1:0] rf[NUMREGS]; - logic [NUMREGS-1:0] rf_wb; - logic [4:0] rf_a3; - logic rf_we3; - logic [P.FLEN-1:0] frf[32]; - logic [`NUM_REGS-1:0] frf_wb; - logic [4:0] frf_a4; - logic frf_we4; - logic [P.XLEN-1:0] CSRArray [4095:0]; - logic [P.XLEN-1:0] CSRArrayOld [4095:0]; - logic [`NUM_CSRS-1:0] CSR_W; - logic CSRWriteM, CSRWriteW; - logic [11:0] CSRAdrM, CSRAdrW; - logic wfiM; - logic InterruptM, InterruptW; + logic reset; + logic clk; + logic InstrValidD, InstrValidE; + logic StallF, StallD; + logic STATUS_SXL, STATUS_UXL; + logic [P.XLEN-1:0] PCNextF, PCF, PCD, PCE, PCM, PCW; + logic [31:0] InstrRawD, InstrRawE, InstrRawM, InstrRawW; + logic InstrValidM, InstrValidW; + logic StallE, StallM, StallW; + logic FlushD, FlushE, FlushM, FlushW; + logic TrapM, TrapW; + logic HaltM, HaltW; + logic [1:0] PrivilegeModeW; + logic [P.XLEN-1:0] rf[NUMREGS]; + logic [NUMREGS-1:0] rf_wb; + logic [4:0] rf_a3; + logic rf_we3; + logic [P.FLEN-1:0] frf[32]; + logic [`NUM_REGS-1:0] frf_wb; + logic [4:0] frf_a4; + logic frf_we4; + logic [P.XLEN-1:0] CSRArray [4095:0]; + logic [P.XLEN-1:0] CSRArrayOld [4095:0]; + logic [`NUM_CSRS-1:0] CSR_W; + logic CSRWriteM, CSRWriteW; + logic [11:0] CSRAdrM, CSRAdrW; + logic wfiM; + logic InterruptM, InterruptW; //For VM Verification - logic [(P.XLEN-1):0] VAdrIM,VAdrDM,VAdrIW,VAdrDW; logic [(P.XLEN-1):0] PTE_iM,PTE_dM,PTE_iW,PTE_dW; logic [(P.PA_BITS-1):0] PAIM,PADM,PAIW,PADW; @@ -73,7 +72,6 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); logic ReadAccessM,WriteAccessM,ReadAccessW,WriteAccessW; logic ExecuteAccessF,ExecuteAccessD,ExecuteAccessE,ExecuteAccessM,ExecuteAccessW; - assign clk = testbench.dut.clk; // assign InstrValidF = testbench.dut.core.ieu.InstrValidF; // not needed yet assign InstrValidD = testbench.dut.core.ieu.c.InstrValidD; @@ -103,7 +101,7 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); assign wfiM = testbench.dut.core.priv.priv.wfiM; assign InterruptM = testbench.dut.core.priv.priv.InterruptM; - //FOr VM Verification + //For VM Verification assign VAdrIM = testbench.dut.core.ifu.immu.immu.tlb.tlb.VAdr; assign VAdrDM = testbench.dut.core.lsu.dmmu.dmmu.tlb.tlb.VAdr; assign PAIM = testbench.dut.core.ifu.immu.immu.PhysicalAddress; @@ -116,21 +114,17 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); assign PPN_iM = testbench.dut.core.ifu.immu.immu.tlb.tlb.PPN; assign PPN_dM = testbench.dut.core.lsu.dmmu.dmmu.tlb.tlb.PPN; - - logic valid; int csrid; always_comb begin - // Since we are detected the CSR change by comparing the old value we need to - // ensure the CSR is detected when the pipeline's Writeback stage is not - // stalled. If it is stalled we want CSRArray to hold the old value. - if(valid) begin - // machine CSRs - // *** missing PMP and performance counters. - + // Since we are detected the CSR change by comparing the old value we need to + // ensure the CSR is detected when the pipeline's Writeback stage is not + // stalled. If it is stalled we want CSRArray to hold the old value. + if(valid) begin + // machine CSRs // PMPCFG space is 0-15 3a0 - 3af - int i, i4, i8, csrid; + int i, i4, i8, csrid; logic [P.XLEN-1:0] pmp; for (i=0; i Date: Wed, 13 Nov 2024 22:12:11 -0800 Subject: [PATCH 3/5] pmps working for RVVI in RV32 --- testbench/common/wallyTracer.sv | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/testbench/common/wallyTracer.sv b/testbench/common/wallyTracer.sv index b4089f70b..b4bf68a36 100644 --- a/testbench/common/wallyTracer.sv +++ b/testbench/common/wallyTracer.sv @@ -124,11 +124,13 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); if(valid) begin // machine CSRs // PMPCFG space is 0-15 3a0 - 3af + int inc = P.XLEN == 32 ? 4 : 8; int i, i4, i8, csrid; logic [P.XLEN-1:0] pmp; - for (i=0; i Date: Thu, 14 Nov 2024 15:03:13 -0800 Subject: [PATCH 4/5] Add mseccfg shell to wallyTracer and reformat CSRs --- testbench/common/wallyTracer.sv | 453 ++++++++++++++++++++------------ 1 file changed, 290 insertions(+), 163 deletions(-) diff --git a/testbench/common/wallyTracer.sv b/testbench/common/wallyTracer.sv index b4bf68a36..7f8e43cdd 100644 --- a/testbench/common/wallyTracer.sv +++ b/testbench/common/wallyTracer.sv @@ -122,8 +122,7 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); // ensure the CSR is detected when the pipeline's Writeback stage is not // stalled. If it is stalled we want CSRArray to hold the old value. if(valid) begin - // machine CSRs - // PMPCFG space is 0-15 3a0 - 3af + // PMPCFG CSRs (space is 0-15 3a0 - 3af) int inc = P.XLEN == 32 ? 4 : 8; int i, i4, i8, csrid; logic [P.XLEN-1:0] pmp; @@ -145,7 +144,7 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); CSRArray[csrid] = pmp; end - // PMPADDR space is 0-63 3b0 - 3ef + // PMPADDR CSRs (space is 0-63 3b0 - 3ef) for (i=0; i Date: Thu, 14 Nov 2024 15:31:10 -0800 Subject: [PATCH 5/5] Fix wallyTracer bug --- testbench/common/wallyTracer.sv | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/testbench/common/wallyTracer.sv b/testbench/common/wallyTracer.sv index 21c72fec9..e2be8c7df 100644 --- a/testbench/common/wallyTracer.sv +++ b/testbench/common/wallyTracer.sv @@ -525,6 +525,7 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); end + // M-mode trap CSRs assign rvvi.csr_wb[0][0][12'h300] = CSR_W[12'h300]; assign rvvi.csr_wb[0][0][12'h302] = CSR_W[12'h302]; @@ -593,7 +594,6 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); - // M-mode trap CSRs assign rvvi.csr[0][0][12'h300] = CSRArray[12'h300]; assign rvvi.csr[0][0][12'h302] = CSRArray[12'h302]; @@ -660,7 +660,7 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); assign rvvi.csr[0][0][12'h15D] = CSRArray[12'h15D]; end - + // PMP CFG 3A0 to 3AF for(index='h3A0; index<='h3AF; index++) begin assign CSR_W[index] = (CSRArrayOld[index] != CSRArray[index]) ? 1 : 0; @@ -735,11 +735,7 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); end end end - end if(HaltW) $finish; end - - - endmodule