include ../project_paths.mk TOP := tb DOTF := tb.f CONFIG := default TBEXEC := $(patsubst %.f,%,$(DOTF)) ifneq ($(CONFIG),default) TBEXEC := $(TBEXEC)-$(CONFIG) endif FILE_LIST := $(shell HDL=$(HDL) $(SCRIPTS)/listfiles ../tb_common/hdl/$(DOTF)) VINCDIR := $(shell HDL=$(HDL) $(SCRIPTS)/listfiles -f flati ../tb_common/hdl/$(DOTF)) BUILD_DIR := build-$(patsubst %.f,%,$(DOTF)) VOBJ_DIR := $(BUILD_DIR)/obj_dir VLIB := $(VOBJ_DIR)/V$(TOP)__ALL.a VERILATED_OBJS := $(VOBJ_DIR)/verilated.o $(VOBJ_DIR)/verilated_threads.o VERILATOR_ROOT := $(shell verilator --getenv VERILATOR_ROOT) CXX := g++ VERILATOR := verilator TB_CFILES := tb.cpp $(wildcard ../tb_common/*.cpp) CINCLUDE := $(VOBJ_DIR) $(VERILATOR_ROOT)/include ../tb_common/include .PHONY: clean all lint vcc vlib all: $(TBEXEC) vcc: $(BUILD_DIR)/vcc.touch vlib: $(BUILD_DIR)/vlib.touch $(BUILD_DIR)/vcc.touch: $(FILE_LIST) $(wildcard *.vh) mkdir -p $(VOBJ_DIR) $(VERILATOR) --Mdir $(VOBJ_DIR) --cc --top-module $(TOP) $(addprefix -I,$(VINCDIR)) -DCONFIG_HEADER="\"config_$(CONFIG).vh\"" $(FILE_LIST) touch $@ $(BUILD_DIR)/vlib.touch: $(BUILD_DIR)/vcc.touch # Verilator's archive (Vtb__ALL.a) does not include the run-time objects # (verilated.o/verilated_threads.o). Build them explicitly so the final # tb link step succeeds across Verilator versions/distros. $(MAKE) VERILATOR_ROOT=$(VERILATOR_ROOT) -C $(VOBJ_DIR) -f V$(TOP).mk \ V$(TOP)__ALL.a verilated.o verilated_threads.o touch $@ clean:: rm -rf $(BUILD_DIR) $(TBEXEC) $(TBEXEC): $(BUILD_DIR)/vlib.touch $(TB_CFILES) $(CXX) -O3 -std=c++14 $(addprefix -D,$(CDEFINES) $(CDEFINES_$(DOTF))) \ $(addprefix -I ,$(CINCLUDE)) $(TB_CFILES) $(VLIB) $(VERILATED_OBJS) -o $(TBEXEC) -pthread -latomic lint: $(VERILATOR) --lint-only --top-module $(TOP) $(addprefix -I,$(VINCDIR)) -DCONFIG_HEADER="\"config_$(CONFIG).vh\"" $(FILE_LIST)