mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Merge pull request #816 from ross144/main
Merges support for functional coverage into wally.do and testbench.sv
This commit is contained in:
		
						commit
						44f25186c6
					
				
							
								
								
									
										24
									
								
								bin/wsim
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								bin/wsim
									
									
									
									
									
								
							@ -23,10 +23,12 @@ parser.add_argument("--sim", "-s", help="Simulator", choices=["questa", "verilat
 | 
			
		||||
parser.add_argument("--tb", "-t", help="Testbench", choices=["testbench", "testbench_fp"], default="testbench")
 | 
			
		||||
parser.add_argument("--gui", "-g", help="Simulate with GUI", 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("--args", "-a", help="Optional arguments passed to simulator via $value$plusargs", default="")
 | 
			
		||||
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("--locksteplog", "-b", help="Retired instruction number to be begin logging.", default=0)
 | 
			
		||||
parser.add_argument("--covlog", "-d", help="Log coverage after n instructions.", default=0)
 | 
			
		||||
args = parser.parse_args()
 | 
			
		||||
print("Config=" + args.config + " tests=" + args.testsuite + " sim=" + args.sim + " gui=" + str(args.gui) + " args='" + args.args + "'")
 | 
			
		||||
ElfFile=""
 | 
			
		||||
@ -61,19 +63,31 @@ for d in ["logs", "wkdir", "cov"]:
 | 
			
		||||
 | 
			
		||||
# Launch selected simulator
 | 
			
		||||
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.
 | 
			
		||||
if (args.sim == "questa"):
 | 
			
		||||
    if (args.lockstep):
 | 
			
		||||
        Instret = str(args.locksteplog)
 | 
			
		||||
        prefix ="IMPERAS_TOOLS=" + WALLY + "/sim/imperas.ic OTHERFLAGS=\"+IDV_TRACE2LOG=" + Instret + " +IDV_TRACE2COV=" + Instret + "\" ";
 | 
			
		||||
        suffix = "--lockstep"
 | 
			
		||||
        prefix = "IMPERAS_TOOLS=" + WALLY + "/sim/imperas.ic" # OTHERFLAGS=\"+IDV_TRACE2LOG=" + str(args.locksteplog) + " +IDV_TRACE2COV=" + str(args.covlog) + "\"";
 | 
			
		||||
        if(args.fcov):
 | 
			
		||||
            CovEnableStr = "1" if int(args.covlog) > 0  else "0";
 | 
			
		||||
            #ImperasPlusArgs = "+IDV_TRACE2LOG=" + str(args.locksteplog) + " +IDV_TRACE2COV=" + str(args.covlog) + " +TRACE2COV_ENABLE=" + CovEnableStr;
 | 
			
		||||
            ImperasPlusArgs = " +IDV_TRACE2COV=" + str(args.covlog) + " +TRACE2COV_ENABLE=" + CovEnableStr;
 | 
			
		||||
            suffix = ""
 | 
			
		||||
        else:
 | 
			
		||||
            CovEnableStr = ""
 | 
			
		||||
            ImperasPlusArgs = "";
 | 
			
		||||
            suffix = "--lockstep"
 | 
			
		||||
    else:
 | 
			
		||||
        prefix = ""
 | 
			
		||||
        ImperasPlusArgs = ""
 | 
			
		||||
        suffix = ""
 | 
			
		||||
    if (args.tb == "testbench_fp"):
 | 
			
		||||
            args.args = " -GTEST=\"" + args.testsuite + "\" " + args.args
 | 
			
		||||
    cmd = "do wally.do " + args.config + " " + args.testsuite + " " + args.tb + " " + args.args + " " + ElfFile + " " + suffix
 | 
			
		||||
        args.args = " -GTEST=\"" + args.testsuite + "\" " + args.args
 | 
			
		||||
    cmd = "do wally.do " + args.config + " " + args.testsuite + " " + args.tb + " " + args.args + " " + ElfFile + " " + suffix + " " + ImperasPlusArgs
 | 
			
		||||
    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.tb == "testbench"): 
 | 
			
		||||
            cmd = cd + "; " + prefix + " vsim -do \"" + cmd + " +acc -GDEBUG=1\""
 | 
			
		||||
 | 
			
		||||
@ -29,6 +29,14 @@ vlog +incdir+$env(WALLY)/config/$1 \
 | 
			
		||||
     +incdir+$env(WALLY)/config/shared \
 | 
			
		||||
     +define+USE_IMPERAS_DV \
 | 
			
		||||
     +define+IDV_INCLUDE_TRACE2COV \
 | 
			
		||||
     +define+INCLUDE_TRACE2COV +define+COVER_BASE_RV64I +define+COVER_LEVEL_DV_PR_EXT \
 | 
			
		||||
       +define+COVER_RV64I \
 | 
			
		||||
       +define+COVER_RV64M \
 | 
			
		||||
       +define+COVER_RV64A \
 | 
			
		||||
       +define+COVER_RV64F \
 | 
			
		||||
       +define+COVER_RV64D \
 | 
			
		||||
       +define+COVER_RV64ZICSR \
 | 
			
		||||
       +define+COVER_RV64C \
 | 
			
		||||
     +incdir+$env(IMPERAS_HOME)/ImpPublic/include/host \
 | 
			
		||||
     +incdir+$env(IMPERAS_HOME)/ImpProprietary/include/host \
 | 
			
		||||
     $env(IMPERAS_HOME)/ImpPublic/source/host/rvvi/rvviApiPkg.sv    \
 | 
			
		||||
@ -39,19 +47,11 @@ vlog +incdir+$env(WALLY)/config/$1 \
 | 
			
		||||
     $env(IMPERAS_HOME)/ImpProprietary/source/host/idv/trace2api.sv  \
 | 
			
		||||
     $env(IMPERAS_HOME)/ImpProprietary/source/host/idv/trace2log.sv  \
 | 
			
		||||
     \
 | 
			
		||||
     +define+INCLUDE_TRACE2COV +define+COVER_BASE_RV64I +define+COVER_LEVEL_DV_PR_EXT \
 | 
			
		||||
       +define+COVER_RV64I \
 | 
			
		||||
       +define+COVER_RV64M \
 | 
			
		||||
       +define+COVER_RV64A \
 | 
			
		||||
       +define+COVER_RV64F \
 | 
			
		||||
       +define+COVER_RV64D \
 | 
			
		||||
       +define+COVER_RV64ZICSR \
 | 
			
		||||
       +define+COVER_RV64C \
 | 
			
		||||
     +incdir+$env(IMPERAS_HOME)/ImpProprietary/source/host/riscvISACOV/source \
 | 
			
		||||
     $env(IMPERAS_HOME)/ImpProprietary/source/host/idv/trace2cov.sv  \
 | 
			
		||||
    \
 | 
			
		||||
     $env(WALLY)/src/cvw.sv \
 | 
			
		||||
     $env(WALLY)/testbench/testbench-imperas.sv \
 | 
			
		||||
     $env(WALLY)/testbench/testbench.sv \
 | 
			
		||||
     $env(WALLY)/testbench/common/*.sv   \
 | 
			
		||||
     $env(WALLY)/src/*/*.sv \
 | 
			
		||||
     $env(WALLY)/src/*/*/*.sv \
 | 
			
		||||
@ -61,7 +61,7 @@ vlog +incdir+$env(WALLY)/config/$1 \
 | 
			
		||||
vopt +acc work.testbench -G DEBUG=1 -o workopt 
 | 
			
		||||
eval vsim workopt +nowarn3829  -fatal 7 \
 | 
			
		||||
     -sv_lib $env(IMPERAS_HOME)/lib/Linux64/ImperasLib/imperas.com/verification/riscv/1.0/model \
 | 
			
		||||
     +testDir=$env(TESTDIR) $env(OTHERFLAGS) +TRACE2COV_ENABLE=1
 | 
			
		||||
     +ElfFile=$env(TESTDIR)/ref/ref.elf $env(OTHERFLAGS) +TRACE2COV_ENABLE=1
 | 
			
		||||
 | 
			
		||||
coverage save -onexit $env(WALLY)/sim/questa/riscv.ucdb
 | 
			
		||||
 | 
			
		||||
@ -76,4 +76,4 @@ run -all
 | 
			
		||||
noview $env(WALLY)/testbench/testbench-imperas.sv
 | 
			
		||||
view wave
 | 
			
		||||
 | 
			
		||||
quit -f
 | 
			
		||||
#quit -f
 | 
			
		||||
 | 
			
		||||
@ -44,6 +44,20 @@ set coverage 0
 | 
			
		||||
set CoverageVoptArg ""
 | 
			
		||||
set CoverageVsimArg ""
 | 
			
		||||
 | 
			
		||||
set FunctCoverage 0
 | 
			
		||||
set riscvISACOVsrc ""
 | 
			
		||||
set FCdefineINCLUDE_TRACE2COV ""
 | 
			
		||||
set FCdefineCOVER_BASE_RV64I ""
 | 
			
		||||
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 lockstep 0
 | 
			
		||||
# ok this is annoying. vlog, vopt, and vsim are very picky about how arguments are passed.
 | 
			
		||||
# unforunately it won't allow these to be grouped as one argument per command so they are broken
 | 
			
		||||
@ -51,7 +65,7 @@ set lockstep 0
 | 
			
		||||
set lockstepvoptstring ""
 | 
			
		||||
set SVLib ""
 | 
			
		||||
set SVLibPath ""
 | 
			
		||||
set OtherFlags ""
 | 
			
		||||
#set OtherFlags ""
 | 
			
		||||
set ImperasPubInc ""
 | 
			
		||||
set ImperasPrivInc ""
 | 
			
		||||
set rvviFiles ""
 | 
			
		||||
@ -98,8 +112,31 @@ if {$CoverageIndex >= 0} {
 | 
			
		||||
    set lst [lreplace $lst $CoverageIndex $CoverageIndex]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# if +coverage found set flag and remove from list
 | 
			
		||||
set FunctCoverageIndex [lsearch -exact $lst "--fcov"]
 | 
			
		||||
if {$FunctCoverageIndex >= 0} {
 | 
			
		||||
    set FunctCoverage 1
 | 
			
		||||
    set riscvISACOVsrc +incdir+$env(IMPERAS_HOME)/ImpProprietary/source/host/riscvISACOV/source
 | 
			
		||||
 | 
			
		||||
    set FCdefineINCLUDE_TRACE2COV "+define+INCLUDE_TRACE2COV"
 | 
			
		||||
    set FCdefineCOVER_BASE_RV64I "+define+COVER_BASE_RV64I"
 | 
			
		||||
    set FCdefineCOVER_LEVEL_DV_PR_EXT  "+define+COVER_LEVEL_DV_PR_EXT"
 | 
			
		||||
    set FCdefineCOVER_RV64I "+define+COVER_RV64I"
 | 
			
		||||
    set FCdefineCOVER_RV64M "+define+COVER_RV64M"
 | 
			
		||||
    set FCdefineCOVER_RV64A "+define+COVER_RV64A"
 | 
			
		||||
    set FCdefineCOVER_RV64F "+define+COVER_RV64F"
 | 
			
		||||
    set FCdefineCOVER_RV64D "+define+COVER_RV64D"
 | 
			
		||||
    set FCdefineCOVER_RV64ZICSR "+define+COVER_RV64ZICSR"
 | 
			
		||||
    set FCdefineCOVER_RV64C "+define+COVER_RV64C"
 | 
			
		||||
    set FCdefineIDV_INCLUDE_TRACE2COV "+define+IDV_INCLUDE_TRACE2COV"
 | 
			
		||||
 | 
			
		||||
    set lst [lreplace $lst $FunctCoverageIndex $FunctCoverageIndex]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
set LockStepIndex [lsearch -exact $lst "--lockstep"]
 | 
			
		||||
if {$LockStepIndex >= 0} {
 | 
			
		||||
# 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
 | 
			
		||||
@ -111,9 +148,11 @@ if {$LockStepIndex >= 0} {
 | 
			
		||||
    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)
 | 
			
		||||
    #set OtherFlags $env(OTHERFLAGS)
 | 
			
		||||
 | 
			
		||||
    set lst [lreplace $lst $LockStepIndex $LockStepIndex]
 | 
			
		||||
    if {$LockStepIndex >= 0} {
 | 
			
		||||
        set lst [lreplace $lst $LockStepIndex $LockStepIndex]
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# separate the +args from the -G parameters
 | 
			
		||||
@ -129,23 +168,40 @@ if {$DEBUG > 0} {
 | 
			
		||||
    echo "GUI = $GUI"
 | 
			
		||||
    echo "coverage = $coverage"
 | 
			
		||||
    echo "lockstep = $lockstep"
 | 
			
		||||
    echo "remaining list = \'$lst\'"
 | 
			
		||||
    echo "Extra +args = \'$PlusArgs\'"
 | 
			
		||||
    echo "Extra -args = \'$ParamArgs\'"
 | 
			
		||||
    echo "FunctCoverage = $FunctCoverage"
 | 
			
		||||
    echo "remaining list = $lst"
 | 
			
		||||
    echo "Extra +args = $PlusArgs"
 | 
			
		||||
    echo "Extra -args = $ParamArgs"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
# suppress spurious warnngs about 
 | 
			
		||||
# "Extra checking for conflicts with always_comb done at vopt time"
 | 
			
		||||
# because vsim will run vopt
 | 
			
		||||
 | 
			
		||||
vlog -lint -work ${WKDIR}  +incdir+${CONFIG}/${CFG} +incdir+${CONFIG}/deriv/${CFG} ${lockstepvoptstring} ${ImperasPubInc} ${ImperasPrivInc} +incdir+${CONFIG}/shared ${rvviFiles} ${idvFiles} ${SRC}/cvw.sv ${TB}/${TESTBENCH}.sv ${TB}/common/*.sv  ${SRC}/*/*.sv ${SRC}/*/*/*.sv -suppress 2583 -suppress 7063,2596,13286
 | 
			
		||||
vlog -lint -work ${WKDIR}  +incdir+${CONFIG}/${CFG} +incdir+${CONFIG}/deriv/${CFG} +incdir+${CONFIG}/shared ${lockstepvoptstring} ${FCdefineIDV_INCLUDE_TRACE2COV} ${FCdefineINCLUDE_TRACE2COV} ${ImperasPubInc} ${ImperasPrivInc} ${rvviFiles} ${idvFiles}  ${FCdefineCOVER_BASE_RV64I} ${FCdefineCOVER_LEVEL_DV_PR_EXT} ${FCdefineCOVER_RV64I} ${FCdefineCOVER_RV64M} ${FCdefineCOVER_RV64A} ${FCdefineCOVER_RV64F} ${FCdefineCOVER_RV64D} ${FCdefineCOVER_RV64ZICSR} ${FCdefineCOVER_RV64C}  ${riscvISACOVsrc} ${SRC}/cvw.sv ${TB}/${TESTBENCH}.sv ${TB}/common/*.sv  ${SRC}/*/*.sv ${SRC}/*/*/*.sv -suppress 2583 -suppress 7063,2596,13286
 | 
			
		||||
 | 
			
		||||
# start and run simulation
 | 
			
		||||
# 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}
 | 
			
		||||
 | 
			
		||||
vsim -lib ${WKDIR} testbenchopt +TEST=${TESTSUITE} ${PlusArgs} -fatal 7 ${SVLib} ${SVLibPath} ${OtherFlags} -suppress 3829 ${CoverageVsimArg}
 | 
			
		||||
#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} ${SVLibPath} +IDV_TRACE2COV=1 +TRACE2COV_ENABLE=1 -suppress 3829 ${CoverageVsimArg}
 | 
			
		||||
vsim -lib ${WKDIR} testbenchopt +TEST=${TESTSUITE} $temp0 $temp1 $temp2 $temp3 -fatal 7 ${SVLib} ${SVLibPath} -suppress 3829 ${CoverageVsimArg}
 | 
			
		||||
 | 
			
		||||
#    vsim -lib wkdir/work_${1}_${2} testbenchopt  -fatal 7 -suppress 3829
 | 
			
		||||
# power add generates the logging necessary for said generation.
 | 
			
		||||
@ -162,8 +218,8 @@ if { ${GUI} } {
 | 
			
		||||
run -all
 | 
			
		||||
# power off -r /dut/core/*
 | 
			
		||||
 | 
			
		||||
if {$coverage} {
 | 
			
		||||
    set UCDB cov/${CFG}_${TESTSUITE}.ucdb
 | 
			
		||||
if {$coverage || $FunctCoverage} {
 | 
			
		||||
    set UCDB ${WALLY}/sim/questa/cov/${CFG}_${TESTSUITE}.ucdb
 | 
			
		||||
    echo "Saving coverage to ${UCDB}"
 | 
			
		||||
    do coverage-exclusions-rv64gc.do  # beware: this assumes testing the rv64gc configuration
 | 
			
		||||
    coverage save -instance /testbench/dut/core ${UCDB}
 | 
			
		||||
 | 
			
		||||
@ -149,10 +149,11 @@ module testbench;
 | 
			
		||||
        $display($sformatf("%m @ t=%0t: Expecting RVVI API version %0d.", $time, RVVI_API_VERSION));
 | 
			
		||||
        $fatal;
 | 
			
		||||
      end
 | 
			
		||||
      
 | 
			
		||||
      void'(rvviRefConfigSetString(IDV_CONFIG_MODEL_VENDOR,            "riscv.ovpworld.org"));
 | 
			
		||||
      void'(rvviRefConfigSetString(IDV_CONFIG_MODEL_NAME,              "riscv"));
 | 
			
		||||
      void'(rvviRefConfigSetString(IDV_CONFIG_MODEL_VARIANT,           "RV64GC"));
 | 
			
		||||
      void'(rvviRefConfigSetInt(IDV_CONFIG_MODEL_ADDRESS_BUS_WIDTH,     39));
 | 
			
		||||
      void'(rvviRefConfigSetInt(IDV_CONFIG_MODEL_ADDRESS_BUS_WIDTH,     56));
 | 
			
		||||
      void'(rvviRefConfigSetInt(IDV_CONFIG_MAX_NET_LATENCY_RETIREMENTS, 6));
 | 
			
		||||
 | 
			
		||||
      if (!rvviRefInit(elffilename)) begin
 | 
			
		||||
@ -189,7 +190,7 @@ module testbench;
 | 
			
		||||
      end
 | 
			
		||||
      if (P.SDC_SUPPORTED) begin
 | 
			
		||||
          void'(rvviRefMemorySetVolatile(P.SDC_BASE, (P.SDC_BASE + P.SDC_RANGE)));
 | 
			
		||||
      end      
 | 
			
		||||
      end
 | 
			
		||||
      if (P.SPI_SUPPORTED) begin
 | 
			
		||||
          void'(rvviRefMemorySetVolatile(P.SPI_BASE, (P.SPI_BASE + P.SPI_RANGE)));
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
@ -681,7 +681,7 @@ end
 | 
			
		||||
  wallyTracer #(P) wallyTracer(rvvi);
 | 
			
		||||
 | 
			
		||||
  trace2log idv_trace2log(rvvi);
 | 
			
		||||
  //      trace2cov idv_trace2cov(rvvi);
 | 
			
		||||
  trace2cov idv_trace2cov(rvvi);
 | 
			
		||||
 | 
			
		||||
  // enabling of comparison types
 | 
			
		||||
  trace2api #(.CMP_PC      (1),
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user