Add tests for dimensions on named types

Check that packed dimensions are preserved when local and
package-qualified identifiers resolve to types in type parameter values and
system function arguments. Verify that symbolic dimensions are evaluated in
the scope of each module instance.

Check the diagnostics for unsized and queue suffixes, indexed part selects,
and packed dimensions applied to an unpacked named type.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
This commit is contained in:
Lars-Peter Clausen 2026-08-10 22:24:37 -07:00
parent 21bfe06b33
commit 506eaa5415
17 changed files with 165 additions and 0 deletions

View File

@ -0,0 +1,2 @@
ivltests/sv_type_identifier_dim_indexed_fail.v:6: error: An indexed part select is not allowed in a dimension.
1 error(s) during elaboration.

View File

@ -0,0 +1,2 @@
ivltests/sv_type_identifier_dim_queue_fail.v:6: error: A queue dimension is not allowed here.
1 error(s) during elaboration.

View File

@ -0,0 +1,2 @@
ivltests/sv_type_identifier_dim_unpacked_fail.v:6: error: Packed array base-type `byte_array_t` is not packed.
1 error(s) during elaboration.

View File

@ -0,0 +1,2 @@
ivltests/sv_type_identifier_dim_unsized_fail.v:6: error: An unsized dimension is not allowed here.
1 error(s) during elaboration.

View File

@ -0,0 +1,7 @@
// Check that an indexed part select is not a named type dimension.
typedef logic [7:0] byte_t;
module test;
localparam integer WIDTH = $bits(byte_t [0 +: 2]);
endmodule

View File

@ -0,0 +1,7 @@
// Check that a queue suffix is not a named type dimension here.
typedef logic [7:0] byte_t;
module test;
localparam integer WIDTH = $bits(byte_t [$:3]);
endmodule

View File

@ -0,0 +1,7 @@
// Check that packed dimensions cannot be added to an unpacked named type.
typedef logic byte_array_t [1:0];
module test;
localparam integer WIDTH = $bits(byte_array_t [3:0]);
endmodule

View File

@ -0,0 +1,7 @@
// Check that an unsized suffix is not a named type dimension here.
typedef logic [7:0] byte_t;
module test;
localparam integer WIDTH = $bits(byte_t []);
endmodule

View File

@ -0,0 +1,55 @@
// Check packed dimensions on typedef names in type parameter values.
package p;
typedef logic [7:0] byte_t;
endpackage
typedef logic [3:0] nibble_t;
module M #(
parameter integer WIDTH = 2,
parameter type T = nibble_t [WIDTH-1:0]
);
T value;
endmodule
module test;
M i_default();
M #(.WIDTH(3)) i_width();
M #(2, p::byte_t [3:0]) i_ordered();
M #(.T(p::byte_t [2:0])) i_override();
reg failed;
initial begin
failed = 1'b0;
if ($bits(i_default.value) !== 8) begin
$display("FAILED(%0d). Expected 8, got %0d", `__LINE__,
$bits(i_default.value));
failed = 1'b1;
end
if ($bits(i_width.value) !== 12) begin
$display("FAILED(%0d). Expected 12, got %0d", `__LINE__,
$bits(i_width.value));
failed = 1'b1;
end
if ($bits(i_ordered.value) !== 32) begin
$display("FAILED(%0d). Expected 32, got %0d", `__LINE__,
$bits(i_ordered.value));
failed = 1'b1;
end
if ($bits(i_override.value) !== 24) begin
$display("FAILED(%0d). Expected 24, got %0d", `__LINE__,
$bits(i_override.value));
failed = 1'b1;
end
if (!failed) begin
$display("PASSED");
end
end
endmodule

View File

@ -0,0 +1,34 @@
// Check packed dimensions on typedef names in system function arguments.
package p;
typedef logic [7:0] byte_t;
endpackage
typedef logic [3:0] byte_t;
module test;
import p::*;
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
failed = 1'b0;
`check($bits(byte_t [0:1]), 16);
`check($bits(byte_t [1:0]), 16);
`check($bits(byte_t [1:0][2:0]), 48);
`check($bits(p::byte_t [3:0]), 32);
if (!failed) begin
$display("PASSED");
end
end
endmodule

View File

@ -494,6 +494,10 @@ sv_type_identifier_attribute_target vvp_tests/sv_type_identifier_attribute_targe
sv_type_identifier_block_label_name vvp_tests/sv_type_identifier_block_label_name.json
sv_type_identifier_block_prefix_label_name vvp_tests/sv_type_identifier_block_prefix_label_name.json
sv_type_identifier_config_name vvp_tests/sv_type_identifier_config_name.json
sv_type_identifier_dim_indexed_fail vvp_tests/sv_type_identifier_dim_indexed_fail.json
sv_type_identifier_dim_queue_fail vvp_tests/sv_type_identifier_dim_queue_fail.json
sv_type_identifier_dim_unpacked_fail vvp_tests/sv_type_identifier_dim_unpacked_fail.json
sv_type_identifier_dim_unsized_fail vvp_tests/sv_type_identifier_dim_unsized_fail.json
sv_type_identifier_discipline_name vvp_tests/sv_type_identifier_discipline_name.json
sv_type_identifier_discipline_nature_ref vvp_tests/sv_type_identifier_discipline_nature_ref.json
sv_type_identifier_disable_path_fail vvp_tests/sv_type_identifier_disable_path_fail.json
@ -542,6 +546,8 @@ sv_type_identifier_shadow_wildcard_port_fail vvp_tests/sv_type_identifier_shadow
sv_type_identifier_specparam_name vvp_tests/sv_type_identifier_specparam_name.json
sv_type_identifier_task_function_argument_name vvp_tests/sv_type_identifier_task_function_argument_name.json
sv_type_identifier_task_name vvp_tests/sv_type_identifier_task_name.json
sv_type_identifier_type_dimension_param vvp_tests/sv_type_identifier_type_dimension_param.json
sv_type_identifier_type_dimension_sysfunc vvp_tests/sv_type_identifier_type_dimension_sysfunc.json
sv_type_identifier_type_param_hier_fail vvp_tests/sv_type_identifier_type_param_hier_fail.json
sv_type_identifier_typed_expression vvp_tests/sv_type_identifier_typed_expression.json
sv_type_identifier_typed_expression_fail vvp_tests/sv_type_identifier_typed_expression_fail.json

View File

@ -0,0 +1,6 @@
{
"type" : "CE",
"source" : "sv_type_identifier_dim_indexed_fail.v",
"gold" : "sv_type_identifier_dim_indexed_fail",
"iverilog-args" : [ "-g2005-sv" ]
}

View File

@ -0,0 +1,6 @@
{
"type" : "CE",
"source" : "sv_type_identifier_dim_queue_fail.v",
"gold" : "sv_type_identifier_dim_queue_fail",
"iverilog-args" : [ "-g2005-sv" ]
}

View File

@ -0,0 +1,6 @@
{
"type" : "CE",
"source" : "sv_type_identifier_dim_unpacked_fail.v",
"gold" : "sv_type_identifier_dim_unpacked_fail",
"iverilog-args" : [ "-g2005-sv" ]
}

View File

@ -0,0 +1,6 @@
{
"type" : "CE",
"source" : "sv_type_identifier_dim_unsized_fail.v",
"gold" : "sv_type_identifier_dim_unsized_fail",
"iverilog-args" : [ "-g2005-sv" ]
}

View File

@ -0,0 +1,5 @@
{
"type" : "normal",
"source" : "sv_type_identifier_type_dimension_param.v",
"iverilog-args" : [ "-g2005-sv" ]
}

View File

@ -0,0 +1,5 @@
{
"type" : "normal",
"source" : "sv_type_identifier_type_dimension_sysfunc.v",
"iverilog-args" : [ "-g2005-sv" ]
}