mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Progress on VCS lockstep
This commit is contained in:
parent
d933c80c55
commit
31b54fb247
91
bin/wsim
91
bin/wsim
@ -14,38 +14,16 @@
|
|||||||
import argparse
|
import argparse
|
||||||
import os
|
import os
|
||||||
|
|
||||||
def LaunchSim(ElfFile):
|
|
||||||
# Launch selected simulator
|
def LaunchSim(ElfFile, flags):
|
||||||
cd = "cd $WALLY/sim/" +args.sim
|
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.sim == "questa"):
|
||||||
if (args.lockstep):
|
# Questa cannot accept more than 9 arguments. fcov implies 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 = ""
|
|
||||||
if (args.tb == "testbench_fp"):
|
if (args.tb == "testbench_fp"):
|
||||||
args.args = " -GTEST=\"" + args.testsuite + "\" " + args.args
|
args.args = " -GTEST=\"" + args.testsuite + "\" " + args.args
|
||||||
cmd = "do wally.do " + args.config + " " + args.testsuite + " " + args.tb + " " + args.args + " " + ElfFile + " " + suffix + " " + ImperasPlusArgs
|
cmd = "do wally.do " + args.config + " " + args.testsuite + " " + args.tb + " " + args.args + " " + ElfFile + " " + suffix + " " + flags
|
||||||
if (args.coverage):
|
|
||||||
cmd += " --coverage"
|
|
||||||
if (args.fcov):
|
|
||||||
cmd += " --fcov"
|
|
||||||
if (args.gui): # launch Questa with GUI; add +acc to keep variables accessible
|
if (args.gui): # launch Questa with GUI; add +acc to keep variables accessible
|
||||||
if(args.tb == "testbench"):
|
if(args.tb == "testbench"):
|
||||||
cmd = cd + "; " + prefix + " vsim -do \"" + cmd + " +acc -GDEBUG=1\""
|
cmd = cd + "; " + prefix + " vsim -do \"" + cmd + " +acc -GDEBUG=1\""
|
||||||
@ -58,24 +36,20 @@ def LaunchSim(ElfFile):
|
|||||||
elif (args.sim == "verilator"):
|
elif (args.sim == "verilator"):
|
||||||
# PWD=${WALLY}/sim CONFIG=rv64gc TESTSUITE=arch64i
|
# PWD=${WALLY}/sim CONFIG=rv64gc TESTSUITE=arch64i
|
||||||
print(f"Running Verilator on {args.config} {args.testsuite}")
|
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}'")
|
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"):
|
elif (args.sim == "vcs"):
|
||||||
print(f"Running VCS on " + args.config + " " + args.testsuite)
|
print(f"Running VCS on " + args.config + " " + args.testsuite)
|
||||||
if (args.gui):
|
if (args.gui):
|
||||||
args.args += "gui"
|
args.args += "gui"
|
||||||
elif (args.coverage):
|
cmd = cd + "; ./run_vcs " + args.config + " " + args.testsuite + " " + args.args + " " + flags
|
||||||
args.args += "coverage"
|
|
||||||
cmd = cd + "; ./run_vcs " + args.config + " " + args.testsuite + " " + args.args
|
|
||||||
print(cmd)
|
print(cmd)
|
||||||
os.system(cmd)
|
os.system(cmd)
|
||||||
|
|
||||||
|
|
||||||
|
########################
|
||||||
|
# main wsim script
|
||||||
|
########################
|
||||||
|
|
||||||
# Parse arguments
|
# Parse arguments
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument("config", help="Configuration file")
|
parser.add_argument("config", help="Configuration file")
|
||||||
@ -96,6 +70,7 @@ print("Config=" + args.config + " tests=" + args.testsuite + " sim=" + args.sim
|
|||||||
ElfFile=""
|
ElfFile=""
|
||||||
DirectorMode = 0
|
DirectorMode = 0
|
||||||
ElfList = []
|
ElfList = []
|
||||||
|
WALLY = os.environ.get('WALLY')
|
||||||
|
|
||||||
if(os.path.isfile(args.testsuite)):
|
if(os.path.isfile(args.testsuite)):
|
||||||
ElfFile = "+ElfFile=" + args.testsuite
|
ElfFile = "+ElfFile=" + args.testsuite
|
||||||
@ -111,21 +86,43 @@ elif(os.path.isdir(args.testsuite)):
|
|||||||
print(ElfList)
|
print(ElfList)
|
||||||
|
|
||||||
# Validate arguments
|
# Validate arguments
|
||||||
if (args.gui):
|
if (args.gui or args.coverage or args.fcov or args.lockstep):
|
||||||
if args.sim not in ["questa", "vcs"]:
|
if args.sim not in ["questa", "vcs"]:
|
||||||
print("GUI option only supported for Questa and VCS")
|
print("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")
|
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
if (args.vcd):
|
if (args.vcd):
|
||||||
args.args += " -DMAKEVCD=1"
|
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.
|
# create the output sub-directories.
|
||||||
WALLY = os.environ.get('WALLY')
|
|
||||||
regressionDir = WALLY + '/sim/'
|
regressionDir = WALLY + '/sim/'
|
||||||
for d in ["logs", "wkdir", "cov"]:
|
for d in ["logs", "wkdir", "cov"]:
|
||||||
try:
|
try:
|
||||||
@ -135,7 +132,7 @@ for d in ["logs", "wkdir", "cov"]:
|
|||||||
|
|
||||||
if(DirectorMode):
|
if(DirectorMode):
|
||||||
for ElfFile in ElfList:
|
for ElfFile in ElfList:
|
||||||
LaunchSim(ElfFile)
|
LaunchSim(ElfFile, flags)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
LaunchSim(ElfFile)
|
LaunchSim(ElfFile, flags)
|
||||||
|
@ -92,24 +92,22 @@ RTL_FILES="$INCLUDE_DIRS $(find ${SRC} -name "*.sv" ! -path "${SRC}/generic/mem/
|
|||||||
OUTPUT="sim_out"
|
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"
|
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}"
|
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
|
# Clean and run simulation with VCS
|
||||||
|
|
||||||
if [ "$3" = "coverage" ]; then
|
if [ "$3" = "--coverage" ]; then
|
||||||
echo -e "${YELLOW}#### Running VCS Simulation with Coverage ####${NC}"
|
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"
|
$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
|
$COV_RUN
|
||||||
#cp -rf urgReport $COV
|
#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
|
else
|
||||||
echo -e "${YELLOW}#### Running VCS Simulation ####${NC}"
|
echo -e "${YELLOW}#### Running VCS Simulation ####${NC}"
|
||||||
$VCS_CMD -Mdir=${WKDIR} -o ${WKDIR}/$OUTPUT -work ${WKDIR} -Mlib ${WKDIR} -l "$LOGS/${CONFIG_VARIANT}_${TESTSUITE}.log"
|
$VCS_CMD -Mdir=${WKDIR} -o ${WKDIR}/$OUTPUT -work ${WKDIR} -Mlib ${WKDIR} -l "$LOGS/${CONFIG_VARIANT}_${TESTSUITE}.log"
|
||||||
|
Loading…
Reference in New Issue
Block a user