# SPDX-License-Identifier: AGPL-3.0-Only # Copyright (C) 2022 Sean Anderson Q = 1 ADOC = asciidoctor SYNTH = yosys PNR = nextpnr-ice40 ICARUS = iverilog ICEPACK = icepack VVP = vvp .DELETE_ON_ERROR: .PHONY: all all: examples/breakout_hub/top.bin .PHONY: FORCE FORCE: log: mkdir $@ INCDIRS := rtl LIBDIRS := rtl lib/verilog-lfsr/rtl %.synth.json: %.v | log $(SYNTH) -q -E $@.d -b json -o $@ -l log/$(*F).synth \ -p "read_verilog $(addprefix -I ,$(INCDIRS)) -sv $<" \ -p "hierarchy $(addprefix -libdir ,$(LIBDIRS) $( $@ endef %.synth.v: %.synth.json %.v $(run-jsontov) %.place.v: %.place.json %.v $(run-jsontov) IFLAGS := -g2012 -gspecify -Wall # Don't warn about including the timescale from common.vh IFLAGS += -Wno-timescale # Don't warn about mem2reg sensitivity IFLAGS += -Wno-sensitivity-entire-array EXTRA_V := rtl/iverilog_dump.v define run-icarus = $(ICARUS) $(IFLAGS) -I$( $@.d; RET=$$?; rm -f $@.pre; exit $$RET endef %.vvp: TOP = $(*F) %.vvp: %.v rtl/iverilog_dump.v $(run-icarus) %.synth.vvp: TOP = $(*F) %.synth.vvp %.place.vvp: EXTRA_V += $(shell $(SYNTH)-config --datdir)/ice40/cells_sim.v # Don't warn about unused SB_IO ports %.synth.vvp: IFLAGS += -Wno-portbind %.synth.vvp: %.synth.v rtl/iverilog_dump.v $(run-icarus) %.place.vvp: TOP = top # Don't warn about unused SB_IO ports %.place.vvp: IFLAGS += -Wno-portbind %.place.vvp: IFLAGS += -DTIMING -Ttyp %.place.vvp: %.place.v rtl/iverilog_dump.v $(run-icarus) PNRARGS := --freq 125 --hx8k --package ct256 --pcf-allow-unconstrained --no-promote-globals PNRARGS += --no-print-critical-path-source define run-pnr = $(PNR) -q $(PNRARGS) --json $< --log log/$(*F).$(LOG_EXT) endef %.sdf %.place.json &: PNRARGS += --write $*.place.json --sdf $*.sdf %.sdf %.place.json &: LOG_EXT := place %.sdf %.place.json &: %.synth.json | log $(run-pnr) PNR_RETRIES := 10 %.asc: PNRARGS += --pcf $*.pcf --asc $@ -r %.asc: LOG_EXT := asc %.asc: %.synth.json %.pcf | log for i in $$(seq $(PNR_RETRIES)); do \ if $(run-pnr); then \ exit 0; \ fi \ done; \ exit 1 %.bin: %.asc $(ICEPACK) $< $@ -include $(wildcard rtl/*.d) -include $(wildcard examples/*/*.d) export LIBPYTHON_LOC := $(shell cocotb-config --libpython) VVPFLAGS := -M $(shell cocotb-config --lib-dir) VVPFLAGS += -m $(shell cocotb-config --lib-name vpi icarus) PLUSARGS = -fst +vcd=$@ # Always use color output if we have a tty. This allows for easy use of -O ifeq ($(shell test -c /dev/stdin && echo 1),1) export COCOTB_ANSI_OUTPUT=1 endif # There are too my columns by default; reduce them export COCOTB_REDUCED_LOG_FMT=2 define run-vvp = MODULE=tb.$* $(VVP) $(VVPFLAGS) $< $(PLUSARGS) endef %.fst: PLUSARGS += +levels=0 %.fst: rtl/%.vvp tb/%.py FORCE $(run-vvp) %.synth.fst: PLUSARGS += +levels=1 %.synth.fst: rtl/%.synth.vvp tb/%.py FORCE $(run-vvp) %.place.fst: PLUSARGS += +levels=1 +sdf=rtl/$*.sdf %.place.fst: rtl/%.place.vvp rtl/%.sdf tb/%.py FORCE $(run-vvp) MODULES += axis_replay_buffer MODULES += axis_mii_tx MODULES += axis_wb_bridge MODULES += descramble MODULES += hub MODULES += hub_core MODULES += led_blinker MODULES += mdio MODULES += mdio_io MODULES += mdio_regs MODULES += mii_elastic_buffer MODULES += mii_io_rx MODULES += mii_io_tx MODULES += nrzi_decode MODULES += nrzi_encode MODULES += pcs_rx MODULES += pcs_tx MODULES += phy_core MODULES += pmd_dp83223 MODULES += pmd_dp83223_rx MODULES += reset_sync MODULES += scramble MODULES += uart_tx MODULES += uart_rx MODULES += uart_wb_bridge MODULES += wb_mux MODULES += wb_reg .PHONY: test test: $(addsuffix .fst,$(MODULES)) $(addsuffix .synth.fst,$(MODULES)) #test: $(addsuffix .place.fst,$(MODULES)) .PHONY: asc asc: $(addprefix rtl/,$(addsuffix .asc,$(MODULES))) doc/output: mkdir -p $@ doc/output/%.html: doc/%.adoc doc/docinfo.html | doc/output $(ADOC) -o $@ $< DOCS += index DOCS += interfaces DOCS += uart_wb_bridge .PHONY: htmldocs htmldocs: $(addprefix doc/output/,$(addsuffix .html,$(DOCS))) CLEAN_EXT := .json .asc .pre .vvp .d .synth.v .place.v .sdf .bin .PHONY: clean clean: rm -f *.fst rm -rf log rm -f $(addprefix rtl/*,$(CLEAN_EXT)) rm -f $(addprefix examples/*/*,$(CLEAN_EXT)) rm -rf doc/output