[#73220] add time offset when opening new files during SAIF trace

This commit is contained in:
Mateusz Gancarz 2025-02-28 10:09:21 +01:00
parent 8b634440a1
commit 239c264b86
4 changed files with 55 additions and 47 deletions

View File

@ -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<CData>(m_owner.m_time, newval, bits);
activity.emitData<CData>(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<SData>(m_owner.m_time, newval, bits);
activity.emitData<SData>(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<IData>(m_owner.m_time, newval, bits);
activity.emitData<IData>(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<QData>(m_owner.m_time, newval, bits);
activity.emitData<QData>(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

View File

@ -194,7 +194,11 @@ private:
std::unordered_map<uint32_t, ActivityVar> m_activity;
std::vector<std::vector<ActivityBit>> 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<std::pair<std::string, VerilatedTracePrefixType>> m_prefixStack{
{"", VerilatedTracePrefixType::SCOPE_MODULE}};

View File

@ -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))
)
)
)
)
)

View File

@ -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))
)
)
)
)
)