Merge pull request #616 from larsclausen/parameter-non-overridable

Elaborate `parameter` as non-overridable where required
This commit is contained in:
Stephen Williams 2022-02-18 08:25:30 -08:00 committed by GitHub
commit 21c769e1e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 171 additions and 87 deletions

View File

@ -116,6 +116,7 @@ class LexicalScope {
SymbolType symbol_type() const;
};
std::map<perm_string,param_expr_t*>parameters;
bool has_parameter_port_list;
// Defined types in the scope.
std::map<perm_string,data_type_t*>typedefs;

View File

@ -1,21 +0,0 @@
./ivltests/parameter_invalid_override.v:28: error: Cannot override localparam `C` in `test.i_a`.
./ivltests/parameter_invalid_override.v:29: error: Cannot override localparam `D` in `test.i_a`.
./ivltests/parameter_invalid_override.v:31: error: Cannot override localparam `F` in `test.i_a`.
./ivltests/parameter_invalid_override.v:32: error: Cannot override localparam `G` in `test.i_a`.
./ivltests/parameter_invalid_override.v:33: error: Cannot override localparam `H` in `test.i_a`.
./ivltests/parameter_invalid_override.v:34: error: Cannot override localparam `I` in `test.i_a`.
./ivltests/parameter_invalid_override.v:35: error: parameter `Z` not found in `test.i_a`.
./ivltests/parameter_invalid_override.v:52: error: Cannot override localparam `C` in `test.i_b`.
./ivltests/parameter_invalid_override.v:53: error: Cannot override localparam `D` in `test.i_b`.
./ivltests/parameter_invalid_override.v:54: error: parameter `Z` not found in `test.i_b`.
./ivltests/parameter_invalid_override.v:40: error: Cannot override localparam `C` in `test.i_a`.
./ivltests/parameter_invalid_override.v:41: error: Cannot override localparam `D` in `test.i_a`.
./ivltests/parameter_invalid_override.v:43: error: Cannot override localparam `F` in `test.i_a`.
./ivltests/parameter_invalid_override.v:44: error: Cannot override localparam `G` in `test.i_a`.
./ivltests/parameter_invalid_override.v:45: error: Cannot override localparam `H` in `test.i_a`.
./ivltests/parameter_invalid_override.v:46: error: Cannot override localparam `I` in `test.i_a`.
./ivltests/parameter_invalid_override.v:47: error: parameter `Z` not found in `test.i_a`.
./ivltests/parameter_invalid_override.v:59: error: Cannot override localparam `C` in `test.i_b`.
./ivltests/parameter_invalid_override.v:60: error: Cannot override localparam `D` in `test.i_b`.
./ivltests/parameter_invalid_override.v:61: error: parameter `Z` not found in `test.i_b`.
21 error(s) during elaboration.

View File

@ -1,63 +0,0 @@
// Check that invalid parameter overrides generate an error
module a #(
parameter A = 1, B = 2,
localparam C = 3, localparam D = 4, // TODO: D should be localparam even when the keyword omitted
parameter E = 5
);
// TODO: parameter here should be treated as a localparam since the module has a
// parameter port list
/*parameter*/ localparam F = 6, G = 7;
localparam H = 8, I = 9;
endmodule
module b;
parameter A = 1, B = 2;
localparam C = 3, D = 4;
endmodule
module test;
a #(
.A(10),
.B(20),
.C(30),
.D(40),
.E(50),
.F(60),
.G(70),
.H(80),
.I(90),
.Z(99)
) i_a();
defparam i_a.A = 100;
defparam i_a.B = 200;
defparam i_a.C = 300;
defparam i_a.D = 400;
defparam i_a.E = 500;
defparam i_a.F = 600;
defparam i_a.G = 700;
defparam i_a.H = 800;
defparam i_a.I = 900;
defparam i_a.Z = 999;
b #(
.A(10),
.B(20),
.C(30),
.D(40),
.Z(99)
) i_b();
defparam i_b.A = 100;
defparam i_b.B = 200;
defparam i_b.C = 300;
defparam i_b.D = 400;
defparam i_b.Z = 999;
endmodule

View File

@ -0,0 +1,19 @@
// Check that trying to override a parameter that does not exist results in an
// error
module a #(
parameter A = 1
);
initial begin
$display("FAILED");
end
endmodule
module test;
a #(
.Z(10) // Error
) i_a();
endmodule

View File

@ -0,0 +1,21 @@
// Check that trying to override a parameter that does not exist results in an
// error
module a #(
parameter A = 1
);
initial begin
$display("FAILED");
end
endmodule
module test;
a #(
.A(10)
) i_a();
defparam i_a.Z = 10; // Error
endmodule

View File

@ -0,0 +1,17 @@
// Check that localparam can not be overridden
module a;
localparam A = 1;
initial begin
$display("FAILED");
end
endmodule
module test;
a #(
.A(10) // Error
) i_a();
endmodule

View File

@ -0,0 +1,17 @@
// Check that localparam can not be overridden by defparam
module a;
localparam A = 1;
initial begin
$display("FAILED");
end
endmodule
module test;
a i_a();
defparam i_a.A = 10; // Error
endmodule

View File

@ -0,0 +1,22 @@
// Check that parameter declared in the module body can not be overridden if the
// module has a parameter port list.
module a #(
parameter A = 1
);
// This behaves like a localparam
parameter B = 1;
initial begin
$display("FAILED");
end
endmodule
module test;
a #(
.A(10),
.B(20) // Error
) i_a();
endmodule

View File

@ -0,0 +1,20 @@
// Check that parameter declared in the module body can not be overridden by a
// defparam if the module has a parameter port list.
module a #(parameter A = 1);
// This behaves like a localparam
parameter B = 2;
initial begin
$display("FAILED");
end
endmodule
module test;
a i_a();
defparam i_a.A = 10;
defparam i_a.B = 20; // Error
endmodule

View File

@ -0,0 +1,18 @@
// Check that localparam declared in parameter port list can not be overridden
module a #(
localparam B = 2
);
initial begin
$display("FAILED");
end
endmodule
module test;
a #(
.A(10) // Error
) i_a();
endmodule

View File

@ -0,0 +1,19 @@
// Check that localparam declared in parameter port list can not be overridden
// by defparam
module a #(
localparam A = 1
);
initial begin
$display("FAILED");
end
endmodule
module test;
a i_a();
defparam i_a.A = 10; // Error
endmodule

View File

@ -317,11 +317,12 @@ named_fork_fail CE,-g2009 ivltests
packeda normal,-g2009 ivltests
packeda2 normal,-g2009 ivltests
parameter_in_generate2 CE,-g2005-sv ivltests
parameter_invalid_override CE,-g2005-sv ivltests gold=parameter_invalid_override.gold
parameter_no_default CE,-g2005-sv ivltests
parameter_no_default_fail1 CE ivltests
parameter_no_default_fail2 CE ivltests
parameter_no_default_toplvl normal,-g2005-sv ivltests
parameter_override_invalid7 CE,-g2005-sv ivltests
parameter_override_invalid8 CE,-g2005-sv ivltests
parameter_type2 normal,-g2009 ivltests
parpkg_test normal,-g2009 ivltests
parpkg_test2 normal,-g2009 ivltests

View File

@ -703,6 +703,12 @@ parameter_omit3 CE ivltests
parameter_omit_invalid1 CE ivltests
parameter_omit_invalid2 CE ivltests
parameter_omit_invalid3 CE ivltests
parameter_override_invalid1 CE ivltests
parameter_override_invalid2 CE ivltests
parameter_override_invalid3 CE ivltests
parameter_override_invalid4 CE ivltests
parameter_override_invalid5 CE ivltests
parameter_override_invalid6 CE ivltests
patch1268 normal ivltests
pca1 normal ivltests # Procedural Continuous Assignment in a mux
pic normal contrib pictest gold=pic.gold

View File

@ -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<Module*>(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<Module*>(scope)) && (scope == pform_cur_module.front()))
if (overridable && in_module)
pform_cur_module.front()->param_names.push_back(name);
}