Add regression tests for named selectors matching typedef names
Check that a named binding selector can have the same text as a visible typedef name. Cover named module port connections, named parameter overrides, and named task, function and constructor arguments. Also check that a modport simple port selector can shadow a visible typedef name. Modport simple port aliases share the same parser rule but declare the modport-visible name rather than binding to an existing formal. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
This commit is contained in:
parent
6844ed4194
commit
3e0c298b25
|
|
@ -0,0 +1,18 @@
|
||||||
|
// Check that a modport simple port selector can shadow a visible typedef name.
|
||||||
|
|
||||||
|
interface I;
|
||||||
|
typedef int T;
|
||||||
|
logic value;
|
||||||
|
|
||||||
|
modport m(input .T(value));
|
||||||
|
endinterface
|
||||||
|
|
||||||
|
module test;
|
||||||
|
|
||||||
|
I i();
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
$display("PASSED");
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
// Check that a named constructor argument selector can match a visible typedef name.
|
||||||
|
|
||||||
|
module test;
|
||||||
|
|
||||||
|
class C;
|
||||||
|
integer value;
|
||||||
|
|
||||||
|
function new(input integer T, input integer B);
|
||||||
|
value = T + B;
|
||||||
|
endfunction
|
||||||
|
endclass
|
||||||
|
|
||||||
|
typedef int T;
|
||||||
|
|
||||||
|
reg failed;
|
||||||
|
|
||||||
|
`define check(val, exp) \
|
||||||
|
if (val !== exp) begin \
|
||||||
|
$display("FAILED(%0d). '%s' expected %0d, got %0d", `__LINE__, \
|
||||||
|
`"val`", exp, val); \
|
||||||
|
failed = 1'b1; \
|
||||||
|
end
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
C c;
|
||||||
|
|
||||||
|
failed = 1'b0;
|
||||||
|
c = new(.T(40), .B(2));
|
||||||
|
`check(c.value, 42);
|
||||||
|
|
||||||
|
if (!failed) begin
|
||||||
|
$display("PASSED");
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
// Check that a named function argument selector can match a visible typedef name.
|
||||||
|
|
||||||
|
module test;
|
||||||
|
|
||||||
|
function integer f(input integer T, input integer B);
|
||||||
|
f = T + B;
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
typedef int T;
|
||||||
|
|
||||||
|
reg failed;
|
||||||
|
integer value;
|
||||||
|
|
||||||
|
`define check(val, exp) \
|
||||||
|
if (val !== exp) begin \
|
||||||
|
$display("FAILED(%0d). '%s' expected %0d, got %0d", `__LINE__, \
|
||||||
|
`"val`", exp, val); \
|
||||||
|
failed = 1'b1; \
|
||||||
|
end
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
failed = 1'b0;
|
||||||
|
value = f(.T(40), .B(2));
|
||||||
|
`check(value, 42);
|
||||||
|
|
||||||
|
if (!failed) begin
|
||||||
|
$display("PASSED");
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
// Check that a named parameter override selector can match a visible typedef name.
|
||||||
|
|
||||||
|
module M #(parameter integer T = 0) (output [31:0] Y);
|
||||||
|
assign Y = T;
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module test;
|
||||||
|
|
||||||
|
typedef int T;
|
||||||
|
|
||||||
|
reg failed;
|
||||||
|
wire [31:0] y;
|
||||||
|
|
||||||
|
M #(.T(32'd42)) i_m(.Y(y));
|
||||||
|
|
||||||
|
`define check(val, exp) \
|
||||||
|
if (val !== exp) begin \
|
||||||
|
$display("FAILED(%0d). '%s' expected %0d, got %0d", `__LINE__, \
|
||||||
|
`"val`", exp, val); \
|
||||||
|
failed = 1'b1; \
|
||||||
|
end
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
failed = 1'b0;
|
||||||
|
#1;
|
||||||
|
`check(y, 32'd42);
|
||||||
|
|
||||||
|
if (!failed) begin
|
||||||
|
$display("PASSED");
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
// Check that a named port connection selector can match a visible typedef name.
|
||||||
|
|
||||||
|
module M(input [3:0] T, output [3:0] Y);
|
||||||
|
assign Y = T;
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module test;
|
||||||
|
|
||||||
|
typedef int T;
|
||||||
|
|
||||||
|
reg failed;
|
||||||
|
reg [3:0] value;
|
||||||
|
wire [3:0] y;
|
||||||
|
|
||||||
|
M i_m(.T(value), .Y(y));
|
||||||
|
|
||||||
|
`define check(val, exp) \
|
||||||
|
if (val !== exp) begin \
|
||||||
|
$display("FAILED(%0d). '%s' expected %0h, got %0h", `__LINE__, \
|
||||||
|
`"val`", exp, val); \
|
||||||
|
failed = 1'b1; \
|
||||||
|
end
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
failed = 1'b0;
|
||||||
|
value = 4'ha;
|
||||||
|
#1;
|
||||||
|
`check(y, 4'ha);
|
||||||
|
|
||||||
|
if (!failed) begin
|
||||||
|
$display("PASSED");
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
// Check that a named task argument selector can match a visible typedef name.
|
||||||
|
|
||||||
|
module test;
|
||||||
|
|
||||||
|
task t(input integer T, output integer result);
|
||||||
|
result = T;
|
||||||
|
endtask
|
||||||
|
|
||||||
|
typedef int T;
|
||||||
|
|
||||||
|
reg failed;
|
||||||
|
integer value;
|
||||||
|
|
||||||
|
`define check(val, exp) \
|
||||||
|
if (val !== exp) begin \
|
||||||
|
$display("FAILED(%0d). '%s' expected %0d, got %0d", `__LINE__, \
|
||||||
|
`"val`", exp, val); \
|
||||||
|
failed = 1'b1; \
|
||||||
|
end
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
failed = 1'b0;
|
||||||
|
t(.T(42), .result(value));
|
||||||
|
`check(value, 42);
|
||||||
|
|
||||||
|
if (!failed) begin
|
||||||
|
$display("PASSED");
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
@ -396,7 +396,13 @@ sv_type_identifier_function_name vvp_tests/sv_type_identifier_function_name.json
|
||||||
sv_type_identifier_generate_label_name vvp_tests/sv_type_identifier_generate_label_name.json
|
sv_type_identifier_generate_label_name vvp_tests/sv_type_identifier_generate_label_name.json
|
||||||
sv_type_identifier_genvar_name vvp_tests/sv_type_identifier_genvar_name.json
|
sv_type_identifier_genvar_name vvp_tests/sv_type_identifier_genvar_name.json
|
||||||
sv_type_identifier_modport_name vvp_tests/sv_type_identifier_modport_name.json
|
sv_type_identifier_modport_name vvp_tests/sv_type_identifier_modport_name.json
|
||||||
|
sv_type_identifier_modport_named_port vvp_tests/sv_type_identifier_modport_named_port.json
|
||||||
sv_type_identifier_module_name vvp_tests/sv_type_identifier_module_name.json
|
sv_type_identifier_module_name vvp_tests/sv_type_identifier_module_name.json
|
||||||
|
sv_type_identifier_named_constructor_argument vvp_tests/sv_type_identifier_named_constructor_argument.json
|
||||||
|
sv_type_identifier_named_function_argument vvp_tests/sv_type_identifier_named_function_argument.json
|
||||||
|
sv_type_identifier_named_parameter_value vvp_tests/sv_type_identifier_named_parameter_value.json
|
||||||
|
sv_type_identifier_named_port_connection vvp_tests/sv_type_identifier_named_port_connection.json
|
||||||
|
sv_type_identifier_named_task_argument vvp_tests/sv_type_identifier_named_task_argument.json
|
||||||
sv_type_identifier_net_name vvp_tests/sv_type_identifier_net_name.json
|
sv_type_identifier_net_name vvp_tests/sv_type_identifier_net_name.json
|
||||||
sv_type_identifier_package_item vvp_tests/sv_type_identifier_package_item.json
|
sv_type_identifier_package_item vvp_tests/sv_type_identifier_package_item.json
|
||||||
sv_type_identifier_package_name vvp_tests/sv_type_identifier_package_name.json
|
sv_type_identifier_package_name vvp_tests/sv_type_identifier_package_name.json
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"type" : "normal",
|
||||||
|
"source" : "sv_type_identifier_modport_named_port.v",
|
||||||
|
"iverilog-args" : [ "-g2005-sv" ]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"type" : "normal",
|
||||||
|
"source" : "sv_type_identifier_named_constructor_argument.v",
|
||||||
|
"iverilog-args" : [ "-g2005-sv" ],
|
||||||
|
"vlog95" : {
|
||||||
|
"__comment" : "Class scopes and new operators are not translated",
|
||||||
|
"type" : "CE"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"type" : "normal",
|
||||||
|
"source" : "sv_type_identifier_named_function_argument.v",
|
||||||
|
"iverilog-args" : [ "-g2005-sv" ]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"type" : "normal",
|
||||||
|
"source" : "sv_type_identifier_named_parameter_value.v",
|
||||||
|
"iverilog-args" : [ "-g2005-sv" ]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"type" : "normal",
|
||||||
|
"source" : "sv_type_identifier_named_port_connection.v",
|
||||||
|
"iverilog-args" : [ "-g2005-sv" ]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"type" : "normal",
|
||||||
|
"source" : "sv_type_identifier_named_task_argument.v",
|
||||||
|
"iverilog-args" : [ "-g2005-sv" ]
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue