diff --git a/include/verilated_saif_c.cpp b/include/verilated_saif_c.cpp index 4748d1bf2..ee5a40e8e 100644 --- a/include/verilated_saif_c.cpp +++ b/include/verilated_saif_c.cpp @@ -319,6 +319,7 @@ void VerilatedSaif::close() VL_MT_SAFE_EXCLUDES(m_mutex) { finalizeSaifFileContents(); clearCurrentlyCollectedData(); + writeBuffered(true); ::close(m_filep); m_isOpen = false; @@ -437,9 +438,25 @@ void VerilatedSaif::clearCurrentlyCollectedData() { m_activityAccumulators.clear(); } -void VerilatedSaif::printStr(const char* str) { ::write(m_filep, str, strlen(str)); } +void VerilatedSaif::printStr(const char* str) { + m_buffer.append(str); + writeBuffered(false); +} -void VerilatedSaif::printStr(const std::string& str) { ::write(m_filep, str.c_str(), str.size()); } +void VerilatedSaif::printStr(const std::string& str) { + m_buffer.append(str); + writeBuffered(false); +} + +void VerilatedSaif::writeBuffered(bool force) { + if (VL_UNLIKELY(m_buffer.size() >= WRITE_BUFFER_SIZE || force)) { + if (VL_UNLIKELY(!m_buffer.empty())) { + ::write(m_filep, m_buffer.data(), m_buffer.size()); + m_buffer = ""; + m_buffer.reserve(WRITE_BUFFER_SIZE * 2); + } + } +} //============================================================================= // Definitions @@ -454,7 +471,7 @@ void VerilatedSaif::incrementIndent() { m_indent += 1; } void VerilatedSaif::decrementIndent() { m_indent -= 1; } void VerilatedSaif::printIndent() { - for (int i = 0; i < m_indent; ++i) printStr(" "); + printStr(std::string(m_indent, ' ')); // Must use () constructor } void VerilatedSaif::pushPrefix(const std::string& name, VerilatedTracePrefixType type) { diff --git a/include/verilated_saif_c.h b/include/verilated_saif_c.h index 06296f556..aab5ddb05 100644 --- a/include/verilated_saif_c.h +++ b/include/verilated_saif_c.h @@ -52,8 +52,10 @@ private: int m_filep = 0; // File we're writing to bool m_isOpen = false; // True indicates open file std::string m_filename; // Filename we're writing to (if open) + std::string m_buffer; // Write data buffer int m_indent = 0; // Indentation size in spaces + static constexpr size_t WRITE_BUFFER_SIZE = 256 * 1024; // Bytes between write calls // Currently active scope VerilatedSaifActivityScope* m_currentScope = nullptr; @@ -92,6 +94,7 @@ private: void printStr(const char* str); void printStr(const std::string& str); + void writeBuffered(bool force); void clearCurrentlyCollectedData(); diff --git a/test_regress/driver.py b/test_regress/driver.py index 8a95a7d2e..126ff8fb6 100755 --- a/test_regress/driver.py +++ b/test_regress/driver.py @@ -2382,6 +2382,7 @@ class VlTest: out = test.run_capture(cmd, check=True) if out != '': print(out) + self.copy_if_golden(fn1, fn2) self.error("SAIF files don't match!") def _vcd_read(self, filename: str) -> str: diff --git a/test_regress/t/t_trace_array_saif.py b/test_regress/t/t_trace_array_saif.py index 4033caae5..6332edb4f 100755 --- a/test_regress/t/t_trace_array_saif.py +++ b/test_regress/t/t_trace_array_saif.py @@ -17,6 +17,7 @@ test.compile(verilator_flags2=['--cc --trace-saif --trace-structs']) test.execute() -test.saif_identical(test.trace_filename, test.golden_filename) +# saif_identical is very slow, so require exact match +test.files_identical(test.trace_filename, test.golden_filename) test.passes() diff --git a/test_regress/t/t_trace_array_saif_portable.py b/test_regress/t/t_trace_array_saif_portable.py index 335927284..d0fb2f7f5 100755 --- a/test_regress/t/t_trace_array_saif_portable.py +++ b/test_regress/t/t_trace_array_saif_portable.py @@ -17,6 +17,7 @@ test.compile(verilator_flags2=['--cc --trace-saif --trace-structs', '-CFLAGS -DV test.execute() -test.saif_identical(test.trace_filename, test.golden_filename) +# saif_identical is very slow, so require exact match +test.files_identical(test.trace_filename, test.golden_filename) test.passes() diff --git a/test_regress/t/t_trace_array_saif_threads_1.py b/test_regress/t/t_trace_array_saif_threads_1.py index fc017b4ac..369e8161a 100755 --- a/test_regress/t/t_trace_array_saif_threads_1.py +++ b/test_regress/t/t_trace_array_saif_threads_1.py @@ -17,6 +17,7 @@ test.compile(verilator_flags2=['--cc --trace-saif --trace-threads 1 --trace-stru test.execute() -test.saif_identical(test.trace_filename, test.golden_filename) +# saif_identical is very slow, so require exact match +test.files_identical(test.trace_filename, test.golden_filename) test.passes() diff --git a/test_regress/t/t_trace_array_saif_threads_2.py b/test_regress/t/t_trace_array_saif_threads_2.py index baa7a015e..f38ef0981 100755 --- a/test_regress/t/t_trace_array_saif_threads_2.py +++ b/test_regress/t/t_trace_array_saif_threads_2.py @@ -17,6 +17,7 @@ test.compile(verilator_flags2=['--cc --trace-saif --trace-threads 2 --trace-stru test.execute() -test.saif_identical(test.trace_filename, test.golden_filename) +# saif_identical is very slow, so require exact match +test.files_identical(test.trace_filename, test.golden_filename) test.passes()