diff --git a/src/peakrdl_regblock/hwif/__init__.py b/src/peakrdl_regblock/hwif/__init__.py index 3298f50..4ff95f0 100644 --- a/src/peakrdl_regblock/hwif/__init__.py +++ b/src/peakrdl_regblock/hwif/__init__.py @@ -49,6 +49,23 @@ class Hwif: return self.exp.ds.top_node + def get_extra_package_params(self) -> str: + lines = [] + + for param in self.top_node.inst.parameters: + value = param.get_value() + if isinstance(value, int): + lines.append( + f"localparam {param.name} = {SVInt(value)};" + ) + elif isinstance(value, str): + lines.append( + f"localparam {param.name} = {value};" + ) + + return "\n".join(lines) + + def get_package_contents(self) -> str: """ If this hwif requires a package, generate the string diff --git a/src/peakrdl_regblock/package_tmpl.sv b/src/peakrdl_regblock/package_tmpl.sv index 5aa5ed3..5e71fc6 100644 --- a/src/peakrdl_regblock/package_tmpl.sv +++ b/src/peakrdl_regblock/package_tmpl.sv @@ -7,6 +7,8 @@ package {{ds.package_name}}; localparam {{ds.module_name.upper()}}_MIN_ADDR_WIDTH = {{ds.addr_width}}; localparam {{ds.module_name.upper()}}_SIZE = {{SVInt(ds.top_node.size)}}; + {{hwif.get_extra_package_params()|indent}} + {{hwif.get_package_contents()|indent}} endpackage {# (eof newline anchor) #} diff --git a/tests/test_pkg_params/__init__.py b/tests/test_pkg_params/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_pkg_params/regblock.rdl b/tests/test_pkg_params/regblock.rdl new file mode 100644 index 0000000..41660de --- /dev/null +++ b/tests/test_pkg_params/regblock.rdl @@ -0,0 +1,11 @@ +addrmap top #( + longint N_REGS = 1, + longint REGWIDTH = 32, + string NAME = "abcd" +) { + reg reg_t { + regwidth = REGWIDTH; + field {sw=rw; hw=na;} f[REGWIDTH] = 1; + }; + reg_t regs[N_REGS]; +}; diff --git a/tests/test_pkg_params/tb_template.sv b/tests/test_pkg_params/tb_template.sv new file mode 100644 index 0000000..b33b3d2 --- /dev/null +++ b/tests/test_pkg_params/tb_template.sv @@ -0,0 +1,8 @@ +{% extends "lib/tb_base.sv" %} + +{% block seq %} + {% sv_line_anchor %} + assert(regblock_pkg::N_REGS == {{testcase.n_regs}}); + assert(regblock_pkg::REGWIDTH == {{testcase.regwidth}}); + assert(regblock_pkg::NAME == "{{testcase.name}}"); +{% endblock %} diff --git a/tests/test_pkg_params/testcase.py b/tests/test_pkg_params/testcase.py new file mode 100644 index 0000000..790b21b --- /dev/null +++ b/tests/test_pkg_params/testcase.py @@ -0,0 +1,27 @@ +from parameterized import parameterized_class + +from ..lib.sim_testcase import SimTestCase +from ..lib.test_params import get_permutations + +PARAMS = get_permutations({ + "n_regs" : [1, 2], + "regwidth" : [8, 16], + "name" : ["hello", "world"], +}) +@parameterized_class(PARAMS) +class TestRetimedFanin(SimTestCase): + n_regs = 20 + regwidth = 32 + name = "xyz" + + @classmethod + def setUpClass(cls): + cls.rdl_elab_params = { + "N_REGS": cls.n_regs, + "REGWIDTH": cls.regwidth, + "NAME": f'"{cls.name}"', + } + super().setUpClass() + + def test_dut(self): + self.run_test()