mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
commit
5045217dca
8
bin/wsim
8
bin/wsim
@ -29,8 +29,8 @@ print("Config=" + args.config + " tests=" + args.testsuite + " sim=" + args.sim
|
|||||||
|
|
||||||
# Validate arguments
|
# Validate arguments
|
||||||
if (args.gui):
|
if (args.gui):
|
||||||
if (args.sim != "questa"):
|
if args.sim not in ["questa", "vcs"]:
|
||||||
print("GUI option only supported for Questa")
|
print("GUI option only supported for Questa and VCS")
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
if (args.coverage):
|
if (args.coverage):
|
||||||
@ -83,8 +83,8 @@ elif (args.sim == "vcs"):
|
|||||||
print("Coverage option not available for VCS")
|
print("Coverage option not available for VCS")
|
||||||
exit(1)
|
exit(1)
|
||||||
if (args.gui):
|
if (args.gui):
|
||||||
print("GUI option not available for VCS")
|
cmd = cd + "; ./run_vcs " + args.config + " " + args.testsuite + " " + args.tb + " " + "1"
|
||||||
exit(1)
|
else:
|
||||||
cmd = cd + "; ./run_vcs " + args.config + " " + "\""+args.testsuite+"\""
|
cmd = cd + "; ./run_vcs " + args.config + " " + "\""+args.testsuite+"\""
|
||||||
print(cmd)
|
print(cmd)
|
||||||
os.system(cmd)
|
os.system(cmd)
|
@ -12,7 +12,26 @@ TB=${WALLY}/testbench
|
|||||||
CONFIG_VARIANT=${1}
|
CONFIG_VARIANT=${1}
|
||||||
# Set TESTSUITE from the second script argument
|
# Set TESTSUITE from the second script argument
|
||||||
TESTSUITE=$2
|
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 "{} ")
|
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}"
|
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"
|
OUTPUT="sim_out"
|
||||||
|
|
||||||
clean() {
|
clean() {
|
||||||
rm -rf obj_dir work transcript vsim.wlf $OUTPUT *.vcd csrc ucli.key vc_hdrs.h program.out
|
rm -rf ${WKDIR}/*
|
||||||
rm -rf simv* *.daidir dve *.vpd *.dump DVEfiles/ verdi* novas* *fsdb* *.vg *.rep *.db *.chk *.log *.out profileReport* simprofile_dir*
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Clean and run simulation with VCS
|
# Clean and run simulation with VCS
|
||||||
clean
|
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
|
#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]
|
# 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
|
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}
|
||||||
./$OUTPUT | tee program.out
|
./${WKDIR}/$OUTPUT +TEST=${TESTSUITE} +fsdb+gate=off | tee ${WKDIR}/${WKDIR}.out
|
||||||
|
|
||||||
|
108
testbench/coverage/test_pmp_coverage.sv
Normal file
108
testbench/coverage/test_pmp_coverage.sv
Normal file
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -168,7 +168,6 @@ module testbench;
|
|||||||
"arch64zknd": if (P.ZKND_SUPPORTED) tests = arch64zknd;
|
"arch64zknd": if (P.ZKND_SUPPORTED) tests = arch64zknd;
|
||||||
"arch64zkne": if (P.ZKNE_SUPPORTED) tests = arch64zkne;
|
"arch64zkne": if (P.ZKNE_SUPPORTED) tests = arch64zkne;
|
||||||
"arch64zknh": if (P.ZKNH_SUPPORTED) tests = arch64zknh;
|
"arch64zknh": if (P.ZKNH_SUPPORTED) tests = arch64zknh;
|
||||||
"wallycov64i": tests = wallycov64i;
|
|
||||||
endcase
|
endcase
|
||||||
end else begin // RV32
|
end else begin // RV32
|
||||||
case (TEST)
|
case (TEST)
|
||||||
@ -883,6 +882,9 @@ end
|
|||||||
else $display("%s succeeded. Brilliant!!!", TestName);
|
else $display("%s succeeded. Brilliant!!!", TestName);
|
||||||
endtask
|
endtask
|
||||||
|
|
||||||
|
`ifdef PMP_COVERAGE
|
||||||
|
test_pmp_coverage #(P) pmp_inst(clk);
|
||||||
|
`endif
|
||||||
/* verilator lint_on WIDTHTRUNC */
|
/* verilator lint_on WIDTHTRUNC */
|
||||||
/* verilator lint_on WIDTHEXPAND */
|
/* verilator lint_on WIDTHEXPAND */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user