From 38b0c10f9b06c7a81e27591ac6d7a863197448cb Mon Sep 17 00:00:00 2001 From: David Harris Date: Tue, 2 Jul 2024 04:47:53 -0700 Subject: [PATCH 1/7] Updated wallyTracer to be compatible with VCS --- testbench/common/wallyTracer.sv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testbench/common/wallyTracer.sv b/testbench/common/wallyTracer.sv index de4692a36..8c72a6816 100644 --- a/testbench/common/wallyTracer.sv +++ b/testbench/common/wallyTracer.sv @@ -56,8 +56,8 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi); logic [`NUM_REGS-1:0] frf_wb; logic [4:0] frf_a4; logic frf_we4; - logic [P.XLEN-1:0] CSRArray [logic[11:0]]; - logic [P.XLEN-1:0] CSRArrayOld [logic[11:0]]; + logic [P.XLEN-1:0] CSRArray [4095:0]; + logic [P.XLEN-1:0] CSRArrayOld [4095:0]; logic [`NUM_CSRS-1:0] CSR_W; logic CSRWriteM, CSRWriteW; logic [11:0] CSRAdrM, CSRAdrW; From a0729d074b76d3675cb2b92888427574bd5a046e Mon Sep 17 00:00:00 2001 From: David Harris Date: Tue, 2 Jul 2024 14:20:40 -0700 Subject: [PATCH 2/7] regression --nightly --buildroot runs buildroot boot in Verilator all the way to login prompt and checks success --- bin/nightly_build.py | 2 +- bin/regression-wally | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/bin/nightly_build.py b/bin/nightly_build.py index d82877a7a..08052ffe1 100755 --- a/bin/nightly_build.py +++ b/bin/nightly_build.py @@ -692,7 +692,7 @@ def main(): # Define tests that we can run if (args.tests == "nightly"): - test_list = [["python", "regression-wally", "--nightly"]] + test_list = [["python", "regression-wally", "--nightly --buildroot"]] elif (args.tests == "test"): test_list = [["python", "regression-wally", ""]] elif (args.tests == "test_lint"): diff --git a/bin/regression-wally b/bin/regression-wally index ed725b51a..4842a15d5 100755 --- a/bin/regression-wally +++ b/bin/regression-wally @@ -170,7 +170,7 @@ derivconfigtests = [ ["fh_rv64gc", ["arch64f", "arch64f_divsqrt", "arch64f_fma", "arch64zfh", "arch64zfh_divsqrt", "arch64zfaf"]], ["fdh_rv64gc", ["arch64f", "arch64f_divsqrt", "arch64f_fma", "arch64d", "arch64d_divsqrt", "arch64d_fma", "arch64zfh", "arch64zfh_divsqrt", "arch64zfaf", "arch64zfad"]], ["fdq_rv64gc", ["arch64f", "arch64f_divsqrt", "arch64f_fma", "arch64d", "arch64d_divsqrt", "arch64d_fma", "arch64i", "arch64zfaf", "arch64zfad"]], - ["fdqh_rv64gc", ["arch64f", "arch64f_divsqrt", "arch64f_fma", "arch64d", "arch64d_divsqrt", "arch64d_fma", "arch64zfh", "arch64zfh_divsqrt", "arch64i", "wally64q", "arch64zfaf", "arch64zfad"]], + ["fdqh_rv64gc", ["arch64f", "arch64f_divsqrt", "arch64f_fma", "arch64d", "arch64d_divsqrt", "arch64d_fma", "arch64zfh", "arch64zfh_divsqrt", "arch64i", "arch64zfaf", "arch64zfad"]], # "wally64q" when Q is supported again in riscof config file ] bpredtests = [ @@ -312,7 +312,6 @@ regressionDir = WALLY + '/sim' os.chdir(regressionDir) coveragesim = "questa" # Questa is required for code/functional coverage -#defaultsim = "vcs" # Default simulator for all other tests; change to Verilator when flow is ready #defaultsim = "questa" # Default simulator for all other tests; change to Verilator when flow is ready defaultsim = "verilator" # Default simulator for all other tests @@ -320,6 +319,7 @@ coverage = '--coverage' in sys.argv fp = '--fp' in sys.argv nightly = '--nightly' in sys.argv testfloat = '--testfloat' in sys.argv +buildroot = '--buildroot' in sys.argv if (nightly): nightMode = "--nightly"; @@ -345,22 +345,27 @@ configs = [ grepfile = WALLY + "/sim/verilator/logs/all_lints.log") ] +# run full buildroot boot simulation (slow) if buildroot flag is set. Start it early to overlap with other tests +if (buildroot): + addTests(tests_buildrootboot, defaultsim) + if (coverage): # only run RV64GC tests on Questa in coverage mode addTests(tests64gc_nofp, "questa") if (fp): addTests(tests64gc_fp, "questa") else: for sim in sims: - addTests(tests_buildrootshort, sim) + if (not (buildroot and sim == defaultsim)): # skip shot buildroot sim if running long one + addTests(tests_buildrootshort, sim) addTests(tests, sim) addTests(tests64gc_nofp, sim) addTests(tests64gc_fp, sim) - # run derivative configurations in nightly regression +# run derivative configurations in nightly regression if (nightly): -# addTests(tests_buildrootboot, defaultsim) addTests(derivconfigtests, defaultsim) + # testfloat tests if (testfloat): # for testfloat alone, just run testfloat tests configs = [] From e72c8b8e09f35f42edf16e1364077e32fa4ce625 Mon Sep 17 00:00:00 2001 From: David Harris Date: Tue, 2 Jul 2024 14:22:51 -0700 Subject: [PATCH 3/7] Watchdog timeout on buildroot boot is a halting criteria --- testbench/common/watchdog.sv | 14 ++++++++++---- testbench/testbench.sv | 5 ++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/testbench/common/watchdog.sv b/testbench/common/watchdog.sv index 296900b20..69b185c40 100644 --- a/testbench/common/watchdog.sv +++ b/testbench/common/watchdog.sv @@ -26,7 +26,8 @@ module watchdog #(parameter XLEN, WatchDogTimerThreshold) (input clk, - input reset + input reset, + string TEST ); // check for hang up. @@ -46,9 +47,14 @@ module watchdog #(parameter XLEN, WatchDogTimerThreshold) always_comb begin WatchDogTimeOut = WatchDogTimerCount >= WatchDogTimerThreshold; if(WatchDogTimeOut) begin - $display("FAILURE: Watch Dog Time Out triggered. PCW stuck at %x for more than %d cycles", PCW, WatchDogTimerCount); - $stop; - end + if (TEST == "buildroot") $display("Watch Dog Time Out triggered. This is a normal termination for a full buildroot boot. Check sim//logs/buildroot_uart.log to check if the boot printed the login prompt."); + else $display("FAILURE: Watch Dog Time Out triggered. PCW stuck at %x for more than %d cycles", PCW, WatchDogTimerCount); + `ifdef QUESTA + $stop; // if this is changed to $finish for Questa, wally-batch.do does not go to the next step to run coverage, and wally.do terminates without allowing GUI debug + `else + $finish; + `endif + end end endmodule diff --git a/testbench/testbench.sv b/testbench/testbench.sv index be0422550..f6087da1b 100644 --- a/testbench/testbench.sv +++ b/testbench/testbench.sv @@ -118,10 +118,9 @@ module testbench; TEST = "none"; if (!$value$plusargs("ElfFile=%s", ElfFile)) ElfFile = "none"; - else begin - end if (!$value$plusargs("INSTR_LIMIT=%d", INSTR_LIMIT)) INSTR_LIMIT = 0; + //$display("TEST = %s ElfFile = %s", TEST, ElfFile); // pick tests based on modes supported //tests = '{}; @@ -613,7 +612,7 @@ module testbench; InstrFName, InstrDName, InstrEName, InstrMName, InstrWName); // watch for problems such as lockup, reading unitialized memory, bad configs - watchdog #(P.XLEN, 1000000) watchdog(.clk, .reset); // check if PCW is stuck + watchdog #(P.XLEN, 1000000) watchdog(.clk, .reset, .TEST); // check if PCW is stuck ramxdetector #(P.XLEN, P.LLEN) ramxdetector(clk, dut.core.lsu.MemRWM[1], dut.core.lsu.LSULoadAccessFaultM, dut.core.lsu.ReadDataM, dut.core.ifu.PCM, InstrM, dut.core.lsu.IEUAdrM, InstrMName); riscvassertions #(P) riscvassertions(); // check assertions for a legal configuration From aff0ad9c02852942a32cc3421eff19edc22deda8 Mon Sep 17 00:00:00 2001 From: David Harris Date: Tue, 2 Jul 2024 14:23:34 -0700 Subject: [PATCH 4/7] Progress on VCS; run_vcs rewritten in Python to ease passing parameters --- bin/wsim | 8 ++++- sim/vcs/run_vcs.py | 84 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 1 deletion(-) create mode 100755 sim/vcs/run_vcs.py diff --git a/bin/wsim b/bin/wsim index 35b48dbb1..945ffa8ad 100755 --- a/bin/wsim +++ b/bin/wsim @@ -41,7 +41,13 @@ def LaunchSim(ElfFile, flags): print(f"Running VCS on " + args.config + " " + args.testsuite) if (args.gui): args.args += "gui" - cmd = cd + "; ./run_vcs " + args.config + " " + args.testsuite + " " + args.args + " " + flags + if (args.args == ""): + vcsargs = "" + else: + vcsargs = " --args " + args.args + if (ElfFile != ""): + ElfFile = " --elffile " + ElfFile + cmd = cd + "; ./run_vcs.py " + args.config + " " + args.testsuite + vcsargs + ElfFile + " " + flags print(cmd) os.system(cmd) diff --git a/sim/vcs/run_vcs.py b/sim/vcs/run_vcs.py new file mode 100755 index 000000000..f5030906e --- /dev/null +++ b/sim/vcs/run_vcs.py @@ -0,0 +1,84 @@ +#!/usr/bin/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) + From 1b62d2116a5386db4e5598702deb7eaf7c578877 Mon Sep 17 00:00:00 2001 From: David Harris Date: Tue, 2 Jul 2024 18:05:13 -0700 Subject: [PATCH 5/7] VCS lockstep working --- sim/vcs/run_vcs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sim/vcs/run_vcs.py b/sim/vcs/run_vcs.py index f5030906e..a9e9c2fca 100755 --- a/sim/vcs/run_vcs.py +++ b/sim/vcs/run_vcs.py @@ -72,7 +72,7 @@ else: 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 +SIMV_CMD= wkdir + "/" + OUTPUT + " +TEST=" + args.testsuite + " " + args.elffile + " " + args.args + " -no_save " + LOCKSTEP_SIMV # Run simulation print("Executing: " + str(VCS) ) From a2fb6a21c5c8199904160569f519451175dd8621 Mon Sep 17 00:00:00 2001 From: David Harris Date: Wed, 3 Jul 2024 06:25:32 -0700 Subject: [PATCH 6/7] Removed testbench-imperas now that wsim supports lockstep and single ELF files --- testbench/testbench-imperas.sv | 378 --------------------------------- 1 file changed, 378 deletions(-) delete mode 100644 testbench/testbench-imperas.sv diff --git a/testbench/testbench-imperas.sv b/testbench/testbench-imperas.sv deleted file mode 100644 index c834483f2..000000000 --- a/testbench/testbench-imperas.sv +++ /dev/null @@ -1,378 +0,0 @@ -/////////////////////////////////////////// -// testbench.sv -// -// Written: David_Harris@hmc.edu 9 January 2021 -// Modified: -// -// Purpose: Wally Testbench and helper modules -// Applies test programs from the riscv-arch-test and Imperas suites -// -// A component of the Wally configurable RISC-V project. -// -// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University -// -// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 -// -// Licensed under the Solderpad Hardware License v 2.1 (the “License”); you may not use this file -// except in compliance with the License, or, at your option, the Apache License version 2.0. You -// may obtain a copy of the License at -// -// https://solderpad.org/licenses/SHL-2.1/ -// -// Unless required by applicable law or agreed to in writing, any work distributed under the -// License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, -// either express or implied. See the License for the specific language governing permissions -// and limitations under the License. -//////////////////////////////////////////////////////////////////////////////////////////////// - -`include "config.vh" - - -// This is set from the command line script -// `define USE_IMPERAS_DV - -`ifdef USE_IMPERAS_DV - `include "idv/idv.svh" -`endif - -import cvw::*; - -module testbench; - parameter DEBUG=0; - -`ifdef USE_IMPERAS_DV - import idvPkg::*; - import rvviApiPkg::*; - import idvApiPkg::*; -`endif - - `include "parameter-defs.vh" - - logic clk; - logic reset_ext, reset; - - - logic [P.XLEN-1:0] testadr, testadrNoBase; - string InstrFName, InstrDName, InstrEName, InstrMName, InstrWName; - logic [31:0] InstrW; - - logic [3:0] dummy; - - logic [P.AHBW-1:0] HRDATAEXT; - logic HREADYEXT, HRESPEXT; - logic HSELEXTSDC; - logic [P.PA_BITS-1:0] HADDR; - logic [P.AHBW-1:0] HWDATA; - logic [P.XLEN/8-1:0] HWSTRB; - logic HWRITE; - logic [2:0] HSIZE; - logic [2:0] HBURST; - logic [3:0] HPROT; - logic [1:0] HTRANS; - logic HMASTLOCK; - logic HCLK, HRESETn; - logic [P.XLEN-1:0] PCW; - logic [31:0] NextInstrE, InstrM; - - string ProgramAddrMapFile, ProgramLabelMapFile; - integer ProgramAddrLabelArray [string] = '{ "begin_signature" : 0, "tohost" : 0 }; - logic DCacheFlushDone, DCacheFlushStart; - string testName; - string memfilename, testDir, adrstr, elffilename; - - logic [31:0] GPIOIN, GPIOOUT, GPIOEN; - logic UARTSin, UARTSout; - logic SPIIn, SPIOut; - logic [3:0] SPICS; - logic SDCIntr; - - logic HREADY; - logic HSELEXT; - - logic InitializingMemories; - integer ResetCount, ResetThreshold; - logic InReset; - - // Imperas look here. - initial - begin - ResetCount = 0; - ResetThreshold = 2; - InReset = 1; - testadr = 0; - testadrNoBase = 0; - - if ($value$plusargs("testDir=%s", testDir)) begin - memfilename = {testDir, "/ref/ref.elf.memfile"}; - elffilename = {testDir, "/ref/ref.elf"}; - $display($sformatf("%m @ t=%0t: loading testDir %0s", $time, testDir)); - end else begin - $error("Must specify test directory using plusarg testDir"); - end - - if (P.BUS_SUPPORTED) $readmemh(memfilename, dut.uncoregen.uncore.ram.ram.memory.RAM); - else $error("Imperas test bench requires BUS."); - - ProgramAddrMapFile = {testDir, "/ref/ref.elf.objdump.addr"}; - ProgramLabelMapFile = {testDir, "/ref/ref.elf.objdump.lab"}; - - // declare memory labels that interest us, the updateProgramAddrLabelArray task will find the addr of each label and fill the array - // to expand, add more elements to this array and initialize them to zero (also initilaize them to zero at the start of the next test) - updateProgramAddrLabelArray(ProgramAddrMapFile, ProgramLabelMapFile, ProgramAddrLabelArray); - $display("Read memfile %s", memfilename); - - end - -`ifdef USE_IMPERAS_DV - - rvviTrace #(.XLEN(P.XLEN), .FLEN(P.FLEN)) rvvi(); - wallyTracer #(P) wallyTracer(rvvi); - - trace2log idv_trace2log(rvvi); - trace2cov idv_trace2cov(rvvi); - - // enabling of comparison types - trace2api #(.CMP_PC (1), - .CMP_INS (1), - .CMP_GPR (1), - .CMP_FPR (1), - .CMP_VR (0), - .CMP_CSR (1) - ) idv_trace2api(rvvi); - - initial begin - - IDV_MAX_ERRORS = 3; - - // Initialize REF (do this before initializing the DUT) - if (!rvviVersionCheck(RVVI_API_VERSION)) begin - $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, 56)); - void'(rvviRefConfigSetInt(IDV_CONFIG_MAX_NET_LATENCY_RETIREMENTS, 6)); - - if (!rvviRefInit(elffilename)) begin - $display($sformatf("%m @ t=%0t: rvviRefInit failed", $time)); - $fatal; - end - - // Volatile CSRs - void'(rvviRefCsrSetVolatile(0, 32'hC00)); // CYCLE - void'(rvviRefCsrSetVolatile(0, 32'hB00)); // MCYCLE - void'(rvviRefCsrSetVolatile(0, 32'hC02)); // INSTRET - void'(rvviRefCsrSetVolatile(0, 32'hB02)); // MINSTRET - void'(rvviRefCsrSetVolatile(0, 32'hC01)); // TIME - - // cannot predict this register due to latency between - // pending and taken - void'(rvviRefCsrSetVolatile(0, 32'h344)); // MIP - void'(rvviRefCsrSetVolatile(0, 32'h144)); // SIP - - // Privileges for PMA are set in the imperas.ic - // volatile (IO) regions are defined here - // only real ROM/RAM areas are BOOTROM and UNCORE_RAM - if (P.CLINT_SUPPORTED) begin - void'(rvviRefMemorySetVolatile(P.CLINT_BASE, (P.CLINT_BASE + P.CLINT_RANGE))); - end - if (P.GPIO_SUPPORTED) begin - void'(rvviRefMemorySetVolatile(P.GPIO_BASE, (P.GPIO_BASE + P.GPIO_RANGE))); - end - if (P.UART_SUPPORTED) begin - void'(rvviRefMemorySetVolatile(P.UART_BASE, (P.UART_BASE + P.UART_RANGE))); - end - if (P.PLIC_SUPPORTED) begin - void'(rvviRefMemorySetVolatile(P.PLIC_BASE, (P.PLIC_BASE + P.PLIC_RANGE))); - end - if (P.SDC_SUPPORTED) begin - void'(rvviRefMemorySetVolatile(P.SDC_BASE, (P.SDC_BASE + P.SDC_RANGE))); - end - if (P.SPI_SUPPORTED) begin - void'(rvviRefMemorySetVolatile(P.SPI_BASE, (P.SPI_BASE + P.SPI_RANGE))); - end - - if(P.XLEN==32) begin - void'(rvviRefCsrSetVolatile(0, 32'hC80)); // CYCLEH - void'(rvviRefCsrSetVolatile(0, 32'hB80)); // MCYCLEH - void'(rvviRefCsrSetVolatile(0, 32'hC82)); // INSTRETH - void'(rvviRefCsrSetVolatile(0, 32'hB82)); // MINSTRETH - end - - void'(rvviRefCsrSetVolatile(0, 32'h104)); // SIE - Temporary!!!! - - end - - always @(dut.core.priv.priv.csr.csri.MIP_REGW[7]) void'(rvvi.net_push("MTimerInterrupt", dut.core.priv.priv.csr.csri.MIP_REGW[7])); - always @(dut.core.priv.priv.csr.csri.MIP_REGW[11]) void'(rvvi.net_push("MExternalInterrupt", dut.core.priv.priv.csr.csri.MIP_REGW[11])); - always @(dut.core.priv.priv.csr.csri.MIP_REGW[9]) void'(rvvi.net_push("SExternalInterrupt", dut.core.priv.priv.csr.csri.MIP_REGW[9])); - always @(dut.core.priv.priv.csr.csri.MIP_REGW[3]) void'(rvvi.net_push("MSWInterrupt", dut.core.priv.priv.csr.csri.MIP_REGW[3])); - always @(dut.core.priv.priv.csr.csri.MIP_REGW[1]) void'(rvvi.net_push("SSWInterrupt", dut.core.priv.priv.csr.csri.MIP_REGW[1])); - always @(dut.core.priv.priv.csr.csri.MIP_REGW[5]) void'(rvvi.net_push("STimerInterrupt", dut.core.priv.priv.csr.csri.MIP_REGW[5])); - - final begin - void'(rvviRefShutdown()); - end - -`endif - - flopenr #(P.XLEN) PCWReg(clk, reset, ~dut.core.ieu.dp.StallW, dut.core.ifu.PCM, PCW); - flopenr #(32) InstrWReg(clk, reset, ~dut.core.ieu.dp.StallW, InstrM, InstrW); - - // check assertions for a legal configuration - riscvassertions #(P) riscvassertions(); - - - // instantiate device to be tested - assign GPIOIN = 0; - assign UARTSin = 1; - - if(P.EXT_MEM_SUPPORTED) begin - ram_ahb #(.BASE(P.EXT_MEM_BASE), .RANGE(P.EXT_MEM_RANGE)) - ram (.HCLK, .HRESETn, .HADDR, .HWRITE, .HTRANS, .HWDATA, .HSELRam(HSELEXT), - .HREADRam(HRDATAEXT), .HREADYRam(HREADYEXT), .HRESPRam(HRESPEXT), .HREADY, - .HWSTRB); - end else begin - assign HREADYEXT = 1; - assign HRESPEXT = 0; - assign HRDATAEXT = 0; - end - - if(P.SDC_SUPPORTED) begin : sdcard - // *** fix later -/* -----\/----- EXCLUDED -----\/----- - sdModel sdcard - (.sdClk(SDCCLK), - .cmd(SDCCmd), - .dat(SDCDat)); - - assign SDCCmd = SDCCmdOE ? SDCCmdOut : 1'bz; - assign SDCCmdIn = SDCCmd; - assign SDCDatIn = SDCDat; - -----/\----- EXCLUDED -----/\----- */ - assign SDCIntr = 0; - end else begin - assign SDCIntr = 0; - end - - wallypipelinedsoc #(P) dut(.clk, .reset_ext, .reset, .HRDATAEXT, .HREADYEXT, .HRESPEXT, .HSELEXT, .HSELEXTSDC, - .HCLK, .HRESETn, .HADDR, .HWDATA, .HWSTRB, .HWRITE, .HSIZE, .HBURST, .HPROT, - .HTRANS, .HMASTLOCK, .HREADY, .TIMECLK(1'b0), .GPIOIN, .GPIOOUT, .GPIOEN, - .UARTSin, .UARTSout, .SDCIntr, .SPICS, .SPIOut, .SPIIn); - - // Track names of instructions - instrTrackerTB it(clk, reset, dut.core.ieu.dp.FlushE, - dut.core.ifu.InstrRawF[31:0], - dut.core.ifu.InstrD, dut.core.ifu.InstrE, - InstrM, InstrW, - InstrFName, InstrDName, InstrEName, InstrMName, InstrWName); - - // initialize tests - - // generate clock to sequence tests - always - begin - clk = 1; # 5; clk = 0; # 5; - // if ($time % 100000 == 0) $display("Time is %0t", $time); - end - - // check results - assign reset_ext = InReset; - - always @(negedge clk) - begin - InitializingMemories = 0; - if(InReset == 1) begin - // once the test inidicates it's done we need to immediately hold reset for a number of cycles. - if(ResetCount < ResetThreshold) ResetCount = ResetCount + 1; - else begin // hit reset threshold so we remove reset. - InReset = 0; - ResetCount = 0; - end - end - end // always @ (negedge clk) - - - // track the current function or global label - if (DEBUG == 1) begin : FunctionName - FunctionName #(P) FunctionName(.reset(reset), - .clk(clk), - .ProgramAddrMapFile(ProgramAddrMapFile), - .ProgramLabelMapFile(ProgramLabelMapFile)); - end - - // Duplicate copy of pipeline registers that are optimized out of some configurations - mux2 #(32) FlushInstrMMux(dut.core.ifu.InstrE, dut.core.ifu.nop, dut.core.ifu.FlushM, NextInstrE); - flopenr #(32) InstrMReg(clk, reset, ~dut.core.ifu.StallM, NextInstrE, InstrM); - - // Termination condition - // terminate on a specific ECALL after li x3,1 for old Imperas tests, *** remove this when old imperas tests are removed - // or sw gp,-56(t0) for new Imperas tests - // or sd gp, -56(t0) - // or on a jump to self infinite loop (6f) for RISC-V Arch tests - logic ecf; // remove this once we don't rely on old Imperas tests with Ecalls - if (P.ZICSR_SUPPORTED) assign ecf = dut.core.priv.priv.EcallFaultM; - else assign ecf = 0; - assign DCacheFlushStart = ecf & - (dut.core.ieu.dp.regf.rf[3] == 1 | - (dut.core.ieu.dp.regf.we3 & - dut.core.ieu.dp.regf.a3 == 3 & - dut.core.ieu.dp.regf.wd3 == 1)) | - ((InstrM == 32'h6f | InstrM == 32'hfc32a423 | InstrM == 32'hfc32a823) & dut.core.ieu.c.InstrValidM ) | - ((dut.core.lsu.IEUAdrM == ProgramAddrLabelArray["tohost"]) & InstrMName == "SW" ); - - DCacheFlushFSM #(P) DCacheFlushFSM(.clk(clk), - .start(DCacheFlushStart), - .done(DCacheFlushDone)); - - // initialize the branch predictor - if (P.BPRED_SUPPORTED == 1) - begin - genvar adrindex; - - // Initializing all zeroes into the branch predictor memory. - for(adrindex = 0; adrindex < 1024; adrindex++) begin - initial begin - force dut.core.ifu.bpred.bpred.Predictor.DirPredictor.PHT.mem[adrindex] = 0; - force dut.core.ifu.bpred.bpred.TargetPredictor.memory.mem[adrindex] = 0; - #1; - release dut.core.ifu.bpred.bpred.Predictor.DirPredictor.PHT.mem[adrindex]; - release dut.core.ifu.bpred.bpred.TargetPredictor.memory.mem[adrindex]; - end - end - end - - watchdog #(P.XLEN, 1000000) watchdog(.clk, .reset); // check if PCW is stuck - -endmodule - - -/* verilator lint_on STMTDLY */ -/* verilator lint_on WIDTH */ - - -task automatic updateProgramAddrLabelArray; - input string ProgramAddrMapFile, ProgramLabelMapFile; - inout integer ProgramAddrLabelArray [string]; - // Gets the memory location of begin_signature - integer ProgramLabelMapFP, ProgramAddrMapFP; - ProgramLabelMapFP = $fopen(ProgramLabelMapFile, "r"); - ProgramAddrMapFP = $fopen(ProgramAddrMapFile, "r"); - - if (ProgramLabelMapFP & ProgramAddrMapFP) begin // check we found both files - while (!$feof(ProgramLabelMapFP)) begin - string label, adrstr; - integer returncode; - returncode = $fscanf(ProgramLabelMapFP, "%s\n", label); - returncode = $fscanf(ProgramAddrMapFP, "%s\n", adrstr); - if (ProgramAddrLabelArray.exists(label)) - ProgramAddrLabelArray[label] = adrstr.atohex(); - end - end - $fclose(ProgramLabelMapFP); - $fclose(ProgramAddrMapFP); -endtask - From af4403342fb34ca0e54c2cf446128b2a75d0ec7b Mon Sep 17 00:00:00 2001 From: David Harris Date: Wed, 3 Jul 2024 08:02:38 -0700 Subject: [PATCH 7/7] renamed run_vcs.py to run_vcs, added instr/data in ebu --- bin/wsim | 2 +- sim/vcs/run_vcs | 171 ++++++++++++++++++--------------------------- sim/vcs/run_vcs.py | 84 ---------------------- src/ebu/ebu.sv | 2 +- 4 files changed, 71 insertions(+), 188 deletions(-) delete mode 100755 sim/vcs/run_vcs.py diff --git a/bin/wsim b/bin/wsim index 945ffa8ad..6a3963319 100755 --- a/bin/wsim +++ b/bin/wsim @@ -47,7 +47,7 @@ def LaunchSim(ElfFile, flags): vcsargs = " --args " + args.args if (ElfFile != ""): ElfFile = " --elffile " + ElfFile - cmd = cd + "; ./run_vcs.py " + args.config + " " + args.testsuite + vcsargs + ElfFile + " " + flags + cmd = cd + "; ./run_vcs " + args.config + " " + args.testsuite + vcsargs + ElfFile + " " + flags print(cmd) os.system(cmd) diff --git a/sim/vcs/run_vcs b/sim/vcs/run_vcs index e5ef6456e..a9e9c2fca 100755 --- a/sim/vcs/run_vcs +++ b/sim/vcs/run_vcs @@ -1,117 +1,84 @@ -#!/bin/bash -# VCS Compilation for WALLY -# Divya Kohli, Rose Thompson, David Harris 2024 -# Note: VCS produces warning about unsupported Linux Version, but runs successfully +#!/usr/bin/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 -# Color Definitions -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -NC='\033[0m' # No Color -# Directories -CFG="${WALLY}/config" -SRC="${WALLY}/src" -TB="${WALLY}/testbench" +import argparse +import os +import subprocess -# Set CONFIG_VARIANT from the first script argument -CONFIG_VARIANT=${1} -# Set TESTSUITE from the second script argument -TESTSUITE=$2 +# 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 -WKDIR="wkdir/${1}_${2}" -COV="cov/${1}_${2}" -LOGS="logs" +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 + "'") -if [ ${TESTSUITE} = "buildroot" ]; then - shift 2 - PLUSARGS="$*" -fi +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" -clean_logs() { - echo -e "${YELLOW}Cleaning up workspace...${NC}" - rm -rf wkdir logs cov -} -clean_simprofile() { - echo -e "${YELLOW}Cleaning up simprofile_dir...${NC}" - rm -rf simprofile_dir* profileReport* -} +os.system("mkdir -p " + wkdir) +os.system("mkdir -p " + covdir) +os.system("mkdir -p " + logdir) -#clean_simprofile -#clean_logs -# Function to create a directory if it does not exist -create_directory() { - local dir=$1 # Local variable for directory name +# 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) - if [ ! -d "$dir" ]; then - mkdir -p "$dir" - if [ $? -eq 0 ]; then - echo "Directory $dir created successfully." - else - echo "Failed to create directory $dir." - exit 1 - fi - else - echo "Directory $dir already exists." - fi -} +# Include directories +INCLUDE_PATH="+incdir+" + cfgdir + "/" + args.config + " +incdir+" + cfgdir + "/deriv/" + args.config + " +incdir+" + cfgdir + "/shared +incdir+$WALLY/tests +incdir+" + tbdir + " +incdir+" + srcdir -# Create or verify WKDIR, COV, and LOGS directories -create_directory "$WKDIR" -create_directory "$COV" -create_directory "$LOGS" +# 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 = "" -# Ensure the working directory exists -if [ ! -d "$WKDIR" ]; then - echo -e "${YELLOW}Directory $WKDIR does not exist. Creating it now...${NC}" - mkdir -p "$WKDIR" && echo -e "${GREEN}Directory $WKDIR created successfully.${NC}" || { - echo -e "${RED}Failed to create directory $WKDIR.${NC}" - exit 1 - } -else - echo -e "${GREEN}Directory $WKDIR already exists.${NC}" -fi +# 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 = "" -# GUI option handling -GUI="" -if [ "$3" = "gui" ]; then - GUI="-gui" -else - GUI="" -fi - -# Collect include directories -INCLUDE_DIRS=$(find ${SRC} -type d | xargs -I {} echo -n "{} ") -INCLUDE_PATH="+incdir+${CFG}/${CONFIG_VARIANT} +incdir+${CFG}/deriv/${CONFIG_VARIANT} +incdir+${CFG}/shared +incdir+../../tests +define+ +incdir+${TB} ${SRC}/cvw.sv +incdir+${SRC}" - -# Prepare RTL files avoiding certain paths -RTL_FILES="$INCLUDE_DIRS $(find ${SRC} -name "*.sv" ! -path "${SRC}/generic/mem/rom1p1r_128x64.sv" ! -path "${SRC}/generic/mem/ram2p1r1wbe_128x64.sv" ! -path "${SRC}/generic/mem/rom1p1r_128x32.sv" ! -path "${SRC}/generic/mem/ram2p1r1wbe_2048x64.sv") ${TB}/testbench.sv $(find ${TB}/common -name "*.sv" ! -path "${TB}/common/wallyTracer.sv")" - -# Simulation and Coverage Commands +# 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 -SIMV_CMD="./${WKDIR}/$OUTPUT +TEST=${TESTSUITE} ${PLUSARGS} -no_save" +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 -# Clean and run simulation with VCS - -if [ "$3" = "--coverage" ]; then - echo -e "${YELLOW}#### Running VCS Simulation with Coverage ####${NC}" - COV_OPTIONS="-cm line+cond+branch+fsm+tgl -cm_log ${WKDIR}/coverage.log -cm_dir ${WKDIR}/COVERAGE" - COV_RUN="urg -dir ./${WKDIR}/COVERAGE.vdb -format text -report IndividualCovReport/${CONFIG_VARIANT}_${TESTSUITE}" - $VCS_CMD -Mdir=${WKDIR} $COV_OPTIONS $RTL_FILES -o ${WKDIR}/$OUTPUT -Mlib ${WKDIR} -work ${WKDIR} -l "$LOGS/${CONFIG_VARIANT}_${TESTSUITE}.log" - $SIMV_CMD $COV_OPTIONS # dh 6/27/24 *** are COV_OPTIONS really needed? - $COV_RUN - #cp -rf urgReport $COV -elif [ "$3" = "--lockstep" ]; then - echo -e "${YELLOW}#### Running VCS Simulation with Lockstep ####${NC}" - 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 ${TB}/common/wallyTracer.sv" - LOCKSTEP_SIMV="-sv_lib ${IMPERAS_HOME}/lib/Linux64/ImperasLib/imperas.com/verification/riscv/1.0/model" - $VCS_CMD -Mdir=${WKDIR} $LOCKSTEP_OPTIONS $RTL_FILES -o ${WKDIR}/$OUTPUT -Mlib ${WKDIR} -work ${WKDIR} -l "$LOGS/${CONFIG_VARIANT}_${TESTSUITE}.log" - $SIMV_CMD $LOCKSTEP_SIMV -else - echo -e "${YELLOW}#### Running VCS Simulation ####${NC}" - $VCS_CMD -Mdir=${WKDIR} $RTL_FILES -o ${WKDIR}/$OUTPUT -work ${WKDIR} -Mlib ${WKDIR} -l "$LOGS/${CONFIG_VARIANT}_${TESTSUITE}.log" - $SIMV_CMD -fi +# 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) diff --git a/sim/vcs/run_vcs.py b/sim/vcs/run_vcs.py deleted file mode 100755 index a9e9c2fca..000000000 --- a/sim/vcs/run_vcs.py +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/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) - diff --git a/src/ebu/ebu.sv b/src/ebu/ebu.sv index 2eec7db58..edf1461bb 100644 --- a/src/ebu/ebu.sv +++ b/src/ebu/ebu.sv @@ -116,7 +116,7 @@ module ebu import cvw::*; #(parameter cvw_t P) ( assign HBURST = LSUSelect ? LSUHBURSTOut : IFUSelect ? IFUHBURSTOut : '0; // If doing memory accesses, use LSUburst, else use Instruction burst. assign HTRANS = LSUSelect ? LSUHTRANSOut : IFUSelect ? IFUHTRANSOut: '0; // SEQ if not first read or write, NONSEQ if first read or write, IDLE otherwise assign HWRITE = LSUSelect ? LSUHWRITEOut : '0; - assign HPROT = 4'b0011; // not used; see Section 3.7 + assign HPROT = {3'b001, LSUSelect}; // treat as privileged access of either Opcode fetch or Data access assign HMASTLOCK = 1'b0; // no locking supported // data phase muxing. This would be a mux if IFU wrote data.