From 8e420f56ff2900afb8dd7c68c89fdc6b0aac3252 Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Sat, 1 Aug 2026 23:16:18 -0700 Subject: [PATCH] Add regression tests for enum named constant reference order Check that a reference before an inner enum declaration resolves to a matching enum named constant in the outer scope, while a reference after the declaration resolves to the inner constant. Also check that `-gno-strict-parameter-declaration` continues to allow a reference to a later enum named constant and identifies it correctly in the declaration-after-use warning. Signed-off-by: Lars-Peter Clausen --- ...ference_order_relaxed-iverilog-stderr.gold | 2 + ...um_reference_order_relaxed-vvp-stdout.gold | 1 + ivtest/ivltests/sv_enum_reference_order.v | 37 +++++++++++++++++++ .../sv_enum_reference_order_relaxed.v | 32 ++++++++++++++++ ivtest/regress-vvp.list | 2 + ivtest/vvp_tests/sv_enum_reference_order.json | 5 +++ .../sv_enum_reference_order_relaxed.json | 6 +++ 7 files changed, 85 insertions(+) create mode 100644 ivtest/gold/sv_enum_reference_order_relaxed-iverilog-stderr.gold create mode 100644 ivtest/gold/sv_enum_reference_order_relaxed-vvp-stdout.gold create mode 100644 ivtest/ivltests/sv_enum_reference_order.v create mode 100644 ivtest/ivltests/sv_enum_reference_order_relaxed.v create mode 100644 ivtest/vvp_tests/sv_enum_reference_order.json create mode 100644 ivtest/vvp_tests/sv_enum_reference_order_relaxed.json diff --git a/ivtest/gold/sv_enum_reference_order_relaxed-iverilog-stderr.gold b/ivtest/gold/sv_enum_reference_order_relaxed-iverilog-stderr.gold new file mode 100644 index 000000000..1e1f2a958 --- /dev/null +++ b/ivtest/gold/sv_enum_reference_order_relaxed-iverilog-stderr.gold @@ -0,0 +1,2 @@ +ivltests/sv_enum_reference_order_relaxed.v:7: warning: enum named constant `VALUE` used before declaration. +ivltests/sv_enum_reference_order_relaxed.v:10: : the enum named constant is declared here. diff --git a/ivtest/gold/sv_enum_reference_order_relaxed-vvp-stdout.gold b/ivtest/gold/sv_enum_reference_order_relaxed-vvp-stdout.gold new file mode 100644 index 000000000..53cdf1e93 --- /dev/null +++ b/ivtest/gold/sv_enum_reference_order_relaxed-vvp-stdout.gold @@ -0,0 +1 @@ +PASSED diff --git a/ivtest/ivltests/sv_enum_reference_order.v b/ivtest/ivltests/sv_enum_reference_order.v new file mode 100644 index 000000000..8f0c5db67 --- /dev/null +++ b/ivtest/ivltests/sv_enum_reference_order.v @@ -0,0 +1,37 @@ +// Check that enum named constants only affect following references. + +typedef enum logic [1:0] { + VALUE = 1 +} outer_t; + +module test; + + localparam value_before = VALUE; + + typedef enum logic [1:0] { + VALUE = 2 + } inner_t; + + localparam value_after = VALUE; + + reg failed; + + `define check(val, exp) \ + if (val !== exp) begin \ + $display("FAILED(%0d). '%s' expected %b, got %b", `__LINE__, \ + `"val`", exp, val); \ + failed = 1'b1; \ + end + + initial begin + failed = 1'b0; + + `check(value_before, 2'd1); + `check(value_after, 2'd2); + + if (!failed) begin + $display("PASSED"); + end + end + +endmodule diff --git a/ivtest/ivltests/sv_enum_reference_order_relaxed.v b/ivtest/ivltests/sv_enum_reference_order_relaxed.v new file mode 100644 index 000000000..0e982ed5b --- /dev/null +++ b/ivtest/ivltests/sv_enum_reference_order_relaxed.v @@ -0,0 +1,32 @@ +// Check relaxed declaration ordering for enum named constants. +// This is not valid in strict SystemVerilog and tests +// -gno-strict-parameter-declaration. + +module test; + + localparam value_before = VALUE; + + typedef enum logic [1:0] { + VALUE = 2 + } value_t; + + reg failed; + + `define check(val, exp) \ + if (val !== exp) begin \ + $display("FAILED(%0d). '%s' expected %b, got %b", `__LINE__, \ + `"val`", exp, val); \ + failed = 1'b1; \ + end + + initial begin + failed = 1'b0; + + `check(value_before, 2'd2); + + if (!failed) begin + $display("PASSED"); + end + end + +endmodule diff --git a/ivtest/regress-vvp.list b/ivtest/regress-vvp.list index 57f768168..037712e6e 100644 --- a/ivtest/regress-vvp.list +++ b/ivtest/regress-vvp.list @@ -331,6 +331,8 @@ sv_declaration_after_null_statement_fail vvp_tests/sv_declaration_after_null_sta sv_default_port_value1 vvp_tests/sv_default_port_value1.json sv_default_port_value2 vvp_tests/sv_default_port_value2.json sv_default_port_value3 vvp_tests/sv_default_port_value3.json +sv_enum_reference_order vvp_tests/sv_enum_reference_order.json +sv_enum_reference_order_relaxed vvp_tests/sv_enum_reference_order_relaxed.json sv_foreach9 vvp_tests/sv_foreach9.json sv_foreach10 vvp_tests/sv_foreach10.json sv_fork_prefix_label vvp_tests/sv_fork_prefix_label.json diff --git a/ivtest/vvp_tests/sv_enum_reference_order.json b/ivtest/vvp_tests/sv_enum_reference_order.json new file mode 100644 index 000000000..034407ac8 --- /dev/null +++ b/ivtest/vvp_tests/sv_enum_reference_order.json @@ -0,0 +1,5 @@ +{ + "type" : "normal", + "source" : "sv_enum_reference_order.v", + "iverilog-args" : [ "-g2005-sv" ] +} diff --git a/ivtest/vvp_tests/sv_enum_reference_order_relaxed.json b/ivtest/vvp_tests/sv_enum_reference_order_relaxed.json new file mode 100644 index 000000000..2d905b05e --- /dev/null +++ b/ivtest/vvp_tests/sv_enum_reference_order_relaxed.json @@ -0,0 +1,6 @@ +{ + "type" : "normal", + "source" : "sv_enum_reference_order_relaxed.v", + "iverilog-args" : [ "-g2005-sv", "-gno-strict-parameter-declaration" ], + "gold" : "sv_enum_reference_order_relaxed" +}