| ## Tools |
| CC ?= $(GCC) |
| VV ?= $(VERILATOR) |
| PYTHON ?= python |
| TRACEDIFF ?= $(BP_COMMON_DIR)/software/tracediff.py |
| |
| ## Tool options |
| VV_OPTS = --sc # Output in SystemC rather than C++ |
| #VV_OPTS += --debug --gdbbt # Debugs and produces stack trace |
| VV_OPTS += -O3 |
| |
| #VV_OPTS += -O1 -fstrict-aliasing # Fastest compile time options |
| |
| LINT_OPTS = --lint-only -Wall --Wno-unoptflat |
| BUILD_OPTS = --Wno-fatal --Wno-lint --Wno-style --Wno-widthconcat --Wno-unoptflat --exe -CFLAGS -std=c++11 |
| BUILD_OPTS += -I$(BP_EXTERNAL_DIR)/share/verilator/include/vltstd/ |
| BUILD_OPTS += -LDFLAGS "-L$(BP_EXTERNAL_DIR)/lib -ldramsim -Wl,-rpath=$(BP_EXTERNAL_DIR)/lib" |
| |
| TOP_MODULE ?= testbench |
| |
| DUMP ?= 0 |
| COV ?= 0 |
| |
| .PHONY: dirs.sc lint.sc build.sc run.sc clean.sc |
| |
| run.sc: sim.sc |
| |
| VERILATOR_RUN_DIR ?= $(SYN_PATH)/run_verilator |
| |
| dirs.sc: |
| $(eval RESULTS_DIR := $(RESULTS_PATH)/verilator) |
| $(eval REPORT_DIR := $(REPORT_PATH)/verilator) |
| $(eval SIM_DIR := $(RESULTS_DIR)/$(TB).$(CFG).sim/$(PROG)) |
| $(eval BUILD_DIR := $(RESULTS_DIR)/$(TB).$(CFG).build) |
| $(eval COV_DIR := $(RESULTS_DIR)/$(TB).$(CFG).cov) |
| $(eval LOG_DIR := $(LOG_PATH)/verilator) |
| |
| $(shell mkdir -p $(LOG_DIR)) |
| $(shell mkdir -p $(REPORT_DIR)) |
| |
| LINT_LOG ?= $(LOG_DIR)/$(TB).$(CFG).lint.log |
| LINT_REPORT ?= $(REPORT_DIR)/$(TB).$(CFG).lint.rpt |
| LINT_ERROR ?= $(REPORT_DIR)/$(TB).$(CFG).lint.err |
| lint.sc: dirs.sc |
| $(shell mkdir -p $(BUILD_DIR)) |
| $(eval include $(TB_PATH)/$(TB)/Makefile.frag) |
| -@sed "s/BP_CFG_FLOWVAR/$(CFG)/g" $(TB_PATH)/$(TB)/testbench.v > $(BUILD_DIR)/testbench.v |
| -@sed "s/BP_CFG_FLOWVAR/$(CFG)/g" $(TB_PATH)/$(TB)/wrapper.v > $(BUILD_DIR)/wrapper.v |
| -@cat $(SYN_PATH)/lint_settings.verilator | envsubst > $(BUILD_DIR)/config.vlt |
| -@cp $(TB_PATH)/$(TB)/test_bp.cpp $(BUILD_DIR)/test_bp.cpp |
| -@grep -v -e "^\#" $(SYN_PATH)/flist.verilator > $(BUILD_DIR)/flist.verilator |
| -@grep -v -e "^\#" $(TB_PATH)/$(TB)/flist.verilator >> $(BUILD_DIR)/flist.verilator |
| -@echo $(BUILD_DIR)/wrapper.v >> $(BUILD_DIR)/flist.verilator |
| -@echo $(BUILD_DIR)/testbench.v >> $(BUILD_DIR)/flist.verilator |
| -@echo $(BUILD_DIR)/test_bp.cpp >> $(BUILD_DIR)/flist.verilator |
| cd $(BUILD_DIR); $(VV) $(LINT_OPTS) --top-module $(TOP_MODULE) \ |
| config.vlt -f flist.verilator $(HDL_PARAMS) |& tee $(LINT_LOG) |
| |
| |
| VBUILD_LOG ?= $(LOG_DIR)/$(TB).$(CFG).vbuild.log |
| VBUILD_REPORT ?= $(REPORT_DIR)/$(TB).$(CFG).vbuild.rpt |
| VBUILD_ERROR ?= $(REPORT_DIR)/$(TB).$(CFG).vbuild.err |
| pre-verilate.sc: dirs.sc |
| $(shell mkdir -p $(BUILD_DIR)) |
| $(eval include $(TB_PATH)/$(TB)/Makefile.frag) |
| -@sed "s/BP_CFG_FLOWVAR/$(CFG)/g" $(TB_PATH)/$(TB)/testbench.v > $(BUILD_DIR)/testbench.v |
| -@sed "s/BP_CFG_FLOWVAR/$(CFG)/g" $(TB_PATH)/$(TB)/wrapper.v > $(BUILD_DIR)/wrapper.v |
| -@cat $(SYN_PATH)/coverage_hier.verilator | envsubst > $(BUILD_DIR)/config.vlt |
| -@cp $(TB_PATH)/$(TB)/test_bp.cpp $(BUILD_DIR)/test_bp.cpp |
| -@grep -v -e "^\#" $(SYN_PATH)/flist.verilator > $(BUILD_DIR)/flist.verilator |
| -@grep -v -e "^\#" $(TB_PATH)/$(TB)/flist.verilator >> $(BUILD_DIR)/flist.verilator |
| -@echo $(BUILD_DIR)/wrapper.v >> $(BUILD_DIR)/flist.verilator |
| -@echo $(BUILD_DIR)/testbench.v >> $(BUILD_DIR)/flist.verilator |
| -@echo $(BUILD_DIR)/test_bp.cpp >> $(BUILD_DIR)/flist.verilator |
| |
| verilate.sc: pre-verilate.sc |
| cd $(BUILD_DIR); $(VV) $(VV_OPTS) $(BUILD_OPTS) --top-module $(TOP_MODULE) \ |
| config.vlt -f flist.verilator $(HDL_PARAMS) | tee $(VBUILD_LOG) |
| -@grep "Error" -A 5 $(VBUILD_LOG) > $(VBUILD_ERROR); |
| -@tail -n 2 $(VBUILD_LOG) > $(VBUILD_REPORT) |
| -@test -s $(VBUILD_ERROR) && echo "FAILED" >> $(VBUILD_REPORT) \ |
| || rm $(VBUILD_ERROR) |
| |
| CBUILD_LOG ?= $(LOG_DIR)/$(TB).$(CFG).cbuild.log |
| CBUILD_REPORT ?= $(LOG_DIR)/$(TB).$(CFG).cbuild.rpt |
| CBUILD_ERROR ?= $(LOG_DIR)/$(TB).$(CFG).cbuild.err |
| build.sc: dirs.sc verilate.sc |
| $(MAKE) -C $(BUILD_DIR)/obj_dir -f V$(TOP_MODULE).mk | tee $(CBUILD_LOG) |
| -@grep "Error" -A 5 $(CBUILD_LOG) > $(CBUILD_ERROR) |
| -@tail -n 2 $(CBUILD_LOG) > $(CBUILD_REPORT) |
| -@test -s $(CBUILD_ERROR) && echo "FAILED" >> $(CBUILD_REPORT) \ |
| || rm $(CBUILD_ERROR) |
| |
| ifeq ($(DUMP), 1) |
| VV_OPTS += --trace # Dump a VCD |
| VV_OPTS += --trace-structs # Dump struct information with VCD |
| VV_OPTS += --trace-depth 10 |
| endif |
| |
| ifeq ($(COV), 1) |
| VV_OPTS += --coverage-line |
| VV_OPTS += --coverage-toggle |
| endif |
| |
| sim.sc: SIM_LOG ?= $(LOG_DIR)/$(TB).$(CFG).sim.$(PROG).log |
| sim.sc: SIM_REPORT ?= $(REPORT_DIR)/$(TB).$(CFG).sim.$(PROG).rpt |
| sim.sc: SIM_ERROR ?= $(REPORT_DIR)/$(TB).$(CFG).sim.$(PROG).err |
| sim.sc: PROG ?= rv64ui-p-simple |
| sim.sc: COVERAGE_DAT ?= $(PROG)_coverage.dat |
| sim.sc: dirs.sc |
| $(shell mkdir -p $(SIM_DIR)) |
| $(shell mkdir -p $(COV_DIR)) |
| $(eval include $(TB_PATH)/$(TB)/Makefile.frag) |
| -@ln -sf $(BUILD_DIR)/obj_dir/V$(TOP_MODULE) $(SIM_DIR)/simsc |
| -@cp $(MEM_PATH)/$(PROG).mem $(SIM_DIR)/prog.mem |
| -@cp $(MEM_PATH)/$(PROG).riscv $(SIM_DIR)/prog.elf |
| -@cp $(MEM_PATH)/$(PROG).dump $(SIM_DIR)/prog.dump |
| -@cp $(MEM_PATH)/$(PROG).spike $(SIM_DIR)/prog.spike |
| -@cp $(BP_COMMON_DIR)/test/cfg/$(DRAMSIM_CH_CFG) $(SIM_DIR)/dram_ch.ini |
| -@cp $(BP_COMMON_DIR)/test/cfg/$(DRAMSIM_SYS_CFG) $(SIM_DIR)/dram_sys.ini |
| -@cp $(CCE_MEM_PATH)/$(CCE_MEM) $(SIM_DIR)/cce_ucode.mem |
| -cd $(SIM_DIR); ./simsc | tee $(SIM_LOG) |
| -@grep "PASS" $(SIM_LOG) || echo "FAILED" > $(SIM_ERROR) |
| -@grep "PASS" -A 9 $(SIM_LOG) > $(SIM_REPORT) |
| |
| match.sc: MATCH_LOG ?= $(LOG_DIR)/$(TB).$(CFG).match.$(PROG).log |
| match.sc: MATCH_REPORT ?= $(REPORT_DIR)/$(TB).$(CFG).match.$(PROG).rpt |
| match.sc: MATCH_ERROR ?= $(REPORT_DIR)/$(TB).$(CFG).match.$(PROG).err |
| match.sc: PROG ?= rv64ui-p-simple |
| match.sc: dirs.sc |
| -cd $(SIM_DIR); $(PYTHON) $(TRACEDIFF) prog.spike prog.trace $(START_PC) --tolerance=$(TOLERANCE) \ |
| | tee -a $(MATCH_LOG) |
| -@grep "MATCH" $(MATCH_LOG) || echo "MISMATCHED" >> $(MATCH_ERROR) |
| -@grep "MATCH" -A 4 $(MATCH_LOG) > $(MATCH_REPORT) |
| |
| regress_riscv.sc: $(RV64_REGRESSION_SC) |
| $(RV64_REGRESSION_SC): |
| $(MAKE) sim.sc PROG=$(basename $@) |
| $(COREMARK_REGRESSION_SC): |
| $(MAKE) sim.sc PROG=$(basename $@) |
| regress_beebs.sc: $(BEEBS_REGRESSION_SC) |
| $(BEEBS_REGRESSION_SC): |
| $(MAKE) sim.sc PROG=$(basename $@) |
| |
| $(MC_REGRESSION_SC): |
| $(MAKE) sim.sc CFG=$(CFG) PROG=$(basename $@) |
| |
| cov.sc: COV_LOG ?= $(LOG_DIR)/$(TB).$(CFG).cov.log |
| cov.sc: COV_REPORT ?= $(REPORT_DIR)/$(TB).$(CFG).cov.rpt |
| cov.sc: COV_ERROR ?= $(REPORT_DIR)/$(TB).$(CFG).cov.err |
| cov.sc: dirs.sc |
| cd $(COV_DIR); \ |
| verilator_coverage *.dat --rank | tee $(COV_LOG) |
| -@cp $(COV_LOG) $(COV_REPORT) |
| |
| wave.sc: dirs.sc |
| cd $(SIM_DIR); $(GTKWAVE) -f dump.vcd & |
| |
| debug.sc: dirs.sc |
| @echo "BlackParrot hardware model does not currently support Verilator VCD dumps" |
| exit 1 |
| $(MAKE) regen -C $(UNHARDWARE_DIR) MODEL=$(UNHARDWARE_MODEL) DATA=$(SIM_DIR)/dump.vcd BINARY=$(SIM_DIR)/prog.elf |
| |
| clean.sc: |
| @rm -rf results/verilator |
| @rm -rf reports/verilator |
| @rm -rf logs/verilator |
| |