Merge pull request #616 from larsclausen/parameter-non-overridable
Elaborate `parameter` as non-overridable where required
This commit is contained in:
commit
21c769e1e1
1
PScope.h
1
PScope.h
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
11
pform.cc
11
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<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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue