diff --git a/ivtest/ivltests/sv_typedef_fwd_base.v b/ivtest/ivltests/sv_typedef_fwd_base.v new file mode 100644 index 000000000..46562aca9 --- /dev/null +++ b/ivtest/ivltests/sv_typedef_fwd_base.v @@ -0,0 +1,47 @@ +// Check that forward typedefs of basic types are supported + +`define check(val, exp) \ + if (val != exp) begin \ + $display("FAILED(%0d). '%s' expected ", `__LINE__, `"val`", exp, " got ", val, ); \ + failed = 1'b1; \ + end + +bit failed = 1'b0; + +module test; + typedef T1; + typedef T1; // Check forward typedef twice for the same type + typedef T2; + typedef T3; + typedef T4; + + T1 x = -1; + T2 y = 1.23; + T3 z = "Hello"; + T4 w; + + typedef integer T1; + // There can be as many forward typedefs as we like, even after the type + // itself has already been declared. + typedef T1; + typedef T1; + + typedef real T2; + typedef string T3; + typedef logic [1:0] T4[3:0]; + + initial begin + `check($bits(x), $bits(integer)) + `check($bits(T1), $bits(integer)) + `check(x, -1) + `check(y, 1.23) + `check(z, "Hello") + `check($unpacked_dimensions(w), 1) + `check($size(w), 4) + + if (!failed) begin + $display("PASSED"); + end + end + +endmodule diff --git a/ivtest/ivltests/sv_typedef_fwd_class.v b/ivtest/ivltests/sv_typedef_fwd_class.v new file mode 100644 index 000000000..4a672f5c5 --- /dev/null +++ b/ivtest/ivltests/sv_typedef_fwd_class.v @@ -0,0 +1,46 @@ +// Check that forward typedefs of classes are supported + +module test; + +`define check(val, exp) \ + if (val !== exp) begin \ + $display("FAILED(%0d). '%s' expected %d, got %d", `__LINE__, `"val`", exp, val); \ + failed = 1'b1; \ + end + + bit failed = 1'b0; + + typedef class C; + typedef C; + + C x; + + class C; + int x; + endclass + + C y; + + // There can be as many forward typedefs as we like, even after the type + // itself has already been declared. + typedef C; + typedef class C; + + C z; + + initial begin + // Check they are all the same type and can be assigned to each other + x = y; + y = z; + z = x; + + `check($bits(x.x), $bits(int)); + `check($bits(y.x), $bits(int)); + `check($bits(z.x), $bits(int)); + + if (!failed) begin + $display("PASSED"); + end + end + +endmodule diff --git a/ivtest/ivltests/sv_typedef_fwd_enum1.v b/ivtest/ivltests/sv_typedef_fwd_enum1.v new file mode 100644 index 000000000..6e3a90132 --- /dev/null +++ b/ivtest/ivltests/sv_typedef_fwd_enum1.v @@ -0,0 +1,44 @@ +// Check that forward enum typedefs are supported + +module test; + +`define check(val, exp) \ + if (val !== exp) begin \ + $display("FAILED(%0d). '%s' expected %0d, got %0d", `__LINE__, `"val`", exp, val); \ + failed = 1'b1; \ + end + + bit failed = 1'b0; + + typedef T; + typedef enum T; + + T x; + + typedef enum integer { + A, B + } T; + + T y; + + typedef enum T; + typedef T; + + T z; + + initial begin + // Check that they are all the same type and can be assigned to each other + x = y; + y = z; + z = x; + + `check($bits(x), $bits(integer)) + `check($bits(y), $bits(integer)) + `check($bits(z), $bits(integer)) + + if (!failed) begin + $display("PASSED"); + end + end + +endmodule diff --git a/ivtest/ivltests/sv_typedef_fwd_enum2.v b/ivtest/ivltests/sv_typedef_fwd_enum2.v new file mode 100644 index 000000000..d4fc02400 --- /dev/null +++ b/ivtest/ivltests/sv_typedef_fwd_enum2.v @@ -0,0 +1,23 @@ +// Check that the base type of an enum can be a forward typedef + +module test; + + typedef T1; + + typedef enum T1 { + A, B + } T2; + + typedef logic [31:0] T1; + + T2 z; + + initial begin + if ($bits(z) == 32) begin + $display("PASSED"); + end else begin + $display("FAILED"); + end + end + +endmodule diff --git a/ivtest/ivltests/sv_typedef_fwd_enum3.v b/ivtest/ivltests/sv_typedef_fwd_enum3.v new file mode 100644 index 000000000..3668d26ba --- /dev/null +++ b/ivtest/ivltests/sv_typedef_fwd_enum3.v @@ -0,0 +1,26 @@ +// Check that a forwarded enum typedef can be referenced in a class + +module test; + + typedef T; + + class C; + T x; + endclass + + typedef enum integer { + X, Y + } T; + + initial begin + C c; + c = new; + + if ($bits(c.x) == 32) begin + $display("PASSED"); + end else begin + $display("FAILED"); + end + end + +endmodule diff --git a/ivtest/ivltests/sv_typedef_fwd_enum_fail.v b/ivtest/ivltests/sv_typedef_fwd_enum_fail.v new file mode 100644 index 000000000..e05586e4e --- /dev/null +++ b/ivtest/ivltests/sv_typedef_fwd_enum_fail.v @@ -0,0 +1,14 @@ +// Check that a enum can't be its own base type + +module test; + + typedef T; + typedef enum T { + A, B + } T; + + initial begin + $display("FAILED"); + end + +endmodule diff --git a/ivtest/ivltests/sv_typedef_fwd_struct.v b/ivtest/ivltests/sv_typedef_fwd_struct.v new file mode 100644 index 000000000..f3593462b --- /dev/null +++ b/ivtest/ivltests/sv_typedef_fwd_struct.v @@ -0,0 +1,39 @@ +// Check that forward struct typedefs are supported + +module test; + +`define check(val, exp) \ + if (val !== exp) begin \ + $display("FAILED(%0d). '%s' expected %0d, got %0d", `__LINE__, `"val`", exp, val); \ + failed = 1'b1; \ + end + + bit failed = 1'b0; + + typedef T; + typedef struct T; + + T x; + + typedef struct packed { + int x; + } T; + + T y; + + typedef struct T; + typedef T; + + T z; + + initial begin + `check($bits(x), $bits(int)) + `check($bits(y), $bits(int)) + `check($bits(z), $bits(int)) + + if (!failed) begin + $display("PASSED"); + end + end + +endmodule diff --git a/ivtest/ivltests/sv_typedef_fwd_struct_fail.v b/ivtest/ivltests/sv_typedef_fwd_struct_fail.v new file mode 100644 index 000000000..eb680bd96 --- /dev/null +++ b/ivtest/ivltests/sv_typedef_fwd_struct_fail.v @@ -0,0 +1,18 @@ +// Check that it is an error to use a forwarded struct type as the type for the +// member in the struct itself. + +module test; + + typedef T; + + typedef struct packed { + T x; + } T; + + T x; + + initial begin + $display("FAILED"); + end + +endmodule diff --git a/ivtest/ivltests/sv_typedef_fwd_union.v b/ivtest/ivltests/sv_typedef_fwd_union.v new file mode 100644 index 000000000..9356d9065 --- /dev/null +++ b/ivtest/ivltests/sv_typedef_fwd_union.v @@ -0,0 +1,41 @@ +// Check that forward typdes of unions are supported + +module test; + +`define check(val, exp) \ + if (val !== exp) begin \ + $display("FAILED(%0d). '%s' expected %0d, got %0d", `__LINE__, `"val`", exp, val); \ + failed = 1'b1; \ + end + + bit failed = 1'b0; + typedef union T; + typedef T; + + T x; + + typedef union packed { + int x; + logic [3:0][7:0] y; + } T; + + T y; + + // There can be as many forward typedefs as we like, even after the type + // itself has already been declared. + typedef T; + typedef union T; + + T z; + + initial begin + `check($bits(x), $bits(int)); + `check($bits(y), $bits(int)); + `check($bits(z), $bits(int)); + + if (!failed) begin + $display("PASSED"); + end + end + +endmodule diff --git a/ivtest/ivltests/sv_typedef_fwd_union_fail.v b/ivtest/ivltests/sv_typedef_fwd_union_fail.v new file mode 100644 index 000000000..b77dc13da --- /dev/null +++ b/ivtest/ivltests/sv_typedef_fwd_union_fail.v @@ -0,0 +1,18 @@ +// Check that it is an error to use a forwarded union type as the type for the +// members in the union itself. + +module test; + + typedef T; + + typedef union packed { + T x; + } T; + + T x; + + initial begin + $display("FAILED"); + end + +endmodule diff --git a/ivtest/regress-sv.list b/ivtest/regress-sv.list index cf7a8f06a..7738d2119 100644 --- a/ivtest/regress-sv.list +++ b/ivtest/regress-sv.list @@ -720,6 +720,16 @@ sv_typedef_darray_base1 normal,-g2009 ivltests sv_typedef_darray_base2 normal,-g2009 ivltests sv_typedef_darray_base3 normal,-g2009 ivltests sv_typedef_darray_base4 normal,-g2009 ivltests +sv_typedef_fwd_base normal,-g2009 ivltests +sv_typedef_fwd_class normal,-g2009 ivltests +sv_typedef_fwd_union normal,-g2009 ivltests +sv_typedef_fwd_union_fail CE,-g2009 ivltests +sv_typedef_fwd_enum1 normal,-g2009 ivltests +sv_typedef_fwd_enum2 normal,-g2009 ivltests +sv_typedef_fwd_enum3 normal,-g2009 ivltests +sv_typedef_fwd_enum_fail CE,-g2009 ivltests +sv_typedef_fwd_struct normal,-g2009 ivltests +sv_typedef_fwd_struct_fail CE,-g2009 ivltests sv_typedef_nested_array normal,-g2009 ivltests sv_typedef_queue_base1 normal,-g2009 ivltests sv_typedef_queue_base2 normal,-g2009 ivltests diff --git a/ivtest/regress-vlog95.list b/ivtest/regress-vlog95.list index 30cbdc3e6..e520e2de3 100644 --- a/ivtest/regress-vlog95.list +++ b/ivtest/regress-vlog95.list @@ -302,6 +302,7 @@ sv_string5 CE,-g2009 ivltests sv_string6 CE,-g2009,-pallowsigned=1 ivltests sv_string7 CE,-g2009,-pallowsigned=1 ivltests sv_string7b CE,-g2009,-pallowsigned=1 ivltests +sv_typedef_fwd_base CE,-g2009 ivltests vhdl_string_lim CE,-g2005-sv,-pallowsigned=1,ivltests/vhdl_string_lim.vhd ivltests vhdl_textio_write CE,-g2005-sv,-pallowsigned=1,ivltests/vhdl_textio_write.vhd ivltests vhdl_textio_read CE,-g2005-sv,-pallowsigned=1,ivltests/vhdl_textio_read.vhd ivltests @@ -440,6 +441,8 @@ sv_port_default8 CE,-g2009,-pallowsigned=1 ivltests sv_port_default9 CE,-g2009 ivltests sv_ps_type_class1 CE,-g2009 ivltests sv_root_class CE,-g2009 ivltests +sv_typedef_fwd_class CE,-g2009 ivltests +sv_typedef_fwd_enum3 CE,-g2009 ivltests sv_typedef_scope3 CE,-g2009 ivltests sv_unit2b CE,-g2009 ivltests sv_unit3b CE,-g2009 ivltests