diff --git a/include/verilated_saif_c.cpp b/include/verilated_saif_c.cpp index d62791d8a..18f892ceb 100644 --- a/include/verilated_saif_c.cpp +++ b/include/verilated_saif_c.cpp @@ -126,6 +126,7 @@ void VerilatedSaif::open(const char* filename) VL_MT_SAFE_EXCLUDES(m_mutex) { openNextImp(m_rolloverSize != 0); if (!isOpen()) return; + m_currentTimeOrigin = m_totalTime; initializeSaifFileContents(); Super::traceInit(); @@ -202,7 +203,7 @@ bool VerilatedSaif::preChangeDump() { return isOpen(); } -void VerilatedSaif::emitTimeChange(uint64_t timeui) { m_time = timeui; } +void VerilatedSaif::emitTimeChange(uint64_t timeui) { m_totalTime = timeui; } VerilatedSaif::~VerilatedSaif() { close(); @@ -245,7 +246,7 @@ void VerilatedSaif::close() VL_MT_SAFE_EXCLUDES(m_mutex) { void VerilatedSaif::finalizeSaifFileContents() { printStr("(DURATION "); - printStr(std::to_string(m_time)); + printStr(std::to_string(getCurrentTime())); printStr(")\n"); incrementIndent(); @@ -317,7 +318,7 @@ bool VerilatedSaif::printActivityStats(uint32_t activityCode, const char* activi continue; } - bit.aggregateVal(m_time - activity.getLastUpdateTime(), bit.getBitValue()); + bit.aggregateVal(getCurrentTime() - activity.getLastUpdateTime(), bit.getBitValue()); if (!anyNetValid) { openNetScope(); @@ -335,7 +336,7 @@ bool VerilatedSaif::printActivityStats(uint32_t activityCode, const char* activi // We only have two-value logic so TZ, TX and TB will always be 0 printStr(" (T0 "); - printStr(std::to_string(m_time - bit.getHighTime())); + printStr(std::to_string(getCurrentTime() - bit.getHighTime())); printStr(") (T1 "); printStr(std::to_string(bit.getHighTime())); printStr(") (TZ 0) (TX 0) (TB 0) (TC "); @@ -343,7 +344,7 @@ bool VerilatedSaif::printActivityStats(uint32_t activityCode, const char* activi printStr("))\n"); } - activity.updateLastTime(m_time); + activity.updateLastTime(getCurrentTime()); return anyNetValid; } @@ -354,7 +355,6 @@ void VerilatedSaif::clearCurrentlyCollectedData() { m_topScopes.clear(); m_activity.clear(); m_activityArena.clear(); - m_time = 0; } void VerilatedSaif::printStr(const char* str) { m_filep->write(str, strlen(str)); } @@ -504,42 +504,42 @@ VL_ATTR_ALWINLINE void VerilatedSaifBuffer::emitBit(uint32_t code, CData newval) { assert(m_owner.m_activity.count(code) && "Activity must be declared earlier"); ActivityVar& activity = m_owner.m_activity.at(code); - activity.emitBit(m_owner.m_time, newval); + activity.emitBit(m_owner.getCurrentTime(), newval); } VL_ATTR_ALWINLINE void VerilatedSaifBuffer::emitCData(uint32_t code, CData newval, int bits) { assert(m_owner.m_activity.count(code) && "Activity must be declared earlier"); ActivityVar& activity = m_owner.m_activity.at(code); - activity.emitData(m_owner.m_time, newval, bits); + activity.emitData(m_owner.getCurrentTime(), newval, bits); } VL_ATTR_ALWINLINE void VerilatedSaifBuffer::emitSData(uint32_t code, SData newval, int bits) { assert(m_owner.m_activity.count(code) && "Activity must be declared earlier"); ActivityVar& activity = m_owner.m_activity.at(code); - activity.emitData(m_owner.m_time, newval, bits); + activity.emitData(m_owner.getCurrentTime(), newval, bits); } VL_ATTR_ALWINLINE void VerilatedSaifBuffer::emitIData(uint32_t code, IData newval, int bits) { assert(m_owner.m_activity.count(code) && "Activity must be declared earlier"); ActivityVar& activity = m_owner.m_activity.at(code); - activity.emitData(m_owner.m_time, newval, bits); + activity.emitData(m_owner.getCurrentTime(), newval, bits); } VL_ATTR_ALWINLINE void VerilatedSaifBuffer::emitQData(uint32_t code, QData newval, int bits) { assert(m_owner.m_activity.count(code) && "Activity must be declared earlier"); ActivityVar& activity = m_owner.m_activity.at(code); - activity.emitData(m_owner.m_time, newval, bits); + activity.emitData(m_owner.getCurrentTime(), newval, bits); } VL_ATTR_ALWINLINE void VerilatedSaifBuffer::emitWData(uint32_t code, const WData* newvalp, int bits) { assert(m_owner.m_activity.count(code) && "Activity must be declared earlier"); ActivityVar& activity = m_owner.m_activity.at(code); - activity.emitWData(m_owner.m_time, newvalp, bits); + activity.emitWData(m_owner.getCurrentTime(), newvalp, bits); } VL_ATTR_ALWINLINE diff --git a/include/verilated_saif_c.h b/include/verilated_saif_c.h index 2621344f1..4521149d8 100644 --- a/include/verilated_saif_c.h +++ b/include/verilated_saif_c.h @@ -194,7 +194,11 @@ private: std::unordered_map m_activity; std::vector> m_activityArena; - uint64_t m_time; + + VL_ATTR_ALWINLINE uint64_t getCurrentTime() const { return m_totalTime - m_currentTimeOrigin; } + + uint64_t m_totalTime{0}; + uint64_t m_currentTimeOrigin{0}; std::vector> m_prefixStack{ {"", VerilatedTracePrefixType::SCOPE_MODULE}}; diff --git a/test_regress/t/t_trace_cat_saif_0000.out b/test_regress/t/t_trace_cat_saif_0000.out index 36861c9e5..c9acdd616 100644 --- a/test_regress/t/t_trace_cat_saif_0000.out +++ b/test_regress/t/t_trace_cat_saif_0000.out @@ -1,27 +1,29 @@ (SAIFILE (SAIFVERSION "2.0") (DIRECTION "backward") -(DESIGN "t") +(DESIGN "foo") +(PROGRAM_NAME "Verilator") +(VERSION "5.032") (DIVIDER / ) (TIMESCALE 1ps) (DURATION 99) -(INSTANCE top + (INSTANCE top (NET - (clk (T0 49) (T1 50) (TX 0) (TC 100)) + (clk (T0 49) (T1 50) (TZ 0) (TX 0) (TB 0) (TC 100)) ) (INSTANCE t - (NET - (clk (T0 49) (T1 50) (TX 0) (TC 100)) - (cyc\[0\] (T0 50) (T1 49) (TX 0) (TC 49)) - (cyc\[1\] (T0 51) (T1 48) (TX 0) (TC 24)) - (cyc\[2\] (T0 51) (T1 48) (TX 0) (TC 12)) - (cyc\[3\] (T0 51) (T1 48) (TX 0) (TC 6)) - (cyc\[4\] (T0 64) (T1 35) (TX 0) (TC 3)) - (cyc\[5\] (T0 64) (T1 35) (TX 0) (TC 1)) - (unchanged\[1\] (T0 0) (T1 99) (TX 0) (TC 1)) - (unchanged\[3\] (T0 0) (T1 99) (TX 0) (TC 1)) - (unchanged\[5\] (T0 0) (T1 99) (TX 0) (TC 1)) - ) + (NET + (clk (T0 49) (T1 50) (TZ 0) (TX 0) (TB 0) (TC 100)) + (cyc\[0\] (T0 50) (T1 49) (TZ 0) (TX 0) (TB 0) (TC 49)) + (cyc\[1\] (T0 51) (T1 48) (TZ 0) (TX 0) (TB 0) (TC 24)) + (cyc\[2\] (T0 51) (T1 48) (TZ 0) (TX 0) (TB 0) (TC 12)) + (cyc\[3\] (T0 51) (T1 48) (TZ 0) (TX 0) (TB 0) (TC 6)) + (cyc\[4\] (T0 64) (T1 35) (TZ 0) (TX 0) (TB 0) (TC 3)) + (cyc\[5\] (T0 64) (T1 35) (TZ 0) (TX 0) (TB 0) (TC 1)) + (unchanged\[1\] (T0 0) (T1 99) (TZ 0) (TX 0) (TB 0) (TC 1)) + (unchanged\[3\] (T0 0) (T1 99) (TZ 0) (TX 0) (TB 0) (TC 1)) + (unchanged\[5\] (T0 0) (T1 99) (TZ 0) (TX 0) (TB 0) (TC 1)) + ) ) -) + ) ) diff --git a/test_regress/t/t_trace_cat_saif_0100.out b/test_regress/t/t_trace_cat_saif_0100.out index 9d76b6a02..e1099149c 100644 --- a/test_regress/t/t_trace_cat_saif_0100.out +++ b/test_regress/t/t_trace_cat_saif_0100.out @@ -1,28 +1,30 @@ (SAIFILE (SAIFVERSION "2.0") (DIRECTION "backward") -(DESIGN "t") +(DESIGN "foo") +(PROGRAM_NAME "Verilator") +(VERSION "5.032") (DIVIDER / ) (TIMESCALE 1ps) -(DURATION 189) -(INSTANCE top +(DURATION 90) + (INSTANCE top (NET - (clk (T0 144) (T1 45) (TX 0) (TC 90)) + (clk (T0 45) (T1 45) (TZ 0) (TX 0) (TB 0) (TC 90)) ) (INSTANCE t - (NET - (clk (T0 144) (T1 45) (TX 0) (TC 90)) - (cyc\[0\] (T0 145) (T1 44) (TX 0) (TC 44)) - (cyc\[1\] (T0 144) (T1 45) (TX 0) (TC 23)) - (cyc\[2\] (T0 144) (T1 45) (TX 0) (TC 11)) - (cyc\[3\] (T0 144) (T1 45) (TX 0) (TC 5)) - (cyc\[4\] (T0 132) (T1 57) (TX 0) (TC 3)) - (cyc\[5\] (T0 161) (T1 28) (TX 0) (TC 2)) - (cyc\[6\] (T0 128) (T1 61) (TX 0) (TC 1)) - (unchanged\[1\] (T0 100) (T1 89) (TX 0) (TC 1)) - (unchanged\[3\] (T0 100) (T1 89) (TX 0) (TC 1)) - (unchanged\[5\] (T0 100) (T1 89) (TX 0) (TC 1)) - ) + (NET + (clk (T0 45) (T1 45) (TZ 0) (TX 0) (TB 0) (TC 90)) + (cyc\[0\] (T0 46) (T1 44) (TZ 0) (TX 0) (TB 0) (TC 44)) + (cyc\[1\] (T0 45) (T1 45) (TZ 0) (TX 0) (TB 0) (TC 23)) + (cyc\[2\] (T0 45) (T1 45) (TZ 0) (TX 0) (TB 0) (TC 11)) + (cyc\[3\] (T0 45) (T1 45) (TZ 0) (TX 0) (TB 0) (TC 5)) + (cyc\[4\] (T0 33) (T1 57) (TZ 0) (TX 0) (TB 0) (TC 3)) + (cyc\[5\] (T0 62) (T1 28) (TZ 0) (TX 0) (TB 0) (TC 2)) + (cyc\[6\] (T0 29) (T1 61) (TZ 0) (TX 0) (TB 0) (TC 1)) + (unchanged\[1\] (T0 1) (T1 89) (TZ 0) (TX 0) (TB 0) (TC 1)) + (unchanged\[3\] (T0 1) (T1 89) (TZ 0) (TX 0) (TB 0) (TC 1)) + (unchanged\[5\] (T0 1) (T1 89) (TZ 0) (TX 0) (TB 0) (TC 1)) + ) ) -) + ) )