summaryrefslogtreecommitdiff
path: root/mk
diff options
context:
space:
mode:
Diffstat (limited to 'mk')
-rw-r--r--mk/builtin/mod.mk5
-rw-r--r--mk/builtin/peakrdl_intfs/apb3_intf.sv40
-rw-r--r--mk/builtin/peakrdl_intfs/apb4_intf.sv46
-rw-r--r--mk/builtin/peakrdl_intfs/avalon_mm_intf.sv46
-rw-r--r--mk/builtin/peakrdl_intfs/axi4lite_intf.sv80
-rw-r--r--mk/cores.mk16
-rw-r--r--mk/peakrdl.mk20
-rw-r--r--mk/tools.mk1
-rw-r--r--mk/top.mk7
-rw-r--r--mk/verilator.mk5
10 files changed, 262 insertions, 4 deletions
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)), \