Skip to content

Commit e14ae1c

Browse files
committed
Add regression tests for hierarchy identifiers shadowing type identifiers
Check that `SCOPE.value` resolves to a forward-referenced generate block when `SCOPE` also names an imported type. The lexer can only see the type at the point of the reference, so this exercises parsing a `TYPE_IDENTIFIER` as the first hierarchy component. Check that a compilation-unit type does not prevent a same-named inherited class property from being used as a procedural l-value or expression. Check that empty and queue-bound indices on such hierarchy components are rejected during parsing instead of reaching elaboration. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
1 parent 5a5146e commit e14ae1c

10 files changed

Lines changed: 112 additions & 1 deletion
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ivltests/sv_type_identifier_hier_empty_fail.v:11: error: Empty index is not allowed in a hierarchy identifier.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ivltests/sv_type_identifier_hier_queue_fail.v:11: error: Queue bounds are not allowed in a hierarchy identifier.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Check that an empty index on a hierarchy identifier is rejected when the
2+
// hierarchy name is also visible as a type identifier.
3+
4+
package p;
5+
typedef integer SCOPE;
6+
endpackage
7+
8+
import p::*;
9+
10+
module test;
11+
initial $display("%0d", SCOPE[].value);
12+
13+
generate
14+
if (1) begin : SCOPE
15+
integer value;
16+
end
17+
endgenerate
18+
endmodule
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Check that a queue-bound index on a hierarchy identifier is rejected when
2+
// the hierarchy name is also visible as a type identifier.
3+
4+
package p;
5+
typedef integer SCOPE;
6+
endpackage
7+
8+
import p::*;
9+
10+
module test;
11+
initial $display("%0d", SCOPE[$:1].value);
12+
13+
generate
14+
if (1) begin : SCOPE
15+
integer value;
16+
end
17+
endgenerate
18+
endmodule
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// Check that a type identifier can be shadowed by a forward-referenced
2+
// hierarchy identifier.
3+
4+
package p;
5+
typedef integer SCOPE;
6+
endpackage
7+
8+
import p::*;
9+
10+
module test;
11+
12+
reg failed;
13+
14+
`define check(val, exp) \
15+
if (val !== exp) begin \
16+
$display("FAILED(%0d). '%s' expected %0d, got %0d", `__LINE__, \
17+
`"val`", exp, val); \
18+
failed = 1'b1; \
19+
end
20+
21+
initial begin
22+
failed = 1'b0;
23+
24+
SCOPE.value = 32'd17;
25+
`check(SCOPE.value, 32'd17)
26+
27+
if (!failed) begin
28+
$display("PASSED");
29+
end
30+
end
31+
32+
generate
33+
if (1) begin : SCOPE
34+
integer value;
35+
end
36+
endgenerate
37+
38+
endmodule

‎ivtest/ivltests/sv_type_identifier_inherited_property_shadow.v‎

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@ class Base;
77
endclass
88

99
class Derived extends Base;
10+
function void set(input logic [7:0] value);
11+
T = value;
12+
endfunction
13+
14+
function logic [7:0] get;
15+
return T;
16+
endfunction
17+
1018
function integer width;
1119
width = $bits(T);
1220
endfunction
@@ -22,8 +30,11 @@ module test;
2230

2331
initial begin
2432
object = new;
33+
object.set(8'ha5);
2534

26-
if (object.width() !== 8) begin
35+
if (object.get() !== 8'ha5) begin
36+
$display("FAILED: expected a5, got %0h", object.get());
37+
end else if (object.width() !== 8) begin
2738
$display("FAILED: expected 8, got %0d", object.width());
2839
end else if (object.slice_width() !== 4) begin
2940
$display("FAILED: expected 4, got %0d", object.slice_width());

‎ivtest/regress-vvp.list‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,10 @@ sv_type_identifier_fork_prefix_label_name vvp_tests/sv_type_identifier_fork_pref
522522
sv_type_identifier_function_name vvp_tests/sv_type_identifier_function_name.json
523523
sv_type_identifier_generate_label_name vvp_tests/sv_type_identifier_generate_label_name.json
524524
sv_type_identifier_genvar_name vvp_tests/sv_type_identifier_genvar_name.json
525+
sv_type_identifier_hier_empty_fail vvp_tests/sv_type_identifier_hier_empty_fail.json
525526
sv_type_identifier_hier_fail vvp_tests/sv_type_identifier_hier_fail.json
527+
sv_type_identifier_hier_queue_fail vvp_tests/sv_type_identifier_hier_queue_fail.json
528+
sv_type_identifier_hierarchy vvp_tests/sv_type_identifier_hierarchy.json
526529
sv_type_identifier_implicit_assign_fail vvp_tests/sv_type_identifier_implicit_assign_fail.json
527530
sv_type_identifier_implicit_gate_fail vvp_tests/sv_type_identifier_implicit_gate_fail.json
528531
sv_type_identifier_implicit_port_fail vvp_tests/sv_type_identifier_implicit_port_fail.json
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"type" : "CE",
3+
"source" : "sv_type_identifier_hier_empty_fail.v",
4+
"gold" : "sv_type_identifier_hier_empty_fail",
5+
"iverilog-args" : [ "-g2005-sv" ]
6+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"type" : "CE",
3+
"source" : "sv_type_identifier_hier_queue_fail.v",
4+
"gold" : "sv_type_identifier_hier_queue_fail",
5+
"iverilog-args" : [ "-g2005-sv" ]
6+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"type" : "normal",
3+
"source" : "sv_type_identifier_hierarchy.v",
4+
"iverilog-args" : [ "-g2005-sv" ],
5+
"vlog95" : {
6+
"__comment" : "Named generate scopes are not translated by vlog95",
7+
"type" : "CE"
8+
}
9+
}

0 commit comments

Comments
 (0)