mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			85 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env python3
 | 
						|
 | 
						|
# run_vcs
 | 
						|
# David_Harris@hmc.edu 2 July 2024
 | 
						|
# Run VCS on a given file, passing appropriate flags
 | 
						|
# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
 | 
						|
 | 
						|
 | 
						|
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) ")
 | 
						|
parser.add_argument("--elffile", "-e", help="ELF file name", default="")
 | 
						|
parser.add_argument("--coverage", "-c", help="Code & Functional Coverage", action="store_true")
 | 
						|
parser.add_argument("--fcov", "-f", help="Code & Functional Coverage", action="store_true")
 | 
						|
parser.add_argument("--args", "-a", help="Optional arguments passed to simulator via $value$plusargs", default="")
 | 
						|
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()
 | 
						|
print("run_vcs Config=" + args.config + " tests=" + args.testsuite + " elffile=" + args.elffile + " lockstep=" + str(args.lockstep) + " args='" + args.args + "'")
 | 
						|
 | 
						|
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"
 | 
						|
 | 
						|
os.system("mkdir -p " + wkdir)
 | 
						|
os.system("mkdir -p " + covdir)
 | 
						|
os.system("mkdir -p " + logdir)
 | 
						|
 | 
						|
# Find RTL source files
 | 
						|
rtlsrc_cmd = "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"'
 | 
						|
rtlsrc_files = runfindcmd(rtlsrc_cmd)
 | 
						|
tbcommon_cmd = 'find ' + tbdir+'/common -name "*.sv" ! -path "' + tbdir+'/common/wallyTracer.sv"'
 | 
						|
tbcommon_files = runfindcmd(tbcommon_cmd)
 | 
						|
RTL_FILES = tbdir+'/testbench.sv ' + str(rtlsrc_files) + ' '  + str(tbcommon_files)
 | 
						|
 | 
						|
# Include directories
 | 
						|
INCLUDE_PATH="+incdir+" + cfgdir + "/" + args.config + " +incdir+" + cfgdir + "/deriv/" + args.config + " +incdir+" + cfgdir + "/shared +incdir+$WALLY/tests +incdir+" + tbdir + " +incdir+" + srcdir
 | 
						|
 | 
						|
# lockstep mode
 | 
						|
if (args.lockstep):
 | 
						|
    LOCKSTEP_OPTIONS = " +define+USE_IMPERAS_DV +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"
 | 
						|
    LOCKSTEP_SIMV = "-sv_lib $IMPERAS_HOME/lib/Linux64/ImperasLib/imperas.com/verification/riscv/1.0/model"
 | 
						|
else:
 | 
						|
    LOCKSTEP_OPTIONS = ""
 | 
						|
    LOCKSTEP_SIMV = ""
 | 
						|
 | 
						|
# coverage mode
 | 
						|
if (args.coverage):
 | 
						|
    COV_OPTIONS = "-cm line+cond+branch+fsm+tgl -cm_log " + wkdir + "/coverage.log -cm_dir " + wkdir + "/coverage"
 | 
						|
else:
 | 
						|
    COV_OPTIONS = ""
 | 
						|
 | 
						|
# Simulation 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 -suppress +warn -sverilog +vc -Mupdate -line -full64 -lca -ntb_opts sensitive_dyn " + INCLUDE_PATH # Disabled Debug flags; add them back for a GUI mode -debug_access+all+reverse  -kdb +vcs+vcdpluson 
 | 
						|
VCS = 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= wkdir + "/" + OUTPUT + " +TEST=" + args.testsuite + " " + args.elffile + " " + args.args + " -no_save " + LOCKSTEP_SIMV 
 | 
						|
 | 
						|
# Run simulation
 | 
						|
print("Executing: " + str(VCS) )
 | 
						|
subprocess.run(VCS, shell=True)
 | 
						|
subprocess.run(SIMV_CMD, shell=True)
 | 
						|
if (args.coverage):
 | 
						|
    COV_RUN = "urg -dir " + wkdir + "/coverage.vdb -format text -report IndividualCovReport/" + args.config + "_" + args.testsuite
 | 
						|
    subprocess.run(COV_RUN, shell=True)
 | 
						|
 |