aboutsummaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
authorFlavian Kaufmann <flavian@flaviankaufmann.ch>2024-05-04 17:16:41 +0200
committerFlavian Kaufmann <flavian@flaviankaufmann.ch>2024-05-04 17:16:41 +0200
commit55b8324987d6253bfd70f069bff804b359e79cf5 (patch)
tree3def430f600095bfdde29194f9a7ed19c215ebdd /Makefile
parent3f3fd75006901cdd01a231785b6a2e43b5dc8a52 (diff)
downloadriscv_cpu-55b8324987d6253bfd70f069bff804b359e79cf5.tar.gz
riscv_cpu-55b8324987d6253bfd70f069bff804b359e79cf5.zip
added support for multiple testbenches
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile142
1 files changed, 88 insertions, 54 deletions
diff --git a/Makefile b/Makefile
index 3591fb5..e23abd1 100644
--- a/Makefile
+++ b/Makefile
@@ -1,58 +1,81 @@
-PROJ_NAME = riscv_cpu
+PRJ_NAME = riscv_cpu
TOP_MODULE = top
-BUILD_DIR = build
-
+# Directories
SRC_DIR = src
-CONSTRAINTS_DIR = constraints
SIM_DIR = sim
-GENTESTS_DIR = tests
+GENTESTVEC_DIR = gentestvec
+CST_DIR = cst
+BUILD_DIR = build
-SOURCES = $(wildcard $(SRC_DIR)/*.v)
-TESTBENCH = $(SIM_DIR)/testbench.v
-CONSTRAINTS = $(CONSTRAINTS_DIR)/tangnano9k.cst
+# Source Files
+SRC_FILES = $(wildcard $(SRC_DIR)/*.v)
+SIM_FILES = $(wildcard $(SIM_DIR)/testbench_*.v)
+GENTESTVEC_FILES = $(wildcard $(GENTESTVEC_DIR)/gentestvec_*.c)
+CST_FILES = $(wildcard $(CST_DIR)/*.cst)
-GENTESTS_SOURCES = $(wildcard $(GENTESTS_DIR)/*.c)
-GENTESTS_BINARIES = $(patsubst $(GENTESTS_DIR)/%.c,$(BUILD_DIR)/%,$(GENTESTS_SOURCES))
+# Output Files
+SIM_EXECUTABLES = $(patsubst $(SIM_DIR)/testbench_%.v, $(BUILD_DIR)/testbench_%,$(SIM_FILES))
+GENTESTVEC_EXECUTABLES = $(patsubst $(GENTESTVEC_DIR)/gentestvec_%.c, $(BUILD_DIR)/gentestvec_%,$(GENTESTVEC_FILES))
+TESTVECTOR_FILES = $(patsubst $(BUILD_DIR)/gentestvec_%, $(BUILD_DIR)/testvec_%.txt, $(GENTESTVEC_EXECUTABLES))
+WAVEFORM_FILES = $(patsubst $(BUILD_DIR)/testbench_%, $(BUILD_DIR)/waveform_%.vcd, $(SIM_EXECUTABLES))
-BITSTREAM = $(BUILD_DIR)/$(PROJ_NAME).fs
+BITSTREAM = $(BUILD_DIR)/$(PRJ_NAME).fs
+
+# Programs
+CC = clang
+CFLAGS = -O3
+
+IVERILOG = iverilog
+VVP = vvp
+GTKWAVE = gtkwave
YOSYS = yosys
NEXTPNR = nextpnr-gowin
GOWIN_PACK = gowin_pack
PROGRAMMER = openFPGALoader
-IVERILOG = iverilog
-VVP = vvp
-GTKWAVE = gtkwave
-CC = clang
FAMILY = GW1N-9C
DEVICE = GW1NR-LV9QN88PC6/I5
BOARD = tangnano9k
-all: $(BITSTREAM)
+all: simulate
-$(BUILD_DIR)/$(PROJ_NAME).json: $(SOURCES)
- @echo "=================================================="
- @echo "Synthesizing"
- @echo "=================================================="
-
- @mkdir -p $(BUILD_DIR)
- $(YOSYS) -p "synth_gowin -top $(TOP_MODULE)" -o $(BUILD_DIR)/$(PROJ_NAME).json $(SOURCES)
-
-$(BUILD_DIR)/$(PROJ_NAME)_pnr.json: $(BUILD_DIR)/$(PROJ_NAME).json $(CONSTRAINTS)
+
+$(BUILD_DIR)/$(PRJ_NAME).json: $(SRC_FILES) | $(BUILD_DIR)
+ @echo
@echo "=================================================="
- @echo "Routing"
+ @echo " Synthesizing"
@echo "=================================================="
-
- $(NEXTPNR) --json $(BUILD_DIR)/$(PROJ_NAME).json --write $(BUILD_DIR)/$(PROJ_NAME)_pnr.json --device $(DEVICE) --family $(FAMILY) --cst $(CONSTRAINTS)
-
-$(BITSTREAM): $(BUILD_DIR)/$(PROJ_NAME)_pnr.json
+ $(YOSYS) -p "synth_gowin -top $(TOP_MODULE)" -o $(BUILD_DIR)/$(PRJ_NAME).json $(SRC_FILES)
@echo "=================================================="
- @echo "Generating Bitstream"
+ @echo " Completed Synthesis"
@echo "=================================================="
-
- $(GOWIN_PACK) -d $(FAMILY) -o $(BITSTREAM) $(BUILD_DIR)/$(PROJ_NAME)_pnr.json
+ @echo
+
+$(BUILD_DIR)/$(PRJ_NAME)_pnr.json: $(BUILD_DIR)/$(PRJ_NAME).json $(CST_FILES)
+ @echo
+ @echo "==================================================="
+ @echo " Routing"
+ @echo "==================================================="
+ $(NEXTPNR) --json $(BUILD_DIR)/$(PRJ_NAME).json --write $(BUILD_DIR)/$(PRJ_NAME)_pnr.json --device $(DEVICE) --family $(FAMILY) --cst $(CST_FILES)
+ @echo "==================================================="
+ @echo " Completed Routing"
+ @echo "==================================================="
+ @echo
+
+$(BITSTREAM): $(BUILD_DIR)/$(PRJ_NAME)_pnr.json
+ @echo
+ @echo "==================================================="
+ @echo " Generating Bitstream"
+ @echo "==================================================="
+ $(GOWIN_PACK) -d $(FAMILY) -o $(BITSTREAM) $(BUILD_DIR)/$(PRJ_NAME)_pnr.json
+ @echo "==================================================="
+ @echo " Generated Bitstream"
+ @echo "==================================================="
+ @echo
+
+bitstream: $(BITSTREAM)
program: $(BITSTREAM)
$(PROGRAMMER) -b $(BOARD) $(BITSTREAM)
@@ -60,28 +83,39 @@ program: $(BITSTREAM)
flash: $(BITSTREAM)
$(PROGRAMMER) -b $(BOARD) -f $(BITSTREAM)
+simulate: $(WAVEFORM_FILES)
+
+# Build the testbench executables
+$(BUILD_DIR)/testbench_%: $(SIM_DIR)/testbench_%.v $(SRC_FILES) | $(BUILD_DIR)
+ $(IVERILOG) -o $@ $^
+
+# Build the test vector generator executables
+$(BUILD_DIR)/gentestvec_%: $(GENTESTVEC_DIR)/gentestvec_%.c | $(BUILD_DIR)
+ $(CC) $(CFLAGS) -o $@ $<
+
+# Generate the test vector files
+$(BUILD_DIR)/testvec_%.txt: $(BUILD_DIR)/gentestvec_%
+ $< > $@
+
+# Run the simulation and generate the waveform files
+$(BUILD_DIR)/waveform_%.vcd: $(BUILD_DIR)/testbench_% $(BUILD_DIR)/testvec_%.txt
+ @echo
+ @echo "==================================================="
+ @echo " Running Testbench ($*)"
+ @echo "==================================================="
+ $(VVP) $< +testvec=$(BUILD_DIR)/testvec_$*.txt +waveform=$@
+ @echo "==================================================="
+ @echo " Completed Testbench ($*)"
+ @echo "==================================================="
+ @echo
+
+# Create the build directory
+$(BUILD_DIR):
+ mkdir -p $(BUILD_DIR)
+
+# Clean
clean:
rm -rf $(BUILD_DIR)
-$(BUILD_DIR)/%: $(GENTESTS_DIR)/%.c
- @mkdir -p $(BUILD_DIR)
- $(CC) -o $@ $<
-
-tests: $(GENTESTS_BINARIES)
- @for bin in $(GENTESTS_BINARIES); do \
- ./$$bin > $$bin.txt; \
- done
-
-simulate: $(BUILD_DIR)/testbench.vcd
-
-wave: $(BUILD_DIR)/testbench.vcd
- $(GTKWAVE) $(BUILD_DIR)/testbench.vcd
-
-$(BUILD_DIR)/testbench: $(SOURCES) $(TESTBENCH)
- @mkdir -p $(BUILD_DIR)
- $(IVERILOG) -o $(BUILD_DIR)/testbench $(SOURCES) $(TESTBENCH)
-
-$(BUILD_DIR)/testbench.vcd: $(BUILD_DIR)/testbench tests
- cd $(BUILD_DIR); $(VVP) testbench
+.PHONY: all simulate bitsream program flash clean
-.PHONY: all program flash simulate wave clean tests