diff --git a/Changes b/Changes index 166baddef..e2d7c5819 100644 --- a/Changes +++ b/Changes @@ -24,6 +24,8 @@ The contributors that suggested a given feature are shown in []. Thanks! **** Fix // in filenames, bug1610. [Peter Nelson] +**** Fix $display("%p") to be closer to IEEE. + * Verilator 4.022 2019-11-10 diff --git a/src/V3Width.cpp b/src/V3Width.cpp index 2752259a8..a7b7574af 100644 --- a/src/V3Width.cpp +++ b/src/V3Width.cpp @@ -2307,13 +2307,17 @@ private: break; } case 'p': { // Packed - // Very hacky and non-compliant; print strings as strings, otherwise as hex - if (argp && argp->dtypep()->basicp()->isString()) { // Convert it + AstBasicDType* basicp = argp ? argp->dtypep()->basicp() : NULL; + if (basicp->isString()) { added = true; newFormat += "\"%@\""; + } else if (basicp->isDouble()) { + added = true; + newFormat += "%g"; } else { added = true; - newFormat += "'h%0h"; + if (fmt == "%0") newFormat += "'h%0h"; // IEEE our choice + else newFormat += "%d"; } if (argp) argp = argp->nextp(); break; diff --git a/test_regress/t/t_display.out b/test_regress/t/t_display.out index ee0f9a472..5ab2b8849 100644 --- a/test_regress/t/t_display.out +++ b/test_regress/t/t_display.out @@ -32,8 +32,8 @@ [0] %c=m %0c=m [0] %v=St0 St0 St0 St0 St0 St1 St1 St0 St0 %0v=St0 St0 St0 St0 St0 St1 St1 St0 St0 %v=St0 St0 St0 St0 St0 St1 St0 St1 St0 St1 St0 St1 St1 St1 St0 St1 St1 St1 St0 St1 St1 St1 St0 St1 St1 St1 St1 St0 St0 St1 St1 St0 St0 St1 St1 St0 St0 St1 St1 St0 St0 %0v=St0 St0 St0 St0 St0 St1 St0 St1 St0 St1 St0 St1 St1 St1 St0 St1 St1 St1 St0 St1 St1 St1 St0 St1 St1 St1 St1 St0 St0 St1 St1 St0 St0 St1 St1 St0 St0 St1 St1 St0 St0 %v=St0 St0 St0 St0 St0 St1 St0 St1 St0 St1 St0 St1 St1 St1 St1 St0 St0 St0 St0 St0 St1 St0 St0 St1 St0 St0 St0 St1 St1 St0 St1 St0 St0 St0 St1 St0 St1 St0 St1 St1 St0 St0 St1 St1 St1 St1 St0 St0 St0 St0 St0 St0 St1 St0 St0 St1 St0 St0 St0 St1 St1 St0 St1 St0 St0 St0 St1 St0 St1 St0 St1 St1 St0 St0 St1 St1 St1 St1 St0 St0 St0 %0v=St0 St0 St0 St0 St0 St1 St0 St1 St0 St1 St0 St1 St1 St1 St1 St0 St0 St0 St0 St0 St1 St0 St0 St1 St0 St0 St0 St1 St1 St0 St1 St0 St0 St0 St1 St0 St1 St0 St1 St1 St0 St0 St1 St1 St1 St1 St0 St0 St0 St0 St0 St0 St1 St0 St0 St1 St0 St0 St0 St1 St1 St0 St1 St0 St0 St0 St1 St0 St1 St0 St1 St1 St0 St0 St1 St1 St1 St1 St0 St0 St0 < [0] %V=St0 St0 St0 St0 St0 St1 St1 St0 St0 %0V=St0 St0 St0 St0 St0 St1 St1 St0 St0 %V=St0 St0 St0 St0 St0 St1 St0 St1 St0 St1 St0 St1 St1 St1 St0 St1 St1 St1 St0 St1 St1 St1 St0 St1 St1 St1 St1 St0 St0 St1 St1 St0 St0 St1 St1 St0 St0 St1 St1 St0 St0 %0V=St0 St0 St0 St0 St0 St1 St0 St1 St0 St1 St0 St1 St1 St1 St0 St1 St1 St1 St0 St1 St1 St1 St0 St1 St1 St1 St1 St0 St0 St1 St1 St0 St0 St1 St1 St0 St0 St1 St1 St0 St0 %V=St0 St0 St0 St0 St0 St1 St0 St1 St0 St1 St0 St1 St1 St1 St1 St0 St0 St0 St0 St0 St1 St0 St0 St1 St0 St0 St0 St1 St1 St0 St1 St0 St0 St0 St1 St0 St1 St0 St1 St1 St0 St0 St1 St1 St1 St1 St0 St0 St0 St0 St0 St0 St1 St0 St0 St1 St0 St0 St0 St1 St1 St0 St1 St0 St0 St0 St1 St0 St1 St0 St1 St1 St0 St0 St1 St1 St1 St1 St0 St0 St0 %0V=St0 St0 St0 St0 St0 St1 St0 St1 St0 St1 St0 St1 St1 St1 St1 St0 St0 St0 St0 St0 St1 St0 St0 St1 St0 St0 St0 St1 St1 St0 St1 St0 St0 St0 St1 St0 St1 St0 St1 St1 St0 St0 St1 St1 St1 St1 St0 St0 St0 St0 St0 St0 St1 St0 St0 St1 St0 St0 St0 St1 St1 St0 St1 St0 St0 St0 St1 St0 St1 St0 St1 St1 St0 St0 St1 St1 St1 St1 St0 St0 St0 < -[0] %p='hc %0p='hc %p='habbbbcccc %0p='habbbbcccc %p='habc1234567812345678 %0p='habc1234567812345678 -[0] %P='hc %0P='hc %P='habbbbcccc %0P='habbbbcccc %P='habc1234567812345678 %0P='habc1234567812345678 +[0] %p= 12 %0p='hc %p= 46099320012 %0p='habbbbcccc %p= 50692964483019020981880 %0p='habc1234567812345678 +[0] %P= 12 %0P='hc %P= 46099320012 %0P='habbbbcccc %P= 50692964483019020981880 %0P='habc1234567812345678 [0] %P="sv-str" [0] %u=dcba %0u=dcba [0] %U=dcba %0U=dcba diff --git a/test_regress/t/t_display_real.out b/test_regress/t/t_display_real.out index bb738ecb3..bf94bb29a 100644 --- a/test_regress/t/t_display_real.out +++ b/test_regress/t/t_display_real.out @@ -1,22 +1,22 @@ -[0] e=0.000000e+00 e1=0.000000e+00 e30=0e+00 e32=0.00e+00 -[0] f=0.000000 f1=0.000000e+00 f30=0e+00 f32=0.00e+00 -[0] g=0 g1=0.000000e+00 g30=0e+00 g32=0.00e+00 +[0] e=0.000000e+00 e1=0.000000e+00 e30=0e+00 e32=0.00e+00 p=0 +[0] f=0.000000 f1=0.000000e+00 f30=0e+00 f32=0.00e+00 p=0 +[0] g=0 g1=0.000000e+00 g30=0e+00 g32=0.00e+00 p=0 -[0] e=1.000000e+00 e1=1.000000e+00 e30=1e+00 e32=1.00e+00 -[0] f=1.000000 f1=1.000000e+00 f30=1e+00 f32=1.00e+00 -[0] g=1 g1=1.000000e+00 g30=1e+00 g32=1.00e+00 +[0] e=1.000000e+00 e1=1.000000e+00 e30=1e+00 e32=1.00e+00 p=1 +[0] f=1.000000 f1=1.000000e+00 f30=1e+00 f32=1.00e+00 p=1 +[0] g=1 g1=1.000000e+00 g30=1e+00 g32=1.00e+00 p=1 -[0] e=1.000000e-01 e1=1.000000e-01 e30=1e-01 e32=1.00e-01 -[0] f=0.100000 f1=1.000000e-01 f30=1e-01 f32=1.00e-01 -[0] g=0.1 g1=1.000000e-01 g30=1e-01 g32=1.00e-01 +[0] e=1.000000e-01 e1=1.000000e-01 e30=1e-01 e32=1.00e-01 p=0.1 +[0] f=0.100000 f1=1.000000e-01 f30=1e-01 f32=1.00e-01 p=0.1 +[0] g=0.1 g1=1.000000e-01 g30=1e-01 g32=1.00e-01 p=0.1 -[0] e=1.234500e-15 e1=1.234500e-15 e30=1e-15 e32=1.23e-15 -[0] f=0.000000 f1=1.234500e-15 f30=1e-15 f32=1.23e-15 -[0] g=1.2345e-15 g1=1.234500e-15 g30=1e-15 g32=1.23e-15 +[0] e=1.234500e-15 e1=1.234500e-15 e30=1e-15 e32=1.23e-15 p=1.2345e-15 +[0] f=0.000000 f1=1.234500e-15 f30=1e-15 f32=1.23e-15 p=1.2345e-15 +[0] g=1.2345e-15 g1=1.234500e-15 g30=1e-15 g32=1.23e-15 p=1.2345e-15 -[0] e=2.579000e+15 e1=2.579000e+15 e30=3e+15 e32=2.58e+15 -[0] f=2579000000000000.000000 f1=2.579000e+15 f30=3e+15 f32=2.58e+15 -[0] g=2.579e+15 g1=2.579000e+15 g30=3e+15 g32=2.58e+15 +[0] e=2.579000e+15 e1=2.579000e+15 e30=3e+15 e32=2.58e+15 p=2.579e+15 +[0] f=2579000000000000.000000 f1=2.579000e+15 f30=3e+15 f32=2.58e+15 p=2.579e+15 +[0] g=2.579e+15 g1=2.579000e+15 g30=3e+15 g32=2.58e+15 p=2.579e+15 r8= 3 n1=1 n2=0.1 n1=1 n2=0.1 r8= 3 diff --git a/test_regress/t/t_display_real.v b/test_regress/t/t_display_real.v index 67235af84..d0756e831 100644 --- a/test_regress/t/t_display_real.v +++ b/test_regress/t/t_display_real.v @@ -13,25 +13,25 @@ module t; initial begin // Display formatting - $display("[%0t] e=%e e1=%1e e30=%3.0e e32=%3.2e", $time, n0,n0,n0,n0); - $display("[%0t] f=%f f1=%1e f30=%3.0e f32=%3.2e", $time, n0,n0,n0,n0); - $display("[%0t] g=%g g1=%1e g30=%3.0e g32=%3.2e", $time, n0,n0,n0,n0); + $display("[%0t] e=%e e1=%1e e30=%3.0e e32=%3.2e p=%p", $time, n0,n0,n0,n0,n0); + $display("[%0t] f=%f f1=%1e f30=%3.0e f32=%3.2e p=%p", $time, n0,n0,n0,n0,n0); + $display("[%0t] g=%g g1=%1e g30=%3.0e g32=%3.2e p=%p", $time, n0,n0,n0,n0,n0); $display; - $display("[%0t] e=%e e1=%1e e30=%3.0e e32=%3.2e", $time, n1,n1,n1,n1); - $display("[%0t] f=%f f1=%1e f30=%3.0e f32=%3.2e", $time, n1,n1,n1,n1); - $display("[%0t] g=%g g1=%1e g30=%3.0e g32=%3.2e", $time, n1,n1,n1,n1); + $display("[%0t] e=%e e1=%1e e30=%3.0e e32=%3.2e p=%p", $time, n1,n1,n1,n1,n1); + $display("[%0t] f=%f f1=%1e f30=%3.0e f32=%3.2e p=%p", $time, n1,n1,n1,n1,n1); + $display("[%0t] g=%g g1=%1e g30=%3.0e g32=%3.2e p=%p", $time, n1,n1,n1,n1,n1); $display; - $display("[%0t] e=%e e1=%1e e30=%3.0e e32=%3.2e", $time, n2,n2,n2,n2); - $display("[%0t] f=%f f1=%1e f30=%3.0e f32=%3.2e", $time, n2,n2,n2,n2); - $display("[%0t] g=%g g1=%1e g30=%3.0e g32=%3.2e", $time, n2,n2,n2,n2); + $display("[%0t] e=%e e1=%1e e30=%3.0e e32=%3.2e p=%p", $time, n2,n2,n2,n2,n2); + $display("[%0t] f=%f f1=%1e f30=%3.0e f32=%3.2e p=%p", $time, n2,n2,n2,n2,n2); + $display("[%0t] g=%g g1=%1e g30=%3.0e g32=%3.2e p=%p", $time, n2,n2,n2,n2,n2); $display; - $display("[%0t] e=%e e1=%1e e30=%3.0e e32=%3.2e", $time, n3,n3,n3,n3); - $display("[%0t] f=%f f1=%1e f30=%3.0e f32=%3.2e", $time, n3,n3,n3,n3); - $display("[%0t] g=%g g1=%1e g30=%3.0e g32=%3.2e", $time, n3,n3,n3,n3); + $display("[%0t] e=%e e1=%1e e30=%3.0e e32=%3.2e p=%p", $time, n3,n3,n3,n3,n3); + $display("[%0t] f=%f f1=%1e f30=%3.0e f32=%3.2e p=%p", $time, n3,n3,n3,n3,n3); + $display("[%0t] g=%g g1=%1e g30=%3.0e g32=%3.2e p=%p", $time, n3,n3,n3,n3,n3); $display; - $display("[%0t] e=%e e1=%1e e30=%3.0e e32=%3.2e", $time, n4,n4,n4,n4); - $display("[%0t] f=%f f1=%1e f30=%3.0e f32=%3.2e", $time, n4,n4,n4,n4); - $display("[%0t] g=%g g1=%1e g30=%3.0e g32=%3.2e", $time, n4,n4,n4,n4); + $display("[%0t] e=%e e1=%1e e30=%3.0e e32=%3.2e p=%p", $time, n4,n4,n4,n4,n4); + $display("[%0t] f=%f f1=%1e f30=%3.0e f32=%3.2e p=%p", $time, n4,n4,n4,n4,n4); + $display("[%0t] g=%g g1=%1e g30=%3.0e g32=%3.2e p=%p", $time, n4,n4,n4,n4,n4); $display; $display("r8=%d n1=%g n2=%g", r8, n1, n2); $display("n1=%g n2=%g r8=%d", n1, n2, r8); diff --git a/test_regress/t/t_display_signed.out b/test_regress/t/t_display_signed.out index 2eae74513..766be54cb 100644 --- a/test_regress/t/t_display_signed.out +++ b/test_regress/t/t_display_signed.out @@ -1,8 +1,8 @@ -[0] lp %x=0bbccc %x=0bbccc %o=2736314 %b=010111011110011001100 %0d=769228 %d= 769228 -[0] ln %x=1bbccc %x=1bbccc %o=6736314 %b=110111011110011001100 %0d=-279348 %d= -279348 -[0] qp %x=001bbbbcccc %x=001bbbbcccc %o=00067356746314 %b=00000000110111011101110111100110011001100 %0d=7444614348 %d= 7444614348 -[0] qn %x=101bbbbcccc %x=101bbbbcccc %o=20067356746314 %b=10000000110111011101110111100110011001100 %0d=-1092067013428 %d=-1092067013428 -[0] wp %x=000bc1234567812345678 %x=000bc1234567812345678 %o=000570110642547402215053170 %b=000000000101111000001001000110100010101100111100000010010001101000101011001111000 -[0] wn %x=000bc1234577812345678 %x=000bc1234577812345678 %o=000570110642567402215053170 %b=000000000101111000001001000110100010101110111100000010010001101000101011001111000 +[0] lp %x=0bbccc %x=0bbccc %o=2736314 %b=010111011110011001100 %0d=769228 %d= 769228 %p= 769228 %0p='hbbccc +[0] ln %x=1bbccc %x=1bbccc %o=6736314 %b=110111011110011001100 %0d=-279348 %d= -279348 %p=1817804 %0p='h1bbccc +[0] qp %x=001bbbbcccc %x=001bbbbcccc %o=00067356746314 %b=00000000110111011101110111100110011001100 %0d=7444614348 %d= 7444614348 %p= 7444614348 %0p='h1bbbbcccc +[0] qn %x=101bbbbcccc %x=101bbbbcccc %o=20067356746314 %b=10000000110111011101110111100110011001100 %0d=-1092067013428 %d=-1092067013428 %p=1106956242124 %0p='h101bbbbcccc +[0] wp %x=000bc1234567812345678 %x=000bc1234567812345678 %o=000570110642547402215053170 %b=000000000101111000001001000110100010101100111100000010010001101000101011001111000 %p= 3469299654322568844920 %0p='hbc1234567812345678 +[0] wn %x=000bc1234577812345678 %x=000bc1234577812345678 %o=000570110642567402215053170 %b=000000000101111000001001000110100010101110111100000010010001101000101011001111000 %p= 3469299655422080472696 %0p='hbc1234577812345678 *-* All Finished *-* diff --git a/test_regress/t/t_display_signed.v b/test_regress/t/t_display_signed.v index 1db324fa9..bdbe69923 100644 --- a/test_regress/t/t_display_signed.v +++ b/test_regress/t/t_display_signed.v @@ -13,18 +13,18 @@ module t; initial begin // Display formatting - $display("[%0t] lp %%x=%x %%x=%x %%o=%o %%b=%b %%0d=%0d %%d=%d", $time, - longp, longp, longp, longp, longp, longp); - $display("[%0t] ln %%x=%x %%x=%x %%o=%o %%b=%b %%0d=%0d %%d=%d", $time, - longn, longn, longn, longn, longn, longn); - $display("[%0t] qp %%x=%x %%x=%x %%o=%o %%b=%b %%0d=%0d %%d=%d", $time, - quadp, quadp, quadp, quadp, quadp, quadp); - $display("[%0t] qn %%x=%x %%x=%x %%o=%o %%b=%b %%0d=%0d %%d=%d", $time, - quadn, quadn, quadn, quadn, quadn, quadn); - $display("[%0t] wp %%x=%x %%x=%x %%o=%o %%b=%b", $time, - widep, widep, widep, widep); - $display("[%0t] wn %%x=%x %%x=%x %%o=%o %%b=%b", $time, - widen, widen, widen, widen); + $display("[%0t] lp %%x=%x %%x=%x %%o=%o %%b=%b %%0d=%0d %%d=%d %%p=%p %%0p=%0p", + $time, longp, longp, longp, longp, longp, longp, longp, longp); + $display("[%0t] ln %%x=%x %%x=%x %%o=%o %%b=%b %%0d=%0d %%d=%d %%p=%p %%0p=%0p", + $time, longn, longn, longn, longn, longn, longn, longn, longn); + $display("[%0t] qp %%x=%x %%x=%x %%o=%o %%b=%b %%0d=%0d %%d=%d %%p=%p %%0p=%0p", + $time, quadp, quadp, quadp, quadp, quadp, quadp, quadp, quadp); + $display("[%0t] qn %%x=%x %%x=%x %%o=%o %%b=%b %%0d=%0d %%d=%d %%p=%p %%0p=%0p", + $time, quadn, quadn, quadn, quadn, quadn, quadn, quadn, quadn); + $display("[%0t] wp %%x=%x %%x=%x %%o=%o %%b=%b %%p=%p %%0p=%0p", + $time, widep, widep, widep, widep, widep, widep); + $display("[%0t] wn %%x=%x %%x=%x %%o=%o %%b=%b %%p=%p %%0p=%0p", + $time, widen, widen, widen, widen, widen, widen); $display; $write("*-* All Finished *-*\n"); $finish; diff --git a/test_regress/t/t_display_time.out b/test_regress/t/t_display_time.out index ba4c28eaf..04a719c8f 100644 --- a/test_regress/t/t_display_time.out +++ b/test_regress/t/t_display_time.out @@ -1,3 +1,3 @@ -default: [0.000] 0t time [ 0.000] No0 time +default: [10.000] 0t time [ 10.000] No0 time p= 10000 0p='h2710 *-* All Finished *-* diff --git a/test_regress/t/t_display_time.v b/test_regress/t/t_display_time.v index 33e77ddac..b4a514692 100644 --- a/test_regress/t/t_display_time.v +++ b/test_regress/t/t_display_time.v @@ -5,23 +5,35 @@ `timescale 1ns/1ns -module t; - initial begin - // Display formatting - $write; // Check missing arguments work - $write("default: [%0t] 0t time [%t] No0 time\n",$time,$time); +module t (/*AUTOARG*/ + // Inputs + clk + ); + input clk; + + always @ (posedge clk) begin + if ($time >= 10) begin + // Display formatting + $write; // Check missing arguments work + $write("default: [%0t] 0t time [%t] No0 time p=%p 0p=%0p\n", + $time, $time, $time, $time); `ifndef verilator // Unsupported - $timeformat(-9, 0, "", 0); - $write("-9,0,,0: [%0t] 0t time [%t] No0 time\n",$time,$time); - $timeformat(-9, 0, "", 10); - $write("-9,0,,10: [%0t] 0t time [%t] No0 time\n",$time,$time); - $timeformat(-9, 0, "ns", 5); - $write("-9,0,ns,5: [%0t] 0t time [%t] No0 time\n",$time,$time); - $timeformat(-9, 3, "ns", 8); - $write("-9,3,ns,8: [%0t] 0t time [%t] No0 time\n",$time,$time); + $timeformat(-9, 0, "", 0); + $write("-9,0,,0: [%0t] 0t time [%t] No0 time p=%p 0p=%0p\n", + $time, $time, $time, $time); + $timeformat(-9, 0, "", 10); + $write("-9,0,,10: [%0t] 0t time [%t] No0 time p=%p 0p=%0p\n", + $time, $time, $time, $time); + $timeformat(-9, 0, "ns", 5); + $write("-9,0,ns,5: [%0t] 0t time [%t] No0 time p=%p 0p=%0p\n", + $time, $time, $time, $time); + $timeformat(-9, 3, "ns", 8); + $write("-9,3,ns,8: [%0t] 0t time [%t] No0 time p=%p 0p=%0p\n", + $time, $time, $time, $time); `endif - $write("\n"); - $write("*-* All Finished *-*\n"); - $finish; + $write("\n"); + $write("*-* All Finished *-*\n"); + $finish; + end end endmodule