Skip to content

Commit 85ca766

Browse files
committed
Add regression tests for inherited interface port headers
Check that bare port names inherit the interface type and modport from the preceding port, including chained continuations. Check that unpacked dimensions are not inherited and can be specified independently. Also check that an inherited modport still prevents writes to input members and that invalid initializers on interface ports remain rejected. The positive tests encounter the existing vlog95 failures where connected interface instances are redeclared as nets. Mark these as expected translation failures. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
1 parent 2133d7d commit 85ca766

11 files changed

Lines changed: 197 additions & 14 deletions
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Check that interface port headers are inherited across bare port names.
2+
3+
module M(input logic a, I p, q, (* keep = 1 *) r, output wire y, z);
4+
5+
assign p.value = a;
6+
assign q.value = !a;
7+
assign r.value = p.value ^ q.value;
8+
assign y = r.value;
9+
assign z = q.value;
10+
11+
endmodule
12+
13+
interface I;
14+
logic value;
15+
endinterface
16+
17+
module test;
18+
19+
I i_p();
20+
I i_q();
21+
I i_r();
22+
wire y, z;
23+
24+
M i_m(1'b1, i_p, i_q, i_r, y, z);
25+
26+
initial begin
27+
#1;
28+
if ({i_p.value, i_q.value, i_r.value, y, z} === 5'b10110)
29+
$display("PASSED");
30+
else
31+
$display("FAILED");
32+
end
33+
34+
endmodule
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Check that continued interface ports use their own unpacked dimensions.
2+
3+
interface I;
4+
logic value;
5+
endinterface
6+
7+
module M(I p[1:0], q, r[3:2], output wire [4:0] y);
8+
9+
assign y = {p[1].value, p[0].value, q.value, r[3].value, r[2].value};
10+
11+
endmodule
12+
13+
module test;
14+
15+
I i_p[1:0]();
16+
I i_q();
17+
I i_r[3:2]();
18+
wire [4:0] y;
19+
20+
assign i_p[1].value = 1'b1;
21+
assign i_p[0].value = 1'b0;
22+
assign i_q.value = 1'b1;
23+
assign i_r[3].value = 1'b0;
24+
assign i_r[2].value = 1'b1;
25+
26+
M i_m(i_p, i_q, i_r, y);
27+
28+
initial begin
29+
#1;
30+
if (y === 5'b10101)
31+
$display("PASSED");
32+
else
33+
$display("FAILED");
34+
end
35+
36+
endmodule
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Check that an interface port cannot acquire an initializer by continuation.
2+
3+
interface I;
4+
logic value;
5+
endinterface
6+
7+
module M(I p, q = 1'b0); // Error: interface ports cannot have initializers.
8+
endmodule
9+
10+
module test;
11+
12+
I i_p();
13+
I i_q();
14+
M i_m(i_p, i_q);
15+
16+
endmodule
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Check that continued interface ports inherit the modport selector.
2+
3+
interface I;
4+
logic value;
5+
modport mp(input value);
6+
endinterface
7+
8+
module M(I.mp p, q, r, output wire [2:0] y);
9+
10+
assign y = {p.value, q.value, r.value};
11+
12+
endmodule
13+
14+
module test;
15+
16+
I i_p();
17+
I i_q();
18+
I i_r();
19+
wire [2:0] y;
20+
21+
assign i_p.value = 1'b1;
22+
assign i_q.value = 1'b0;
23+
assign i_r.value = 1'b1;
24+
25+
M i_m(i_p, i_q, i_r, y);
26+
27+
initial begin
28+
#1;
29+
if (y === 3'b101)
30+
$display("PASSED");
31+
else
32+
$display("FAILED");
33+
end
34+
35+
endmodule
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Check that an inherited modport still prevents writes to its input members.
2+
3+
interface I;
4+
logic value;
5+
modport mp(input value);
6+
endinterface
7+
8+
module M(I.mp p, q);
9+
10+
assign q.value = 1'b1; // Error: value is an input in the inherited modport.
11+
12+
endmodule
13+
14+
module test;
15+
16+
I i_p();
17+
I i_q();
18+
M i_m(i_p, i_q);
19+
20+
endmodule

‎ivtest/regress-vvp.list‎

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -401,28 +401,33 @@ sv_interface_identifier_interface_port_name vvp_tests/sv_interface_identifier_in
401401
sv_interface_identifier_member_name vvp_tests/sv_interface_identifier_member_name.json
402402
sv_interface_identifier_modport_name vvp_tests/sv_interface_identifier_modport_name.json
403403
sv_interface_identifier_port_name vvp_tests/sv_interface_identifier_port_name.json
404+
sv_interface_port_array_basic vvp_tests/sv_interface_port_array_basic.json
405+
sv_interface_port_array_modport_restrict_fail vvp_tests/sv_interface_port_array_modport_restrict_fail.json
406+
sv_interface_port_array_size_mismatch_fail vvp_tests/sv_interface_port_array_size_mismatch_fail.json
404407
sv_interface_port_basic vvp_tests/sv_interface_port_basic.json
405408
sv_interface_port_forward_type_after_port vvp_tests/sv_interface_port_forward_type_after_port.json
406-
sv_interface_port_missing_type_fail vvp_tests/sv_interface_port_missing_type_fail.json
407-
sv_interface_port_missing_modport_fail vvp_tests/sv_interface_port_missing_modport_fail.json
408-
sv_interface_port_non_interface_actual_fail vvp_tests/sv_interface_port_non_interface_actual_fail.json
409-
sv_interface_port_wrong_type_fail vvp_tests/sv_interface_port_wrong_type_fail.json
410-
sv_interface_port_modport_input_write_fail vvp_tests/sv_interface_port_modport_input_write_fail.json
411-
sv_interface_port_unlisted_member_fail vvp_tests/sv_interface_port_unlisted_member_fail.json
412-
sv_interface_port_unmodported_basic vvp_tests/sv_interface_port_unmodported_basic.json
413-
sv_interface_port_unmodported_missing_type_fail vvp_tests/sv_interface_port_unmodported_missing_type_fail.json
414409
sv_interface_port_forwarding vvp_tests/sv_interface_port_forwarding.json
415410
sv_interface_port_forwarding_restrict_fail vvp_tests/sv_interface_port_forwarding_restrict_fail.json
416-
sv_interface_port_positional vvp_tests/sv_interface_port_positional.json
417-
sv_interface_port_positional_unconnected_fail vvp_tests/sv_interface_port_positional_unconnected_fail.json
418-
sv_interface_port_wildcard vvp_tests/sv_interface_port_wildcard.json
419411
sv_interface_port_indexed_actual vvp_tests/sv_interface_port_indexed_actual.json
420412
sv_interface_port_indexed_actual_generate vvp_tests/sv_interface_port_indexed_actual_generate.json
421-
sv_interface_port_array_basic vvp_tests/sv_interface_port_array_basic.json
422-
sv_interface_port_array_modport_restrict_fail vvp_tests/sv_interface_port_array_modport_restrict_fail.json
423-
sv_interface_port_array_size_mismatch_fail vvp_tests/sv_interface_port_array_size_mismatch_fail.json
413+
sv_interface_port_inherit vvp_tests/sv_interface_port_inherit.json
414+
sv_interface_port_inherit_dimensions vvp_tests/sv_interface_port_inherit_dimensions.json
415+
sv_interface_port_inherit_initializer_fail vvp_tests/sv_interface_port_inherit_initializer_fail.json
416+
sv_interface_port_inherit_modport vvp_tests/sv_interface_port_inherit_modport.json
417+
sv_interface_port_inherit_modport_write_fail vvp_tests/sv_interface_port_inherit_modport_write_fail.json
418+
sv_interface_port_missing_modport_fail vvp_tests/sv_interface_port_missing_modport_fail.json
419+
sv_interface_port_missing_type_fail vvp_tests/sv_interface_port_missing_type_fail.json
420+
sv_interface_port_modport_input_write_fail vvp_tests/sv_interface_port_modport_input_write_fail.json
421+
sv_interface_port_non_interface_actual_fail vvp_tests/sv_interface_port_non_interface_actual_fail.json
424422
sv_interface_port_plain_ansi_regression vvp_tests/sv_interface_port_plain_ansi_regression.json
423+
sv_interface_port_positional vvp_tests/sv_interface_port_positional.json
424+
sv_interface_port_positional_unconnected_fail vvp_tests/sv_interface_port_positional_unconnected_fail.json
425425
sv_interface_port_typedef_ansi_regression vvp_tests/sv_interface_port_typedef_ansi_regression.json
426+
sv_interface_port_unlisted_member_fail vvp_tests/sv_interface_port_unlisted_member_fail.json
427+
sv_interface_port_unmodported_basic vvp_tests/sv_interface_port_unmodported_basic.json
428+
sv_interface_port_unmodported_missing_type_fail vvp_tests/sv_interface_port_unmodported_missing_type_fail.json
429+
sv_interface_port_wildcard vvp_tests/sv_interface_port_wildcard.json
430+
sv_interface_port_wrong_type_fail vvp_tests/sv_interface_port_wrong_type_fail.json
426431
sv_literals vvp_tests/sv_literals.json
427432
sv_lval_concat_class_fail1 vvp_tests/sv_lval_concat_class_fail1.json
428433
sv_lval_concat_class_fail2 vvp_tests/sv_lval_concat_class_fail2.json
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_interface_port_inherit.v",
4+
"iverilog-args" : [ "-g2005-sv" ],
5+
"vlog95" : {
6+
"__comment" : "vlog95 redeclares connected interface instances as nets",
7+
"type" : "TE"
8+
}
9+
}
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_interface_port_inherit_dimensions.v",
4+
"iverilog-args" : [ "-g2005-sv" ],
5+
"vlog95" : {
6+
"__comment" : "vlog95 redeclares connected interface instances as nets",
7+
"type" : "TE"
8+
}
9+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"type" : "CE",
3+
"source" : "sv_interface_port_inherit_initializer_fail.v",
4+
"iverilog-args" : [ "-g2005-sv" ]
5+
}
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_interface_port_inherit_modport.v",
4+
"iverilog-args" : [ "-g2005-sv" ],
5+
"vlog95" : {
6+
"__comment" : "vlog95 redeclares connected interface instances as nets",
7+
"type" : "TE"
8+
}
9+
}

0 commit comments

Comments
 (0)