From a4b94d40e61e634aa8e970af3911a7671e7d8d50 Mon Sep 17 00:00:00 2001 From: Alejandro Soto Date: Sat, 27 Apr 2024 11:30:47 -0600 Subject: mk: implement peakrdl support --- mk/builtin/mod.mk | 5 ++ mk/builtin/peakrdl_intfs/apb3_intf.sv | 40 +++++++++++++++ mk/builtin/peakrdl_intfs/apb4_intf.sv | 46 +++++++++++++++++ mk/builtin/peakrdl_intfs/avalon_mm_intf.sv | 46 +++++++++++++++++ mk/builtin/peakrdl_intfs/axi4lite_intf.sv | 80 ++++++++++++++++++++++++++++++ mk/cores.mk | 16 +++++- mk/peakrdl.mk | 20 ++++++++ mk/tools.mk | 1 + mk/top.mk | 7 ++- mk/verilator.mk | 5 +- 10 files changed, 262 insertions(+), 4 deletions(-) create mode 100644 mk/builtin/mod.mk create mode 100644 mk/builtin/peakrdl_intfs/apb3_intf.sv create mode 100644 mk/builtin/peakrdl_intfs/apb4_intf.sv create mode 100644 mk/builtin/peakrdl_intfs/avalon_mm_intf.sv create mode 100644 mk/builtin/peakrdl_intfs/axi4lite_intf.sv create mode 100644 mk/peakrdl.mk diff --git a/mk/builtin/mod.mk b/mk/builtin/mod.mk new file mode 100644 index 0000000..18d7b32 --- /dev/null +++ b/mk/builtin/mod.mk @@ -0,0 +1,5 @@ +cores := peakrdl_intfs + +define core/peakrdl_intfs + $(this)/rtl_dirs := peakrdl_intfs +endef diff --git a/mk/builtin/peakrdl_intfs/apb3_intf.sv b/mk/builtin/peakrdl_intfs/apb3_intf.sv new file mode 100644 index 0000000..d18d3a0 --- /dev/null +++ b/mk/builtin/peakrdl_intfs/apb3_intf.sv @@ -0,0 +1,40 @@ +interface apb3_intf #( + parameter DATA_WIDTH = 32, + parameter ADDR_WIDTH = 32 +); + // Command + logic PSEL; + logic PENABLE; + logic PWRITE; + logic [ADDR_WIDTH-1:0] PADDR; + logic [DATA_WIDTH-1:0] PWDATA; + + // Response + logic [DATA_WIDTH-1:0] PRDATA; + logic PREADY; + logic PSLVERR; + + modport master ( + output PSEL, + output PENABLE, + output PWRITE, + output PADDR, + output PWDATA, + + input PRDATA, + input PREADY, + input PSLVERR + ); + + modport slave ( + input PSEL, + input PENABLE, + input PWRITE, + input PADDR, + input PWDATA, + + output PRDATA, + output PREADY, + output PSLVERR + ); +endinterface diff --git a/mk/builtin/peakrdl_intfs/apb4_intf.sv b/mk/builtin/peakrdl_intfs/apb4_intf.sv new file mode 100644 index 0000000..4a554f8 --- /dev/null +++ b/mk/builtin/peakrdl_intfs/apb4_intf.sv @@ -0,0 +1,46 @@ +interface apb4_intf #( + parameter DATA_WIDTH = 32, + parameter ADDR_WIDTH = 32 +); + // Command + logic PSEL; + logic PENABLE; + logic PWRITE; + logic [2:0] PPROT; + logic [ADDR_WIDTH-1:0] PADDR; + logic [DATA_WIDTH-1:0] PWDATA; + logic [DATA_WIDTH/8-1:0] PSTRB; + + // Response + logic [DATA_WIDTH-1:0] PRDATA; + logic PREADY; + logic PSLVERR; + + modport master ( + output PSEL, + output PENABLE, + output PWRITE, + output PPROT, + output PADDR, + output PWDATA, + output PSTRB, + + input PRDATA, + input PREADY, + input PSLVERR + ); + + modport slave ( + input PSEL, + input PENABLE, + input PWRITE, + input PPROT, + input PADDR, + input PWDATA, + input PSTRB, + + output PRDATA, + output PREADY, + output PSLVERR + ); +endinterface diff --git a/mk/builtin/peakrdl_intfs/avalon_mm_intf.sv b/mk/builtin/peakrdl_intfs/avalon_mm_intf.sv new file mode 100644 index 0000000..1d3d0c3 --- /dev/null +++ b/mk/builtin/peakrdl_intfs/avalon_mm_intf.sv @@ -0,0 +1,46 @@ +interface avalon_mm_intf #( + parameter DATA_WIDTH = 32, + parameter ADDR_WIDTH = 32 // Important! Avalon uses word addressing +); + // Command + logic read; + logic write; + logic waitrequest; + logic [ADDR_WIDTH-1:0] address; + logic [DATA_WIDTH-1:0] writedata; + logic [DATA_WIDTH/8-1:0] byteenable; + + // Response + logic readdatavalid; + logic writeresponsevalid; + logic [DATA_WIDTH-1:0] readdata; + logic [1:0] response; + + modport host ( + output read, + output write, + input waitrequest, + output address, + output writedata, + output byteenable, + + input readdatavalid, + input writeresponsevalid, + input readdata, + input response + ); + + modport agent ( + input read, + input write, + output waitrequest, + input address, + input writedata, + input byteenable, + + output readdatavalid, + output writeresponsevalid, + output readdata, + output response + ); +endinterface diff --git a/mk/builtin/peakrdl_intfs/axi4lite_intf.sv b/mk/builtin/peakrdl_intfs/axi4lite_intf.sv new file mode 100644 index 0000000..b0a232d --- /dev/null +++ b/mk/builtin/peakrdl_intfs/axi4lite_intf.sv @@ -0,0 +1,80 @@ +interface axi4lite_intf #( + parameter DATA_WIDTH = 32, + parameter ADDR_WIDTH = 32 +); + logic AWREADY; + logic AWVALID; + logic [ADDR_WIDTH-1:0] AWADDR; + logic [2:0] AWPROT; + + logic WREADY; + logic WVALID; + logic [DATA_WIDTH-1:0] WDATA; + logic [DATA_WIDTH/8-1:0] WSTRB; + + logic BREADY; + logic BVALID; + logic [1:0] BRESP; + + logic ARREADY; + logic ARVALID; + logic [ADDR_WIDTH-1:0] ARADDR; + logic [2:0] ARPROT; + + logic RREADY; + logic RVALID; + logic [DATA_WIDTH-1:0] RDATA; + logic [1:0] RRESP; + + modport master ( + input AWREADY, + output AWVALID, + output AWADDR, + output AWPROT, + + input WREADY, + output WVALID, + output WDATA, + output WSTRB, + + output BREADY, + input BVALID, + input BRESP, + + input ARREADY, + output ARVALID, + output ARADDR, + output ARPROT, + + output RREADY, + input RVALID, + input RDATA, + input RRESP + ); + + modport slave ( + output AWREADY, + input AWVALID, + input AWADDR, + input AWPROT, + + output WREADY, + input WVALID, + input WDATA, + input WSTRB, + + input BREADY, + output BVALID, + output BRESP, + + output ARREADY, + input ARVALID, + input ARADDR, + input ARPROT, + + input RREADY, + output RVALID, + output RDATA, + output RRESP + ); +endinterface diff --git a/mk/cores.mk b/mk/cores.mk index 7ff373d..5c71272 100644 --- a/mk/cores.mk +++ b/mk/cores.mk @@ -10,18 +10,30 @@ all_stamps := top_stamp = $(call core_stamp,$(rule_top)) core_stamp = $(obj)/deps/$(core_info/$(1)/path)/stamp -core_paths = \ +core_paths_no_dyn = \ $(patsubst /%,%, \ $(patsubst /,., \ $(abspath \ $(let prefix,$(core_info/$(1)/workdir), \ - $(addprefix /$(if $(prefix),$(prefix)/),$(core_info/$(1)/$(2))))))) + $(foreach path_elem,$(core_info/$(1)/$(2)), \ + $(if $(patsubst /%,,$(path_elem)), \ + $(addprefix /$(if $(prefix),$(prefix)/),$(path_elem)), \ + $(path_elem))))))) + +core_paths = \ + $(call core_paths_no_dyn,$(1),$(2)) $(call core_paths_no_dyn,$(1),$(call target_var,$(2))) require_core_paths = \ $(strip \ $(let val,$(strip $(call core_paths,$(1),$(2))), \ $(if $(val),$(val),$(error core '$(1)' must define '$(2)')))) +core_paths_dyn = $(call core_paths,$(1),$(call target_var,$(2))) + +define add_core_dyn + core_info/$(1)/$(call target_var,$(2)) := $(core_info/$(1)/$(call target_var,$(2))) $(3) +endef + require_core_var = \ $(strip \ $(let val,$(core_info/$(1)/$(2)), \ diff --git a/mk/peakrdl.mk b/mk/peakrdl.mk new file mode 100644 index 0000000..8e39634 --- /dev/null +++ b/mk/peakrdl.mk @@ -0,0 +1,20 @@ +regblock_out = $(obj)/regblock/$(regblock_core) +regblock_rdl = $(call require_core_paths,$(regblock_core),regblock_rdl) +regblock_top = $(call require_core_var,$(regblock_core),regblock_top) +regblock_cpuif = $(call require_core_var,$(regblock_core),regblock_cpuif) + +define hooks/regblock + regblock_core := $(1) + regblock_rtl := $$(addprefix $$(regblock_out)/,$$(regblock_top)_pkg.sv $$(regblock_top).sv) + + core_info/$(1)/deps += peakrdl_intfs + $$(eval $$(call add_core_dyn,$(1),rtl_files,$$(addprefix /,$$(regblock_rtl)))) + + $$(regblock_rtl) &: $$(top_stamp) $$(regblock_rdl) + $$(eval regblock_core := $(1)) + $$(call run,REGBLOCK,$$(core_info/$(1)/path)) $$(PEAKRDL) regblock $$(regblock_rdl) \ + -o $$(regblock_out) --cpuif=$$(regblock_cpuif) --rename=$$(regblock_top) \ + $$(core_info/$(1)/regblock_args) + + $(call target_entrypoint,$$(regblock_rtl)) +endef diff --git a/mk/tools.mk b/mk/tools.mk index 9df3eff..d5ea853 100644 --- a/mk/tools.mk +++ b/mk/tools.mk @@ -1,6 +1,7 @@ define find_tools_lazy $(call find_command_lazy,cocotb-config,COCOTB_CONFIG) $(call find_command_lazy,genhtml,GENHTML) + $(call find_command_lazy,peakrdl,PEAKRDL) $(call find_command_lazy,pkg-config,PKG_CONFIG) $(call find_command_lazy,qsys-generate,QSYS_GENERATE) $(call find_command_lazy,quartus,QUARTUS) diff --git a/mk/top.mk b/mk/top.mk index aede1e5..fe8023e 100644 --- a/mk/top.mk +++ b/mk/top.mk @@ -31,6 +31,7 @@ include mk/cocotb.mk include mk/cores.mk include mk/cov.mk include mk/output.mk +include mk/peakrdl.mk include mk/quartus.mk include mk/target.mk include mk/tools.mk @@ -43,7 +44,7 @@ ifneq (,$(target)) $(eval $(target/$(target)/prepare)) endif -$(foreach top_dir,$(core_dirs), \ +$(foreach top_dir,mk/builtin $(core_dirs), \ $(eval $(call add_core_subdir,$(top_dir)))) top_path := $(core_info/$(top)/path) @@ -64,6 +65,10 @@ define build_target_top $$(eval $$(setup_obj)) $$(eval $$(setup_stamp_rules)) + $$(foreach core,$$(all_cores), \ + $$(foreach hook,$$(core_info/$$(core)/hooks), \ + $$(eval $$(call hooks/$$(hook),$$(core))))) + $$(eval $$(target/$$(rule_target)/rules)) obj/$$(rule_target)/$$(rule_top) := $$(obj) diff --git a/mk/verilator.mk b/mk/verilator.mk index cc63ea1..805199b 100644 --- a/mk/verilator.mk +++ b/mk/verilator.mk @@ -92,7 +92,7 @@ define verilator_target_rules $$(vtop_mk_file): @rm -f $$@ - $$(vtop_mk_stamp): $$(top_stamp) $$(vtop_mk_file) + $$(vtop_mk_stamp): $$(top_stamp) $$(vtop_mk_file) $$(verilator_hard_deps) $$(eval $$(final_vflags)) $$(call run,VERILATE) $$(VERILATOR) $$(vl_flags) $$(verilator_src_args) @touch $$@ @@ -100,6 +100,9 @@ define verilator_target_rules $(call target_entrypoint,$$(vtop_exe)) endef +verilator_hard_deps = \ + $(foreach dep,$(dep_tree/$(rule_top)),$(call core_paths_dyn,$(dep),rtl_files)) + define final_vflags $(call find_with_pkgconfig, \ $(call map_core_deps,vl_pkgconfig,$(rule_top)), \ -- cgit v1.2.3