verilog: disallow overriding global parameters

It was previously possible to override global parameters on a
per-instance basis. This could be dangerous when using positional
parameter bindings, hiding oversupplied parameters.
This commit is contained in:
Zachary Snow 2021-03-11 11:49:15 -05:00
parent 83fc5cc28b
commit cb9f3b6abf
2 changed files with 18 additions and 0 deletions

View File

@ -1286,6 +1286,8 @@ void AST::process(RTLIL::Design *design, AstNode *ast, bool dump_ast1, bool dump
} }
else { else {
// must be global definition // must be global definition
if ((*it)->type == AST_PARAMETER)
(*it)->type = AST_LOCALPARAM; // cannot be overridden
(*it)->simplify(false, false, false, 1, -1, false, false); //process enum/other declarations (*it)->simplify(false, false, false, 1, -1, false, false); //process enum/other declarations
design->verilog_globals.push_back((*it)->clone()); design->verilog_globals.push_back((*it)->clone());
current_scope.clear(); current_scope.clear();

View File

@ -0,0 +1,16 @@
read_verilog -sv <<EOF
parameter P = 1;
module example(
output integer out
);
assign out = P;
endmodule
module top(
output integer out
);
example #(2) e1(out);
endmodule
EOF
logger -expect error "Can't find object for defparam" 1
hierarchy