More wally.do simplifications. Use variable expansion to combine multiple variables

This commit is contained in:
Jordan Carlin 2024-08-11 10:44:53 -07:00
parent 413a3fca0e
commit e48d577545
No known key found for this signature in database

View file

@ -1,4 +1,4 @@
# wally-batch.do # wally.do
# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 # SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
# #
# Modification by Oklahoma State University & Harvey Mudd College # Modification by Oklahoma State University & Harvey Mudd College
@ -11,23 +11,36 @@
# Usage: do wally-batch.do <config> <testcases> <testbench> [--ccov] [--fcov] [+acc] [any number of +value] [any number of -G VAR=VAL] # Usage: do wally-batch.do <config> <testcases> <testbench> [--ccov] [--fcov] [+acc] [any number of +value] [any number of -G VAR=VAL]
# Example: do wally-batch.do rv64gc arch64i testbench # Example: do wally-batch.do rv64gc arch64i testbench
# Use this wally-batch.do file to run this example. # Use this wally.do file to run this example.
# Either bring up ModelSim and type the following at the "ModelSim>" prompt: # Either bring up ModelSim and type the following at the "ModelSim>" prompt:
# do wally-batch.do # do wally.do
# or, to run from a shell, type the following at the shell prompt: # or, to run from a shell, type the following at the shell prompt:
# vsim -do wally-batch.do -c # vsim -do wally.do -c
# (omit the "-c" to see the GUI while running from the shell) # (omit the "-c" to see the GUI while running from the shell)
set DEBUG 1 # lcheck - return 1 if value is in list and remove it from list
proc lcheck {listVariable value} {
upvar 1 $listVariable list
set index [lsearch -exact $list $value]
if {$index >= 0} {
set list [lreplace $list $index $index]
return 1
} else {
return 0
}
}
set DEBUG 1
onbreak {resume} onbreak {resume}
onerror {quit -f} onerror {quit -f}
# Initialize variables
set CFG ${1} set CFG ${1}
set TESTSUITE ${2} set TESTSUITE ${2}
set TESTBENCH ${3} set TESTBENCH ${3}
set WKDIR wkdir/${CFG}_${TESTSUITE} set WKDIR wkdir/${CFG}_${TESTSUITE}
set WALLY $::env(WALLY) set WALLY $::env(WALLY)
set IMPERAS_HOME $::env(IMPERAS_HOME)
set CONFIG ${WALLY}/config set CONFIG ${WALLY}/config
set SRC ${WALLY}/src set SRC ${WALLY}/src
set TB ${WALLY}/testbench set TB ${WALLY}/testbench
@ -38,11 +51,8 @@ if [file exists ${WKDIR}] {
vdel -lib ${WKDIR} -all vdel -lib ${WKDIR} -all
} }
vlib ${WKDIR} vlib ${WKDIR}
# Create directory for coverage data
mkdir -p cov
# Create directory for functional coverage data # Create directory for functional coverage data
mkdir -p ${WALLY}/addins/cvw-arch-verif/work mkdir -p ${FCRVVI}
set ccov 0 set ccov 0
set CoverageVoptArg "" set CoverageVoptArg ""
set CoverageVsimArg "" set CoverageVsimArg ""
@ -51,41 +61,22 @@ set FuncCovRVVI 0
set FCdefineRVVI_COVERAGE "" set FCdefineRVVI_COVERAGE ""
set FunctCoverage 0 set FunctCoverage 0
set riscvISACOVsrc "" set FCvlog ""
set FCdefineINCLUDE_TRACE2COV "" set FCvopt ""
set FCdefineCOVER_BASE_RV64I "" set FCdefineCOVER_EXTS {}
set FCdefineCOVER_LEVEL_DV_PR_EXT ""
set FCdefineCOVER_RV64I ""
set FCdefineCOVER_RV64M ""
set FCdefineCOVER_RV64A ""
set FCdefineCOVER_RV64F ""
set FCdefineCOVER_RV64D ""
set FCdefineCOVER_RV64ZICSR ""
set FCdefineCOVER_RV64C ""
set FCdefineIDV_INCLUDE_TRACE2COV ""
set FCTRACE2COV ""
set FCdefineIDV_TRACE2COV ""
set lockstep 0 set lockstep 0
# ok this is annoying. vlog, vopt, and vsim are very picky about how arguments are passed. set lockstepvlog ""
# unforunately it won't allow these to be grouped as one argument per command so they are broken
# apart.
set lockstepvoptstring ""
set SVLib "" set SVLib ""
set SVLibPath ""
set OtherFlags "" set OtherFlags ""
set ImperasPubInc ""
set ImperasPrivInc ""
set rvviFiles ""
set idvFiles ""
set GUI 0 set GUI 0
set accFlag "" set accFlag ""
# Need to be able to pass arguments to vopt. Unforunately argv does not work because # Need to be able to pass arguments to vopt. Unforunately argv does not work because
# it takes on different values if vsim and the do file are called from the command line or # it takes on different values if vsim and the do file are called from the command line or
# if the do file isd called from questa sim directly. This chunk of code uses the $4 through $n # if the do file is called from questa sim directly. This chunk of code uses the $4 through $n
# variables and compacts into a single list for passing to vopt. # variables and compacts into a single list for passing to vopt.
set tbArgs ""
set from 4 set from 4
set step 1 set step 1
set lst {} set lst {}
@ -103,74 +94,55 @@ echo "number of args = $argc"
echo "lst = $lst" echo "lst = $lst"
# if +acc found set flag and remove from list # if +acc found set flag and remove from list
set AccIndex [lsearch -exact $lst "+acc"] if {[lcheck lst "+acc"]} {
if {$AccIndex >= 0} {
set GUI 1 set GUI 1
set accFlag "+acc" set accFlag "+acc"
set lst [lreplace $lst $AccIndex $AccIndex]
} }
# if +coverage found set flag and remove from list # if --ccov found set flag and remove from list
set CoverageIndex [lsearch -exact $lst "--ccov"] if {[lcheck lst "--ccov"]} {
if {$CoverageIndex >= 0} {
set ccov 1 set ccov 1
set CoverageVoptArg "+cover=sbecf" set CoverageVoptArg "+cover=sbecf"
set CoverageVsimArg "-coverage" set CoverageVsimArg "-coverage"
set lst [lreplace $lst $CoverageIndex $CoverageIndex]
} }
set FCoverageIndexRVVI [lsearch -exact $lst "--fcovrvvi"] # if --fcovrvvi found set flag and remove from list
if {$FCoverageIndexRVVI >= 0} { if {[lcheck lst "--fcovrvvi"]} {
set FuncCovRVVI 1 set FuncCovRVVI 1
set FCdefineRVVI_COVERAGE "+define+RVVI_COVERAGE" set FCdefineRVVI_COVERAGE "+define+RVVI_COVERAGE"
set lst [lreplace $lst $FCoverageIndexRVVI $FCoverageIndexRVVI]
} }
# if +coverage found set flag and remove from list # if --fcov found set flag and remove from list
set FunctCoverageIndex [lsearch -exact $lst "--fcov"] if {[lcheck lst "--fcov"]} {
if {$FunctCoverageIndex >= 0} {
set FunctCoverage 1 set FunctCoverage 1
set riscvISACOVsrc +incdir+$env(IMPERAS_HOME)/ImpProprietary/source/host/riscvISACOV/source set FCvlog "+define+INCLUDE_TRACE2COV \
+define+IDV_INCLUDE_TRACE2COV \
set FCdefineINCLUDE_TRACE2COV "+define+INCLUDE_TRACE2COV" +define+COVER_BASE_RV64I \
set FCdefineCOVER_BASE_RV64I "+define+COVER_BASE_RV64I" +define+COVER_LEVEL_DV_PR_EXT \
set FCdefineCOVER_LEVEL_DV_PR_EXT "+define+COVER_LEVEL_DV_PR_EXT" +incdir+${IMPERAS_HOME}/ImpProprietary/source/host/riscvISACOV/source"
set FCvopt "+TRACE2COV_ENABLE=1 +IDV_TRACE2COV=1"
# Uncomment various cover statements below to control which extensions get functional coverage # Uncomment various cover statements below to control which extensions get functional coverage
set FCdefineCOVER_RV64I "+define+COVER_RV64I" lappend FCdefineCOVER_EXTS "+define+COVER_RV64I"
#set FCdefineCOVER_RV64M "+define+COVER_RV64M" #lappend FCdefineCOVER_EXTS "+define+COVER_RV64M"
#set FCdefineCOVER_RV64A "+define+COVER_RV64A" #lappend FCdefineCOVER_EXTS "+define+COVER_RV64A"
#set FCdefineCOVER_RV64F "+define+COVER_RV64F" #lappend FCdefineCOVER_EXTS "+define+COVER_RV64F"
#set FCdefineCOVER_RV64D "+define+COVER_RV64D" #lappend FCdefineCOVER_EXTS "+define+COVER_RV64D"
#set FCdefineCOVER_RV64ZICSR "+define+COVER_RV64ZICSR" #lappend FCdefineCOVER_EXTS "+define+COVER_RV64ZICSR"
#set FCdefineCOVER_RV64C "+define+COVER_RV64C" #lappend FCdefineCOVER_EXTS "+define+COVER_RV64C"
set FCdefineIDV_INCLUDE_TRACE2COV "+define+IDV_INCLUDE_TRACE2COV"
set FCTRACE2COV "+TRACE2COV_ENABLE=1"
set FCdefineIDV_TRACE2COV "+IDV_TRACE2COV=1"
set lst [lreplace $lst $FunctCoverageIndex $FunctCoverageIndex]
}\
set LockStepIndex [lsearch -exact $lst "--lockstep"]
# 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.
if {$LockStepIndex >= 0 || $FunctCoverageIndex >= 0} {
set lockstep 1
# ideally this would all be one or two variables, but questa is having a real hard time
# with this. For now they have to be separate.
set lockstepvoptstring "+define+USE_IMPERAS_DV"
set ImperasPubInc +incdir+$env(IMPERAS_HOME)/ImpPublic/include/host
set ImperasPrivInc +incdir+$env(IMPERAS_HOME)/ImpProprietary/include/host
set rvviFiles $env(IMPERAS_HOME)/ImpPublic/source/host/rvvi/*.sv
set idvFiles $env(IMPERAS_HOME)/ImpProprietary/source/host/idv/*.sv
set SVLib "-sv_lib"
set SVLibPath $env(IMPERAS_HOME)/lib/Linux64/ImperasLib/imperas.com/verification/riscv/1.0/model
#set OtherFlags $::env(OTHERFLAGS) # not working 7/15/24 dh; this should be the way to pass things like --verbose (Issue 871)
if {$LockStepIndex >= 0} {
set lst [lreplace $lst $LockStepIndex $LockStepIndex]
}
} }
# if --lockstep or --fcov found set flag and remove from list
if {[lcheck lst "--lockstep"] || $FunctCoverage == 1} {
set lockstep 1
set lockstepvlog "+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"
set SVLib "-sv_lib ${IMPERAS_HOME}/lib/Linux64/ImperasLib/imperas.com/verification/riscv/1.0/model"
#set OtherFlags $::env(OTHERFLAGS) # not working 7/15/24 dh; this should be the way to pass things like --verbose (Issue 871)
}
# separate the +args from the -G parameters # separate the +args from the -G parameters
foreach otherArg $lst { foreach otherArg $lst {
@ -181,6 +153,7 @@ foreach otherArg $lst {
} }
} }
# Debug print statements
if {$DEBUG > 0} { if {$DEBUG > 0} {
echo "GUI = $GUI" echo "GUI = $GUI"
echo "ccov = $ccov" echo "ccov = $ccov"
@ -192,28 +165,24 @@ if {$DEBUG > 0} {
echo "Extra -args = $ParamArgs" echo "Extra -args = $ParamArgs"
} }
foreach x $PlusArgs {
echo "Element is $x"
}
#quit
# compile source files # compile source files
# suppress spurious warnngs about # suppress spurious warnngs about
# "Extra checking for conflicts with always_comb done at vopt time" # "Extra checking for conflicts with always_comb done at vopt time"
# because vsim will run vopt # because vsim will run vopt
set INC_DIRS "+incdir+${CONFIG}/${CFG} +incdir+${CONFIG}/deriv/${CFG} +incdir+${CONFIG}/shared +incdir+${FCRVVI}/common +incdir+${FCRVVI}"
vlog -lint -work ${WKDIR} +incdir+${CONFIG}/${CFG} +incdir+${CONFIG}/deriv/${CFG} +incdir+${CONFIG}/shared ${lockstepvoptstring} ${FCdefineIDV_INCLUDE_TRACE2COV} ${FCdefineINCLUDE_TRACE2COV} ${ImperasPubInc} ${ImperasPrivInc} ${rvviFiles} ${FCdefineCOVER_BASE_RV64I} ${FCdefineCOVER_LEVEL_DV_PR_EXT} ${FCdefineCOVER_RV64I} ${FCdefineCOVER_RV64M} ${FCdefineCOVER_RV64A} ${FCdefineCOVER_RV64F} ${FCdefineCOVER_RV64D} ${FCdefineCOVER_RV64ZICSR} ${FCdefineCOVER_RV64C} ${FCdefineRVVI_COVERAGE} ${idvFiles} ${riscvISACOVsrc} ${SRC}/cvw.sv ${TB}/${TESTBENCH}.sv ${TB}/common/*.sv ${SRC}/*/*.sv ${SRC}/*/*/*.sv +incdir+${FCRVVI}/common +incdir+${FCRVVI} ${WALLY}/addins/verilog-ethernet/*/*.sv ${WALLY}/addins/verilog-ethernet/*/*/*/*.sv -suppress 2583 -suppress 7063,2596,13286 set SOURCES "${SRC}/cvw.sv ${TB}/${TESTBENCH}.sv ${TB}/common/*.sv ${SRC}/*/*.sv ${SRC}/*/*/*.sv ${WALLY}/addins/verilog-ethernet/*/*.sv ${WALLY}/addins/verilog-ethernet/*/*/*/*.sv"
vlog -lint -work ${WKDIR} {*}${INC_DIRS} {*}${FCvlog} {*}${FCdefineCOVER_EXTS} {*}${lockstepvlog} ${FCdefineRVVI_COVERAGE} {*}${SOURCES} -suppress 2583 -suppress 7063,2596,13286
# start and run simulation # start and run simulation
# remove +acc flag for faster sim during regressions if there is no need to access internal signals # remove +acc flag for faster sim during regressions if there is no need to access internal signals
vopt $accFlag wkdir/${CFG}_${TESTSUITE}.${TESTBENCH} -work ${WKDIR} {*}${ParamArgs} -o testbenchopt ${CoverageVoptArg} vopt $accFlag wkdir/${CFG}_${TESTSUITE}.${TESTBENCH} -work ${WKDIR} {*}${ParamArgs} -o testbenchopt ${CoverageVoptArg}
vsim -lib ${WKDIR} testbenchopt +TEST=${TESTSUITE} {*}${PlusArgs} -fatal 7 ${SVLib} ${SVLibPath} ${OtherFlags} ${FCTRACE2COV} ${FCdefineIDV_TRACE2COV} -suppress 3829 ${CoverageVsimArg} vsim -lib ${WKDIR} testbenchopt +TEST=${TESTSUITE} {*}${PlusArgs} -fatal 7 {*}${SVLib} ${OtherFlags} {*}${FCvopt} -suppress 3829 ${CoverageVsimArg}
# vsim -lib wkdir/work_${1}_${2} testbenchopt -fatal 7 -suppress 3829
# power add generates the logging necessary for said generation. # power add generates the logging necessary for said generation.
# power add -r /dut/core/* # power add -r /dut/core/*
# add waveforms if GUI is enabled
if { ${GUI} } { if { ${GUI} } {
add log -recursive /* add log -recursive /*
if { ${TESTBENCH} eq "testbench_fp" } { if { ${TESTBENCH} eq "testbench_fp" } {
@ -255,4 +224,3 @@ if {$ccov} {
if { ${GUI} == 0} { if { ${GUI} == 0} {
quit quit
} }