From eb38d07568ac76d4ee5b8fe57caddb2e86aba7ea Mon Sep 17 00:00:00 2001 From: Jordan Carlin Date: Wed, 29 Jan 2025 00:11:13 -0800 Subject: [PATCH 1/6] Use macro for CSR connections in wallyTracer --- testbench/common/wallyTracer.sv | 565 +++++++------------------------- 1 file changed, 119 insertions(+), 446 deletions(-) diff --git a/testbench/common/wallyTracer.sv b/testbench/common/wallyTracer.sv index 093b72de2..91367e230 100644 --- a/testbench/common/wallyTracer.sv +++ b/testbench/common/wallyTracer.sv @@ -29,6 +29,18 @@ `define PRINT_ALL 0 `define PRINT_CSRS 0 +// Since we are detecting 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. +`define CONNECT_CSR(addr, val) \ + always_comb \ + if (valid) CSRArray[addr] = val; \ + else CSRArray[addr] = CSRArrayOld[addr]; \ + always_ff @(posedge clk) \ + CSRArrayOld[addr] = CSRArray[addr]; \ + assign CSR_W[addr] = (CSRArrayOld[addr] != CSRArray[addr]) ? 1 : 0; \ + assign rvvi.csr_wb[0][0][addr] = CSR_W[addr]; \ + assign rvvi.csr[0][0][addr] = CSRArray[addr]; module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); @@ -65,6 +77,7 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); logic [11:0] CSRAdrM, CSRAdrW; logic wfiM; logic InterruptM, InterruptW; + logic valid; //For VM Verification logic [(P.XLEN-1):0] IVAdrF,IVAdrD,IVAdrE,IVAdrM,IVAdrW,DVAdrM,DVAdrW; @@ -129,32 +142,97 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); assign IPageTypeF = testbench.dut.core.ifu.immu.immu.PageTypeWriteVal; assign DPageTypeM = testbench.dut.core.lsu.dmmu.dmmu.PageTypeWriteVal; - logic valid; - + // CSR connections if (P.ZICSR_SUPPORTED) begin + // M-mode trap CSRs + `CONNECT_CSR(12'h300, testbench.dut.core.priv.priv.csr.csrm.MSTATUS_REGW); + `CONNECT_CSR(12'h302, testbench.dut.core.priv.priv.csr.csrm.MEDELEG_REGW); + `CONNECT_CSR(12'h303, testbench.dut.core.priv.priv.csr.csrm.MIDELEG_REGW); + `CONNECT_CSR(12'h304, testbench.dut.core.priv.priv.csr.csrm.MIE_REGW); + `CONNECT_CSR(12'h305, testbench.dut.core.priv.priv.csr.csrm.MTVEC_REGW); + `CONNECT_CSR(12'h340, testbench.dut.core.priv.priv.csr.csrm.MSCRATCH_REGW); + `CONNECT_CSR(12'h341, testbench.dut.core.priv.priv.csr.csrm.MEPC_REGW); + `CONNECT_CSR(12'h342, testbench.dut.core.priv.priv.csr.csrm.MCAUSE_REGW); + `CONNECT_CSR(12'h343, testbench.dut.core.priv.priv.csr.csrm.MTVAL_REGW); + `CONNECT_CSR(12'h344, testbench.dut.core.priv.priv.csr.csrm.MIP_REGW); + + // S-mode trap CSRs + `CONNECT_CSR(12'h100, testbench.dut.core.priv.priv.csr.csrs.csrs.SSTATUS_REGW); + `CONNECT_CSR(12'h104, testbench.dut.core.priv.priv.csr.csrm.MIE_REGW & 12'h222); + `CONNECT_CSR(12'h105, testbench.dut.core.priv.priv.csr.csrs.csrs.STVEC_REGW); + `CONNECT_CSR(12'h140, testbench.dut.core.priv.priv.csr.csrs.csrs.SSCRATCH_REGW); + `CONNECT_CSR(12'h141, testbench.dut.core.priv.priv.csr.csrs.csrs.SEPC_REGW); + `CONNECT_CSR(12'h142, testbench.dut.core.priv.priv.csr.csrs.csrs.SCAUSE_REGW); + `CONNECT_CSR(12'h143, testbench.dut.core.priv.priv.csr.csrs.csrs.STVAL_REGW); + `CONNECT_CSR(12'h144, testbench.dut.core.priv.priv.csr.csrm.MIP_REGW & 12'h222 & testbench.dut.core.priv.priv.csr.csrm.MIDELEG_REGW); + + // Virtual Memory CSRs + `CONNECT_CSR(12'h180, testbench.dut.core.priv.priv.csr.csrs.csrs.SATP_REGW); + + // Floating-Point CSRs + `CONNECT_CSR(12'h001, testbench.dut.core.priv.priv.csr.csru.csru.FFLAGS_REGW); + `CONNECT_CSR(12'h002, testbench.dut.core.priv.priv.csr.csru.csru.FRM_REGW); + `CONNECT_CSR(12'h003, {testbench.dut.core.priv.priv.csr.csru.csru.FRM_REGW, testbench.dut.core.priv.priv.csr.csru.csru.FFLAGS_REGW}); + + // Counters / Performance Monitoring CSRs + `CONNECT_CSR(12'h306, testbench.dut.core.priv.priv.csr.csrm.MCOUNTEREN_REGW); + `CONNECT_CSR(12'h106, testbench.dut.core.priv.priv.csr.csrs.csrs.SCOUNTEREN_REGW); + `CONNECT_CSR(12'h320, testbench.dut.core.priv.priv.csr.csrm.MCOUNTINHIBIT_REGW); + // mhpmevent3-31 not connected (232-33F) + `CONNECT_CSR(12'hB00, testbench.dut.core.priv.priv.csr.counters.counters.HPMCOUNTER_REGW[0]); // MCYCLE + `CONNECT_CSR(12'hB02, testbench.dut.core.priv.priv.csr.counters.counters.HPMCOUNTER_REGW[2]); // MINSTRET + // mhpmcounter3-31 not connected (B03-B1F) + // cycle, time, instret not connected (C00-C02) + // hpmcounter3-31 not connected (C03-C1F) + + // Machine Information Registers and Configuration CSRs + `CONNECT_CSR(12'h301, testbench.dut.core.priv.priv.csr.csrm.MISA_REGW); + `CONNECT_CSR(12'h30A, testbench.dut.core.priv.priv.csr.csrm.MENVCFG_REGW); + `CONNECT_CSR(12'h10A, testbench.dut.core.priv.priv.csr.csrs.csrs.SENVCFG_REGW); + `CONNECT_CSR(12'h747, 0); // mseccfg + `CONNECT_CSR(12'hF11, 0); //mvendorid + `CONNECT_CSR(12'hF12, 0); // marchid + `CONNECT_CSR(12'hF13, {{P.XLEN-12{1'b0}}, 12'h100}); // mimpid + `CONNECT_CSR(12'hF14, testbench.dut.core.priv.priv.csr.csrm.MHARTID_REGW); + `CONNECT_CSR(12'hF15, 0); //mconfigptr + + // Sstc CSRs + `CONNECT_CSR(12'h14D, testbench.dut.core.priv.priv.csr.csrs.csrs.STIMECMP_REGW[P.XLEN-1:0]); + + // Zkr CSRs + // seed not connected (015) + + // extra CSRs for RV32 + if (P.XLEN == 32) begin + `CONNECT_CSR(12'h310, testbench.dut.core.priv.priv.csr.csrsr.MSTATUSH_REGW); + `CONNECT_CSR(12'h31A, testbench.dut.core.priv.priv.csr.csrm.MENVCFGH_REGW); + `CONNECT_CSR(12'h757, 0); // mseccfgh + `CONNECT_CSR(12'h15D, testbench.dut.core.priv.priv.csr.csrs.csrs.STIMECMP_REGW[63:32]); + end + end + + +// PMP CSRs + if (P.PMP_ENTRIES > 0) begin 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 // PMPCFG CSRs (space is 0-15 3a0 - 3af) localparam inc = P.XLEN == 32 ? 4 : 8; - int i, i4, i8, csrid; + int i, i4, csrid; logic [P.XLEN-1:0] pmp; for (i=0; i Date: Wed, 29 Jan 2025 18:53:11 -0800 Subject: [PATCH 2/6] Simplify macro --- testbench/common/wallyTracer.sv | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/testbench/common/wallyTracer.sv b/testbench/common/wallyTracer.sv index 2de52af3c..d2d192bfe 100644 --- a/testbench/common/wallyTracer.sv +++ b/testbench/common/wallyTracer.sv @@ -21,7 +21,6 @@ // and limitations under the License. //////////////////////////////////////////////////////////////////////////////////////////////// - `define STD_LOG 0 `define PRINT_PC_INSTR 0 `define PRINT_MOST 0 @@ -30,16 +29,12 @@ // Since we are detecting 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. +// stalled. If it is stalled we want to hold the old value. `define CONNECT_CSR(addr, val) \ - always_comb \ - if (valid) CSRArray[addr] = val; \ - else CSRArray[addr] = CSRArrayOld[addr]; \ always_ff @(posedge clk) \ - CSRArrayOld[addr] = CSRArray[addr]; \ - assign CSR_W[addr] = (CSRArrayOld[addr] != CSRArray[addr]) ? 1 : 0; \ - assign rvvi.csr_wb[0][0][addr] = CSR_W[addr]; \ - assign rvvi.csr[0][0][addr] = CSRArray[addr]; + CSRArrayOld[addr] = rvvi.csr[0][0][addr]; \ + assign rvvi.csr_wb[0][0][addr] = (rvvi.csr[0][0][addr] != CSRArrayOld[addr]); \ + assign rvvi.csr[0][0][addr] = valid ? val : CSRArrayOld[addr]; module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); From 0b7b1f3c9aa1d9fd6b77e0375a7ff764a190691f Mon Sep 17 00:00:00 2001 From: Jordan Carlin Date: Wed, 29 Jan 2025 19:15:52 -0800 Subject: [PATCH 3/6] Use macro concatenation instead of CSRArrayOld --- testbench/common/wallyTracer.sv | 99 +++++++++++++++++---------------- 1 file changed, 50 insertions(+), 49 deletions(-) diff --git a/testbench/common/wallyTracer.sv b/testbench/common/wallyTracer.sv index d2d192bfe..8080101dc 100644 --- a/testbench/common/wallyTracer.sv +++ b/testbench/common/wallyTracer.sv @@ -30,11 +30,12 @@ // Since we are detecting 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 to hold the old value. -`define CONNECT_CSR(addr, val) \ +`define CONNECT_CSR(name, addr, val) \ + logic [P.XLEN-1:0] prev_csr_``name; \ always_ff @(posedge clk) \ - CSRArrayOld[addr] = rvvi.csr[0][0][addr]; \ - assign rvvi.csr_wb[0][0][addr] = (rvvi.csr[0][0][addr] != CSRArrayOld[addr]); \ - assign rvvi.csr[0][0][addr] = valid ? val : CSRArrayOld[addr]; + prev_csr_``name <= rvvi.csr[0][0][addr]; \ + assign rvvi.csr_wb[0][0][addr] = (rvvi.csr[0][0][addr] != prev_csr_``name); \ + assign rvvi.csr[0][0][addr] = valid ? val : prev_csr_``name; module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); @@ -140,69 +141,69 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); // CSR connections if (P.ZICSR_SUPPORTED) begin // M-mode trap CSRs - `CONNECT_CSR(12'h300, testbench.dut.core.priv.priv.csr.csrm.MSTATUS_REGW); - `CONNECT_CSR(12'h302, testbench.dut.core.priv.priv.csr.csrm.MEDELEG_REGW); - `CONNECT_CSR(12'h303, testbench.dut.core.priv.priv.csr.csrm.MIDELEG_REGW); - `CONNECT_CSR(12'h304, testbench.dut.core.priv.priv.csr.csrm.MIE_REGW); - `CONNECT_CSR(12'h305, testbench.dut.core.priv.priv.csr.csrm.MTVEC_REGW); - `CONNECT_CSR(12'h340, testbench.dut.core.priv.priv.csr.csrm.MSCRATCH_REGW); - `CONNECT_CSR(12'h341, testbench.dut.core.priv.priv.csr.csrm.MEPC_REGW); - `CONNECT_CSR(12'h342, testbench.dut.core.priv.priv.csr.csrm.MCAUSE_REGW); - `CONNECT_CSR(12'h343, testbench.dut.core.priv.priv.csr.csrm.MTVAL_REGW); - `CONNECT_CSR(12'h344, testbench.dut.core.priv.priv.csr.csrm.MIP_REGW); + `CONNECT_CSR(MSTATUS, 12'h300, testbench.dut.core.priv.priv.csr.csrm.MSTATUS_REGW); + `CONNECT_CSR(MEDELEG, 12'h302, testbench.dut.core.priv.priv.csr.csrm.MEDELEG_REGW); + `CONNECT_CSR(MIDELEG, 12'h303, testbench.dut.core.priv.priv.csr.csrm.MIDELEG_REGW); + `CONNECT_CSR(MIE, 12'h304, testbench.dut.core.priv.priv.csr.csrm.MIE_REGW); + `CONNECT_CSR(MTVEC, 12'h305, testbench.dut.core.priv.priv.csr.csrm.MTVEC_REGW); + `CONNECT_CSR(MSCRATCH, 12'h340, testbench.dut.core.priv.priv.csr.csrm.MSCRATCH_REGW); + `CONNECT_CSR(MEPC, 12'h341, testbench.dut.core.priv.priv.csr.csrm.MEPC_REGW); + `CONNECT_CSR(MCAUSE, 12'h342, testbench.dut.core.priv.priv.csr.csrm.MCAUSE_REGW); + `CONNECT_CSR(MTVAL, 12'h343, testbench.dut.core.priv.priv.csr.csrm.MTVAL_REGW); + `CONNECT_CSR(MIP, 12'h344, testbench.dut.core.priv.priv.csr.csrm.MIP_REGW); // S-mode trap CSRs - `CONNECT_CSR(12'h100, testbench.dut.core.priv.priv.csr.csrs.csrs.SSTATUS_REGW); - `CONNECT_CSR(12'h104, testbench.dut.core.priv.priv.csr.csrm.MIE_REGW & 12'h222); - `CONNECT_CSR(12'h105, testbench.dut.core.priv.priv.csr.csrs.csrs.STVEC_REGW); - `CONNECT_CSR(12'h140, testbench.dut.core.priv.priv.csr.csrs.csrs.SSCRATCH_REGW); - `CONNECT_CSR(12'h141, testbench.dut.core.priv.priv.csr.csrs.csrs.SEPC_REGW); - `CONNECT_CSR(12'h142, testbench.dut.core.priv.priv.csr.csrs.csrs.SCAUSE_REGW); - `CONNECT_CSR(12'h143, testbench.dut.core.priv.priv.csr.csrs.csrs.STVAL_REGW); - `CONNECT_CSR(12'h144, testbench.dut.core.priv.priv.csr.csrm.MIP_REGW & 12'h222 & testbench.dut.core.priv.priv.csr.csrm.MIDELEG_REGW); + `CONNECT_CSR(SSTATUS, 12'h100, testbench.dut.core.priv.priv.csr.csrs.csrs.SSTATUS_REGW); + `CONNECT_CSR(SIE, 12'h104, testbench.dut.core.priv.priv.csr.csrm.MIE_REGW & 12'h222); + `CONNECT_CSR(STVEC, 12'h105, testbench.dut.core.priv.priv.csr.csrs.csrs.STVEC_REGW); + `CONNECT_CSR(SSCRATCH, 12'h140, testbench.dut.core.priv.priv.csr.csrs.csrs.SSCRATCH_REGW); + `CONNECT_CSR(SEPC, 12'h141, testbench.dut.core.priv.priv.csr.csrs.csrs.SEPC_REGW); + `CONNECT_CSR(SCAUSE, 12'h142, testbench.dut.core.priv.priv.csr.csrs.csrs.SCAUSE_REGW); + `CONNECT_CSR(STVAL, 12'h143, testbench.dut.core.priv.priv.csr.csrs.csrs.STVAL_REGW); + `CONNECT_CSR(SIP, 12'h144, testbench.dut.core.priv.priv.csr.csrm.MIP_REGW & 12'h222 & testbench.dut.core.priv.priv.csr.csrm.MIDELEG_REGW); // Virtual Memory CSRs - `CONNECT_CSR(12'h180, testbench.dut.core.priv.priv.csr.csrs.csrs.SATP_REGW); + `CONNECT_CSR(SATP, 12'h180, testbench.dut.core.priv.priv.csr.csrs.csrs.SATP_REGW); // Floating-Point CSRs - `CONNECT_CSR(12'h001, testbench.dut.core.priv.priv.csr.csru.csru.FFLAGS_REGW); - `CONNECT_CSR(12'h002, testbench.dut.core.priv.priv.csr.csru.csru.FRM_REGW); - `CONNECT_CSR(12'h003, {testbench.dut.core.priv.priv.csr.csru.csru.FRM_REGW, testbench.dut.core.priv.priv.csr.csru.csru.FFLAGS_REGW}); + `CONNECT_CSR(FFLAGS, 12'h001, testbench.dut.core.priv.priv.csr.csru.csru.FFLAGS_REGW); + `CONNECT_CSR(FRM, 12'h002, testbench.dut.core.priv.priv.csr.csru.csru.FRM_REGW); + `CONNECT_CSR(FCSR, 12'h003, {testbench.dut.core.priv.priv.csr.csru.csru.FRM_REGW, testbench.dut.core.priv.priv.csr.csru.csru.FFLAGS_REGW}); // Counters / Performance Monitoring CSRs - `CONNECT_CSR(12'h306, testbench.dut.core.priv.priv.csr.csrm.MCOUNTEREN_REGW); - `CONNECT_CSR(12'h106, testbench.dut.core.priv.priv.csr.csrs.csrs.SCOUNTEREN_REGW); - `CONNECT_CSR(12'h320, testbench.dut.core.priv.priv.csr.csrm.MCOUNTINHIBIT_REGW); + `CONNECT_CSR(MCOUNTEREN, 12'h306, testbench.dut.core.priv.priv.csr.csrm.MCOUNTEREN_REGW); + `CONNECT_CSR(SCOUNTEREN, 12'h106, testbench.dut.core.priv.priv.csr.csrs.csrs.SCOUNTEREN_REGW); + `CONNECT_CSR(MCOUNTINHIBIT, 12'h320, testbench.dut.core.priv.priv.csr.csrm.MCOUNTINHIBIT_REGW); // mhpmevent3-31 not connected (232-33F) - `CONNECT_CSR(12'hB00, testbench.dut.core.priv.priv.csr.counters.counters.HPMCOUNTER_REGW[0]); // MCYCLE - `CONNECT_CSR(12'hB02, testbench.dut.core.priv.priv.csr.counters.counters.HPMCOUNTER_REGW[2]); // MINSTRET + `CONNECT_CSR(MCYCLE, 12'hB00, testbench.dut.core.priv.priv.csr.counters.counters.HPMCOUNTER_REGW[0]); // MCYCLE + `CONNECT_CSR(MINSTRET, 12'hB02, testbench.dut.core.priv.priv.csr.counters.counters.HPMCOUNTER_REGW[2]); // MINSTRET // mhpmcounter3-31 not connected (B03-B1F) // cycle, time, instret not connected (C00-C02) // hpmcounter3-31 not connected (C03-C1F) // Machine Information Registers and Configuration CSRs - `CONNECT_CSR(12'h301, testbench.dut.core.priv.priv.csr.csrm.MISA_REGW); - `CONNECT_CSR(12'h30A, testbench.dut.core.priv.priv.csr.csrm.MENVCFG_REGW); - `CONNECT_CSR(12'h10A, testbench.dut.core.priv.priv.csr.csrs.csrs.SENVCFG_REGW); - `CONNECT_CSR(12'h747, 0); // mseccfg - `CONNECT_CSR(12'hF11, 0); //mvendorid - `CONNECT_CSR(12'hF12, 0); // marchid - `CONNECT_CSR(12'hF13, {{P.XLEN-12{1'b0}}, 12'h100}); // mimpid - `CONNECT_CSR(12'hF14, testbench.dut.core.priv.priv.csr.csrm.MHARTID_REGW); - `CONNECT_CSR(12'hF15, 0); //mconfigptr + `CONNECT_CSR(MISA, 12'h301, testbench.dut.core.priv.priv.csr.csrm.MISA_REGW); + `CONNECT_CSR(MENVCFG, 12'h30A, testbench.dut.core.priv.priv.csr.csrm.MENVCFG_REGW); + `CONNECT_CSR(SENVCFG, 12'h10A, testbench.dut.core.priv.priv.csr.csrs.csrs.SENVCFG_REGW); + `CONNECT_CSR(MSECCFG, 12'h747, 0); // mseccfg + `CONNECT_CSR(MVENDORID, 12'hF11, 0); //mvendorid + `CONNECT_CSR(MARCHID, 12'hF12, 0); // marchid + `CONNECT_CSR(MIMPID, 12'hF13, {{P.XLEN-12{1'b0}}, 12'h100}); // mimpid + `CONNECT_CSR(MHARTID, 12'hF14, testbench.dut.core.priv.priv.csr.csrm.MHARTID_REGW); + `CONNECT_CSR(MCONFIGPTR, 12'hF15, 0); //mconfigptr // Sstc CSRs - `CONNECT_CSR(12'h14D, testbench.dut.core.priv.priv.csr.csrs.csrs.STIMECMP_REGW[P.XLEN-1:0]); + `CONNECT_CSR(STIMECMP, 12'h14D, testbench.dut.core.priv.priv.csr.csrs.csrs.STIMECMP_REGW[P.XLEN-1:0]); // Zkr CSRs // seed not connected (015) // extra CSRs for RV32 if (P.XLEN == 32) begin - `CONNECT_CSR(12'h310, testbench.dut.core.priv.priv.csr.csrsr.MSTATUSH_REGW); - `CONNECT_CSR(12'h31A, testbench.dut.core.priv.priv.csr.csrm.MENVCFGH_REGW); - `CONNECT_CSR(12'h757, 0); // mseccfgh - `CONNECT_CSR(12'h15D, testbench.dut.core.priv.priv.csr.csrs.csrs.STIMECMP_REGW[63:32]); + `CONNECT_CSR(MSTATUSH, 12'h310, testbench.dut.core.priv.priv.csr.csrsr.MSTATUSH_REGW); + `CONNECT_CSR(MENVCFGH, 12'h31A, testbench.dut.core.priv.priv.csr.csrm.MENVCFGH_REGW); + `CONNECT_CSR(MSECCFGH, 12'h757, 0); // mseccfgh + `CONNECT_CSR(STIMECMPH, 12'h15D, testbench.dut.core.priv.priv.csr.csrs.csrs.STIMECMP_REGW[63:32]); end end @@ -374,7 +375,7 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); assign valid = ((InstrValidW | TrapW) & ~StallW) & ~reset; assign rvvi.clk = clk; assign rvvi.valid[0][0] = valid; - assign rvvi.order[0][0] = CSRArray[12'hB02]; // TODO: IMPERAS Should be event order + assign rvvi.order[0][0] = rvvi.csr[0][0][12'hB02]; // TODO: IMPERAS Should be event order assign rvvi.insn[0][0] = InstrRawW; assign rvvi.pc_rdata[0][0] = PCW; assign rvvi.trap[0][0] = TrapW; @@ -414,7 +415,7 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); end always_ff @(posedge clk) begin - if(valid) begin + if(valid) begin if(`STD_LOG) begin $fwrite(file, "%016x, %08x, %s\t\t", rvvi.pc_rdata[0][0], rvvi.insn[0][0], instrWName); for(index2 = 0; index2 < NUM_REGS; index2 += 1) begin @@ -451,8 +452,8 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); end if (`PRINT_CSRS) begin for(index2 = 0; index2 < NUM_CSRS; index2 += 1) begin - if(CSR_W[index2]) begin - $display("%t: CSR %03x = %x", $time(), index2, CSRArray[index2]); + if((rvvi.csr[0][0][index2] != CSRArrayOld[index2])) begin + $display("%t: CSR %03x = %x", $time(), index2, rvvi.csr[0][0][index2]); end end end From 6d3223fafe4cfe1aea79cc2748c1b4175fe29398 Mon Sep 17 00:00:00 2001 From: Jordan Carlin Date: Wed, 29 Jan 2025 19:58:06 -0800 Subject: [PATCH 4/6] Use macro for pmpcfg csrs --- testbench/common/wallyTracer.sv | 96 ++++++++------------------------- 1 file changed, 23 insertions(+), 73 deletions(-) diff --git a/testbench/common/wallyTracer.sv b/testbench/common/wallyTracer.sv index 8080101dc..d5f0fcc41 100644 --- a/testbench/common/wallyTracer.sv +++ b/testbench/common/wallyTracer.sv @@ -207,82 +207,32 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); end end - -// PMP CSRs if (P.PMP_ENTRIES > 0) begin - always_comb begin - if(valid) begin - // PMPCFG CSRs (space is 0-15 3a0 - 3af) - localparam inc = P.XLEN == 32 ? 4 : 8; - int i, i4, csrid; - logic [P.XLEN-1:0] pmp; - - for (i=0; i Date: Wed, 29 Jan 2025 21:32:24 -0800 Subject: [PATCH 5/6] Remove unused signals from wallyTracer --- testbench/common/wallyTracer.sv | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/testbench/common/wallyTracer.sv b/testbench/common/wallyTracer.sv index d5f0fcc41..e3239772d 100644 --- a/testbench/common/wallyTracer.sv +++ b/testbench/common/wallyTracer.sv @@ -66,9 +66,6 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); logic [31: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; @@ -400,13 +397,14 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); $display("f%02d = %08x", index2, rvvi.f_wdata[0][0][index2]); end end - if (`PRINT_CSRS) begin - for(index2 = 0; index2 < NUM_CSRS; index2 += 1) begin - if((rvvi.csr[0][0][index2] != CSRArrayOld[index2])) begin - $display("%t: CSR %03x = %x", $time(), index2, rvvi.csr[0][0][index2]); - end - end - end + // Need to figure out how to print values on change if they are not in a large array + // if (`PRINT_CSRS) begin + // for(index2 = 0; index2 < NUM_CSRS; index2 += 1) begin + // if((rvvi.csr[0][0][index2] != CSRArrayOld[index2])) begin + // $display("%t: CSR %03x = %x", $time(), index2, rvvi.csr[0][0][index2]); + // end + // end + // end end if(HaltW) $finish; end From 373855af0b8bef77c2dda9f569cf4b5c46617804 Mon Sep 17 00:00:00 2001 From: Jordan Carlin Date: Wed, 29 Jan 2025 21:32:42 -0800 Subject: [PATCH 6/6] Gate more CSRs in wallyTracer on supported extensions --- testbench/common/wallyTracer.sv | 54 +++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/testbench/common/wallyTracer.sv b/testbench/common/wallyTracer.sv index e3239772d..1f6af7b7a 100644 --- a/testbench/common/wallyTracer.sv +++ b/testbench/common/wallyTracer.sv @@ -150,33 +150,45 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); `CONNECT_CSR(MIP, 12'h344, testbench.dut.core.priv.priv.csr.csrm.MIP_REGW); // S-mode trap CSRs - `CONNECT_CSR(SSTATUS, 12'h100, testbench.dut.core.priv.priv.csr.csrs.csrs.SSTATUS_REGW); - `CONNECT_CSR(SIE, 12'h104, testbench.dut.core.priv.priv.csr.csrm.MIE_REGW & 12'h222); - `CONNECT_CSR(STVEC, 12'h105, testbench.dut.core.priv.priv.csr.csrs.csrs.STVEC_REGW); - `CONNECT_CSR(SSCRATCH, 12'h140, testbench.dut.core.priv.priv.csr.csrs.csrs.SSCRATCH_REGW); - `CONNECT_CSR(SEPC, 12'h141, testbench.dut.core.priv.priv.csr.csrs.csrs.SEPC_REGW); - `CONNECT_CSR(SCAUSE, 12'h142, testbench.dut.core.priv.priv.csr.csrs.csrs.SCAUSE_REGW); - `CONNECT_CSR(STVAL, 12'h143, testbench.dut.core.priv.priv.csr.csrs.csrs.STVAL_REGW); - `CONNECT_CSR(SIP, 12'h144, testbench.dut.core.priv.priv.csr.csrm.MIP_REGW & 12'h222 & testbench.dut.core.priv.priv.csr.csrm.MIDELEG_REGW); + if (P.S_SUPPORTED) begin + `CONNECT_CSR(SSTATUS, 12'h100, testbench.dut.core.priv.priv.csr.csrs.csrs.SSTATUS_REGW); + `CONNECT_CSR(SIE, 12'h104, testbench.dut.core.priv.priv.csr.csrm.MIE_REGW & 12'h222); + `CONNECT_CSR(STVEC, 12'h105, testbench.dut.core.priv.priv.csr.csrs.csrs.STVEC_REGW); + `CONNECT_CSR(SSCRATCH, 12'h140, testbench.dut.core.priv.priv.csr.csrs.csrs.SSCRATCH_REGW); + `CONNECT_CSR(SEPC, 12'h141, testbench.dut.core.priv.priv.csr.csrs.csrs.SEPC_REGW); + `CONNECT_CSR(SCAUSE, 12'h142, testbench.dut.core.priv.priv.csr.csrs.csrs.SCAUSE_REGW); + `CONNECT_CSR(STVAL, 12'h143, testbench.dut.core.priv.priv.csr.csrs.csrs.STVAL_REGW); + `CONNECT_CSR(SIP, 12'h144, testbench.dut.core.priv.priv.csr.csrm.MIP_REGW & 12'h222 & testbench.dut.core.priv.priv.csr.csrm.MIDELEG_REGW); + end // Virtual Memory CSRs - `CONNECT_CSR(SATP, 12'h180, testbench.dut.core.priv.priv.csr.csrs.csrs.SATP_REGW); + if (P.VIRTMEM_SUPPORTED) begin + `CONNECT_CSR(SATP, 12'h180, testbench.dut.core.priv.priv.csr.csrs.csrs.SATP_REGW); + end // Floating-Point CSRs - `CONNECT_CSR(FFLAGS, 12'h001, testbench.dut.core.priv.priv.csr.csru.csru.FFLAGS_REGW); - `CONNECT_CSR(FRM, 12'h002, testbench.dut.core.priv.priv.csr.csru.csru.FRM_REGW); - `CONNECT_CSR(FCSR, 12'h003, {testbench.dut.core.priv.priv.csr.csru.csru.FRM_REGW, testbench.dut.core.priv.priv.csr.csru.csru.FFLAGS_REGW}); + if (P.F_SUPPORTED) begin + `CONNECT_CSR(FFLAGS, 12'h001, testbench.dut.core.priv.priv.csr.csru.csru.FFLAGS_REGW); + `CONNECT_CSR(FRM, 12'h002, testbench.dut.core.priv.priv.csr.csru.csru.FRM_REGW); + `CONNECT_CSR(FCSR, 12'h003, {testbench.dut.core.priv.priv.csr.csru.csru.FRM_REGW, testbench.dut.core.priv.priv.csr.csru.csru.FFLAGS_REGW}); + end // Counters / Performance Monitoring CSRs - `CONNECT_CSR(MCOUNTEREN, 12'h306, testbench.dut.core.priv.priv.csr.csrm.MCOUNTEREN_REGW); - `CONNECT_CSR(SCOUNTEREN, 12'h106, testbench.dut.core.priv.priv.csr.csrs.csrs.SCOUNTEREN_REGW); + if (P.U_SUPPORTED) begin + `CONNECT_CSR(MCOUNTEREN, 12'h306, testbench.dut.core.priv.priv.csr.csrm.MCOUNTEREN_REGW); + end + if (P.S_SUPPORTED) begin + `CONNECT_CSR(SCOUNTEREN, 12'h106, testbench.dut.core.priv.priv.csr.csrs.csrs.SCOUNTEREN_REGW); + end `CONNECT_CSR(MCOUNTINHIBIT, 12'h320, testbench.dut.core.priv.priv.csr.csrm.MCOUNTINHIBIT_REGW); // mhpmevent3-31 not connected (232-33F) - `CONNECT_CSR(MCYCLE, 12'hB00, testbench.dut.core.priv.priv.csr.counters.counters.HPMCOUNTER_REGW[0]); // MCYCLE - `CONNECT_CSR(MINSTRET, 12'hB02, testbench.dut.core.priv.priv.csr.counters.counters.HPMCOUNTER_REGW[2]); // MINSTRET - // mhpmcounter3-31 not connected (B03-B1F) - // cycle, time, instret not connected (C00-C02) - // hpmcounter3-31 not connected (C03-C1F) + if (P.ZICNTR_SUPPORTED) begin + `CONNECT_CSR(MCYCLE, 12'hB00, testbench.dut.core.priv.priv.csr.counters.counters.HPMCOUNTER_REGW[0]); // MCYCLE + `CONNECT_CSR(MINSTRET, 12'hB02, testbench.dut.core.priv.priv.csr.counters.counters.HPMCOUNTER_REGW[2]); // MINSTRET + // mhpmcounter3-31 not connected (B03-B1F) + // cycle, time, instret not connected (C00-C02) + // hpmcounter3-31 not connected (C03-C1F) + end // Machine Information Registers and Configuration CSRs `CONNECT_CSR(MISA, 12'h301, testbench.dut.core.priv.priv.csr.csrm.MISA_REGW); @@ -190,7 +202,9 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); `CONNECT_CSR(MCONFIGPTR, 12'hF15, 0); //mconfigptr // Sstc CSRs - `CONNECT_CSR(STIMECMP, 12'h14D, testbench.dut.core.priv.priv.csr.csrs.csrs.STIMECMP_REGW[P.XLEN-1:0]); + if (P.SSTC_SUPPORTED) begin + `CONNECT_CSR(STIMECMP, 12'h14D, testbench.dut.core.priv.priv.csr.csrs.csrs.STIMECMP_REGW[P.XLEN-1:0]); + end // Zkr CSRs // seed not connected (015)