summaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2023-10-05 00:36:37 -0600
committerAlejandro Soto <alejandro@34project.org>2023-10-05 13:07:57 -0600
commit4acd900c4602db0353d11bf6841ddadfd80c57b8 (patch)
treefe24637ccd16fefcf25f0c8d8e65b01d19a1760c /Makefile
parentd173727c1ed34652613fc046d522a43ac9ef015e (diff)
Makefile, tb: add support for cocotb
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile68
1 files changed, 50 insertions, 18 deletions
diff --git a/Makefile b/Makefile
index e2bdbe9..813990c 100644
--- a/Makefile
+++ b/Makefile
@@ -13,6 +13,7 @@ DEMO_OBJ_DIR := $(OBJ_DIR)/$(TOP)/demo
DIST_OBJ_DIR := $(OBJ_DIR)/$(TOP)/dist
RBF_OUT_DIR := output_files
VERILATOR ?= verilator
+COCOTB_CONFIG ?= cocotb-config
GENHTML ?= genhtml
COCOTB_CONFIG ?= cocotb-config
CROSS_CC := $(CROSS_COMPILE)gcc
@@ -20,6 +21,14 @@ CROSS_OBJCOPY := $(CROSS_COMPILE)objcopy
CROSS_CFLAGS := -O3 -Wall -Wextra -Werror
CROSS_LDFLAGS :=
+ifeq ($(shell which $(VERILATOR)),)
+ $(error verilator not found)
+endif
+
+ifeq ($(shell which $(COCOTB_CONFIG)),)
+ $(error cocotb not found)
+endif
+
ifdef FASTER_IS_BETTER
DISABLE_COV := 1
DISABLE_RAND := 1
@@ -29,6 +38,8 @@ ifdef FASTER_IS_BETTER
LDFLAGS += -O3 -flto
endif
+CXXFLAGS += -iquote $(shell pwd)/$(TB_DIR)
+
export CXXFLAGS LDFLAGS
X_MODE := $(if $(DISABLE_RAND),fast,unique)
@@ -41,11 +52,23 @@ VFLAGS ?= \
$(if $(DISABLE_TRACE),,--trace --trace-fst --trace-structs) \
$(if $(DISABLE_COV),,--coverage)
-RTL_FILES = $(shell find $(RTL_DIR)/ ! -path '$(RTL_DIR)/top/*' -type f -name '*.sv')
+VFLAGS += -O3 --cc --exe -y $(RTL_DIR) --prefix Vtop
+
+LIBPYTHON = $(shell $(COCOTB_CONFIG) --libpython)
+
+COCOTB_LDFLAGS := $(LDFLAGS) \
+ -Wl,-rpath,$(shell $(COCOTB_CONFIG) --lib-dir) \
+ -L$(shell $(COCOTB_CONFIG) -config --lib-dir) \
+ -Wl,-rpath,$(dir $(LIBPYTHON)) \
+ -lcocotbvpi_verilator -lgpi -lcocotb -lgpilog -lcocotbutils
+
+RTL_FILES := $(shell find $(RTL_DIR)/ ! -path '$(RTL_DIR)/top/*' -type f -name '*.sv')
RTL_FILES += $(shell find $(TB_DIR)/ ! -path '$(TB_DIR)/top/*' -type f -name '*.sv')
-TB_FILES = $(shell find $(TB_DIR)/ ! -path '$(TB_DIR)/top/*' -type f -name '*.cpp')
+TB_FILES := $(shell find $(TB_DIR)/ ! -path '$(TB_DIR)/top/*' -type f -name '*.cpp')
-SIMS := $(patsubst $(TB_SIM_DIR)/%.py,%,$(wildcard $(TB_SIM_DIR)/*.py))
+SIMS := \
+ $(patsubst $(TB_SIM_DIR)/%.py,%,$(wildcard $(TB_SIM_DIR)/*.py)) \
+ $(patsubst $(TB_DIR)/top/%.py,%,$(wildcard $(TB_DIR)/top/*.py))
GIT_REV := $(shell if [ -d .git ]; then echo -$$(git rev-parse --short HEAD); fi)
@@ -69,18 +92,25 @@ dist: $(if $(DISABLE_COV),,cov)
sim: $(addprefix sim/,$(SIMS))
-sim/%: $(SIM_DIR)/sim.py $(TB_SIM_DIR)/%.py exe/$(TOP) $(SIM_OBJ_DIR)/%.bin
- @$(if $(DISABLE_TRACE),,mkdir -p $(FST_DIR)/$*)
- @$< $(TB_SIM_DIR)/$*.py $(OBJ_DIR)/$(TOP)/V$(TOP) \
+sim/%: $(SIM_DIR)/sim.py $(TB_SIM_DIR)/%.py exe/$(TOP) $(SIM_OBJ_DIR)/%.bin $(FST_DIR)/%
+ @$< $(TB_SIM_DIR)/$*.py $(OBJ_DIR)/$(TOP)/Vtop \
$(SIM_OBJ_DIR)/$*.bin \
$(if $(DISABLE_COV),,--coverage $(SIM_OBJ_DIR)/$*.cov) \
$(if $(DISABLE_TRACE),,--trace $(FST_DIR)/$*/trace$(GIT_REV).fst)
+sim/%: $(TB_DIR)/top/%.py exe/% $(FST_DIR)/%
+ @LIBPYTHON_LOC=$(LIBPYTHON) MODULE=tb.top.$* \
+ $(if $(SIM_SEED),RANDOM_SEED=$(SIM_SEED)) \
+ $(OBJ_DIR)/$*/Vtop
+
+$(FST_DIR)/%:
+ @mkdir -p $@
+
vmlaunch: $(SIM_DIR)/sim.py $(SIM_DIR)/gdbstub.py exe/$(TOP)
- @ENABLE_VIDEO=1 $< $(SIM_DIR)/gdbstub.py $(OBJ_DIR)/$(TOP)/V$(TOP) build/u-boot.bin
+ @ENABLE_VIDEO=1 $< $(SIM_DIR)/gdbstub.py $(OBJ_DIR)/$(TOP)/Vtop build/u-boot.bin
demo: $(SIM_DIR)/sim.py $(SIM_DIR)/gdbstub.py exe/$(TOP) $(DEMO_OBJ_DIR)/demo.bin
- @START_HALTED=0 $< $(SIM_DIR)/gdbstub.py $(OBJ_DIR)/$(TOP)/V$(TOP) $(DEMO_OBJ_DIR)/demo.bin
+ @START_HALTED=0 $< $(SIM_DIR)/gdbstub.py $(OBJ_DIR)/$(TOP)/Vtop $(DEMO_OBJ_DIR)/demo.bin
ifndef DISABLE_COV
$(COV_DIR): $(OBJ_DIR)/$(TOP)/cov.info
@@ -130,23 +160,25 @@ $(SIM_OBJ_DIR)/%.o: $(SIM_DIR)/%.S
exe: exe/$(TOP)
-exe/%: $(OBJ_DIR)/%/V%.mk
- $(MAKE) -C $(OBJ_DIR)/$* -f V$*.mk
+exe/%: $(OBJ_DIR)/%/Vtop.mk
+ @CXXFLAGS="$(CXXFLAGS) -iquote $(shell pwd)/$(TB_DIR)/top/$*" \
+ $(MAKE) -C $(OBJ_DIR)/$* -f Vtop.mk
-.PRECIOUS: $(SIM_OBJ_DIR)/% $(SIM_OBJ_DIR)/%.o $(SIM_OBJ_DIR)/%.cov %.bin
+.PRECIOUS: $(OBJ_DIR)/%.mk $(SIM_OBJ_DIR)/% $(SIM_OBJ_DIR)/%.o $(SIM_OBJ_DIR)/%.cov %.bin
.PHONY: all clean dist demo sim
.SECONDEXPANSION:
$(OBJ_DIR)/%.mk: \
$(RTL_DIR)/top/$$(word 1,$$(subst /, ,$$*)).sv \
- $$(shell find $(RTL_DIR)/top/$$(dir $$*) -type f -name '*.sv' 2>/dev/null) \
- $$(shell find $(TB_DIR)/top/$$(dir $$*) -type f -name '*.sv' 2>/dev/null) \
+ $$(shell find $(RTL_DIR)/top/$$(dir $$*) -type f 2>/dev/null) \
$(RTL_FILES) $(TB_FILES) $(TB_DIR)/top/$$(word 1,$$(subst /, ,$$*)).cpp \
- $$(shell find $(TB_DIR)/top/$$(dir $$*) -type f -name '*.cpp' 2>/dev/null)
+ $$(shell find $(TB_DIR)/top/$$(dir $$*) -type f 2>/dev/null)
mkdir -p $(dir $@)
- $(VERILATOR) \
- -O3 --cc --exe -y $(RTL_DIR) --Mdir $(dir $@) \
- --top $(word 1,$(subst /, ,$*)) $(patsubst tb/%,../tb/%,$^) \
- $(VFLAGS)
+ $(VERILATOR) $(VFLAGS) \
+ --Mdir $(dir $@) --top $(word 1,$(subst /, ,$*)) \
+ $(filter %.sv %.cpp,$(patsubst tb/%,../tb/%,$^)) \
+ $(if $(filter $(TOP),$(word 1,$(subst /, ,$*))),, \
+ --vpi --public-flat-rw -LDFLAGS "$(COCOTB_LDFLAGS) $(LIBPYTHON)" \
+ $(shell $(COCOTB_CONFIG) --share)/lib/verilator/verilator.cpp)