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