mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
commit
b48b4f4e81
14
bin/wsim
14
bin/wsim
@ -34,8 +34,8 @@ if (args.gui):
|
||||
exit(1)
|
||||
|
||||
if (args.coverage):
|
||||
if (args.sim != "questa"):
|
||||
print("Coverage option only available for Questa")
|
||||
if args.sim not in ["questa", "vcs"]:
|
||||
print("Coverage option only available for Questa and VCS")
|
||||
exit(1)
|
||||
|
||||
if (args.vcd):
|
||||
@ -79,12 +79,10 @@ elif (args.sim == "verilator"):
|
||||
os.system(f"/usr/bin/make -C {regressionDir}/verilator WALLYCONF={args.config} TEST={args.testsuite} EXTRA_ARGS='{args.args}'")
|
||||
elif (args.sim == "vcs"):
|
||||
print(f"Running VCS on " + args.config + " " + args.testsuite)
|
||||
if (args.coverage):
|
||||
print("Coverage option not available for VCS")
|
||||
exit(1)
|
||||
if (args.gui):
|
||||
cmd = cd + "; ./run_vcs " + args.config + " " + args.testsuite + " " + args.tb + " " + "1"
|
||||
else:
|
||||
cmd = cd + "; ./run_vcs " + args.config + " " + "\""+args.testsuite+"\""
|
||||
args.args += "gui"
|
||||
elif (args.coverage):
|
||||
args.args += "coverage"
|
||||
cmd = cd + "; ./run_vcs " + args.config + " " + args.testsuite + " " + args.args
|
||||
print(cmd)
|
||||
os.system(cmd)
|
||||
|
108
sim/vcs/run_vcs
108
sim/vcs/run_vcs
@ -4,48 +4,108 @@
|
||||
# Note: VCS produces warning about unsupported Linux Version, but runs successfully
|
||||
# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
|
||||
|
||||
CFG=${WALLY}/config
|
||||
SRC=${WALLY}/src
|
||||
TB=${WALLY}/testbench
|
||||
# Color Definitions
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Directories
|
||||
CFG="${WALLY}/config"
|
||||
SRC="${WALLY}/src"
|
||||
TB="${WALLY}/testbench"
|
||||
|
||||
# Set CONFIG_VARIANT from the first script argument
|
||||
#CONFIG_VARIANT=${1:-rv64i}
|
||||
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."
|
||||
WKDIR="wkdir/${1}_${2}"
|
||||
COV="cov/${1}_${2}"
|
||||
LOGS="logs"
|
||||
|
||||
|
||||
clean_logs() {
|
||||
echo -e "${YELLOW}Cleaning up workspace...${NC}"
|
||||
rm -rf wkdir logs cov
|
||||
}
|
||||
clean_simprofile() {
|
||||
echo -e "${YELLOW}Cleaning up simprofile_dir...${NC}"
|
||||
rm -rf simprofile_dir* profileReport*
|
||||
}
|
||||
#clean_logs
|
||||
clean_simprofile
|
||||
# Function to create a directory if it does not exist
|
||||
create_directory() {
|
||||
local dir=$1 # Local variable for directory name
|
||||
|
||||
if [ ! -d "$dir" ]; then
|
||||
mkdir -p "$dir"
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "Directory $dir created successfully."
|
||||
else
|
||||
echo "Failed to create directory $dir."
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "Failed to create directory $WKDIR."
|
||||
exit 1
|
||||
echo "Directory $dir already exists."
|
||||
fi
|
||||
}
|
||||
|
||||
# Create or verify WKDIR, COV, and LOGS directories
|
||||
create_directory "$WKDIR"
|
||||
create_directory "$COV"
|
||||
create_directory "$LOGS"
|
||||
|
||||
# Ensure the working directory exists
|
||||
if [ ! -d "$WKDIR" ]; then
|
||||
echo -e "${YELLOW}Directory $WKDIR does not exist. Creating it now...${NC}"
|
||||
mkdir -p "$WKDIR" && echo -e "${GREEN}Directory $WKDIR created successfully.${NC}" || {
|
||||
echo -e "${RED}Failed to create directory $WKDIR.${NC}"
|
||||
exit 1
|
||||
}
|
||||
else
|
||||
echo "Directory $WKDIR already exists."
|
||||
echo -e "${GREEN}Directory $WKDIR already exists.${NC}"
|
||||
fi
|
||||
|
||||
if [[ -n "$4" ]]; then
|
||||
# GUI option handling
|
||||
GUI=""
|
||||
if [ "$3" = "gui" ]; then
|
||||
GUI="-gui"
|
||||
else
|
||||
GUI=""
|
||||
fi
|
||||
|
||||
# Collect include directories
|
||||
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}"
|
||||
INCLUDE_PATH="+incdir+${CFG}/${CONFIG_VARIANT} +incdir+${CFG}/deriv/${CONFIG_VARIANT} +incdir+${CFG}/shared +incdir+../../tests +define+ +incdir+${TB} ${SRC}/cvw.sv +incdir+${SRC}"
|
||||
|
||||
SIMFILES="$INCLUDE_DIRS $(find ${SRC} -name "*.sv" ! -path "${SRC}/generic/clockgater.sv" ! -path "${SRC}/generic/mem/rom1p1r_128x64.sv" ! -path "${SRC}/generic/mem/ram2p1r1wbe_128x64.sv" ! -path "${SRC}/generic/mem/rom1p1r_128x32.sv" ! -path "${SRC}/generic/mem/ram2p1r1wbe_512x64.sv") ${TB}/testbench.sv $(find ${TB}/common -name "*.sv" ! -path "${TB}/common/wallyTracer.sv")"
|
||||
# Prepare RTL files avoiding certain paths
|
||||
RTL_FILES="$INCLUDE_DIRS $(find ${SRC} -name "*.sv" ! -path "${SRC}/generic/clockgater.sv" ! -path "${SRC}/generic/mem/rom1p1r_128x64.sv" ! -path "${SRC}/generic/mem/ram2p1r1wbe_128x64.sv" ! -path "${SRC}/generic/mem/rom1p1r_128x32.sv" ! -path "${SRC}/generic/mem/ram2p1r1wbe_512x64.sv") ${TB}/testbench.sv $(find ${TB}/common -name "*.sv" ! -path "${TB}/common/wallyTracer.sv")"
|
||||
|
||||
# Simulation and Coverage Commands
|
||||
OUTPUT="sim_out"
|
||||
VCS_CMD="vcs +lint=all,noGCWM,noUI,noSVA-UA,noIDTS,noNS,noULCO,noCAWM-L,noWMIA-L,noSV-PIU,noSTASKW_CO,noSTASKW_CO1,noSTASKW_RMCOF +vcs+vcdpluson -simprofile -suppress +warn -sverilog +vc -Mupdate -line -full64 -kdb -lca -debug_access+all+reverse -ntb_opts sensitive_dyn +define+SIM_VCS ${INCLUDE_PATH} $RTL_FILES"
|
||||
SIMV_CMD="./${WKDIR}/$OUTPUT +TEST=${TESTSUITE}"
|
||||
COV_FILES="${TB}/coverage/test_pmp_coverage.sv"
|
||||
COV_OPTIONS="-cm line+cond+branch+fsm+tgl -cm_log ${WKDIR}/coverage.log -cm_dir ${WKDIR}/COVERAGE"
|
||||
COV_RUN="urg -dir ${WKDIR}/sim_out.vdb/"
|
||||
|
||||
clean() {
|
||||
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 -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
|
||||
#clean
|
||||
|
||||
if [ "$3" = "coverage" ]; then
|
||||
echo -e "${YELLOW}#### Running VCS Simulation with Coverage ####${NC}"
|
||||
# Code Coverage.
|
||||
$VCS_CMD $COV_OPTIONS -o ${WKDIR}/$OUTPUT -Mlib ${WKDIR} -work ${WKDIR} -l "$LOGS/${CONFIG_VARIANT}_${TESTSUITE}.log"
|
||||
$SIMV_CMD
|
||||
$COV_RUN
|
||||
cp -rf urgReport $COV
|
||||
|
||||
else
|
||||
echo -e "${YELLOW}#### Running VCS Simulation ####${NC}"
|
||||
$VCS_CMD -o ${WKDIR}/$OUTPUT -work ${WKDIR} -Mlib ${WKDIR} -l "$LOGS/{CONFIG_VARIANT}_{TESTSUITE}.log"
|
||||
$SIMV_CMD ${GUI}
|
||||
fi
|
||||
|
||||
|
@ -318,9 +318,13 @@ module testbench;
|
||||
// Find the test vector files and populate the PC to function label converter
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
logic [P.XLEN-1:0] testadr;
|
||||
always_comb begin
|
||||
|
||||
//VCS ignores the dynamic types while processing the implicit sensitivity lists of always @*, always_comb, and always_latch
|
||||
//procedural blocks. VCS supports the dynamic types in the implicit sensitivity list of always @* block as specified in the Section 9.2 of the IEEE Standard SystemVerilog Specification 1800-2012.
|
||||
//To support memory load and dump task verbosity: flag : -diag sys_task_mem
|
||||
always @(*) begin
|
||||
begin_signature_addr = ProgramAddrLabelArray["begin_signature"];
|
||||
end_signature_addr = ProgramAddrLabelArray["sig_end_canary"];
|
||||
end_signature_addr = ProgramAddrLabelArray["sig_end_canary"];
|
||||
signature_size = end_signature_addr - begin_signature_addr;
|
||||
end
|
||||
logic EcallFaultM;
|
||||
@ -409,8 +413,7 @@ module testbench;
|
||||
if (!begin_signature_addr)
|
||||
$display("begin_signature addr not found in %s", ProgramLabelMapFile);
|
||||
else if (TEST != "embench") begin // *** quick hack for embench. need a better long term solution
|
||||
// CheckSignature(pathname, tests[test], riscofTest, begin_signature_addr, errors);
|
||||
CheckSignature(pathname, tests[test], riscofTest, ProgramAddrLabelArray["begin_signature"], errors);
|
||||
CheckSignature(pathname, tests[test], riscofTest, begin_signature_addr, errors);
|
||||
if(errors > 0) totalerrors = totalerrors + 1;
|
||||
end
|
||||
end
|
||||
@ -420,6 +423,8 @@ module testbench;
|
||||
else $display("FAIL: %d test programs had errors", totalerrors);
|
||||
`ifdef VERILATOR // this macro is defined when verilator is used
|
||||
$finish; // Simulator Verilator needs $finish to terminate simulation.
|
||||
`elsif SIM_VCS // this macro is defined when vcs is used
|
||||
$finish; // Simulator VCS needs $finish to terminate simulation.
|
||||
`else
|
||||
$stop; // if this is changed to $finish for Questa, wally-batch.do does not go to the next step to run coverage, and wally.do terminates without allowing GUI debug
|
||||
`endif
|
||||
|
Loading…
Reference in New Issue
Block a user