diff --git a/Changes b/Changes index 182469cab..20a419128 100644 --- a/Changes +++ b/Changes @@ -43,6 +43,7 @@ Verilator 5.049 devel * Fix events in observed region (#7546). [Todd Strader] * Fix regression rejecting boolean `!x` inside sequence expressions (#7549) (#7551). [Yilou Wang] * Fix exponential expansion in V3Gate (#7550). [Geza Lore, Testorrent USA, Inc.] +* Fix display of %m in non-first argument (#7574). Verilator 5.048 2026-04-26 diff --git a/src/V3AstNodeExpr.h b/src/V3AstNodeExpr.h index ea75a24b9..ebe5dd4d7 100644 --- a/src/V3AstNodeExpr.h +++ b/src/V3AstNodeExpr.h @@ -2362,8 +2362,18 @@ public: return nullptr; } bool formatScopeTracking() const { // Track scopeNamep(); Ok if false positive - return exprFormat() || name().find("%m") != string::npos - || name().find("%M") != string::npos; + if (exprFormat() || name().find("%m") != string::npos || name().find("%M") != string::npos) + return true; + for (const AstNode* exprp = this->exprsp(); exprp; exprp = exprp->nextp()) { + if (const AstConst* const fmtp = VN_CAST(exprp, Const)) { + if (fmtp->num().isFromString()) { + const string str = fmtp->num().toString(); + if (str.find("%m") != string::npos || str.find("%M") != string::npos) + return true; + } + } + } + return false; } bool hidden() const { return m_hidden; } bool exprFormat() const { return m_exprFormat; } diff --git a/test_regress/t/t_display.out b/test_regress/t/t_display.out index 95bc61e73..023e37097 100644 --- a/test_regress/t/t_display.out +++ b/test_regress/t/t_display.out @@ -106,4 +106,6 @@ XXXx [0] not-fmt %-d 60 [0] fmt-as-string-not-%0x 70 s=[0] fmt-string-not-%s +atop.t + 12top.ttop.t *-* All Finished *-* diff --git a/test_regress/t/t_display.v b/test_regress/t/t_display.v index 75609e367..a2f6beda6 100644 --- a/test_regress/t/t_display.v +++ b/test_regress/t/t_display.v @@ -230,6 +230,10 @@ multiline", $time); s = $sformatf("[%0t] %s", $time, " fmt-string-not-%s"); $display("s=%s", s); + // Issue #7574 + $display("a", "%m"); + $display(nine, "%m", "%M"); + $write("*-* All Finished *-*\n"); $finish; end diff --git a/test_regress/t/t_sys_sformat.v b/test_regress/t/t_sys_sformat.v index c283ac9b6..8dbe49b34 100644 --- a/test_regress/t/t_sys_sformat.v +++ b/test_regress/t/t_sys_sformat.v @@ -72,6 +72,9 @@ module t ( $swrite(str2, "mod=%m"); `checks(str2, "mod=top.t"); + $swrite(str2, "n=%0d mod=%m n=%0d mod_again=%m", 1, 2); + `checks(str2, "n=1 mod=top.t n=2 mod_again=top.t"); + $swrite(str2, "lib=%l"); `checks(str2, "lib=work.t");