From 673b40b78ce0bb33adb974d24c44069e61090d8f Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Sat, 5 Feb 2022 12:04:55 +0100 Subject: [PATCH] Elaborate `parameter` as non-overridable where required For modules, programs and interfaces that have a parameter port list, a parameter declared inside the scope's body is supposed to be elaborated as a local parameter. TThis is described in the Verilog LRM (1364-2005) section 4.10.1 ("Module parameters") and the SystemVerilog LRM (1800-2017) section 6.20.1 ("Parameter declaration syntax"). Implement this by marking a parameter declared in such a way as non-overridable. Note that a parameter declared within a named block, function or task can still be overridden, even if the module has a parameter port list. Signed-off-by: Lars-Peter Clausen --- PScope.h | 1 + pform.cc | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/PScope.h b/PScope.h index 037974860..b9118d7ff 100644 --- a/PScope.h +++ b/PScope.h @@ -116,6 +116,7 @@ class LexicalScope { SymbolType symbol_type() const; }; std::mapparameters; + bool has_parameter_port_list; // Defined types in the scope. std::maptypedefs; diff --git a/pform.cc b/pform.cc index dd171773c..10b8d9f37 100644 --- a/pform.cc +++ b/pform.cc @@ -1384,6 +1384,7 @@ void pform_startmodule(const struct vlltype&loc, const char*name, void pform_start_parameter_port_list() { pform_in_parameter_port_list = true; + pform_peek_scope()->has_parameter_port_list = true; } void pform_end_parameter_port_list() @@ -3264,6 +3265,13 @@ void pform_set_parameter(const struct vlltype&loc, overridable = false; } + bool in_module = dynamic_cast(scope) && + scope == pform_cur_module.front(); + + if (!pform_in_parameter_port_list && in_module && + scope->has_parameter_port_list) + overridable = false; + Module::param_expr_t*parm = new Module::param_expr_t(); FILE_NAME(parm, loc); @@ -3278,8 +3286,7 @@ void pform_set_parameter(const struct vlltype&loc, scope->parameters[name] = parm; // Only a module keeps the position of the parameter. - if (overridable && - (dynamic_cast(scope)) && (scope == pform_cur_module.front())) + if (overridable && in_module) pform_cur_module.front()->param_names.push_back(name); }