project-rules.mk 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #
  2. # project-rules.mk
  3. #
  4. # Default tools
  5. YOSYS ?= yosys
  6. YOSYS_READ_ARGS ?=
  7. YOSYS_SYNTH_ARGS ?= -dffe_min_ce_use 4 -relut
  8. NEXTPNR ?= nextpnr-ice40
  9. NEXTPNR_ARGS ?= --freq 50
  10. ICEPACK ?= icepack
  11. ICEPROG ?= iceprog
  12. IVERILOG ?= iverilog
  13. ICE40_LIBS ?= $(shell yosys-config --datdir/ice40/cells_sim.v)
  14. # Must be first rule and call it 'all' by convention
  15. all: synth
  16. # Root directory
  17. ROOT := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))/..)
  18. # Temporary build-directory
  19. BUILD_TMP := $(abspath build-tmp)
  20. $(BUILD_TMP):
  21. mkdir -p $(BUILD_TMP)
  22. # Discover all cores
  23. $(foreach core_dir, $(wildcard $(ROOT)/cores/*), $(eval include $(core_dir)/core.mk))
  24. # Resolve dependency tree for project and collect sources
  25. $(BUILD_TMP)/proj-deps.mk: Makefile $(BUILD_TMP) $(addprefix deps-core-,$(PROJ_DEPS))
  26. @echo "PROJ_ALL_DEPS := $(DEPS_SOLVE_TMP)" > $@
  27. @echo "PROJ_ALL_SRCS := $(SRCS_SOLVE_TMP)" >> $@
  28. @echo "PROJ_ALL_PREREQ := $(PREREQ_SOLVE_TMP)" >> $@
  29. include $(BUILD_TMP)/proj-deps.mk
  30. # Make all sources absolute
  31. PROJ_RTL_SRCS := $(abspath $(PROJ_RTL_SRCS))
  32. PROJ_TOP_SRC := $(abspath $(PROJ_TOP_SRC))
  33. PIN_DEF ?= $(abspath data/$(PROJ_TOP_MOD)-$(BOARD).pcf)
  34. # Add those to the list
  35. PROJ_ALL_SRCS += $(PROJ_RTL_SRCS)
  36. PROJ_ALL_PREREQ += $(PROJ_PREREQ)
  37. # Synthesis & Place-n-route rules
  38. $(BUILD_TMP)/$(PROJ).ys: $(PROJ_TOP_SRC) $(PROJ_ALL_SRCS)
  39. @echo "read_verilog $(YOSYS_READ_ARGS) $(PROJ_TOP_SRC) $(PROJ_ALL_SRCS)" > $@
  40. @echo "synth_ice40 $(YOSYS_SYNTH_ARGS) -top $(PROJ_TOP_MOD) -json $(PROJ).json" >> $@
  41. $(BUILD_TMP)/$(PROJ).synth.rpt $(BUILD_TMP)/$(PROJ).json: $(PROJ_ALL_PREREQ) $(BUILD_TMP)/$(PROJ).ys $(PROJ_ALL_SRCS)
  42. cd $(BUILD_TMP) && \
  43. $(YOSYS) -s $(BUILD_TMP)/$(PROJ).ys \
  44. -l $(BUILD_TMP)/$(PROJ).synth.rpt
  45. $(BUILD_TMP)/$(PROJ).pnr.rpt $(BUILD_TMP)/$(PROJ).asc: $(BUILD_TMP)/$(PROJ).json $(PIN_DEF)
  46. $(NEXTPNR) $(NEXTPNR_ARGS) \
  47. --$(DEVICE) --package $(PACKAGE) \
  48. -l $(BUILD_TMP)/$(PROJ).pnr.rpt \
  49. --json $(BUILD_TMP)/$(PROJ).json \
  50. --pcf $(PIN_DEF) \
  51. --asc $@
  52. %.bin: %.asc
  53. $(ICEPACK) -s $< $@
  54. # Simulation
  55. $(BUILD_TMP)/%_tb: sim/%_tb.v $(ICE40_LIBS) $(PROJ_ALL_PREREQ) $(PROJ_ALL_SRCS)
  56. iverilog -Wall -DSIM=1 -o $@ $(ICE40_LIBS) $(PROJ_ALL_SRCS) $<
  57. # Action targets
  58. synth: $(BUILD_TMP)/$(PROJ).bin
  59. sim: $(addprefix $(BUILD_TMP)/, $(PROJ_TESTBENCHES))
  60. prog: $(BUILD_TMP)/$(PROJ).bin
  61. $(ICEPROG) $<
  62. sudo-prog: $(BUILD_TMP)/$(PROJ).bin
  63. @echo 'Executing prog as root!!!'
  64. sudo $(ICEPROG) $<
  65. clean:
  66. @rm -Rf $(BUILD_TMP)
  67. .PHONY: all synth sim prog sudo-prog clean