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
MODULE=tb_control_unit
## Verilog part
.PHONY:sim
sim: waveform.vcd
.PHONY:verilate
verilate: .stamp.verilate
.PHONY:build
build: obj_dir/V$(MODULE)
.PHONY:waves
show: ./waves/$(MODULE).vcd
gtkwave ./waves/$(MODULE).vcd
./waves/cpu_program_%.vcd: ./obj_dir/Vtb_cpu_program_% ./waves
$<
./waves/%.vcd: ./obj_dir/V% ./waves
$<
./waves:
mkdir -p $@
# These are runtime dependencies, not build time dependencies.
.PRECIOUS: ./programs/bin/%.dat ./programs/bin/%.bin
./obj_dir/Vtb_cpu_program_%: ./programs/bin/%.dat testbench/tb_cpu_program.sv src/*.sv
verilator --binary --trace \
-GCPU_PROGRAM_PATH="\"$<\"" \
-GCPU_PROGRAM_NAME="\"$(notdir $(basename $<))\"" \
--trace-max-array 512 \
src/cpu_types.sv \
src/instruction_decoder.sv \
src/control_unit.sv \
src/alu.sv \
src/register_file.sv \
src/program_counter.sv \
src/ram.sv \
src/cpu.sv \
src/file_program_memory.sv \
testbench/tb_cpu_program.sv \
-o Vtb_cpu_program_$(notdir $(basename $<)) \
--top tb_cpu_program
./obj_dir/Vtb_%: testbench/tb_%.sv src/*.sv
verilator --binary --trace \
--trace-max-array 512 \
src/cpu_types.sv \
src/instruction_decoder.sv \
src/control_unit.sv \
src/alu.sv \
src/register_file.sv \
src/program_counter.sv \
src/ram.sv \
src/cpu.sv \
src/file_program_memory.sv \
$< \
--top $(notdir $(basename $<))
## C part
CFLAGS=-march=rv32i -mabi=ilp32 -O0 -c
ASFLAGS=-march=rv32i -mabi=ilp32
LDFLAGS=-Tprograms/link.ld
CC=riscv32-none-elf-gcc
AS=riscv32-none-elf-as
LD=riscv32-none-elf-ld
OBJDUMP=riscv32-none-elf-objdump
OBJCOPY=riscv32-none-elf-objcopy
./programs/bin:
mkdir -p $@
./programs/bin/start.o: ./programs/start.S ./programs/bin
$(AS) $(ASFLAGS) $< -o $@
./programs/bin/%.o: ./programs/%.c ./programs/bin
$(CC) $(CFLAGS) $< -o $@
./programs/bin/start-%.o: ./programs/bin/start.o ./programs/bin/%.o
$(LD) $(LDFLAGS) $^ -o $@
./programs/bin/%.bin: ./programs/bin/start-%.o
$(OBJCOPY) $< -O binary $@
./programs/bin/%.dat: ./programs/bin/%.bin
od $< -t x4 -A n -v > $@
objdump/%: ./programs/bin/start-%.o
$(OBJDUMP) -d -M no-aliases $<
.PHONY: clean
clean:
rm -rf ./waves
rm -rf ./programs/bin
rm -rf ./obj_dir
rm -rf waveform.vcd
rm -rf tests/out
make -C tests/official clean