blob: e23abd1bfc33ea3863db042df6872a9354d522c2 (
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
PRJ_NAME = riscv_cpu
TOP_MODULE = top
# Directories
SRC_DIR = src
SIM_DIR = sim
GENTESTVEC_DIR = gentestvec
CST_DIR = cst
BUILD_DIR = build
# 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)
# 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)/$(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
FAMILY = GW1N-9C
DEVICE = GW1NR-LV9QN88PC6/I5
BOARD = tangnano9k
all: simulate
$(BUILD_DIR)/$(PRJ_NAME).json: $(SRC_FILES) | $(BUILD_DIR)
@echo
@echo "=================================================="
@echo " Synthesizing"
@echo "=================================================="
$(YOSYS) -p "synth_gowin -top $(TOP_MODULE)" -o $(BUILD_DIR)/$(PRJ_NAME).json $(SRC_FILES)
@echo "=================================================="
@echo " Completed Synthesis"
@echo "=================================================="
@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)
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)
.PHONY: all simulate bitsream program flash clean
|