summaryrefslogtreecommitdiffstats
path: root/Makefile.inner
blob: b1fe73036c136ad9274a47b86614cab8b176cb2e (plain) (blame)
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
HDL_DIR = hdl
BUILD   = build

DEVICE  = GW5A-LV25MG121NES
FAMILY  = GW5A-25A
TOP     = pic_top
CST     = primer25k.cst

MODULE  = -m ghdl
STD     = --std=08

# Synthesizable sources

SYN_VERILOG_FILES = \
	$(HDL_DIR)/prog_rom.v

SYN_VHDL_FILES = \
	$(HDL_DIR)/common.vhd \
	$(HDL_DIR)/decoder.vhd \
	$(HDL_DIR)/fifo.vhd \
	$(HDL_DIR)/uart.vhd \
	$(HDL_DIR)/onewire.vhd \
	$(HDL_DIR)/timer0.vhd \
	$(HDL_DIR)/ALU.vhd \
	$(HDL_DIR)/stack.vhd \
	$(HDL_DIR)/dpram.vhd \
	$(HDL_DIR)/state_machine.vhd \
	$(HDL_DIR)/PIC.vhd \
	$(HDL_DIR)/pic_top.vhd

# Simulation adds the hex-reader package and testbenches
SIM_FILES = \
	$(HDL_DIR)/common.vhd \
	$(HDL_DIR)/decoder.vhd \
	$(HDL_DIR)/hexfile_reader.vhd \
	$(HDL_DIR)/fifo.vhd \
	$(HDL_DIR)/uart.vhd \
	$(HDL_DIR)/onewire.vhd \
	$(HDL_DIR)/timer0.vhd \
	$(HDL_DIR)/ALU.vhd \
	$(HDL_DIR)/stack.vhd \
	$(HDL_DIR)/dpram.vhd \
	$(HDL_DIR)/state_machine.vhd \
	$(HDL_DIR)/PIC.vhd

TB_FILES = \
	$(HDL_DIR)/tb_stack.vhd \
	$(HDL_DIR)/tb_pic.vhd

all: $(BUILD)/$(TOP).fs

$(BUILD):
	mkdir -p $@

# Synthesize
$(BUILD)/$(TOP).json: $(SYN_VHDL_FILES) $(SYN_VERILOG_FILES) | $(BUILD)
	ghdl -a $(STD) --workdir=$(BUILD) $(SYN_VHDL_FILES)
	yosys $(MODULE) -p " \
		ghdl $(STD) --workdir=$(BUILD) $(TOP); \
		read_verilog $(SYN_VERILOG_FILES); \
		synth_gowin -json $@ -family gw5a -nolutram \
		"

# Place and route
$(BUILD)/$(TOP)_pnr.json: $(BUILD)/$(TOP).json $(CST)
	nextpnr-himbaechel --json $< --write $@ \
		--device $(DEVICE) --vopt family=GW5A-25A --vopt cst=$(CST) \
		--vopt sspi_as_gpio --freq 50 --report $(BUILD)/$(TOP)_timing.json \
		--threads $(shell nproc)

# Pack bitstream
$(BUILD)/$(TOP).fs: $(BUILD)/$(TOP)_pnr.json
	gowin_pack --sspi_as_gpio --cpu_as_gpio -d $(FAMILY) -o $@ $<

sim: $(SIM_FILES) $(TB_FILES) | $(BUILD)
	ghdl -a $(STD) --workdir=$(BUILD) $(SIM_FILES) $(TB_FILES)
	ghdl -e $(STD) --workdir=$(BUILD) -o $(BUILD)/tb_stack tb_stack
	$(BUILD)/tb_stack
	ghdl -e $(STD) --workdir=$(BUILD) -o $(BUILD)/tb_pic tb_pic
	$(BUILD)/tb_pic --vcd=$(BUILD)/tb_pic.vcd

$(BUILD)/pic_top.dot: $(SYN_VHDL_FILES) $(SYN_VERILOG_FILES) | $(BUILD)
	ghdl -a $(STD) --workdir=$(BUILD) $(SYN_VHDL_FILES)
	yosys $(MODULE) -p " \
		ghdl $(STD) --workdir=$(BUILD) $(TOP); \
		read_verilog $(SYN_VERILOG_FILES); \
		show -format dot -prefix $(BUILD)/pic_top \
		"

$(BUILD)/uart.dot: $(HDL_DIR)/fifo.vhd $(HDL_DIR)/uart.vhd | $(BUILD)
	ghdl -a $(STD) --workdir=$(BUILD) $(HDL_DIR)/fifo.vhd $(HDL_DIR)/uart.vhd
	yosys $(MODULE) -p "ghdl $(STD) --workdir=$(BUILD) uart; show -format dot -prefix $(BUILD)/uart"

clean:
	rm -rf $(BUILD)

.PHONY: all sim clean