From aec1ee5a4219778561f59d39415a5b737bbb5976 Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Sat, 19 Feb 2022 09:35:22 +0100 Subject: [PATCH] Add regression tests for type parameters Check that all sorts of variations of type parameters are supported. Signed-off-by: Lars-Peter Clausen --- ivtest/ivltests/sv_type_param1.v | 25 ++++++++ ivtest/ivltests/sv_type_param2.v | 28 +++++++++ ivtest/ivltests/sv_type_param3.v | 26 ++++++++ ivtest/ivltests/sv_type_param4.v | 27 ++++++++ ivtest/ivltests/sv_type_param5.v | 27 ++++++++ ivtest/ivltests/sv_type_param6.v | 91 +++++++++++++++++++++++++++ ivtest/ivltests/sv_type_param7.v | 59 +++++++++++++++++ ivtest/ivltests/sv_type_param_fail1.v | 23 +++++++ ivtest/ivltests/sv_type_param_fail2.v | 21 +++++++ ivtest/regress-sv.list | 9 +++ 10 files changed, 336 insertions(+) create mode 100644 ivtest/ivltests/sv_type_param1.v create mode 100644 ivtest/ivltests/sv_type_param2.v create mode 100644 ivtest/ivltests/sv_type_param3.v create mode 100644 ivtest/ivltests/sv_type_param4.v create mode 100644 ivtest/ivltests/sv_type_param5.v create mode 100644 ivtest/ivltests/sv_type_param6.v create mode 100644 ivtest/ivltests/sv_type_param7.v create mode 100644 ivtest/ivltests/sv_type_param_fail1.v create mode 100644 ivtest/ivltests/sv_type_param_fail2.v diff --git a/ivtest/ivltests/sv_type_param1.v b/ivtest/ivltests/sv_type_param1.v new file mode 100644 index 000000000..226c11a01 --- /dev/null +++ b/ivtest/ivltests/sv_type_param1.v @@ -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 diff --git a/ivtest/ivltests/sv_type_param2.v b/ivtest/ivltests/sv_type_param2.v new file mode 100644 index 000000000..8caf8bb55 --- /dev/null +++ b/ivtest/ivltests/sv_type_param2.v @@ -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 diff --git a/ivtest/ivltests/sv_type_param3.v b/ivtest/ivltests/sv_type_param3.v new file mode 100644 index 000000000..fa71442ea --- /dev/null +++ b/ivtest/ivltests/sv_type_param3.v @@ -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 diff --git a/ivtest/ivltests/sv_type_param4.v b/ivtest/ivltests/sv_type_param4.v new file mode 100644 index 000000000..a2c49677c --- /dev/null +++ b/ivtest/ivltests/sv_type_param4.v @@ -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 diff --git a/ivtest/ivltests/sv_type_param5.v b/ivtest/ivltests/sv_type_param5.v new file mode 100644 index 000000000..c603e1e2e --- /dev/null +++ b/ivtest/ivltests/sv_type_param5.v @@ -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 diff --git a/ivtest/ivltests/sv_type_param6.v b/ivtest/ivltests/sv_type_param6.v new file mode 100644 index 000000000..47e8822c1 --- /dev/null +++ b/ivtest/ivltests/sv_type_param6.v @@ -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 diff --git a/ivtest/ivltests/sv_type_param7.v b/ivtest/ivltests/sv_type_param7.v new file mode 100644 index 000000000..f6c634be9 --- /dev/null +++ b/ivtest/ivltests/sv_type_param7.v @@ -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 diff --git a/ivtest/ivltests/sv_type_param_fail1.v b/ivtest/ivltests/sv_type_param_fail1.v new file mode 100644 index 000000000..9470d326e --- /dev/null +++ b/ivtest/ivltests/sv_type_param_fail1.v @@ -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 + diff --git a/ivtest/ivltests/sv_type_param_fail2.v b/ivtest/ivltests/sv_type_param_fail2.v new file mode 100644 index 000000000..440d64ac0 --- /dev/null +++ b/ivtest/ivltests/sv_type_param_fail2.v @@ -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 diff --git a/ivtest/regress-sv.list b/ivtest/regress-sv.list index f9456c777..d81b8387d 100644 --- a/ivtest/regress-sv.list +++ b/ivtest/regress-sv.list @@ -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