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:
parent
21bfe06b33
commit
506eaa5415
|
|
@ -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.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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" ]
|
||||
}
|
||||
|
|
@ -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" ]
|
||||
}
|
||||
|
|
@ -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" ]
|
||||
}
|
||||
|
|
@ -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" ]
|
||||
}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"type" : "normal",
|
||||
"source" : "sv_type_identifier_type_dimension_param.v",
|
||||
"iverilog-args" : [ "-g2005-sv" ]
|
||||
}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"type" : "normal",
|
||||
"source" : "sv_type_identifier_type_dimension_sysfunc.v",
|
||||
"iverilog-args" : [ "-g2005-sv" ]
|
||||
}
|
||||
Loading…
Reference in New Issue