aboutsummaryrefslogtreecommitdiff
path: root/Makefile
blob: 3591fb5a8190e97cc9dbb6c3393b25a30d930d37 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
PROJ_NAME = riscv_cpu
TOP_MODULE = top

BUILD_DIR = build

SRC_DIR = src
CONSTRAINTS_DIR = constraints
SIM_DIR = sim
GENTESTS_DIR = tests

SOURCES = $(wildcard $(SRC_DIR)/*.v)
TESTBENCH = $(SIM_DIR)/testbench.v
CONSTRAINTS = $(CONSTRAINTS_DIR)/tangnano9k.cst

GENTESTS_SOURCES = $(wildcard $(GENTESTS_DIR)/*.c)
GENTESTS_BINARIES = $(patsubst $(GENTESTS_DIR)/%.c,$(BUILD_DIR)/%,$(GENTESTS_SOURCES))

BITSTREAM = $(BUILD_DIR)/$(PROJ_NAME).fs

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)

$(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)
	@echo "=================================================="
	@echo "Routing"
	@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
	@echo "=================================================="
	@echo "Generating Bitstream"
	@echo "=================================================="

	$(GOWIN_PACK) -d $(FAMILY) -o $(BITSTREAM) $(BUILD_DIR)/$(PROJ_NAME)_pnr.json
	
program: $(BITSTREAM)
	$(PROGRAMMER) -b $(BOARD) $(BITSTREAM)

flash: $(BITSTREAM)
	$(PROGRAMMER) -b $(BOARD) -f $(BITSTREAM)

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 program flash simulate wave clean tests