Merge pull request #908 from jordancarlin/script_updates

Sim updates + rv64gcCacheSim.py fixed
This commit is contained in:
Rose Thompson 2024-08-30 12:25:44 -07:00 committed by GitHub
commit 6f7d4cde21
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 219 additions and 197 deletions

1
.gitignore vendored
View File

@ -101,6 +101,7 @@ sim/localhistory_m6k10_results_april24.txt
sim/cfi/* sim/cfi/*
sim/branch/* sim/branch/*
sim/covhtmlreport/ sim/covhtmlreport/
sim/*/*Cache.log
# Questa # Questa
sim/questa/logs sim/questa/logs

View File

@ -41,7 +41,6 @@
# Add -d or --dist to report the distribution of loads, stores, and atomic ops. # Add -d or --dist to report the distribution of loads, stores, and atomic ops.
# These distributions may not add up to 100; this is because of flushes or invalidations. # These distributions may not add up to 100; this is because of flushes or invalidations.
import sys
import math import math
import argparse import argparse
import os import os
@ -193,7 +192,7 @@ class Cache:
return self.__str__() return self.__str__()
if __name__ == "__main__": def main():
parser = argparse.ArgumentParser(description="Simulates a L1 cache.") parser = argparse.ArgumentParser(description="Simulates a L1 cache.")
parser.add_argument('numlines', type=int, help="The number of lines per way (a power of 2)", metavar="L") parser.add_argument('numlines', type=int, help="The number of lines per way (a power of 2)", metavar="L")
parser.add_argument('numways', type=int, help="The number of ways (a power of 2)", metavar='W') parser.add_argument('numways', type=int, help="The number of ways (a power of 2)", metavar='W')
@ -207,7 +206,7 @@ if __name__ == "__main__":
args = parser.parse_args() args = parser.parse_args()
cache = Cache(args.numlines, args.numways, args.addrlen, args.taglen) cache = Cache(args.numlines, args.numways, args.addrlen, args.taglen)
extfile = os.path.expanduser(args.file) extfile = os.path.expanduser(args.file)
nofails = True mismatches = 0
if args.perf: if args.perf:
hits = 0 hits = 0
@ -269,7 +268,7 @@ if __name__ == "__main__":
if not result == lninfo[2]: if not result == lninfo[2]:
print("Result mismatch at address", lninfo[0]+ ". Wally:", lninfo[2]+", Sim:", result) print("Result mismatch at address", lninfo[0]+ ". Wally:", lninfo[2]+", Sim:", result)
nofails = False mismatches += 1
if args.dist: if args.dist:
percent_loads = str(round(100*loads/totalops)) percent_loads = str(round(100*loads/totalops))
percent_stores = str(round(100*stores/totalops)) percent_stores = str(round(100*stores/totalops))
@ -280,5 +279,9 @@ if __name__ == "__main__":
ratio = round(hits/misses,3) ratio = round(hits/misses,3)
print("There were", hits, "hits and", misses, "misses. The hit/miss ratio was", str(ratio)+".") print("There were", hits, "hits and", misses, "misses. The hit/miss ratio was", str(ratio)+".")
if nofails: if mismatches == 0:
print("SUCCESS! There were no mismatches between Wally and the sim.") print("SUCCESS! There were no mismatches between Wally and the sim.")
return mismatches
if __name__ == '__main__':
exit(main())

View File

@ -31,6 +31,7 @@ parser.add_argument("--fcov", "-f", help="Functional Coverage, implies lockstep"
parser.add_argument("--fcov2", "-f2", help="Functional Coverage, implies lockstep", action="store_true") parser.add_argument("--fcov2", "-f2", help="Functional Coverage, implies lockstep", action="store_true")
parser.add_argument("--fcovrvvi", "-fr", help="Functional Coverage RVVI", action="store_true") parser.add_argument("--fcovrvvi", "-fr", help="Functional Coverage RVVI", action="store_true")
parser.add_argument("--args", "-a", help="Optional arguments passed to simulator via $value$plusargs", default="") parser.add_argument("--args", "-a", help="Optional arguments passed to simulator via $value$plusargs", default="")
parser.add_argument("--params", "-p", help="Optional top-level parameter overrides of the form param=value", default="")
parser.add_argument("--vcd", "-v", help="Generate testbench.vcd", action="store_true") parser.add_argument("--vcd", "-v", help="Generate testbench.vcd", action="store_true")
parser.add_argument("--lockstep", "-l", help="Run ImperasDV lock, step, and compare.", action="store_true") parser.add_argument("--lockstep", "-l", help="Run ImperasDV lock, step, and compare.", action="store_true")
parser.add_argument("--locksteplog", "-b", help="Retired instruction number to be begin logging.", default=0) parser.add_argument("--locksteplog", "-b", help="Retired instruction number to be begin logging.", default=0)
@ -76,7 +77,10 @@ if (args.vcd):
args.args += " -DMAKEVCD=1" args.args += " -DMAKEVCD=1"
if (args.rvvi): if (args.rvvi):
args.args += " -GRVVI_SYNTH_SUPPORTED=1" args.params += " RVVI_SYNTH_SUPPORTED=1 "
if (args.tb == "testbench_fp"):
args.params += " TEST=\"" + args.testsuite + "\" "
# if lockstep is enabled, then we need to pass the Imperas lockstep arguments # if lockstep is enabled, then we need to pass the Imperas lockstep arguments
if(int(args.locksteplog) >= 1): EnableLog = 1 if(int(args.locksteplog) >= 1): EnableLog = 1
@ -91,10 +95,10 @@ if (args.lockstep):
if(args.locksteplog != 0): ImperasPlusArgs = " +IDV_TRACE2LOG=" + str(EnableLog) + " +IDV_TRACE2LOG_AFTER=" + str(args.locksteplog) if(args.locksteplog != 0): ImperasPlusArgs = " +IDV_TRACE2LOG=" + str(EnableLog) + " +IDV_TRACE2LOG_AFTER=" + str(args.locksteplog)
else: ImperasPlusArgs = "" else: ImperasPlusArgs = ""
if(args.fcov): if(args.fcov):
CovEnableStr = "1" if int(args.covlog) > 0 else "0"; CovEnableStr = "1" if int(args.covlog) > 0 else "0"
if(args.covlog >= 1): EnableLog = 1 if(args.covlog >= 1): EnableLog = 1
else: EnableLog = 0 else: EnableLog = 0
ImperasPlusArgs = " +IDV_TRACE2COV=" + str(EnableLog) + " +TRACE2LOG_AFTER=" + str(args.covlog) + " +TRACE2COV_ENABLE=" + CovEnableStr; ImperasPlusArgs = " +IDV_TRACE2COV=" + str(EnableLog) + " +TRACE2LOG_AFTER=" + str(args.covlog) + " +TRACE2COV_ENABLE=" + CovEnableStr
suffix = "" suffix = ""
if(args.fcov2): if(args.fcov2):
CovEnableStr = "1" if int(args.covlog) > 0 else "0"; CovEnableStr = "1" if int(args.covlog) > 0 else "0";
@ -108,7 +112,8 @@ if (args.lockstep):
else: else:
ImperasPlusArgs = "" ImperasPlusArgs = ""
suffix = "" suffix = ""
flags = suffix + " " + ImperasPlusArgs flags = suffix
args.args += ImperasPlusArgs
# other flags # other flags
@ -133,14 +138,17 @@ cd = "cd $WALLY/sim/" +args.sim
# per-simulator launch # per-simulator launch
if (args.sim == "questa"): if (args.sim == "questa"):
if (args.gui) and (args.tb == "testbench"):
args.params += "DEBUG=1"
if (ElfFile != ""):
args.args += " " + ElfFile
if (args.args != ""):
args.args = " --args \\\"" + args.args + "\\\""
if (args.params != ""):
args.params = " --params \\\"" + args.params + "\\\""
# Questa cannot accept more than 9 arguments. fcov implies lockstep # Questa cannot accept more than 9 arguments. fcov implies lockstep
if (args.tb == "testbench_fp"): cmd = "do wally.do " + args.config + " " + args.testsuite + " " + args.tb + " " + args.args + " " + args.params + " " + flags
args.args = " -GTEST=\"" + args.testsuite + "\" " + args.args
cmd = "do wally.do " + args.config + " " + args.testsuite + " " + args.tb + " " + args.args + " " + ElfFile + " " + flags
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"):
cmd = cd + "; " + prefix + " vsim -do \"" + cmd + " +acc -GDEBUG=1\""
elif(args.tb == "testbench_fp"):
cmd = cd + "; " + prefix + " vsim -do \"" + cmd + " +acc\"" cmd = cd + "; " + prefix + " vsim -do \"" + cmd + " +acc\""
else: # launch Questa in batch mode else: # launch Questa in batch mode
cmd = cd + "; " + prefix + " vsim -c -do \"" + cmd + "\"" cmd = cd + "; " + prefix + " vsim -c -do \"" + cmd + "\""
@ -149,17 +157,23 @@ if (args.sim == "questa"):
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}")
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} PLUS_ARGS=\"{args.args}\" PARAM_ARGS=\"{args.params}\"")
elif (args.sim == "vcs"): elif (args.sim == "vcs"):
print("wsim params: " + args.params)
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" # flags += " --gui"
if (args.args == ""): if (args.args == ""):
vcsargs = "" vcsargs = ""
else: else:
vcsargs = " --args " + args.args vcsargs = " --args \"" + args.args + "\" "
if (args.params == ""):
vcsparams = ""
else:
vcsparams = " --params \"" + args.params + "\" "
print("VCS params: " + vcsparams)
if (ElfFile != ""): if (ElfFile != ""):
ElfFile = " --elffile " + ElfFile ElfFile = " --elffile " + ElfFile
cmd = cd + "; " + prefix + " ./run_vcs " + args.config + " " + args.testsuite + vcsargs + ElfFile + " " + flags cmd = cd + "; " + prefix + " ./run_vcs " + args.config + " " + args.testsuite + " " + " --tb " + args.tb + " " + vcsargs + vcsparams + ElfFile + " " + flags
print(cmd) print(cmd)
os.system(cmd) os.system(cmd)

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
@ -8,26 +8,39 @@
# #
# Takes 1:10 to run RV64IC tests using gui # Takes 1:10 to run RV64IC tests using gui
# Usage: do wally-batch.do <config> <testcases> <testbench> [--ccov] [--fcov] [+acc] [any number of +value] [any number of -G VAR=VAL] # Usage: do wally.do <config> <testcases> <testbench> [--ccov] [--fcov] [+acc] [--args "any number of +value"] [--params "any number of VAR=VAL parameter overrides"]
# Example: do wally-batch.do rv64gc arch64i testbench # Example: do wally.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,10 +51,12 @@ 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 PlusArgs ""
set ParamArgs ""
set ExpandedParamArgs {}
set ccov 0 set ccov 0
set CoverageVoptArg "" set CoverageVoptArg ""
@ -51,47 +66,26 @@ 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 {}
set PlusArgs {}
set ParamArgs {}
for {set i 0} true {incr i} { for {set i 0} true {incr i} {
set x [expr {$i*$step + $from}] set x [expr {$i*$step + $from}]
if {$x > $argc} break if {$x > $argc} break
@ -103,106 +97,94 @@ 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 FunctCoverageIndex2 [lsearch -exact $lst "--fcov2"] }
if {$FunctCoverageIndex2 >= 0} {
# if --fcov2 found set flag and remove from list
if {[lcheck lst "--fcov2"]} {
set FunctCoverage 1 set FunctCoverage 1
set riscvISACOVsrc +incdir+$env(WALLY)/addins/riscvISACOV/source set FCvlog "+define+INCLUDE_TRACE2COV \
+define+IDV_INCLUDE_TRACE2COV \
set FCdefineINCLUDE_TRACE2COV "+define+INCLUDE_TRACE2COV" +define+COVER_BASE_RV32I \
set FCdefineCOVER_BASE_RV64I "+define+COVER_BASE_RV32I" +define+COVER_LEVEL_DV_PR_EXT \
set FCdefineCOVER_LEVEL_DV_PR_EXT "+define+COVER_LEVEL_DV_PR_EXT" +incdir+$env(WALLY)/addins/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_RV32I" lappend FCdefineCOVER_EXTS "+define+COVER_RV32I"
#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 $FunctCoverageIndex2 $FunctCoverageIndex2]
}\
set LockStepIndex [lsearch -exact $lst "--lockstep"] # if --lockstep or --fcov found set flag and remove from list
# ugh. can't have more than 9 arguments passed to vsim. why? I'll have to remove --lockstep when running if {[lcheck lst "--lockstep"] || $FunctCoverage == 1} {
# functional coverage and imply it.
if {$LockStepIndex >= 0 || $FunctCoverageIndex >= 0 || $FunctCoverageIndex2 >= 0} {
set lockstep 1 set lockstep 1
set lockstepvlog "+define+USE_IMPERAS_DV \
# ideally this would all be one or two variables, but questa is having a real hard time +incdir+${IMPERAS_HOME}/ImpPublic/include/host \
# with this. For now they have to be separate. +incdir+${IMPERAS_HOME}/ImpProprietary/include/host \
set lockstepvoptstring "+define+USE_IMPERAS_DV" ${IMPERAS_HOME}/ImpPublic/source/host/rvvi/*.sv \
set ImperasPubInc +incdir+$env(IMPERAS_HOME)/ImpPublic/include/host ${IMPERAS_HOME}/ImpProprietary/source/host/idv/*.sv"
set ImperasPrivInc +incdir+$env(IMPERAS_HOME)/ImpProprietary/include/host set SVLib "-sv_lib ${IMPERAS_HOME}/lib/Linux64/ImperasLib/imperas.com/verification/riscv/1.0/model"
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) #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]
}
} }
# Set PlusArgs passed using the --args flag
# separate the +args from the -G parameters set PlusArgsIndex [lsearch -exact $lst "--args"]
foreach otherArg $lst { if {$PlusArgsIndex >= 0} {
if {[string index $otherArg 0] eq "+"} { set PlusArgs [lindex $lst [expr {$PlusArgsIndex + 1}]]
lappend PlusArgs $otherArg set lst [lreplace $lst $PlusArgsIndex [expr {$PlusArgsIndex + 1}]]
} else {
lappend ParamArgs $otherArg
}
} }
# Set ParamArgs passed using the --params flag and expand into a list of -G<param> arguments
set ParamArgsIndex [lsearch -exact $lst "--params"]
if {$ParamArgsIndex >= 0} {
set ParamArgs [lindex $lst [expr {$ParamArgsIndex + 1}]]
set ParamArgs [regexp -all -inline {\S+} $ParamArgs]
foreach param $ParamArgs {
lappend ExpandedParamArgs -G$param
}
set lst [lreplace $lst $ParamArgsIndex [expr {$ParamArgsIndex + 1}]]
}
# Debug print statements
if {$DEBUG > 0} { if {$DEBUG > 0} {
echo "GUI = $GUI" echo "GUI = $GUI"
echo "ccov = $ccov" echo "ccov = $ccov"
@ -211,41 +193,27 @@ if {$DEBUG > 0} {
echo "FunctCoverage = $FunctCoverage" echo "FunctCoverage = $FunctCoverage"
echo "remaining list = $lst" echo "remaining list = $lst"
echo "Extra +args = $PlusArgs" echo "Extra +args = $PlusArgs"
echo "Extra -args = $ParamArgs" echo "Extra -args = $ExpandedParamArgs"
} }
foreach x $PlusArgs {
echo "Element is $x"
}
# need a better solution this is really ugly
# Questa really don't like passing $PlusArgs on the command line to vsim. It treats the whole things
# as one string rather than mutliple separate +args. Is there an automated way to pass these?
set temp0 [lindex $PlusArgs 0]
set temp1 [lindex $PlusArgs 1]
set temp2 [lindex $PlusArgs 2]
set temp3 [lindex $PlusArgs 3]
#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 +nowarnRDGN -suppress 2244 -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 2244 -suppress 2282 -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 +nowarnRDGN -work ${WKDIR} {*}${INC_DIRS} {*}${FCvlog} {*}${FCdefineCOVER_EXTS} {*}${lockstepvlog} ${FCdefineRVVI_COVERAGE} {*}${SOURCES} -suppress 2244 -suppress 2282 -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} {*}${ExpandedParamArgs} -o testbenchopt ${CoverageVoptArg}
#vsim -lib ${WKDIR} testbenchopt +TEST=${TESTSUITE} ${PlusArgs} -fatal 7 ${SVLib} ${SVLibPath} ${OtherFlags} +TRACE2COV_ENABLE=1 -suppress 3829 ${CoverageVsimArg} vsim -lib ${WKDIR} testbenchopt +TEST=${TESTSUITE} {*}${PlusArgs} -fatal 7 {*}${SVLib} ${OtherFlags} {*}${FCvopt} -suppress 3829 ${CoverageVsimArg}
#vsim -lib ${WKDIR} testbenchopt +TEST=${TESTSUITE} ${PlusArgs} -fatal 7 ${SVLib} ${SVLibPath} +IDV_TRACE2COV=1 +TRACE2COV_ENABLE=1 -suppress 3829 ${CoverageVsimArg}
vsim -lib ${WKDIR} testbenchopt +TEST=${TESTSUITE} $temp0 $temp1 $temp2 $temp3 -fatal 7 ${SVLib} ${SVLibPath} ${OtherFlags} ${FCTRACE2COV} ${FCdefineIDV_TRACE2COV} -suppress 3829 ${CoverageVsimArg}
# vsim -lib wkdir/work_${1}_${2} testbenchopt -fatal 7 -suppress 3829
# power add generates the logging necessary for saif generation. # power add generates the logging necessary for saif 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" } {
@ -287,4 +255,3 @@ if {$ccov} {
if { ${GUI} == 0} { if { ${GUI} == 0} {
quit quit
} }

View File

@ -6,6 +6,7 @@
## Written: lserafini@hmc.edu ## Written: lserafini@hmc.edu
## Created: 11 April 2023 ## Created: 11 April 2023
## Modified: 12 April 2023 ## Modified: 12 April 2023
## Modified: 10 August 2023, jcarlin@hmc.edu
## ##
## Purpose: Run the cache simulator on each rv64gc test suite in turn. ## Purpose: Run the cache simulator on each rv64gc test suite in turn.
## ##
@ -27,9 +28,9 @@
## either express or implied. See the License for the specific language governing permissions ## either express or implied. See the License for the specific language governing permissions
## and limitations under the License. ## and limitations under the License.
################################################################################################ ################################################################################################
import sys
import os import os
import argparse import argparse
import subprocess
# NOTE: make sure testbench.sv has the ICache and DCache loggers enabled! # NOTE: make sure testbench.sv has the ICache and DCache loggers enabled!
# This does not check the test output for correctness, run regression for that. # This does not check the test output for correctness, run regression for that.
@ -48,26 +49,26 @@ class bcolors:
BOLD = '\033[1m' BOLD = '\033[1m'
UNDERLINE = '\033[4m' UNDERLINE = '\033[4m'
# tests64gc = ["coverage64gc", "arch64f", "arch64d", "arch64i", "arch64priv", "arch64c", "arch64m", tests64gc = ["coverage64gc", "arch64i", "arch64priv", "arch64c", "arch64m", "arch64zcb",
tests64gc = ["coverage64gc", "arch64i", "arch64priv", "arch64c", "arch64m", "arch64zifencei", "arch64zicond", "arch64a_amo", "wally64a_lrsc", "wally64periph", "wally64priv",
"arch64zi", "wally64a", "wally64periph", "wally64priv", "arch64zbkb", "arch64zbkc", "arch64zbkx", "arch64zknd", "arch64zkne", "arch64zknh",
"arch64zba", "arch64zbb", "arch64zbc", "arch64zbs", "arch64zba", "arch64zbb", "arch64zbc", "arch64zbs"]
"imperas64f", "imperas64d", "imperas64c", "imperas64i"]
# arch64i is the most interesting case. Uncomment line below to run just that case # arch64i is the most interesting case. Uncomment line below to run just that case
tests64gc = ["arch64i"] # tests64gc = ["arch64i"]
cachetypes = ["ICache", "DCache"] cachetypes = ["ICache", "DCache"]
simdir = os.path.expanduser("~/cvw/sim") simdir = os.path.expandvars("$WALLY/sim")
if __name__ == '__main__': def main():
parser = argparse.ArgumentParser(description="Runs the cache simulator on all rv64gc test suites") parser = argparse.ArgumentParser(description="Runs the cache simulator on all rv64gc test suites")
parser.add_argument('-p', "--perf", action='store_true', help="Report hit/miss ratio") parser.add_argument('-p', "--perf", action='store_true', help="Report hit/miss ratio")
parser.add_argument('-d', "--dist", action='store_true', help="Report distribution of operations") parser.add_argument('-d', "--dist", action='store_true', help="Report distribution of operations")
parser.add_argument('-s', "--sim", help="Simulator", choices=["questa", "verilator", "vcs"], default="verilator")
args = parser.parse_args() args = parser.parse_args()
simargs = "I_CACHE_ADDR_LOGGER=1\\\'b1 D_CACHE_ADDR_LOGGER=1\\\'b1"
testcmd = "vsim -do \"do wally-batch.do rv64gc {}\" -c > /dev/null" testcmd = "wsim --sim " + args.sim + " rv64gc {} --params \"" + simargs + "\" > /dev/null"
cachecmd = "CacheSim.py 64 4 56 44 -f {}" cachecmd = "CacheSim.py 64 4 56 44 -f {}"
mismatches = 0
if args.perf: if args.perf:
cachecmd += " -p" cachecmd += " -p"
@ -76,8 +77,18 @@ if __name__ == '__main__':
for test in tests64gc: for test in tests64gc:
print(f"{bcolors.HEADER}Commencing test", test+f":{bcolors.ENDC}") print(f"{bcolors.HEADER}Commencing test", test+f":{bcolors.ENDC}")
# remove wkdir to force recompile with logging enabled
os.system("rm -rf " + simdir + "/" + args.sim + "/wkdir/rv64gc_" + test)
os.system("rm -rf " + simdir + "/" + args.sim + "/*Cache.log")
print(testcmd.format(test))
os.system(testcmd.format(test)) os.system(testcmd.format(test))
for cache in cachetypes: for cache in cachetypes:
print(f"{bcolors.OKCYAN}Running the", cache, f"simulator.{bcolors.ENDC}") print(f"{bcolors.OKCYAN}Running the", cache, f"simulator.{bcolors.ENDC}")
os.system(cachecmd.format(cache+".log")) result = subprocess.run(cachecmd.format(args.sim+"/"+cache+".log"), shell=True)
mismatches += result.returncode
print() print()
return mismatches
if __name__ == '__main__':
exit(main())

View File

@ -23,10 +23,12 @@ def runfindcmd(cmd):
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("config", help="Configuration file") 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("testsuite", help="Test suite (or none, when running a single ELF file) ")
parser.add_argument("--tb", "-t", help="Testbench", choices=["testbench", "testbench_fp"], default="testbench")
parser.add_argument("--elffile", "-e", help="ELF file name", default="") 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("--coverage", "-c", help="Code & Functional Coverage", action="store_true")
parser.add_argument("--fcov", "-f", 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("--args", "-a", help="Optional arguments passed to simulator via $value$plusargs", default="")
parser.add_argument("--params", "-p", help="Optional top-level parameter overrides of the form param=value", default="")
parser.add_argument("--lockstep", "-l", help="Run ImperasDV lock, step, and compare.", action="store_true") parser.add_argument("--lockstep", "-l", help="Run ImperasDV lock, step, and compare.", action="store_true")
# GUI not yet implemented # GUI not yet implemented
#parser.add_argument("--gui", "-g", help="Simulate with GUI", action="store_true") #parser.add_argument("--gui", "-g", help="Simulate with GUI", action="store_true")
@ -49,7 +51,8 @@ rtlsrc_cmd = "find " + srcdir + ' -name "*.sv" ! -path "' + srcdir + '/generic/m
rtlsrc_files = runfindcmd(rtlsrc_cmd) rtlsrc_files = runfindcmd(rtlsrc_cmd)
tbcommon_cmd = 'find ' + tbdir+'/common -name "*.sv" ! -path "' + tbdir+'/common/wallyTracer.sv"' tbcommon_cmd = 'find ' + tbdir+'/common -name "*.sv" ! -path "' + tbdir+'/common/wallyTracer.sv"'
tbcommon_files = runfindcmd(tbcommon_cmd) tbcommon_files = runfindcmd(tbcommon_cmd)
RTL_FILES = tbdir+'/testbench.sv ' + str(rtlsrc_files) + ' ' + str(tbcommon_files) tb_file = tbdir + "/" + args.tb + ".sv"
RTL_FILES = tb_file + ' ' + str(rtlsrc_files) + ' ' + str(tbcommon_files)
# Include directories # Include directories
INCLUDE_PATH="+incdir+" + cfgdir + "/" + args.config + " +incdir+" + cfgdir + "/deriv/" + args.config + " +incdir+" + cfgdir + "/shared +incdir+$WALLY/tests +incdir+" + tbdir + " +incdir+" + srcdir INCLUDE_PATH="+incdir+" + cfgdir + "/" + args.config + " +incdir+" + cfgdir + "/deriv/" + args.config + " +incdir+" + cfgdir + "/shared +incdir+$WALLY/tests +incdir+" + tbdir + " +incdir+" + srcdir
@ -68,10 +71,23 @@ if (args.coverage):
else: else:
COV_OPTIONS = "" COV_OPTIONS = ""
# Write parameter overrides to a file
f = open(os.path.expandvars(wkdir) + "/param_overrides.txt", "w")
for param in args.params.split():
[param, value] = param.split("=")
if "\\'" in value: # for bit values
value = value.replace("\\'", "'")
else: # for strings
value = "\"" + value + "\""
# print("param=" + param + " value=" + value)
f.write("assign " + value + " " + args.tb + "/" + param + "\n")
f.close()
PARAM_OVERRIDES=" -parameters " + wkdir + "/param_overrides.txt "
# Simulation commands # Simulation commands
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 -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_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 " + "-top " + args.tb + PARAM_OVERRIDES + 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" 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 SIMV_CMD= wkdir + "/" + OUTPUT + " +TEST=" + args.testsuite + " " + args.elffile + " " + args.args + " -no_save " + LOCKSTEP_SIMV
# Run simulation # Run simulation
@ -81,4 +97,3 @@ subprocess.run(SIMV_CMD, shell=True)
if (args.coverage): if (args.coverage):
COV_RUN = "urg -dir " + wkdir + "/coverage.vdb -format text -report IndividualCovReport/" + args.config + "_" + args.testsuite COV_RUN = "urg -dir " + wkdir + "/coverage.vdb -format text -report IndividualCovReport/" + args.config + "_" + args.testsuite
subprocess.run(COV_RUN, shell=True) subprocess.run(COV_RUN, shell=True)

View File

@ -7,12 +7,13 @@ SHELL := /bin/bash
# verilator configurations # verilator configurations
OPT= OPT=
PARAMS?=-DVERILATOR=1 --no-trace-top PARAMS?=--no-trace-top
NONPROF?=--stats NONPROF?=--stats
VERILATOR_DIR=${WALLY}/sim/verilator VERILATOR_DIR=${WALLY}/sim/verilator
SOURCE=${WALLY}/config/shared/*.vh ${WALLY}/config/${WALLYCONF} ${WALLY}/config/deriv/${WALLYCONF} ${WALLY}/src/cvw.sv ${WALLY}/testbench/*.sv ${WALLY}/testbench/common/*.sv ${WALLY}/src/*/*.sv ${WALLY}/src/*/*/*.sv SOURCE=${WALLY}/config/shared/*.vh ${WALLY}/config/${WALLYCONF} ${WALLY}/config/deriv/${WALLYCONF} ${WALLY}/src/cvw.sv ${WALLY}/testbench/*.sv ${WALLY}/testbench/common/*.sv ${WALLY}/src/*/*.sv ${WALLY}/src/*/*/*.sv
EXTRA_ARGS= PLUS_ARGS=
PARAM_ARGS=
EXPANDED_PARAM_ARGS:=$(patsubst %,-G%,$(PARAM_ARGS))
WALLYCONF?=rv64gc WALLYCONF?=rv64gc
TEST?=arch64i TEST?=arch64i
@ -32,11 +33,9 @@ DEPENDENCIES=${WALLY}/config/shared/*.vh $(SOURCES)
# regular testbench requires a wrapper defining getenvval # regular testbench requires a wrapper defining getenvval
ifeq ($(TESTBENCH), testbench) ifeq ($(TESTBENCH), testbench)
WRAPPER=${WALLY}/sim/verilator/wrapper.c WRAPPER=${WALLY}/sim/verilator/wrapper.c
GTEST=
ARGTEST=+TEST=$(TEST) ARGTEST=+TEST=$(TEST)
else else
WRAPPER= WRAPPER=
GTEST=-GTEST="\"${TEST}\""
ARGTEST= ARGTEST=
endif endif
@ -44,7 +43,7 @@ default: run
run: wkdir/$(WALLYCONF)_$(TEST)/V${TESTBENCH} run: wkdir/$(WALLYCONF)_$(TEST)/V${TESTBENCH}
mkdir -p $(VERILATOR_DIR)/logs mkdir -p $(VERILATOR_DIR)/logs
wkdir/$(WALLYCONF)_$(TEST)/V${TESTBENCH} ${ARGTEST} $(EXTRA_ARGS) wkdir/$(WALLYCONF)_$(TEST)/V${TESTBENCH} ${ARGTEST} $(PLUS_ARGS)
profile: obj_dir_profiling/V${TESTBENCH}_$(WALLYCONF) profile: obj_dir_profiling/V${TESTBENCH}_$(WALLYCONF)
$(VERILATOR_DIR)/obj_dir_profiling/V${TESTBENCH}_$(WALLYCONF) ${ARGTEST} $(VERILATOR_DIR)/obj_dir_profiling/V${TESTBENCH}_$(WALLYCONF) ${ARGTEST}
@ -64,7 +63,7 @@ wkdir/$(WALLYCONF)_$(TEST)/V${TESTBENCH}: $(DEPENDENCIES)
--top-module ${TESTBENCH} --relative-includes \ --top-module ${TESTBENCH} --relative-includes \
$(INCLUDE_PATH) \ $(INCLUDE_PATH) \
${WRAPPER} \ ${WRAPPER} \
${GTEST} \ ${EXPANDED_PARAM_ARGS} \
$(SOURCES) $(SOURCES)
obj_dir_profiling/V${TESTBENCH}_$(WALLYCONF): $(DEPENDENCIES) obj_dir_profiling/V${TESTBENCH}_$(WALLYCONF): $(DEPENDENCIES)
@ -76,7 +75,7 @@ obj_dir_profiling/V${TESTBENCH}_$(WALLYCONF): $(DEPENDENCIES)
--top-module ${TESTBENCH} --relative-includes \ --top-module ${TESTBENCH} --relative-includes \
$(INCLUDE_PATH) \ $(INCLUDE_PATH) \
${WRAPPER} \ ${WRAPPER} \
${GTEST} \ ${EXPANDED_PARAM_ARGS} \
$(SOURCES) $(SOURCES)
clean: clean:

View File

@ -637,7 +637,11 @@ module testbench_fp;
// check if nothing is being tested // check if nothing is being tested
if (Tests.size() == 0) begin if (Tests.size() == 0) begin
$display("TEST %s not supported in this configuration", TEST); $display("TEST %s not supported in this configuration", TEST);
$stop; `ifdef QUESTA
$stop; // if this is changed to $finish for Questa, wally.do terminates without allowing GUI debug
`else
$finish;
`endif
end end
end end
@ -987,7 +991,11 @@ module testbench_fp;
X[P.FLEN-1:0], Y[P.FLEN-1:0], Z[P.FLEN-1:0], SrcA, Res[P.FLEN-1:0], ResFlg, Ans[P.FLEN-1:0], AnsFlg); X[P.FLEN-1:0], Y[P.FLEN-1:0], Z[P.FLEN-1:0], SrcA, Res[P.FLEN-1:0], ResFlg, Ans[P.FLEN-1:0], AnsFlg);
//$display(" fma.Xs %h Xe %h Xm %h Ys %h Ye %h Ym %h Ss %h Se %h Sm %h", fma.Xs, fma.Xe, fma.Xm, fma.Ys, fma.Ye, fma.Ym, fma.Ss, fma.Se, fma.Sm); //$display(" fma.Xs %h Xe %h Xm %h Ys %h Ye %h Ym %h Ss %h Se %h Sm %h", fma.Xs, fma.Xe, fma.Xm, fma.Ys, fma.Ye, fma.Ym, fma.Ss, fma.Se, fma.Sm);
//$display(" readvectors.unpack.X %h Xs %h Xe %h Xm %h", readvectors.unpack.X, readvectors.unpack.Xs, readvectors.unpack.Xe, readvectors.unpack.Xm); //$display(" readvectors.unpack.X %h Xs %h Xe %h Xm %h", readvectors.unpack.X, readvectors.unpack.Xs, readvectors.unpack.Xe, readvectors.unpack.Xm);
$stop; `ifdef QUESTA
$stop; // if this is changed to $finish for Questa, wally.do terminates without allowing GUI debug
`else
$finish;
`endif
end end
if (TestVectors[VectorNum] == '1 & Tests[TestNum] !== "") begin // if reached the eof if (TestVectors[VectorNum] == '1 & Tests[TestNum] !== "") begin // if reached the eof
@ -1013,7 +1021,11 @@ module testbench_fp;
// if no more Tests - finish // if no more Tests - finish
if (Tests[TestNum] === "") begin if (Tests[TestNum] === "") begin
$display("\nAll Tests completed with %d errors\n", errors); $display("\nAll Tests completed with %d errors\n", errors);
$stop; `ifdef QUESTA
$stop; // if this is changed to $finish for Questa, wally.do terminates without allowing GUI debug
`else
$finish;
`endif
end end
$display("Running %s vectors", Tests[TestNum]); $display("Running %s vectors", Tests[TestNum]);
end end