Fix %% on elaboration severity tasks (#5922).

This commit is contained in:
Wilson Snyder 2025-04-07 08:38:05 -04:00
parent 0a3de7c74a
commit f5312b83b9
10 changed files with 73 additions and 27 deletions

View File

@ -71,6 +71,7 @@ Verilator 5.035 devel
* Fix segfault in fork synchronization (#5906). [Krzysztof Bieganski, Antmicro Ltd.] * Fix segfault in fork synchronization (#5906). [Krzysztof Bieganski, Antmicro Ltd.]
* Fix `new this` (#5909). * Fix `new this` (#5909).
* Fix LATCH warning for automatic variables (#5918). [Yutetsu TAKATSUKASA] * Fix LATCH warning for automatic variables (#5918). [Yutetsu TAKATSUKASA]
* Fix %% on elaboration severity tasks (#5922). [Ethan Sifferman]
Verilator 5.034 2025-02-24 Verilator 5.034 2025-02-24

View File

@ -3249,7 +3249,7 @@ class ConstVisitor final : public VNVisitor {
} }
} }
if (m_doNConst && anyconst) { if (m_doNConst && anyconst) {
// UINFO(9," Display in "<<nodep->text()<<endl); // UINFO(9, " Display in " << nodep->text() << endl);
string newFormat; string newFormat;
string fmt; string fmt;
bool inPct = false; bool inPct = false;
@ -3265,9 +3265,9 @@ class ConstVisitor final : public VNVisitor {
inPct = false; inPct = false;
fmt += ch; fmt += ch;
switch (std::tolower(ch)) { switch (std::tolower(ch)) {
case '%': break; // %% - just output a % case '%': break; // %% - still %%
case 'm': break; // %m - auto insert "name" case 'm': break; // %m - still %m - auto insert "name"
case 'l': break; // %l - auto insert "library" case 'l': break; // %l - still %l - auto insert "library"
case 't': // FALLTHRU case 't': // FALLTHRU
case '^': // %t/%^ - don't know $timeformat so can't constify case '^': // %t/%^ - don't know $timeformat so can't constify
if (argp) argp = argp->nextp(); if (argp) argp = argp->nextp();

View File

@ -100,6 +100,20 @@ string VString::quoteAny(const string& str, char tgt, char esc) {
return result; return result;
} }
string VString::dequotePercent(const string& str) {
string result;
char last = '\0';
for (const char c : str) {
if (last == '%' && c == '%') {
last = '\0';
} else {
result += c;
last = c;
}
}
return result;
}
string VString::quoteStringLiteralForShell(const string& str) { string VString::quoteStringLiteralForShell(const string& str) {
string result; string result;
const char dquote = '"'; const char dquote = '"';

View File

@ -99,6 +99,8 @@ public:
static string quoteBackslash(const string& str) { return quoteAny(str, '\\', '\\'); } static string quoteBackslash(const string& str) { return quoteAny(str, '\\', '\\'); }
// Replace any %'s with %% // Replace any %'s with %%
static string quotePercent(const string& str) { return quoteAny(str, '%', '%'); } static string quotePercent(const string& str) { return quoteAny(str, '%', '%'); }
// Replace any %%'s with %
static string dequotePercent(const string& str);
// Surround a raw string by double quote and escape if necessary // Surround a raw string by double quote and escape if necessary
// e.g. input abc's becomes "\"abc\'s\"" // e.g. input abc's becomes "\"abc\'s\""
static string escapeStringForPath(const string& str); static string escapeStringForPath(const string& str);

View File

@ -5463,7 +5463,7 @@ class WidthVisitor final : public VNVisitor {
userIterateChildren(nodep, WidthVP{SELF, BOTH}.p()); userIterateChildren(nodep, WidthVP{SELF, BOTH}.p());
if (!m_paramsOnly) { if (!m_paramsOnly) {
V3Const::constifyParamsEdit(nodep->fmtp()); // fmtp may change V3Const::constifyParamsEdit(nodep->fmtp()); // fmtp may change
string text = nodep->fmtp()->text(); string text = VString::dequotePercent(nodep->fmtp()->text());
if (text.empty()) text = "Elaboration system task message (IEEE 1800-2023 20.11)"; if (text.empty()) text = "Elaboration system task message (IEEE 1800-2023 20.11)";
switch (nodep->displayType()) { switch (nodep->displayType()) {
case VDisplayType::DT_INFO: nodep->v3warn(USERINFO, text); break; case VDisplayType::DT_INFO: nodep->v3warn(USERINFO, text); break;

View File

@ -0,0 +1,7 @@
[0] -Info: t_assert_comp.v:23: top.t
[0] -Info: t_assert_comp.v:24: top.t: User run-time info
[0] -Info: t_assert_comp.v:25: top.t: Percent=% PctPct=%% Ten=10
[0] %Warning: t_assert_comp.v:26: top.t
[0] %Warning: t_assert_comp.v:27: top.t: User run-time warning
[0] %Warning: t_assert_comp.v:28: top.t: 1
*-* All Finished *-*

View File

@ -13,6 +13,6 @@ test.scenarios('simulator')
test.compile(verilator_flags2=['--assert'], nc_flags2=['+assert']) test.compile(verilator_flags2=['--assert'], nc_flags2=['+assert'])
test.execute() test.execute(expect_filename=test.golden_filename)
test.passes() test.passes()

View File

@ -6,13 +6,27 @@
module t (/*AUTOARG*/); module t (/*AUTOARG*/);
localparam TEN = 10;
localparam string PCTPCT = "%%";
if (0) begin if (0) begin
$info("User compile-time info"); $info;
$warning("User compile-time warning"); $info("User elaboration-time info");
$error("User compile-time error"); $info("Percent=%% PctPct=%s Ten=%0d", PCTPCT, TEN);
$warning;
$warning("User elaboration-time warning");
$warning(1); // Check can convert arguments to format
$error("User elaboration-time error");
end end
initial begin initial begin
$info;
$info("User run-time info");
$info("Percent=%% PctPct=%s Ten=%0d", PCTPCT, TEN);
$warning;
$warning("User run-time warning");
$warning(1); // Check can convert arguments to format
$write("*-* All Finished *-*\n"); $write("*-* All Finished *-*\n");
$finish; $finish;
end end

View File

@ -1,43 +1,47 @@
-Info: t/t_assert_comp_bad.v:10:7: Elaboration system task message (IEEE 1800-2023 20.11) -Info: t/t_assert_comp_bad.v:13:7: Elaboration system task message (IEEE 1800-2023 20.11)
: ... note: In instance 't' : ... note: In instance 't'
10 | $info; 13 | $info;
| ^~~~~ | ^~~~~
-Info: t/t_assert_comp_bad.v:11:7: User elaboration-time info -Info: t/t_assert_comp_bad.v:14:7: User elaboration-time info
: ... note: In instance 't' : ... note: In instance 't'
11 | $info("User elaboration-time info"); 14 | $info("User elaboration-time info");
| ^~~~~ | ^~~~~
%Warning-USERWARN: t/t_assert_comp_bad.v:12:7: Elaboration system task message (IEEE 1800-2023 20.11) -Info: t/t_assert_comp_bad.v:15:7: Percent=% PctPct=%% Ten=10
: ... note: In instance 't' : ... note: In instance 't'
12 | $warning; 15 | $info("Percent=%% PctPct=%s Ten=%0d", PCTPCT, TEN);
| ^~~~~
%Warning-USERWARN: t/t_assert_comp_bad.v:16:7: Elaboration system task message (IEEE 1800-2023 20.11)
: ... note: In instance 't'
16 | $warning;
| ^~~~~~~~ | ^~~~~~~~
... For warning description see https://verilator.org/warn/USERWARN?v=latest ... For warning description see https://verilator.org/warn/USERWARN?v=latest
... Use "/* verilator lint_off USERWARN */" and lint_on around source to disable this message. ... Use "/* verilator lint_off USERWARN */" and lint_on around source to disable this message.
%Warning-USERWARN: t/t_assert_comp_bad.v:13:7: User elaboration-time warning %Warning-USERWARN: t/t_assert_comp_bad.v:17:7: User elaboration-time warning
: ... note: In instance 't' : ... note: In instance 't'
13 | $warning("User elaboration-time warning"); 17 | $warning("User elaboration-time warning");
| ^~~~~~~~ | ^~~~~~~~
%Warning-USERWARN: t/t_assert_comp_bad.v:14:7: 1 %Warning-USERWARN: t/t_assert_comp_bad.v:18:7: 1
: ... note: In instance 't' : ... note: In instance 't'
14 | $warning(1); 18 | $warning(1);
| ^~~~~~~~ | ^~~~~~~~
%Warning-USERERROR: t/t_assert_comp_bad.v:15:7: Elaboration system task message (IEEE 1800-2023 20.11) %Warning-USERERROR: t/t_assert_comp_bad.v:19:7: Elaboration system task message (IEEE 1800-2023 20.11)
: ... note: In instance 't' : ... note: In instance 't'
15 | $error; 19 | $error;
| ^~~~~~ | ^~~~~~
... For warning description see https://verilator.org/warn/USERERROR?v=latest ... For warning description see https://verilator.org/warn/USERERROR?v=latest
... Use "/* verilator lint_off USERERROR */" and lint_on around source to disable this message. ... Use "/* verilator lint_off USERERROR */" and lint_on around source to disable this message.
%Warning-USERERROR: t/t_assert_comp_bad.v:16:7: User elaboration-time error %Warning-USERERROR: t/t_assert_comp_bad.v:20:7: User elaboration-time error
: ... note: In instance 't' : ... note: In instance 't'
16 | $error("User elaboration-time error"); 20 | $error("User elaboration-time error");
| ^~~~~~ | ^~~~~~
%Warning-USERFATAL: t/t_assert_comp_bad.v:17:7: User elaboration-time fatal %Warning-USERFATAL: t/t_assert_comp_bad.v:21:7: User elaboration-time fatal
: ... note: In instance 't' : ... note: In instance 't'
17 | $fatal(0, "User elaboration-time fatal"); 21 | $fatal(0, "User elaboration-time fatal");
| ^~~~~~ | ^~~~~~
... For warning description see https://verilator.org/warn/USERFATAL?v=latest ... For warning description see https://verilator.org/warn/USERFATAL?v=latest
... Use "/* verilator lint_off USERFATAL */" and lint_on around source to disable this message. ... Use "/* verilator lint_off USERFATAL */" and lint_on around source to disable this message.
%Warning-USERFATAL: t/t_assert_comp_bad.v:18:7: Elaboration system task message (IEEE 1800-2023 20.11) %Warning-USERFATAL: t/t_assert_comp_bad.v:22:7: Elaboration system task message (IEEE 1800-2023 20.11)
: ... note: In instance 't' : ... note: In instance 't'
18 | $fatal; 22 | $fatal;
| ^~~~~~ | ^~~~~~
%Error: Exiting due to %Error: Exiting due to

View File

@ -6,9 +6,13 @@
module t (/*AUTOARG*/); module t (/*AUTOARG*/);
localparam TEN = 10;
localparam string PCTPCT = "%%";
if (1) begin if (1) begin
$info; $info;
$info("User elaboration-time info"); $info("User elaboration-time info");
$info("Percent=%% PctPct=%s Ten=%0d", PCTPCT, TEN);
$warning; $warning;
$warning("User elaboration-time warning"); $warning("User elaboration-time warning");
$warning(1); // Check can convert arguments to format $warning(1); // Check can convert arguments to format