blob: 58f948cfe49bc7803931fa910774ffd2c4c9e194 [file] [log] [blame]
default: build
BOARD ?= icebreaker
TOOLCHAIN_PREFIX ?= riscv32-unknown-elf-
PYTHON ?= python3
FIRMWARE_OBJS = firmware/start.o firmware/main.o
GCC_WARNS = -Werror -Wall -Wextra -Wshadow -Wundef -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings
GCC_WARNS += -Wredundant-decls -Wstrict-prototypes -Wmissing-prototypes -pedantic # -Wconversion
# Sources
RTL = $(wildcard leorv32/rtl/*.sv) $(wildcard soc/rtl/*.sv) $(wildcard uart/rtl/*.sv) $(wildcard util/rtl/*.sv) $(wildcard svga/rtl/*.sv) $(wildcard sram/rtl/*.sv)
TB = $(wildcard soc/tb/*.sv)
# --- Generic Targets ---
sim: sim-${BOARD}
view: view-${BOARD}
synth: synth-${BOARD}
build: build-${BOARD}
upload: upload-${BOARD}
# --- iCEBreaker ---
sim-icebreaker.vvp: $(RTL) $(TB) firmware/firmware.hex
iverilog -Wall -o $@ -g2012 $(RTL) $(TB) -s icebreaker_top_tb `yosys-config --datdir/ice40/cells_sim.v`
sim-icebreaker: sim-icebreaker.vvp
vvp $^ -fst
view-icebreaker:
gtkwave icebreaker_top_tb.fst --save gtkwave/save_icebreaker.gtkw
synth-icebreaker: icebreaker.json
build-icebreaker: icebreaker.bit
upload-icebreaker: icebreaker.bit
iceprog icebreaker.bit
icebreaker.json: $(RTL) firmware/firmware.hex
yosys -l $(basename $@)-yosys.log -DSYNTHESIS -p 'synth_ice40 -top icebreaker_top -json $@' $(RTL)
icebreaker.asc: icebreaker.json
nextpnr-ice40 --up5k --json $< \
--pcf constraints/icebreaker.pcf \
--package sg48 \
--asc $@
icebreaker.bit: icebreaker.asc
icepack $< $@
# --- svga ---
sim-svga.vvp: $(RTL) svga/tb/svga_gen_top_tb.sv
iverilog -Wall -o $@ -g2012 $^ -s svga_gen_top_tb
sim-svga: sim-svga.vvp
vvp $^ -fst
view-svga:
gtkwave svga.fst --save gtkwave/save_svga.gtkw
synth-svga: svga.json
build-svga: svga.bit
upload-svga: svga.bit
iceprog svga.bit
svga.json: svga/rtl/svga_gen.sv svga/rtl/svga_gen_top.sv
yosys -l $(basename $@)-yosys.log -DSYNTHESIS -p 'synth_ice40 -top svga_gen_top -json $@' $(RTL)
svga.asc: svga.json
nextpnr-ice40 --up5k --json $< \
--pcf constraints/icebreaker.pcf \
--package sg48 \
--asc $@
svga.bit: svga.asc
icepack $< $@
# --- ULX3S ---
sim-ulx3s.vvp: $(RTL) $(TB) firmware/firmware.hex
iverilog -Wall -o $@ -g2012 $(RTL) $(TB) -s ulx3s_top_tb `yosys-config --datdir/ecp5/cells_sim.v`
sim-ulx3s: sim-ulx3s.vvp
vvp $^ -fst
view-ulx3s:
gtkwave ulx3s_top_tb.fst --save gtkwave/save_ulx3s.gtkw
synth-ulx3s: ulx3s.json
build-ulx3s: ulx3s.bit
upload-ulx3s: ulx3s.bit
openFPGALoader --board=ulx3s ulx3s.bit
ulx3s.json: $(RTL) firmware/firmware.hex
yosys -l $(basename $@)-yosys.log -DSYNTHESIS -p 'synth_ecp5 -top ulx3s_top -json $@' $(RTL)
ulx3s.config: ulx3s.json
nextpnr-ecp5 --85k --json $< \
--lpf constraints/ulx3s_v20.lpf \
--package CABGA381 \
--textcfg $@
ulx3s.bit: ulx3s.config
ecppack $< $@
# --- Firmware ---
firmware/%.o: firmware/%.c
$(TOOLCHAIN_PREFIX)gcc -c -mabi=ilp32 -march=rv32i -Os --std=c99 $(GCC_WARNS) -ffreestanding -nostdlib -o $@ $<
firmware/start.o: firmware/start.S
$(TOOLCHAIN_PREFIX)gcc -c -mabi=ilp32 -march=rv32i -o $@ $<
firmware/${BOARD}_sections.lds: firmware/sections.lds
$(TOOLCHAIN_PREFIX)gcc -E -x c -DBOARD=${BOARD} -o $@ $^
firmware/firmware.elf: $(FIRMWARE_OBJS) firmware/${BOARD}_sections.lds
$(TOOLCHAIN_PREFIX)gcc -Os -mabi=ilp32 -march=rv32i -ffreestanding -nostdlib -o $@ \
-Wl,--build-id=none,-Bstatic,-T,firmware/${BOARD}_sections.lds,-Map,firmware/firmware.map,--strip-debug \
$(FIRMWARE_OBJS) -lgcc
firmware/firmware.bin: firmware/firmware.elf
$(TOOLCHAIN_PREFIX)objcopy -O binary $< $@
firmware/firmware.hex: firmware/firmware.bin firmware/makehex.py
$(PYTHON) firmware/makehex.py $< 2048 > $@
# --- General ---
.PHONY: clean sim view synth build upload \
sim-icebreaker view-icebreaker synth-icebreaker build-icebreaker upload-icebreaker \
sim-ulx3s view-ulx3s synth-ulx3s build-ulx3s upload-ulx3s
clean:
rm -f *.vvp *.fst *.vcd *.log *.json *.asc *.bin *.bit firmware/*.o firmware/*.elf firmware/*.bin firmware/*.hex firmware/firmware.map
# --- Linting ---
lint:
verible-verilog-lint $(RTL) $(TB) --rules=-unpacked-dimensions-range-ordering
lint-autofix:
verible-verilog-lint $(RTL) $(TB) --autofix inplace-interactive --rules=-unpacked-dimensions-range-ordering
format:
verible-verilog-format --indentation_spaces 4 --module_net_variable_alignment=preserve --case_items_alignment=preserve $(RTL) --inplace --verbose
check-license:
find . -type f -name "*.sv" -exec head -n 1 {} \;