From 7ca1c976c04563a19ec97ce8e21326ade596f023 Mon Sep 17 00:00:00 2001 From: Divya2030 Date: Thu, 2 May 2024 10:33:29 -0700 Subject: [PATCH] initial commit pmp basic coverage working --- bin/wsim | 12 +-- sim/questa/wally.do | 2 +- sim/vcs/run_vcs | 27 ++++-- testbench/coverage/test_pmp_coverage.sv | 108 ++++++++++++++++++++++++ 4 files changed, 137 insertions(+), 12 deletions(-) create mode 100644 testbench/coverage/test_pmp_coverage.sv diff --git a/bin/wsim b/bin/wsim index a10ea6158..a85b7e304 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) + if (args.gui): + cmd = cd + "; ./run_vcs " + args.config + " " + args.testsuite + " " + args.tb + " " + "1" + os.system(cmd) 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/questa/wally.do b/sim/questa/wally.do index 33832516b..062cf5fe0 100644 --- a/sim/questa/wally.do +++ b/sim/questa/wally.do @@ -97,7 +97,7 @@ if {$argc >= 3} { # "Extra checking for conflicts with always_comb done at vopt time" # because vsim will run vopt -vlog -lint -work ${WKDIR} +incdir+${CONFIG}/${CFG} +incdir+${CONFIG}/deriv/${CFG} +incdir+${CONFIG}/shared ${SRC}/cvw.sv ${TB}/${TESTBENCH}.sv ${TB}/common/*.sv ${SRC}/*/*.sv ${SRC}/*/*/*.sv -suppress 2583 -suppress 7063,2596,13286 +vlog -lint -work ${WKDIR} +incdir+${CONFIG}/${CFG} +incdir+${CONFIG}/deriv/${CFG} +incdir+${CONFIG}/shared ${SRC}/cvw.sv ${TB}/${TESTBENCH}.sv ${TB}/common/*.sv ${SRC}/*/*.sv ${SRC}/*/*/*.sv ${TB}/coverage/test_pmp_coverage.sv -suppress 2583 -suppress 7063,2596,13286 # start and run simulation # remove +acc flag for faster sim during regressions if there is no need to access internal signals 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 + + + + +