diff --git a/bin/wsim b/bin/wsim index a10ea6158..b29eee4bd 100755 --- a/bin/wsim +++ b/bin/wsim @@ -29,8 +29,8 @@ print("Config=" + args.config + " tests=" + args.testsuite + " sim=" + args.sim # Validate arguments if (args.gui): - if (args.sim != "questa"): - print("GUI option only supported for Questa") + if args.sim not in ["questa", "vcs"]: + print("GUI option only supported for Questa and VCS") exit(1) if (args.coverage): @@ -82,9 +82,9 @@ elif (args.sim == "vcs"): if (args.coverage): print("Coverage option not available for VCS") exit(1) - if (args.gui): - print("GUI option not available for VCS") - exit(1) - cmd = cd + "; ./run_vcs " + args.config + " " + "\""+args.testsuite+"\"" + if (args.gui): + cmd = cd + "; ./run_vcs " + args.config + " " + args.testsuite + " " + args.tb + " " + "1" + else: + cmd = cd + "; ./run_vcs " + args.config + " " + "\""+args.testsuite+"\"" print(cmd) - os.system(cmd) \ No newline at end of file + os.system(cmd) diff --git a/sim/vcs/run_vcs b/sim/vcs/run_vcs index 27ffff8f0..ca5b10986 100755 --- a/sim/vcs/run_vcs +++ b/sim/vcs/run_vcs @@ -12,7 +12,26 @@ TB=${WALLY}/testbench CONFIG_VARIANT=${1} # Set TESTSUITE from the second script argument TESTSUITE=$2 +WKDIR=wkdir/${1}_${2} +if [ ! -d "$WKDIR" ]; then + #echo "Directory $WKDIR does not exist. Creating it now..." + mkdir -p "$WKDIR" + if [ $? -eq 0 ]; then + echo "Directory $WKDIR created successfully." + else + echo "Failed to create directory $WKDIR." + exit 1 + fi +else + echo "Directory $WKDIR already exists." +fi + +if [[ -n "$4" ]]; then + GUI="-gui" +else + GUI="" +fi INCLUDE_DIRS=$(find ${SRC} -type d | xargs -I {} echo -n "{} ") SOURCE_PATH="+incdir+${CFG}/${CONFIG_VARIANT} +incdir+${CFG}/deriv/${CONFIG_VARIANT} +incdir+${CFG}/shared +define+ +define+P.XLEN=64 +define+FPGA=0 +incdir+${TB} ${SRC}/cvw.sv +incdir+${SRC}" @@ -21,14 +40,12 @@ SIMFILES="$INCLUDE_DIRS $(find ${SRC} -name "*.sv" ! -path "${SRC}/generic/clock OUTPUT="sim_out" clean() { - rm -rf obj_dir work transcript vsim.wlf $OUTPUT *.vcd csrc ucli.key vc_hdrs.h program.out - rm -rf simv* *.daidir dve *.vpd *.dump DVEfiles/ verdi* novas* *fsdb* *.vg *.rep *.db *.chk *.log *.out profileReport* simprofile_dir* + rm -rf ${WKDIR}/* } # Clean and run simulation with VCS clean #vcs +lint=all,noGCWM -simprofile -sverilog +vc -Mupdate -line -full64 -kdb -lca -debug_access+all+reverse -v2k_generate ${SOURCE_PATH} +define+TEST=$TESTSUITE $SIMFILES -o $OUTPUT -error=NOODV # lint ignores Unused Inputs (UI), Unnamed Assertipons (SVA-UA), Dynamic Type Sensitivty [IDTS], Null Statement [NS], Unequal Length in Comparison Operation [ULCO] -vcs +lint=all,noGCWM,noUI,noSVA-UA,noIDTS,noNS,noULCO,noCAWM-L,noWMIA-L,noSV-PIU -simprofile -sverilog +vc -Mupdate -line -full64 -kdb -lca -debug_access+all+reverse ${SOURCE_PATH} -pvalue+testbench.TEST=$TESTSUITE $SIMFILES -o $OUTPUT -error=NOODV -./$OUTPUT | tee program.out - +vcs +lint=all,noGCWM,noUI,noSVA-UA,noIDTS,noNS,noULCO,noCAWM-L,noWMIA-L,noSV-PIU -simprofile -suppress -sverilog +vc -Mupdate -line -full64 -kdb -lca -debug_access+all+reverse ${SOURCE_PATH} $SIMFILES -o ${WKDIR}/$OUTPUT -simdir ${WKDIR} -error=NOODV -work ${WKDIR} ${GUI} +./${WKDIR}/$OUTPUT +TEST=${TESTSUITE} +fsdb+gate=off | tee ${WKDIR}/${WKDIR}.out diff --git a/testbench/coverage/test_pmp_coverage.sv b/testbench/coverage/test_pmp_coverage.sv new file mode 100644 index 000000000..2c1cbbfaa --- /dev/null +++ b/testbench/coverage/test_pmp_coverage.sv @@ -0,0 +1,108 @@ +module test_pmp_coverage import cvw::*; #(parameter cvw_t P) (input clk); + +// Ensure the covergroup is defined correctly +covergroup cg_priv_mode @(posedge clk); + coverpoint dut.core.ifu.PrivilegeModeW { + bins user = {2'b00}; + bins superv = {2'b01}; + bins hyperv = {2'b10}; + bins mach = {2'b11}; + } +endgroup + +covergroup cg_PMPConfig @(posedge clk); + coverpoint dut.core.ifu.PMPCFG_ARRAY_REGW[0][0] { + bins ones = {1}; + bins zeros = {0}; + } +endgroup + + +function bit [1:0] getPMPConfigSlice(int index); + return dut.core.ifu.immu.immu.PMPCFG_ARRAY_REGW[index][4:3]; +endfunction + +//if (P.PMP_ENTRIES > 0) begin : pmp + covergroup cg_pmpcfg_mode @(posedge clk); + coverpoint dut.core.ifu.immu.immu.PMPCFG_ARRAY_REGW[0][4:3] { + bins off = {2'b00}; + bins tor = {2'b01}; + bins na4 = {2'b10}; + bins napot = {2'b11}; + } + + + coverpoint dut.core.ifu.immu.immu.PMPCFG_ARRAY_REGW[1][4:3] { + bins off = {2'b00}; + bins tor = {2'b01}; + bins na4 = {2'b10}; + bins napot = {2'b11}; + } + + coverpoint dut.core.ifu.immu.immu.PMPCFG_ARRAY_REGW[2][4:3] { + bins off = {2'b00}; + bins tor = {2'b01}; + bins na4 = {2'b10}; + bins napot = {2'b11}; + } + + coverpoint dut.core.ifu.immu.immu.PMPCFG_ARRAY_REGW[3][4:3] { + bins off = {2'b00}; + bins tor = {2'b01}; + bins na4 = {2'b10}; + bins napot = {2'b11}; + } + + coverpoint dut.core.ifu.immu.immu.PMPCFG_ARRAY_REGW[4][4:3] { + bins off = {2'b00}; + bins tor = {2'b01}; + bins na4 = {2'b10}; + bins napot = {2'b11}; + } + + coverpoint dut.core.ifu.immu.immu.PMPCFG_ARRAY_REGW[5][4:3] { + bins off = {2'b00}; + bins tor = {2'b01}; + bins na4 = {2'b10}; + bins napot = {2'b11}; + } + + coverpoint dut.core.ifu.immu.immu.PMPCFG_ARRAY_REGW[6][4:3] { + bins off = {2'b00}; + bins tor = {2'b01}; + bins na4 = {2'b10}; + bins napot = {2'b11}; + } + + coverpoint dut.core.ifu.immu.immu.PMPCFG_ARRAY_REGW[7][4:3] { + bins off = {2'b00}; + bins tor = {2'b01}; + bins na4 = {2'b10}; + bins napot = {2'b11}; + } + endgroup +//end + + +// Ensure that the instantiation and sampling of covergroups are within the correct procedural context +initial begin + cg_priv_mode privmodeCG = new(); // Instantiate the privilege mode covergroup + cg_PMPConfig pmpconfigCG = new(); // Instantiate the PMP config covergroup + cg_pmpcfg_mode pmpcfgmodeCG = new(); + + forever begin + @(posedge clk) begin + privmodeCG.sample(); // Sample the privilege mode covergroup + pmpconfigCG.sample(); // Sample the PMP config covergroupi + pmpcfgmodeCG.sample(); + end + end +end + + +endmodule + + + + + diff --git a/testbench/testbench.sv b/testbench/testbench.sv index 0c732c0be..093522fc3 100644 --- a/testbench/testbench.sv +++ b/testbench/testbench.sv @@ -168,7 +168,6 @@ module testbench; "arch64zknd": if (P.ZKND_SUPPORTED) tests = arch64zknd; "arch64zkne": if (P.ZKNE_SUPPORTED) tests = arch64zkne; "arch64zknh": if (P.ZKNH_SUPPORTED) tests = arch64zknh; - "wallycov64i": tests = wallycov64i; endcase end else begin // RV32 case (TEST) @@ -882,7 +881,10 @@ end if (errors) $display("%s failed with %d errors. :(", TestName, errors); else $display("%s succeeded. Brilliant!!!", TestName); endtask - + +`ifdef PMP_COVERAGE +test_pmp_coverage #(P) pmp_inst(clk); +`endif /* verilator lint_on WIDTHTRUNC */ /* verilator lint_on WIDTHEXPAND */