From 0851d1fbe5949ee333d9b276dbc93bf43ff49b4b Mon Sep 17 00:00:00 2001 From: Ryszard Rozak Date: Fri, 5 Jun 2026 18:21:21 +0200 Subject: [PATCH] Fix optimizations of assignments with timing controls (#7718) --- src/V3Dead.cpp | 2 +- test_regress/t/t_timing_intra_assign.v | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/V3Dead.cpp b/src/V3Dead.cpp index 312f64bf6..1a08da9e8 100644 --- a/src/V3Dead.cpp +++ b/src/V3Dead.cpp @@ -309,7 +309,7 @@ class DeadVisitor final : public VNVisitor { VL_RESTORER(m_inAssign); VL_RESTORER(m_sideEffect); m_inAssign = true; - m_sideEffect = false; + m_sideEffect = nodep->isTimingControl(); // Can't remove the delay iterateAndNextNull(nodep->rhsp()); checkAll(nodep); // Has to be direct assignment without any EXTRACTing. diff --git a/test_regress/t/t_timing_intra_assign.v b/test_regress/t/t_timing_intra_assign.v index b5e55596a..8227cb5b0 100644 --- a/test_regress/t/t_timing_intra_assign.v +++ b/test_regress/t/t_timing_intra_assign.v @@ -10,6 +10,7 @@ module t; logic[1:0] idx1 = 0; logic[1:0] idx2 = 0; logic[0:0] idx3 = 0; + int not_read = 0; event e; always @val $write("[%0t] val[0]=%0d val[1]=%0d val[2]=%0d net[0]=%0d net[1]=%0d\n", @@ -19,6 +20,12 @@ module t; assign #4 val[1] = val[0]; assign #6 val[2] = val[0]; + initial begin + automatic time tm = $time; + not_read = #1 1; + if (tm != $time - 1) $stop; + end + always #10 begin // always so we can use NBA val[0] = 1; #10 val[0] = 2;