Add regression tests for type parameters

Check that all sorts of variations of type parameters are supported.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
This commit is contained in:
Lars-Peter Clausen 2022-02-19 09:35:22 +01:00
parent 5ef847ea87
commit aec1ee5a42
10 changed files with 336 additions and 0 deletions

View File

@ -0,0 +1,25 @@
// Check that basic type parameter syntax is supported
bit failed = 1'b0;
`define check(expr, val) \
if (expr != val) begin \
$display("failed: %s, expected %0d, got %0d", `"expr`", val, expr); \
failed = 1'b1; \
end
module test #(
parameter type T1 = integer
);
T1 x;
initial begin
`check($bits(x), $bits(integer))
`check($bits(T1), $bits(integer))
if (!failed) begin
$display("PASSED");
end
end
endmodule

View File

@ -0,0 +1,28 @@
// Check that it is possible to declare multiple type parameters as a list with
// a single type keyword.
bit failed = 1'b0;
`define check(expr, val) \
if (expr != val) begin \
$display("failed: %s, expected %0d, got %0d", `"expr`", val, expr); \
failed = 1'b1; \
end
module test #(
parameter type T1 = integer, T2 = real
);
T1 x;
T2 y = 1.23;
initial begin
`check($bits(x), $bits(integer))
`check($bits(T1), $bits(integer))
`check(y, 1.23)
if (!failed) begin
$display("PASSED");
end
end
endmodule

View File

@ -0,0 +1,26 @@
// Check that it is possible to declare type parameters when omitting the
// parameter keyword.
bit failed = 1'b0;
`define check(expr, val) \
if (expr != val) begin \
$display("failed: %s, expected %0d, got %0d", `"expr`", val, expr); \
failed = 1'b1; \
end
module test #(
type T1 = integer
);
T1 x;
initial begin
`check($bits(x), $bits(integer))
`check($bits(T1), $bits(integer))
if (!failed) begin
$display("PASSED");
end
end
endmodule

View File

@ -0,0 +1,27 @@
// Check that it is possible to reference other parameters in the default value
// of a type parameter.
bit failed = 1'b0;
`define check(expr, val) \
if (expr != val) begin \
$display("failed: %s, expected %0d, got %0d", `"expr`", val, expr); \
failed = 1'b1; \
end
module test #(
parameter A = 10,
parameter type T1 = logic [A-1:0]
);
T1 x;
initial begin
`check($bits(x), A)
`check($bits(T1), A)
if (!failed) begin
$display("PASSED");
end
end
endmodule

View File

@ -0,0 +1,27 @@
// Check that it is possible to declare local type parameters.
bit failed = 1'b0;
`define check(expr, val) \
if (expr != val) begin \
$display("failed: %s, expected %0d, got %0d", `"expr`", val, expr); \
failed = 1'b1; \
end
module test;
parameter A = 10;
localparam type T1 = logic [A-1:0];
T1 x;
initial begin
`check($bits(x), A)
`check($bits(T1), A)
if (!failed) begin
$display("PASSED");
end
end
endmodule

View File

@ -0,0 +1,91 @@
// Check that various syntax variations for type parameters without a default
// value are supported.
bit failed = 1'b0;
`define check(expr, val) \
if (expr != val) begin \
$display("failed: %s, expected %0d, got %0d", `"expr`", val, expr); \
failed = 1'b1; \
end
module M1 #(
parameter type T1
);
T1 x;
initial begin
`check($bits(x), $bits(integer))
`check($bits(T1), $bits(integer))
end
endmodule
module M2 #(
type T1
);
T1 x;
initial begin
`check($bits(x), $bits(integer))
`check($bits(T1), $bits(integer))
end
endmodule
module M3 #(
parameter type T1, T2
);
T1 x;
T2 y = 1.23;
initial begin
`check($bits(x), $bits(integer))
`check($bits(T1), $bits(integer))
`check(y, 1.23)
end
endmodule
module M4 #(
type T1, T2
);
T1 x;
T2 y = 1.23;
initial begin
`check($bits(x), $bits(integer))
`check($bits(T1), $bits(integer))
`check(y, 1.23)
end
endmodule
module test;
M1 #(
.T1 (integer)
) i_m1 ();
M2 #(
.T1 (integer)
) i_m2 ();
M3 #(
.T1 (integer),
.T2 (real)
) i_m3();
M4 #(
.T1 (integer),
.T2 (real)
) i_m4 ();
initial begin
#1
if (!failed) begin
$display("PASSED");
end
end
endmodule

View File

@ -0,0 +1,59 @@
// Check that it is possible to overwrite type parameters and that the provided
// type is evaluated in the scope instantiating the module.
bit failed = 1'b0;
`define check(expr, val) \
if (expr != val) begin \
$display("failed: %s, expected %0d, got %0d", `"expr`", val, expr); \
failed = 1'b1; \
end
module M #(
parameter type T1 = integer,
parameter WIDTH = 0
);
typedef logic [1:0] T2;
localparam A = 2;
T1 x;
initial begin
`check($bits(x), WIDTH)
`check($bits(T1), WIDTH)
end
endmodule
module test;
localparam A = 4;
typedef logic [A-1:0] T2;
M #(
.WIDTH ($bits(integer))
) i_m1 ();
M #(
.T1 (logic [15:0]),
.WIDTH (16)
) i_m2 ();
// `A` must be evauluated in this context
M #(
.T1 (logic [A-1:0]),
.WIDTH (4)
) i_m3 ();
// `T2` must be evauluated in this context
M #(
.T1 (T2),
.WIDTH (4)
) i_m4 ();
initial begin
#1
if (!failed) begin
$display("PASSED");
end
end
endmodule

View File

@ -0,0 +1,23 @@
// Check that overrideing a type parameter with an expression that is not a type
// generates an error.
module M #(
type T = int
);
T x;
initial begin
$display("FAILED");
end
endmodule
module test;
M #(
.T(10)
) m();
endmodule

View File

@ -0,0 +1,21 @@
// Check that trying to override a type parameter using a defparam statement
// generates an error.
module M #(
type T = int
);
T x;
initial begin
$display("FAILED");
end
endmodule
module test;
M m();
defparam m.T = real; // Error, this is illegal
endmodule

View File

@ -711,6 +711,15 @@ sv_timeunit_prec_fail2 CE,-g2009,-u,\
./ivltests/sv_timeunit_prec_fail2a.v,\
./ivltests/sv_timeunit_prec_fail2b.v,\
./ivltests/sv_timeunit_prec_fail2c.v, ivltests gold=sv_timeunit_prec_fail2.gold
sv_type_param1 normal,-g2005-sv ivltests
sv_type_param2 normal,-g2005-sv ivltests
sv_type_param3 normal,-g2005-sv ivltests
sv_type_param4 normal,-g2005-sv ivltests
sv_type_param5 normal,-g2005-sv ivltests
sv_type_param6 normal,-g2005-sv ivltests
sv_type_param7 normal,-g2005-sv ivltests
sv_type_param_fail1 CE,-g2005-sv ivltests
sv_type_param_fail2 CE,-g2005-sv ivltests
sv_typedef_array_base1 normal,-g2009 ivltests
sv_typedef_array_base2 normal,-g2009 ivltests
sv_typedef_array_base3 normal,-g2009 ivltests