diff --git a/src/V3Width.cpp b/src/V3Width.cpp index 3b54e14cf..5b8e29cf4 100644 --- a/src/V3Width.cpp +++ b/src/V3Width.cpp @@ -2843,10 +2843,17 @@ private: case 'm': break; // %m - auto insert "name" case 'l': break; // %m - auto insert "library" case 'd': { // Convert decimal to either 'd' or '#' - if (argp && argp->isSigned()) { // Convert it - ch = '~'; + if (argp) { + AstNode* nextp = argp->nextp(); + if (argp->isDouble()) { + spliceCvtS(argp, true, 64); + ch = '~'; + } + else if (argp->isSigned()) { // Convert it + ch = '~'; + } + argp = nextp; } - if (argp) argp = argp->nextp(); break; } case 'p': { // Pattern @@ -2895,6 +2902,17 @@ private: if (argp) argp = argp->nextp(); break; } + case 'f': // FALLTHRU + case 'g': { + if (argp) { + AstNode* nextp = argp->nextp(); + if (!argp->isDouble()) { + iterateCheckReal(nodep, "Display argument", argp, BOTH); + } + argp = nextp; + } + break; + } case '?': { // Unspecified by user, guess if (argp && argp->isDouble()) { ch = 'g'; diff --git a/test_regress/t/t_display.v b/test_regress/t/t_display.v index a74de67bc..cfdeea257 100644 --- a/test_regress/t/t_display.v +++ b/test_regress/t/t_display.v @@ -171,7 +171,9 @@ multiline", $time); $write("'%-8s'\n", "beep"); // $itord conversion bug, note a %d instead of proper float + // verilator lint_off REALCVT $display("log10(2) = %d", $log10(100)); + // verilator lint_on REALCVT $write("*-* All Finished *-*\n"); $finish;