From 4da1dea50f3d6bfaea60d372352050fd980e932a Mon Sep 17 00:00:00 2001 From: Jerry Zhao Date: Wed, 17 May 2023 15:21:54 -0700 Subject: [PATCH 1/5] 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) From 4dc932035cc7617adce2a1aa5c31a6004677d387 Mon Sep 17 00:00:00 2001 From: Jerry Zhao Date: Wed, 17 May 2023 15:23:33 -0700 Subject: [PATCH 2/5] Add help text on run-binaries --- common.mk | 3 +++ variables.mk | 1 + 2 files changed, 4 insertions(+) diff --git a/common.mk b/common.mk index ab237c93..3ea209dc 100644 --- a/common.mk +++ b/common.mk @@ -45,6 +45,9 @@ HELP_COMMANDS += \ " run-binary = run [./$(shell basename $(sim))] and log instructions to file" \ " run-binary-fast = run [./$(shell basename $(sim))] and don't log instructions" \ " run-binary-debug = run [./$(shell basename $(sim_debug))] and log instructions and waveform to files" \ +" run-binaries = run [./$(shell basename $(sim))] and log instructions to file" \ +" run-binaries-fast = run [./$(shell basename $(sim))] and don't log instructions" \ +" run-binaries-debug = run [./$(shell basename $(sim_debug))] and log instructions and waveform to files" \ " verilog = generate intermediate verilog files from chisel elaboration and firrtl passes" \ " firrtl = generate intermediate firrtl files from chisel elaboration" \ " run-tests = run all assembly and benchmark tests" \ diff --git a/variables.mk b/variables.mk index b4a581a8..d4823377 100644 --- a/variables.mk +++ b/variables.mk @@ -25,6 +25,7 @@ HELP_PROJECT_VARIABLES = \ HELP_SIMULATION_VARIABLES = \ " BINARY = riscv elf binary that the simulator will run when using the run-binary* targets" \ +" BINARIES = list of riscv elf binary that the simulator will run when using the run-binaries* targets" \ " LOADMEM = riscv elf binary that should be loaded directly into simulated DRAM. LOADMEM=1 will load the BINARY elf" \ " LOADARCH = path to a architectural checkpoint directory that should end in .loadarch/, for restoring from a checkpoint" \ " VERBOSE_FLAGS = flags used when doing verbose simulation [$(VERBOSE_FLAGS)]" \ From 57d849ae4d165f2b94a490e2b44e1ec8b4300aa0 Mon Sep 17 00:00:00 2001 From: Jerry Zhao Date: Wed, 17 May 2023 16:55:23 -0700 Subject: [PATCH 3/5] Check binaries exist with run-binaries --- common.mk | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/common.mk b/common.mk index 3ea209dc..8507d9b0 100644 --- a/common.mk +++ b/common.mk @@ -290,24 +290,21 @@ verilog: $(sim_common_files) # helper rules to run simulations ######################################################################################### .PHONY: run-binary run-binary-fast run-binary-debug run-fast - - + %.check-exists check-binary check-binaries check-binary: ifeq (,$(BINARY)) $(error BINARY variable is not set. Set it to the simulation binary) endif -ifneq (none,$(BINARY)) -ifeq ("$(wildcard $(BINARY))","") - $(error BINARY=$(BINARY) not found) -endif -endif check-binaries: ifeq (,$(BINARIES)) $(error BINARIES variable is not set. Set it to the list of simulation binaries to run) endif +%.check-exists: + if [ "$*" != "none" ] && [ ! -f "$*" ]; then printf "\n\nBinary $* not found\n\n"; exit 1; fi + # allow you to override sim prereq ifeq (,$(BREAK_SIM_PREREQ)) SIM_PREREQ = $(sim) @@ -332,23 +329,23 @@ get_sim_out_name = $(output_dir)/$(call get_out_name,$(1)) run-binary: $(BINARY).run check-binary run-binaries: $(addsuffix .run,$(BINARIES)) check-binaries -%.run: $(SIM_PREREQ) | $(output_dir) +%.run: %.check-exists $(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: $(BINARY).run.fast check-binary run-binaries-fast: $(addsuffix .run.fast,$(BINARIES)) check-binaries -%.run.fast: $(SIM_PREREQ) | $(output_dir) +%.run.fast: %.check-exists $(SIM_PREREQ) | $(output_dir) (set -o pipefail && $(NUMA_PREFIX) $(sim) $(PERMISSIVE_ON) $(SIM_FLAGS) $(EXTRA_SIM_FLAGS) $(call get_loadmem_flag,$*) $(SEED_FLAG) $(PERMISSIVE_OFF) $* $(call get)sim_out_name,$*).dump + 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) $(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) From 5d55f2bd772b3ad604493c75541300b71556d0f8 Mon Sep 17 00:00:00 2001 From: Jerry Zhao Date: Sat, 20 May 2023 09:40:52 -0700 Subject: [PATCH 4/5] Support multi-loadarch RTL sims --- common.mk | 12 +++++++++--- variables.mk | 6 +++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/common.mk b/common.mk index 8507d9b0..933f7bed 100644 --- a/common.mk +++ b/common.mk @@ -320,8 +320,14 @@ else ifneq ($(LOADMEM),) get_loadmem_flag = +loadmem=$(LOADMEM) endif +ifneq ($(LOADARCH),_) +get_loadarch_flag = +loadarch=$(subst mem.elf,loadarch,$(1)) +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)) +# sim flags that are common to run-binary/run-binary-fast/run-binary-debug +get_common_sim_flags = $(SIM_FLAGS) $(EXTRA_SIM_FLAGS) $(SEED_FLAG) $(call get_loadmem_flag,$(1)) $(call get_loadarch_flag,$(1)) .PHONY: %.run %.run.debug %.run.fast @@ -330,14 +336,14 @@ run-binary: $(BINARY).run check-binary run-binaries: $(addsuffix .run,$(BINARIES)) check-binaries %.run: %.check-exists $(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) + (set -o pipefail && $(NUMA_PREFIX) $(sim) $(PERMISSIVE_ON) $(call get_common_sim_flags,$*) $(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: $(BINARY).run.fast check-binary run-binaries-fast: $(addsuffix .run.fast,$(BINARIES)) check-binaries %.run.fast: %.check-exists $(SIM_PREREQ) | $(output_dir) - (set -o pipefail && $(NUMA_PREFIX) $(sim) $(PERMISSIVE_ON) $(SIM_FLAGS) $(EXTRA_SIM_FLAGS) $(call get_loadmem_flag,$*) $(SEED_FLAG) $(PERMISSIVE_OFF) $* $(call get_sim_out_name,$*).dump endif - (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) + (set -o pipefail && $(NUMA_PREFIX) $(sim_debug) $(PERMISSIVE_ON) $(call get_common_sim_flags,$*) $(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 diff --git a/variables.mk b/variables.mk index d4823377..f4e3d3c9 100644 --- a/variables.mk +++ b/variables.mk @@ -254,10 +254,10 @@ LOADMEM ?= LOADARCH ?= ifneq ($(LOADARCH),) -override BINARY = $(LOADARCH)/mem.elf -override get_out_name = $(shell basename $(LOADARCH)) +override BINARY = $(addsuffix /mem.elf,$(LOADARCH)) +override BINARIES = $(addsuffix /mem.elf,$(LOADARCH)) +override get_out_name = $(shell basename $(dir $(1))) override LOADMEM = 1 -override SIM_FLAGS += +loadarch=$(LOADARCH)/loadarch endif ######################################################################################### From 79369cff40131312749c802871dc3559b13cd57c Mon Sep 17 00:00:00 2001 From: Jerry Zhao Date: Sat, 20 May 2023 09:44:17 -0700 Subject: [PATCH 5/5] Fix check for BINARY/BINARIES being set --- common.mk | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/common.mk b/common.mk index 933f7bed..50a01a4d 100644 --- a/common.mk +++ b/common.mk @@ -320,7 +320,7 @@ else ifneq ($(LOADMEM),) get_loadmem_flag = +loadmem=$(LOADMEM) endif -ifneq ($(LOADARCH),_) +ifneq ($(LOADARCH),) get_loadarch_flag = +loadarch=$(subst mem.elf,loadarch,$(1)) endif @@ -332,22 +332,22 @@ get_common_sim_flags = $(SIM_FLAGS) $(EXTRA_SIM_FLAGS) $(SEED_FLAG) $(call get_l .PHONY: %.run %.run.debug %.run.fast # run normal binary with hardware-logged insn dissassembly -run-binary: $(BINARY).run check-binary -run-binaries: $(addsuffix .run,$(BINARIES)) check-binaries +run-binary: check-binary $(BINARY).run +run-binaries: check-binaries $(addsuffix .run,$(BINARIES)) %.run: %.check-exists $(SIM_PREREQ) | $(output_dir) (set -o pipefail && $(NUMA_PREFIX) $(sim) $(PERMISSIVE_ON) $(call get_common_sim_flags,$*) $(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: $(BINARY).run.fast check-binary -run-binaries-fast: $(addsuffix .run.fast,$(BINARIES)) check-binaries +run-binary-fast: check-binary $(BINARY).run.fast +run-binaries-fast: check-binaries $(addsuffix .run.fast,$(BINARIES)) %.run.fast: %.check-exists $(SIM_PREREQ) | $(output_dir) (set -o pipefail && $(NUMA_PREFIX) $(sim) $(PERMISSIVE_ON) $(call get_common_sim_flags,$*) $(PERMISSIVE_OFF) $*