diff --git a/src/V3Life.cpp b/src/V3Life.cpp index 5b0c45921..a34493aa2 100644 --- a/src/V3Life.cpp +++ b/src/V3Life.cpp @@ -304,6 +304,7 @@ private: AstVarScope* vscp = nodep->varScopep(); if (!vscp) nodep->v3fatalSrc("Scope not assigned"); if (nodep->lvalue()) { + m_sideEffect = true; // $sscanf etc may have RHS vars that are lvalues m_lifep->complexAssign(vscp); } else { m_lifep->varUsageReplace(vscp, nodep); VL_DANGLING(nodep); diff --git a/test_regress/t/t_sys_file_basic.v b/test_regress/t/t_sys_file_basic.v index 5ec60a216..c4fc6f097 100644 --- a/test_regress/t/t_sys_file_basic.v +++ b/test_regress/t/t_sys_file_basic.v @@ -6,6 +6,8 @@ `include "verilated.v" `define STRINGIFY(x) `"x`" +`define ratio_error(a,b) (((a)>(b) ? ((a)-(b)) : ((b)-(a))) /(a)) +`define checkr(gotv,expv) do if (`ratio_error((gotv),(expv))>0.0001) begin $write("%%Error: %s:%0d: got=%g exp=%g\n", `__FILE__,`__LINE__, (gotv), (expv)); $stop; end while(0); module t; integer file; @@ -113,12 +115,12 @@ module t; if (chars != 1) $stop; if (letterq != "ijklmnop") $stop; - chars = $sscanf("xa=1f xb=12898971238912389712783490823_237904689_02348923", + chars = $sscanf("xa=1f xb=12898971238912389712783490823_abcdef689_02348923", "xa=%x xb=%x", letterq, letterw); if (`verbose) $write("c=%0d xa=%x xb=%x\n", chars, letterq, letterw); if (chars != 2) $stop; if (letterq != 64'h1f) $stop; - if (letterw != 128'h38971278349082323790468902348923) $stop; + if (letterw != 128'h389712783490823_abcdef689_02348923) $stop; chars = $sscanf("ba=10 bb=110100101010010101012 note_the_two ", "ba=%b bb=%b%s", letterq, letterw, letterz); @@ -139,14 +141,25 @@ module t; "r=%g d=%d", r, letterq); if (`verbose) $write("c=%0d d=%d\n", chars, letterq); if (chars != 2) $stop; - if (r != 0.1) $stop; + `checkr(r, 0.1); if (letterq != 64'hfffffffffffc65a5) $stop; + // Cover quad and %e/%f + chars = $sscanf("r=0.2", + "r=%e", r); + if (`verbose) $write("c=%0d r=%e\n", chars, r); + `checkr(r, 0.2); + + chars = $sscanf("r=0.3", + "r=%f", r); + if (`verbose) $write("c=%0d r=%f\n", chars, r); + `checkr(r, 0.3); + s = "r=0.2 d=-236124"; chars = $sscanf(s, "r=%g d=%d", r, letterq); if (`verbose) $write("c=%0d d=%d\n", chars, letterq); if (chars != 2) $stop; - if (r != 0.2) $stop; + `checkr(r, 0.2); if (letterq != 64'hfffffffffffc65a4) $stop; // $fscanf