mirror of
https://github.com/steveicarus/iverilog.git
synced 2026-09-07 03:43:19 +02:00
Add regression test for named type lookup
Check that local, imported, and package-scoped typedefs resolve as declaration types and as `$bits()` arguments, including attached dimensions and function return and argument types. Check lexical visibility before and after a local typedef declaration and an explicit import. Earlier references resolve to outer typedefs and later references resolve to the newly visible types. Signed-off-by: Lars-Peter Clausen <[email protected]>
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
// Check that visible type identifiers can be used as declaration types.
|
||||
|
||||
package p;
|
||||
typedef logic [3:0] PT;
|
||||
endpackage
|
||||
|
||||
package q;
|
||||
typedef logic [12:0] I;
|
||||
endpackage
|
||||
|
||||
typedef logic [7:0] T;
|
||||
typedef logic [6:0] L;
|
||||
typedef logic [8:0] I;
|
||||
|
||||
module test;
|
||||
|
||||
import p::*;
|
||||
|
||||
localparam integer outer_type_width = $bits(L);
|
||||
typedef logic [10:0] L;
|
||||
localparam integer local_type_width = $bits(L);
|
||||
|
||||
localparam integer outer_import_width = $bits(I);
|
||||
import q::I;
|
||||
localparam integer imported_type_width = $bits(I);
|
||||
|
||||
reg failed;
|
||||
T value;
|
||||
T [1:0] packed_value;
|
||||
PT imported_value;
|
||||
PT [1:0] imported_packed_value;
|
||||
|
||||
function T inc(input T arg);
|
||||
inc = arg + 8'd1;
|
||||
endfunction
|
||||
|
||||
initial begin
|
||||
p::PT scoped_value;
|
||||
p::PT [1:0] scoped_packed_value;
|
||||
|
||||
failed = 1'b0;
|
||||
|
||||
if (outer_type_width != 7) begin
|
||||
$display("FAILED(%0d). Outer typedef width mismatch", `__LINE__);
|
||||
failed = 1'b1;
|
||||
end
|
||||
|
||||
if (local_type_width != 11) begin
|
||||
$display("FAILED(%0d). Local typedef width mismatch", `__LINE__);
|
||||
failed = 1'b1;
|
||||
end
|
||||
|
||||
if (outer_import_width != 9) begin
|
||||
$display("FAILED(%0d). Outer typedef before import width mismatch",
|
||||
`__LINE__);
|
||||
failed = 1'b1;
|
||||
end
|
||||
|
||||
if (imported_type_width != 13) begin
|
||||
$display("FAILED(%0d). Imported typedef width mismatch", `__LINE__);
|
||||
failed = 1'b1;
|
||||
end
|
||||
|
||||
value = 8'h12;
|
||||
packed_value = 16'h3456;
|
||||
imported_value = 4'h5;
|
||||
imported_packed_value = 8'h3c;
|
||||
scoped_value = 4'ha;
|
||||
scoped_packed_value = 8'hbc;
|
||||
|
||||
if ($bits(value) != 8 || value !== 8'h12) begin
|
||||
$display("FAILED(%0d). Typedef declaration mismatch", `__LINE__);
|
||||
failed = 1'b1;
|
||||
end
|
||||
|
||||
if ($bits(packed_value) != 16 || packed_value !== 16'h3456) begin
|
||||
$display("FAILED(%0d). Typedef packed declaration mismatch", `__LINE__);
|
||||
failed = 1'b1;
|
||||
end
|
||||
|
||||
if ($bits(imported_value) != 4 || imported_value !== 4'h5) begin
|
||||
$display("FAILED(%0d). Imported typedef declaration mismatch", `__LINE__);
|
||||
failed = 1'b1;
|
||||
end
|
||||
|
||||
if ($bits(imported_packed_value) != 8 || imported_packed_value !== 8'h3c) begin
|
||||
$display("FAILED(%0d). Imported typedef packed declaration mismatch", `__LINE__);
|
||||
failed = 1'b1;
|
||||
end
|
||||
|
||||
if ($bits(scoped_value) != 4 || scoped_value !== 4'ha) begin
|
||||
$display("FAILED(%0d). Package-scoped typedef declaration mismatch", `__LINE__);
|
||||
failed = 1'b1;
|
||||
end
|
||||
|
||||
if ($bits(scoped_packed_value) != 8 || scoped_packed_value !== 8'hbc) begin
|
||||
$display("FAILED(%0d). Package-scoped typedef packed declaration mismatch", `__LINE__);
|
||||
failed = 1'b1;
|
||||
end
|
||||
|
||||
if (inc(value) !== 8'h13) begin
|
||||
$display("FAILED(%0d). Typedef function type mismatch", `__LINE__);
|
||||
failed = 1'b1;
|
||||
end
|
||||
|
||||
if (!failed) begin
|
||||
$display("PASSED");
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
@@ -560,6 +560,7 @@ sv_type_identifier_task_function_argument_name vvp_tests/sv_type_identifier_task
|
||||
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_lookup vvp_tests/sv_type_identifier_type_lookup.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,5 @@
|
||||
{
|
||||
"type" : "normal",
|
||||
"source" : "sv_type_identifier_type_lookup.v",
|
||||
"iverilog-args" : [ "-g2005-sv" ]
|
||||
}
|
||||
Reference in New Issue
Block a user