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" ] +}