blob: e3dcab05450bbaba8ee33479ef20fc0f227746b2 [file] [log] [blame]
## 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