2024-07-04 06:47:26 +00:00
|
|
|
#!/usr/bin/env python3
|
2024-05-07 17:41:02 +00:00
|
|
|
|
2024-07-03 15:02:38 +00:00
|
|
|
# run_vcs
|
|
|
|
# David_Harris@hmc.edu 2 July 2024
|
2024-12-08 12:50:22 +00:00
|
|
|
# Modified Jordan Carlin jcarlin@hmc.edu Dec 9 2024
|
2024-07-03 15:02:38 +00:00
|
|
|
# Run VCS on a given file, passing appropriate flags
|
|
|
|
# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
|
2024-04-20 21:12:55 +00:00
|
|
|
|
2024-05-07 17:41:02 +00:00
|
|
|
|
2024-07-03 15:02:38 +00:00
|
|
|
import argparse
|
|
|
|
import os
|
|
|
|
import subprocess
|
|
|
|
|
|
|
|
# run a Linux command and return the result as a string in a form that VCS can use
|
|
|
|
def runfindcmd(cmd):
|
|
|
|
# print("Executing: " + str(cmd) )
|
|
|
|
res = subprocess.check_output(cmd, shell=True)
|
|
|
|
res = str(res)
|
|
|
|
res = res.replace("\\n", " ") # replace newline with space
|
|
|
|
res = res.replace("\'", "") # strip off quotation marks
|
|
|
|
res = res[1:] # strip off leading b from byte string
|
|
|
|
return res
|
|
|
|
|
|
|
|
parser = argparse.ArgumentParser()
|
|
|
|
parser.add_argument("config", help="Configuration file")
|
|
|
|
parser.add_argument("testsuite", help="Test suite (or none, when running a single ELF file) ")
|
2024-08-11 20:08:16 +00:00
|
|
|
parser.add_argument("--tb", "-t", help="Testbench", choices=["testbench", "testbench_fp"], default="testbench")
|
2024-12-07 20:54:51 +00:00
|
|
|
parser.add_argument("--ccov", "-c", help="Code Coverage", action="store_true")
|
|
|
|
parser.add_argument("--fcov", "-f", help="Functional Coverage", action="store_true")
|
2024-07-03 15:02:38 +00:00
|
|
|
parser.add_argument("--args", "-a", help="Optional arguments passed to simulator via $value$plusargs", default="")
|
2024-08-11 20:08:16 +00:00
|
|
|
parser.add_argument("--params", "-p", help="Optional top-level parameter overrides of the form param=value", default="")
|
2024-12-08 09:51:08 +00:00
|
|
|
parser.add_argument("--define", "-d", help="Optional define macros passed to simulator", default="")
|
2024-07-03 15:02:38 +00:00
|
|
|
parser.add_argument("--lockstep", "-l", help="Run ImperasDV lock, step, and compare.", action="store_true")
|
|
|
|
# GUI not yet implemented
|
|
|
|
#parser.add_argument("--gui", "-g", help="Simulate with GUI", action="store_true")
|
|
|
|
args = parser.parse_args()
|
2024-12-08 12:50:22 +00:00
|
|
|
print(f"run_vcs Config={args.config} tests={args.testsuite} lockstep={args.lockstep} args='{args.args}' params='{args.params}' define='{args.define}'")
|
2024-07-03 15:02:38 +00:00
|
|
|
|
|
|
|
cfgdir = "$WALLY/config"
|
|
|
|
srcdir = "$WALLY/src"
|
|
|
|
tbdir = "$WALLY/testbench"
|
|
|
|
wkdir = "$WALLY/sim/vcs/wkdir/" + args.config + "_" + args.testsuite
|
|
|
|
covdir = "$WALLY/sim/vcs/cov/" + args.config + "_" + args.testsuite
|
|
|
|
logdir = "$WALLY/sim/vcs/logs"
|
|
|
|
|
2024-12-08 12:50:22 +00:00
|
|
|
os.makedirs(wkdir, exist_ok=True)
|
|
|
|
os.makedirs(covdir, exist_ok=True)
|
|
|
|
os.makedirs(logdir, exist_ok=True)
|
2024-07-03 15:02:38 +00:00
|
|
|
|
|
|
|
# Find RTL source files
|
2024-12-08 12:50:22 +00:00
|
|
|
rtlsrc_cmd = f'find {srcdir} -name "*.sv" ! -path "{srcdir}/generic/mem/rom1p1r_128x64.sv" ! -path "{srcdir}/generic/mem/ram2p1r1wbe_128x64.sv" ! -path "{srcdir}/generic/mem/rom1p1r_128x32.sv" ! -path "{srcdir}/generic/mem/ram2p1r1wbe_2048x64.sv"'
|
2024-07-03 15:02:38 +00:00
|
|
|
rtlsrc_files = runfindcmd(rtlsrc_cmd)
|
2024-12-08 12:50:22 +00:00
|
|
|
tbcommon_cmd = f'find {tbdir}/common -name "*.sv" ! -path "{tbdir}/common/wallyTracer.sv"'
|
2024-07-03 15:02:38 +00:00
|
|
|
tbcommon_files = runfindcmd(tbcommon_cmd)
|
2024-12-08 12:50:22 +00:00
|
|
|
tb_file = f'{tbdir}/{args.tb}.sv'
|
|
|
|
RTL_FILES = f"{tb_file} {rtlsrc_files} {tbcommon_files}"
|
2024-07-03 15:02:38 +00:00
|
|
|
|
|
|
|
# Include directories
|
2024-12-08 12:50:22 +00:00
|
|
|
INCLUDE_PATH=f"+incdir+{cfgdir}/{args.config} +incdir+{cfgdir}/deriv/{args.config} +incdir+{cfgdir}/shared +incdir+$WALLY/tests +incdir+{tbdir} +incdir+{srcdir}"
|
2024-07-03 15:02:38 +00:00
|
|
|
|
|
|
|
# lockstep mode
|
|
|
|
if (args.lockstep):
|
2024-12-08 10:47:04 +00:00
|
|
|
LOCKSTEP_OPTIONS = " +incdir+$IMPERAS_HOME/ImpPublic/include/host +incdir+$IMPERAS_HOME/ImpProprietary/include/host $IMPERAS_HOME/ImpPublic/source/host/rvvi/*.sv $IMPERAS_HOME/ImpProprietary/source/host/idv/*.sv " + tbdir + "/common/wallyTracer.sv"
|
2024-07-03 15:02:38 +00:00
|
|
|
LOCKSTEP_SIMV = "-sv_lib $IMPERAS_HOME/lib/Linux64/ImperasLib/imperas.com/verification/riscv/1.0/model"
|
|
|
|
else:
|
|
|
|
LOCKSTEP_OPTIONS = ""
|
|
|
|
LOCKSTEP_SIMV = ""
|
|
|
|
|
|
|
|
# coverage mode
|
2024-12-07 20:54:51 +00:00
|
|
|
if (args.ccov):
|
2024-12-08 12:50:22 +00:00
|
|
|
COV_OPTIONS = f"-cm line+cond+branch+fsm+tgl -cm_log {wkdir}/coverage.log -cm_dir {wkdir}/coverage"
|
2024-07-03 15:02:38 +00:00
|
|
|
else:
|
|
|
|
COV_OPTIONS = ""
|
|
|
|
|
2024-08-11 20:08:16 +00:00
|
|
|
# Write parameter overrides to a file
|
2024-08-12 00:23:05 +00:00
|
|
|
f = open(os.path.expandvars(wkdir) + "/param_overrides.txt", "w")
|
2024-08-11 20:08:16 +00:00
|
|
|
for param in args.params.split():
|
|
|
|
[param, value] = param.split("=")
|
2024-12-08 12:50:22 +00:00
|
|
|
if fr"\'" in value: # for bit values
|
|
|
|
value = value.replace(rf"\'", "'")
|
2024-08-12 00:40:36 +00:00
|
|
|
else: # for strings
|
2024-12-08 12:50:22 +00:00
|
|
|
value = f'"{value}"'
|
|
|
|
f.write(f"assign {value} {args.tb}/{param}\n")
|
2024-08-11 20:08:16 +00:00
|
|
|
f.close()
|
2024-12-08 12:50:22 +00:00
|
|
|
PARAM_OVERRIDES=f" -parameters {wkdir}/param_overrides.txt "
|
2024-08-11 20:08:16 +00:00
|
|
|
|
2024-07-03 15:02:38 +00:00
|
|
|
# Simulation commands
|
2024-04-03 17:39:02 +00:00
|
|
|
OUTPUT="sim_out"
|
2024-12-08 12:50:22 +00:00
|
|
|
VCS_CMD=f"vcs +lint=all,noGCWM,noUI,noSVA-UA,noIDTS,noNS,noULCO,noCAWM-L,noWMIA-L,noSV-PIU,noSTASKW_CO,noSTASKW_CO1,noSTASKW_RMCOF -suppress +warn -sverilog +vc -Mupdate -line -full64 -lca -ntb_opts sensitive_dyn -top {args.tb} {args.define} {PARAM_OVERRIDES} {INCLUDE_PATH}" # Disabled Debug flags; add them back for a GUI mode -debug_access+all+reverse -kdb +vcs+vcdpluson
|
|
|
|
VCS = f'{VCS_CMD} -Mdir={wkdir} {srcdir}/cvw.sv {LOCKSTEP_OPTIONS} {COV_OPTIONS} {RTL_FILES} -o {wkdir}/{OUTPUT} -work {wkdir} -Mlib={wkdir} -l {logdir}/{args.config}_{args.testsuite}.log'
|
|
|
|
SIMV_CMD= f'wkdir/{OUTPUT} +TEST={args.testsuite} {args.args} -no_save {LOCKSTEP_SIMV}'
|
2024-07-03 15:02:38 +00:00
|
|
|
|
|
|
|
# Run simulation
|
2024-12-08 12:50:22 +00:00
|
|
|
print(f"Executing: {VCS}")
|
2024-07-03 15:02:38 +00:00
|
|
|
subprocess.run(VCS, shell=True)
|
|
|
|
subprocess.run(SIMV_CMD, shell=True)
|
2024-12-07 20:54:51 +00:00
|
|
|
if (args.ccov):
|
2024-12-08 12:50:22 +00:00
|
|
|
COV_RUN = f"urg -dir {wkdir}/coverage.vdb -format text -report IndividualCovReport/{args.config}_{args.testsuite}"
|
2024-07-03 15:02:38 +00:00
|
|
|
subprocess.run(COV_RUN, shell=True)
|