From 4da1dea50f3d6bfaea60d372352050fd980e932a Mon Sep 17 00:00:00 2001 From: Jerry Zhao Date: Wed, 17 May 2023 15:21:54 -0700 Subject: [PATCH] Support multi-binary-run in RTL sim --- common.mk | 52 ++++++++++++++++++++++++++++++++--------- sims/vcs/vcs.mk | 4 ++-- sims/verilator/Makefile | 2 +- sims/xcelium/xcelium.mk | 2 +- variables.mk | 16 ++++--------- vlsi/power.mk | 6 ++--- vlsi/sim.mk | 10 ++++---- 7 files changed, 57 insertions(+), 35 deletions(-) diff --git a/common.mk b/common.mk index 2dce97ec..ab237c93 100644 --- a/common.mk +++ b/common.mk @@ -288,6 +288,8 @@ verilog: $(sim_common_files) ######################################################################################### .PHONY: run-binary run-binary-fast run-binary-debug run-fast + + check-binary: ifeq (,$(BINARY)) $(error BINARY variable is not set. Set it to the simulation binary) @@ -298,26 +300,54 @@ ifeq ("$(wildcard $(BINARY))","") endif endif +check-binaries: +ifeq (,$(BINARIES)) + $(error BINARIES variable is not set. Set it to the list of simulation binaries to run) +endif + # allow you to override sim prereq ifeq (,$(BREAK_SIM_PREREQ)) SIM_PREREQ = $(sim) SIM_DEBUG_PREREQ = $(sim_debug) endif +# Function to generate the loadmem flag. First arg is the binary +ifeq ($(LOADMEM),1) +# If LOADMEM=1, assume BINARY is the loadmem elf +get_loadmem_flag = +loadmem=$(1) +else ifneq ($(LOADMEM),) +# Otherwise, assume the variable points to an elf file +get_loadmem_flag = +loadmem=$(LOADMEM) +endif + +# get the output path base name for simulation outputs, First arg is the binary +get_sim_out_name = $(output_dir)/$(call get_out_name,$(1)) + +.PHONY: %.run %.run.debug %.run.fast + # run normal binary with hardware-logged insn dissassembly -run-binary: $(SIM_PREREQ) check-binary | $(output_dir) - (set -o pipefail && $(NUMA_PREFIX) $(sim) $(PERMISSIVE_ON) $(SIM_FLAGS) $(EXTRA_SIM_FLAGS) $(SEED_FLAG) $(VERBOSE_FLAGS) $(PERMISSIVE_OFF) $(BINARY) >(spike-dasm > $(sim_out_name).out) | tee $(sim_out_name).log) +run-binary: $(BINARY).run check-binary +run-binaries: $(addsuffix .run,$(BINARIES)) check-binaries + +%.run: $(SIM_PREREQ) | $(output_dir) + (set -o pipefail && $(NUMA_PREFIX) $(sim) $(PERMISSIVE_ON) $(SIM_FLAGS) $(EXTRA_SIM_FLAGS) $(call get_loadmem_flag,$*) $(SEED_FLAG) $(VERBOSE_FLAGS) $(PERMISSIVE_OFF) $* >(spike-dasm > $(call get_sim_out_name,$*).out) | tee $(call get_sim_out_name,$*).log) # run simulator as fast as possible (no insn disassembly) -run-binary-fast: $(SIM_PREREQ) check-binary | $(output_dir) - (set -o pipefail && $(NUMA_PREFIX) $(sim) $(PERMISSIVE_ON) $(SIM_FLAGS) $(EXTRA_SIM_FLAGS) $(SEED_FLAG) $(PERMISSIVE_OFF) $(BINARY) $(sim_out_name).dump +run-binary-debug: $(BINARY).run.debug check-binary +run-binaries-debug: $(addsuffix .run.debug,$(BINARIES)) check-binaries + +%.run.debug: $(SIM_DEBUG_PREREQ) | $(output_dir) +ifneq (none,$*) + riscv64-unknown-elf-objdump -D $* > $(call get)sim_out_name,$*).dump endif - (set -o pipefail && $(NUMA_PREFIX) $(sim_debug) $(PERMISSIVE_ON) $(SIM_FLAGS) $(EXTRA_SIM_FLAGS) $(SEED_FLAG) $(VERBOSE_FLAGS) $(WAVEFORM_FLAG) $(PERMISSIVE_OFF) $(BINARY) >(spike-dasm > $(sim_out_name).out) | tee $(sim_out_name).log) + (set -o pipefail && $(NUMA_PREFIX) $(sim_debug) $(PERMISSIVE_ON) $(SIM_FLAGS) $(EXTRA_SIM_FLAGS) $(call get_loadmem_flag,$*) $(SEED_FLAG) $(VERBOSE_FLAGS) $(call get_waveform_flag,$(call get_sim_out_name,$*)) $(PERMISSIVE_OFF) $* >(spike-dasm > $(call get_sim_out_name,$*).out) | tee $(call get_sim_out_name,$*).log) run-fast: run-asm-tests-fast run-bmark-tests-fast @@ -325,11 +355,11 @@ run-fast: run-asm-tests-fast run-bmark-tests-fast # helper rules to run simulator with fast loadmem # LEGACY - use LOADMEM=1 instead ######################################################################################### -run-binary-hex: run-binary +run-binary-hex: $(BINARY).run run-binary-hex: override SIM_FLAGS += +loadmem=$(BINARY) -run-binary-debug-hex: run-binary-debug +run-binary-debug-hex: $(BINARY).run.debug run-binary-debug-hex: override SIM_FLAGS += +loadmem=$(BINARY) -run-binary-fast-hex: run-binary-fast +run-binary-fast-hex: $(BINARY).run.fast run-binary-fast-hex: override SIM_FLAGS += +loadmem=$(BINARY) ######################################################################################### diff --git a/sims/vcs/vcs.mk b/sims/vcs/vcs.mk index f816f102..0a26a487 100644 --- a/sims/vcs/vcs.mk +++ b/sims/vcs/vcs.mk @@ -5,9 +5,9 @@ HELP_SIMULATION_VARIABLES += \ " USE_VPD = set to '1' to run VCS simulator emitting VPD instead of FSDB." ifndef USE_VPD -WAVEFORM_FLAG=+fsdbfile=$(sim_out_name).fsdb +get_waveform_flag=+fsdbfile=$(1).fsdb else -WAVEFORM_FLAG=+vcdplusfile=$(sim_out_name).vpd +get_waveform_flag=+vcdplusfile=$(1).vpd endif # If ntb_random_seed unspecified, vcs uses 1 as constant seed. diff --git a/sims/verilator/Makefile b/sims/verilator/Makefile index 11b80331..dc556862 100644 --- a/sims/verilator/Makefile +++ b/sims/verilator/Makefile @@ -96,7 +96,7 @@ USE_FST ?= 0 TRACING_OPTS := $(if $(filter $(USE_FST),0),\ --trace,--trace-fst --trace-threads 1) # TODO: consider renaming +vcdfile in TestDriver.v to +waveformfile (or similar) -WAVEFORM_FLAG := +vcdfile=$(sim_out_name).$(if $(filter $(USE_FST),0),vcd,fst) +get_waveform_flag = +vcdfile=$(1).$(if $(filter $(USE_FST),0),vcd,fst) #---------------------------------------------------------------------------------------- # verilation configuration/optimization diff --git a/sims/xcelium/xcelium.mk b/sims/xcelium/xcelium.mk index 3d9ed5ab..62d1e9ae 100644 --- a/sims/xcelium/xcelium.mk +++ b/sims/xcelium/xcelium.mk @@ -1,5 +1,5 @@ -WAVEFORM_FLAG=+vcdfile=$(sim_out_name).vcd +get_waveform_flag=+vcdfile=$(1).vcd # If ntb_random_seed unspecified, xcelium uses 1 as constant seed. # Set ntb_random_seed_automatic to actually get a random seed diff --git a/variables.mk b/variables.mk index 89e66cd9..b4a581a8 100644 --- a/variables.mk +++ b/variables.mk @@ -244,29 +244,21 @@ output_dir=$(sim_dir)/output/$(long_name) PERMISSIVE_ON=+permissive PERMISSIVE_OFF=+permissive-off BINARY ?= +BINARIES ?= override SIM_FLAGS += +dramsim +dramsim_ini_dir=$(TESTCHIP_DIR)/src/main/resources/dramsim2_ini +max-cycles=$(timeout_cycles) VERBOSE_FLAGS ?= +verbose -OUT_NAME ?= $(subst $() $(),_,$(notdir $(basename $(BINARY)))) +# get_out_name is a function, 1st argument is the binary +get_out_name = $(subst $() $(),_,$(notdir $(basename $(1)))) LOADMEM ?= LOADARCH ?= ifneq ($(LOADARCH),) override BINARY = $(LOADARCH)/mem.elf -override OUT_NAME = $(shell basename $(LOADARCH)) +override get_out_name = $(shell basename $(LOADARCH)) override LOADMEM = 1 override SIM_FLAGS += +loadarch=$(LOADARCH)/loadarch endif -ifeq ($(LOADMEM),1) -# If LOADMEM=1, assume BINARY is the loadmem elf -override SIM_FLAGS += +loadmem=$(BINARY) -else ifneq ($(LOADMEM),) -# Otherwise, assume the variable points to an elf file -override SIM_FLAGS += +loadmem=$(LOADMEM) -endif - -sim_out_name = $(output_dir)/$(OUT_NAME) - ######################################################################################### # build output directory for compilation ######################################################################################### diff --git a/vlsi/power.mk b/vlsi/power.mk index 5e265a35..ff1c1729 100644 --- a/vlsi/power.mk +++ b/vlsi/power.mk @@ -6,7 +6,7 @@ POWER_PAR_HIER_CONF = $(OBJ_DIR)/power-par-$(VLSI_TOP)-inputs.yml .PHONY: $(POWER_CONF) $(POWER_RTL_CONF) $(POWER_SYN_CONF) $(POWER_PAR_CONF) $(POWER_PAR_HIER_CONF) -$(POWER_CONF): $(VLSI_RTL) +$(POWER_CONF): $(VLSI_RTL) check-binary mkdir -p $(dir $@) echo "power.inputs:" > $@ echo " top_module: $(VLSI_TOP)" >> $@ @@ -15,9 +15,9 @@ $(POWER_CONF): $(VLSI_RTL) ifneq ($(BINARY), ) echo " waveforms: [" >> $@ ifndef USE_VPD - echo " '$(sim_out_name).fsdb'" >> $@ + echo " '$(call get_sim_out_name,$(BINARY)).fsdb'" >> $@ else - echo " '$(sim_out_name).vpd'" >> $@ + echo " '$(call get_sim_out_name,$(BINARY)).vpd'" >> $@ endif echo " ]" >> $@ endif diff --git a/vlsi/sim.mk b/vlsi/sim.mk index 291c93ad..b721c9fb 100644 --- a/vlsi/sim.mk +++ b/vlsi/sim.mk @@ -4,7 +4,7 @@ SIM_TIMING_CONF = $(OBJ_DIR)/sim-timing-inputs.yml .PHONY: $(SIM_CONF) $(SIM_DEBUG_CONF) $(SIM_TIMING_CONF) -$(SIM_CONF): $(sim_common_files) +$(SIM_CONF): $(sim_common_files) check-binary mkdir -p $(dir $@) echo "sim.inputs:" > $@ echo " top_module: $(VLSI_TOP)" >> $@ @@ -47,14 +47,14 @@ ifneq ($(BINARY), ) endif echo " tb_dut: 'TestDriver.testHarness.$(VLSI_MODEL_DUT_NAME)'" >> $@ -$(SIM_DEBUG_CONF): $(sim_common_files) +$(SIM_DEBUG_CONF): $(sim_common_files) check-binary mkdir -p $(dir $@) mkdir -p $(output_dir) echo "sim.inputs:" > $@ echo " defines: ['DEBUG']" >> $@ echo " defines_meta: 'append'" >> $@ echo " execution_flags:" >> $@ - for x in $(VERBOSE_FLAGS) $(WAVEFORM_FLAG); do \ + for x in $(VERBOSE_FLAGS) $(call get_waveform_flag,$(call get_sim_out_name,$(BINARY))); do \ echo ' - "'$$x'"' >> $@; \ done echo " execution_flags_meta: 'append'" >> $@ @@ -65,9 +65,9 @@ ifndef USE_VPD echo " options:" >> $@ echo ' - "-kdb"' >> $@ echo " options_meta: 'append'" >> $@ - echo "sim.outputs.waveforms: ['$(sim_out_name).fsdb']" >> $@ + echo "sim.outputs.waveforms: ['$(call get_sim_out_name,$(BINARY)).fsdb']" >> $@ else - echo "sim.outputs.waveforms: ['$(sim_out_name).vpd']" >> $@ + echo "sim.outputs.waveforms: ['$(call get_sim_out_name,$(BINARY)).vpd']" >> $@ endif $(SIM_TIMING_CONF): $(sim_common_files)