diff --git a/bin/wsim b/bin/wsim index 9884992e4..db9b53258 100755 --- a/bin/wsim +++ b/bin/wsim @@ -14,38 +14,16 @@ import argparse import os -def LaunchSim(ElfFile): - # Launch selected simulator + +def LaunchSim(ElfFile, flags): cd = "cd $WALLY/sim/" +args.sim - # ugh. can't have more than 9 arguments passed to vsim. why? I'll have to remove --lockstep when running - # functional coverage and imply it. + + # per-simulator launch if (args.sim == "questa"): - if (args.lockstep): - prefix = "IMPERAS_TOOLS=" + WALLY + "/sim/imperas.ic" - if(int(args.locksteplog) >= 1): EnableLog = 1 - else: EnableLog = 0 - if(args.locksteplog != 0): ImperasPlusArgs = " +IDV_TRACE2LOG=" + str(EnableLog) + " +IDV_TRACE2LOG_AFTER=" + str(args.locksteplog) - else: ImperasPlusArgs = "" - if(args.fcov): - CovEnableStr = "1" if int(args.covlog) > 0 else "0"; - if(args.covlog >= 1): EnableLog = 1 - else: EnableLog = 0 - ImperasPlusArgs = " +IDV_TRACE2COV=" + str(EnableLog) + " +TRACE2LOG_AFTER=" + str(args.covlog) + " +TRACE2COV_ENABLE=" + CovEnableStr; - suffix = "" - else: - CovEnableStr = "" - suffix = "--lockstep" - else: - prefix = "" - ImperasPlusArgs = "" - suffix = "" + # Questa cannot accept more than 9 arguments. fcov implies lockstep if (args.tb == "testbench_fp"): args.args = " -GTEST=\"" + args.testsuite + "\" " + args.args - cmd = "do wally.do " + args.config + " " + args.testsuite + " " + args.tb + " " + args.args + " " + ElfFile + " " + suffix + " " + ImperasPlusArgs - if (args.coverage): - cmd += " --coverage" - if (args.fcov): - cmd += " --fcov" + cmd = "do wally.do " + args.config + " " + args.testsuite + " " + args.tb + " " + args.args + " " + ElfFile + " " + suffix + " " + flags if (args.gui): # launch Questa with GUI; add +acc to keep variables accessible if(args.tb == "testbench"): cmd = cd + "; " + prefix + " vsim -do \"" + cmd + " +acc -GDEBUG=1\"" @@ -58,24 +36,20 @@ def LaunchSim(ElfFile): elif (args.sim == "verilator"): # PWD=${WALLY}/sim CONFIG=rv64gc TESTSUITE=arch64i print(f"Running Verilator on {args.config} {args.testsuite}") - if (args.coverage): - print("Coverage option not available for Verilator") - exit(1) - if (args.gui): - print("GUI option not available for Verilator") - exit(1) os.system(f"/usr/bin/make -C {regressionDir}/verilator WALLYCONF={args.config} TEST={args.testsuite} TESTBENCH={args.tb} EXTRA_ARGS='{args.args}'") elif (args.sim == "vcs"): print(f"Running VCS on " + args.config + " " + args.testsuite) if (args.gui): args.args += "gui" - elif (args.coverage): - args.args += "coverage" - cmd = cd + "; ./run_vcs " + args.config + " " + args.testsuite + " " + args.args + cmd = cd + "; ./run_vcs " + args.config + " " + args.testsuite + " " + args.args + " " + flags print(cmd) os.system(cmd) +######################## +# main wsim script +######################## + # Parse arguments parser = argparse.ArgumentParser() parser.add_argument("config", help="Configuration file") @@ -96,6 +70,7 @@ print("Config=" + args.config + " tests=" + args.testsuite + " sim=" + args.sim ElfFile="" DirectorMode = 0 ElfList = [] +WALLY = os.environ.get('WALLY') if(os.path.isfile(args.testsuite)): ElfFile = "+ElfFile=" + args.testsuite @@ -111,21 +86,43 @@ elif(os.path.isdir(args.testsuite)): print(ElfList) # Validate arguments -if (args.gui): +if (args.gui or args.coverage or args.fcov or args.lockstep): if args.sim not in ["questa", "vcs"]: - print("GUI option only supported for Questa and VCS") - exit(1) - -if (args.coverage): - if args.sim not in ["questa", "vcs"]: - print("Coverage option only available for Questa and VCS") + print("Option only supported for Questa and VCS") exit(1) if (args.vcd): args.args += " -DMAKEVCD=1" +# if lockstep is enabled, then we need to pass the Imperas lockstep arguments +if(int(args.locksteplog) >= 1): EnableLog = 1 +else: EnableLog = 0 +if (args.lockstep): + prefix = "IMPERAS_TOOLS=" + WALLY + "/sim/imperas.ic" + if(args.locksteplog != 0): ImperasPlusArgs = " +IDV_TRACE2LOG=" + str(EnableLog) + " +IDV_TRACE2LOG_AFTER=" + str(args.locksteplog) + else: ImperasPlusArgs = "" + if(args.fcov): + CovEnableStr = "1" if int(args.covlog) > 0 else "0"; + if(args.covlog >= 1): EnableLog = 1 + else: EnableLog = 0 + ImperasPlusArgs = " +IDV_TRACE2COV=" + str(EnableLog) + " +TRACE2LOG_AFTER=" + str(args.covlog) + " +TRACE2COV_ENABLE=" + CovEnableStr; + suffix = "" + else: + CovEnableStr = "" + suffix = "--lockstep" +else: + prefix = "" + ImperasPlusArgs = "" + suffix = "" +flags = ImperasPlusArgs + +# other flags +if (args.coverage): + flags += " --coverage" +if (args.fcov): + flags += " --fcov" + # create the output sub-directories. -WALLY = os.environ.get('WALLY') regressionDir = WALLY + '/sim/' for d in ["logs", "wkdir", "cov"]: try: @@ -135,7 +132,7 @@ for d in ["logs", "wkdir", "cov"]: if(DirectorMode): for ElfFile in ElfList: - LaunchSim(ElfFile) + LaunchSim(ElfFile, flags) else: - LaunchSim(ElfFile) + LaunchSim(ElfFile, flags) diff --git a/sim/vcs/run_vcs b/sim/vcs/run_vcs index 80385f6ba..d9d53e45b 100755 --- a/sim/vcs/run_vcs +++ b/sim/vcs/run_vcs @@ -92,24 +92,22 @@ RTL_FILES="$INCLUDE_DIRS $(find ${SRC} -name "*.sv" ! -path "${SRC}/generic/mem/ 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 -suppress +warn -sverilog +vc -Mupdate -line -full64 -kdb -lca -debug_access+all+reverse -ntb_opts sensitive_dyn ${INCLUDE_PATH} $RTL_FILES" SIMV_CMD="./${WKDIR}/$OUTPUT +TEST=${TESTSUITE} ${PLUSARGS}" -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" -### CODE COVERAGE REPORT in IndividualCovReport in XML format -#COV_RUN="urg -dir ${WKDIR}/COVERAGE.vdb -report IndividualCovReport/${CONFIG_VARIANT}_${TESTSUITE}" -### CODE COVERAGE REPORT in IndividualCovReport in text format -COV_RUN="urg -dir ./${WKDIR}/COVERAGE.vdb -format text -report IndividualCovReport/${CONFIG_VARIANT}_${TESTSUITE}" - # Clean and run simulation with VCS -if [ "$3" = "coverage" ]; then +if [ "$3" = "--coverage" ]; then echo -e "${YELLOW}#### Running VCS Simulation with Coverage ####${NC}" - # Code Coverage. + COV_OPTIONS="-cm line+cond+branch+fsm+tgl -cm_log ${WKDIR}/coverage.log -cm_dir ${WKDIR}/COVERAGE" + COV_RUN="urg -dir ./${WKDIR}/COVERAGE.vdb -format text -report IndividualCovReport/${CONFIG_VARIANT}_${TESTSUITE}" $VCS_CMD -Mdir=${WKDIR} $COV_OPTIONS -o ${WKDIR}/$OUTPUT -Mlib ${WKDIR} -work ${WKDIR} -l "$LOGS/${CONFIG_VARIANT}_${TESTSUITE}.log" - $SIMV_CMD $COV_OPTIONS + $SIMV_CMD $COV_OPTIONS # dh 6/27/24 *** are COV_OPTIONS really needed? $COV_RUN #cp -rf urgReport $COV - +elif [ "$3" = "--lockstep" ]; then + echo -e "${YELLOW}#### Running VCS Simulation with Lockstep ####${NC}" + LOCKSTEPVOPTSTRING=" +define+USE_IMPERAS_DV +incdir+$env(IMPERAS_HOME)/ImpPublic/include/host +incdir+$env(IMPERAS_HOME)/ImpProprietary/include/host ${IMPERAS_HOME}/ImpPublic/source/host/rvvi/*.sv ${IMPERAS_HOME}/ImpProprietary/source/host/idv/*.sv -sv_lib ${IMPERAS_HOME}/lib/Linux64/ImperasLib/imperas.com/verification/riscv/1.0/model " + $VCS_CMD -Mdir=${WKDIR} $LOCKSTEP_OPTIONS -o ${WKDIR}/$OUTPUT -Mlib ${WKDIR} -work ${WKDIR} -l "$LOGS/${CONFIG_VARIANT}_${TESTSUITE}.log" + $SIMV_CMD else echo -e "${YELLOW}#### Running VCS Simulation ####${NC}" $VCS_CMD -Mdir=${WKDIR} -o ${WKDIR}/$OUTPUT -work ${WKDIR} -Mlib ${WKDIR} -l "$LOGS/${CONFIG_VARIANT}_${TESTSUITE}.log"