From 506eaa54151bc36f6adba9a850245b43e024b8a0 Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Mon, 10 Aug 2026 22:24:37 -0700 Subject: [PATCH] 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 --- ...fier_dim_indexed_fail-iverilog-stderr.gold | 2 + ...tifier_dim_queue_fail-iverilog-stderr.gold | 2 + ...ier_dim_unpacked_fail-iverilog-stderr.gold | 2 + ...fier_dim_unsized_fail-iverilog-stderr.gold | 2 + .../sv_type_identifier_dim_indexed_fail.v | 7 +++ .../sv_type_identifier_dim_queue_fail.v | 7 +++ .../sv_type_identifier_dim_unpacked_fail.v | 7 +++ .../sv_type_identifier_dim_unsized_fail.v | 7 +++ .../sv_type_identifier_type_dimension_param.v | 55 +++++++++++++++++++ ...v_type_identifier_type_dimension_sysfunc.v | 34 ++++++++++++ ivtest/regress-vvp.list | 6 ++ .../sv_type_identifier_dim_indexed_fail.json | 6 ++ .../sv_type_identifier_dim_queue_fail.json | 6 ++ .../sv_type_identifier_dim_unpacked_fail.json | 6 ++ .../sv_type_identifier_dim_unsized_fail.json | 6 ++ ..._type_identifier_type_dimension_param.json | 5 ++ ...ype_identifier_type_dimension_sysfunc.json | 5 ++ 17 files changed, 165 insertions(+) create mode 100644 ivtest/gold/sv_type_identifier_dim_indexed_fail-iverilog-stderr.gold create mode 100644 ivtest/gold/sv_type_identifier_dim_queue_fail-iverilog-stderr.gold create mode 100644 ivtest/gold/sv_type_identifier_dim_unpacked_fail-iverilog-stderr.gold create mode 100644 ivtest/gold/sv_type_identifier_dim_unsized_fail-iverilog-stderr.gold create mode 100644 ivtest/ivltests/sv_type_identifier_dim_indexed_fail.v create mode 100644 ivtest/ivltests/sv_type_identifier_dim_queue_fail.v create mode 100644 ivtest/ivltests/sv_type_identifier_dim_unpacked_fail.v create mode 100644 ivtest/ivltests/sv_type_identifier_dim_unsized_fail.v create mode 100644 ivtest/ivltests/sv_type_identifier_type_dimension_param.v create mode 100644 ivtest/ivltests/sv_type_identifier_type_dimension_sysfunc.v create mode 100644 ivtest/vvp_tests/sv_type_identifier_dim_indexed_fail.json create mode 100644 ivtest/vvp_tests/sv_type_identifier_dim_queue_fail.json create mode 100644 ivtest/vvp_tests/sv_type_identifier_dim_unpacked_fail.json create mode 100644 ivtest/vvp_tests/sv_type_identifier_dim_unsized_fail.json create mode 100644 ivtest/vvp_tests/sv_type_identifier_type_dimension_param.json create mode 100644 ivtest/vvp_tests/sv_type_identifier_type_dimension_sysfunc.json diff --git a/ivtest/gold/sv_type_identifier_dim_indexed_fail-iverilog-stderr.gold b/ivtest/gold/sv_type_identifier_dim_indexed_fail-iverilog-stderr.gold new file mode 100644 index 000000000..dd3477f6f --- /dev/null +++ b/ivtest/gold/sv_type_identifier_dim_indexed_fail-iverilog-stderr.gold @@ -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. diff --git a/ivtest/gold/sv_type_identifier_dim_queue_fail-iverilog-stderr.gold b/ivtest/gold/sv_type_identifier_dim_queue_fail-iverilog-stderr.gold new file mode 100644 index 000000000..dea354592 --- /dev/null +++ b/ivtest/gold/sv_type_identifier_dim_queue_fail-iverilog-stderr.gold @@ -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. diff --git a/ivtest/gold/sv_type_identifier_dim_unpacked_fail-iverilog-stderr.gold b/ivtest/gold/sv_type_identifier_dim_unpacked_fail-iverilog-stderr.gold new file mode 100644 index 000000000..931f1d7c1 --- /dev/null +++ b/ivtest/gold/sv_type_identifier_dim_unpacked_fail-iverilog-stderr.gold @@ -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. diff --git a/ivtest/gold/sv_type_identifier_dim_unsized_fail-iverilog-stderr.gold b/ivtest/gold/sv_type_identifier_dim_unsized_fail-iverilog-stderr.gold new file mode 100644 index 000000000..a2fcb3d20 --- /dev/null +++ b/ivtest/gold/sv_type_identifier_dim_unsized_fail-iverilog-stderr.gold @@ -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. diff --git a/ivtest/ivltests/sv_type_identifier_dim_indexed_fail.v b/ivtest/ivltests/sv_type_identifier_dim_indexed_fail.v new file mode 100644 index 000000000..3361b5ca0 --- /dev/null +++ b/ivtest/ivltests/sv_type_identifier_dim_indexed_fail.v @@ -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 diff --git a/ivtest/ivltests/sv_type_identifier_dim_queue_fail.v b/ivtest/ivltests/sv_type_identifier_dim_queue_fail.v new file mode 100644 index 000000000..5dbed08c9 --- /dev/null +++ b/ivtest/ivltests/sv_type_identifier_dim_queue_fail.v @@ -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 diff --git a/ivtest/ivltests/sv_type_identifier_dim_unpacked_fail.v b/ivtest/ivltests/sv_type_identifier_dim_unpacked_fail.v new file mode 100644 index 000000000..2ef3670c8 --- /dev/null +++ b/ivtest/ivltests/sv_type_identifier_dim_unpacked_fail.v @@ -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 diff --git a/ivtest/ivltests/sv_type_identifier_dim_unsized_fail.v b/ivtest/ivltests/sv_type_identifier_dim_unsized_fail.v new file mode 100644 index 000000000..058d2ece5 --- /dev/null +++ b/ivtest/ivltests/sv_type_identifier_dim_unsized_fail.v @@ -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 diff --git a/ivtest/ivltests/sv_type_identifier_type_dimension_param.v b/ivtest/ivltests/sv_type_identifier_type_dimension_param.v new file mode 100644 index 000000000..aee7c7785 --- /dev/null +++ b/ivtest/ivltests/sv_type_identifier_type_dimension_param.v @@ -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 diff --git a/ivtest/ivltests/sv_type_identifier_type_dimension_sysfunc.v b/ivtest/ivltests/sv_type_identifier_type_dimension_sysfunc.v new file mode 100644 index 000000000..1926c73f3 --- /dev/null +++ b/ivtest/ivltests/sv_type_identifier_type_dimension_sysfunc.v @@ -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 diff --git a/ivtest/regress-vvp.list b/ivtest/regress-vvp.list index 41812ce18..a6c168359 100644 --- a/ivtest/regress-vvp.list +++ b/ivtest/regress-vvp.list @@ -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 diff --git a/ivtest/vvp_tests/sv_type_identifier_dim_indexed_fail.json b/ivtest/vvp_tests/sv_type_identifier_dim_indexed_fail.json new file mode 100644 index 000000000..ce1f7baca --- /dev/null +++ b/ivtest/vvp_tests/sv_type_identifier_dim_indexed_fail.json @@ -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" ] +} diff --git a/ivtest/vvp_tests/sv_type_identifier_dim_queue_fail.json b/ivtest/vvp_tests/sv_type_identifier_dim_queue_fail.json new file mode 100644 index 000000000..a1b4cde71 --- /dev/null +++ b/ivtest/vvp_tests/sv_type_identifier_dim_queue_fail.json @@ -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" ] +} diff --git a/ivtest/vvp_tests/sv_type_identifier_dim_unpacked_fail.json b/ivtest/vvp_tests/sv_type_identifier_dim_unpacked_fail.json new file mode 100644 index 000000000..d1f56319c --- /dev/null +++ b/ivtest/vvp_tests/sv_type_identifier_dim_unpacked_fail.json @@ -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" ] +} diff --git a/ivtest/vvp_tests/sv_type_identifier_dim_unsized_fail.json b/ivtest/vvp_tests/sv_type_identifier_dim_unsized_fail.json new file mode 100644 index 000000000..af4c2b28c --- /dev/null +++ b/ivtest/vvp_tests/sv_type_identifier_dim_unsized_fail.json @@ -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" ] +} diff --git a/ivtest/vvp_tests/sv_type_identifier_type_dimension_param.json b/ivtest/vvp_tests/sv_type_identifier_type_dimension_param.json new file mode 100644 index 000000000..d0fd0bb6c --- /dev/null +++ b/ivtest/vvp_tests/sv_type_identifier_type_dimension_param.json @@ -0,0 +1,5 @@ +{ + "type" : "normal", + "source" : "sv_type_identifier_type_dimension_param.v", + "iverilog-args" : [ "-g2005-sv" ] +} diff --git a/ivtest/vvp_tests/sv_type_identifier_type_dimension_sysfunc.json b/ivtest/vvp_tests/sv_type_identifier_type_dimension_sysfunc.json new file mode 100644 index 000000000..1743d4597 --- /dev/null +++ b/ivtest/vvp_tests/sv_type_identifier_type_dimension_sysfunc.json @@ -0,0 +1,5 @@ +{ + "type" : "normal", + "source" : "sv_type_identifier_type_dimension_sysfunc.v", + "iverilog-args" : [ "-g2005-sv" ] +}