diff --git a/Changes b/Changes index b1e03f214..5e6743357 100644 --- a/Changes +++ b/Changes @@ -22,6 +22,7 @@ Verilator 5.003 devel * Add ENUMVALUE warning when value misused for enum (#726). * Internal AST improvements, also affect XML format (#3721). [Geza Lore] * Change ENDLABEL from warning into an error. +* Deprecate verilated_fst_sc.cpp and verilated_vcd_sc.cpp. * Fix return type of $countbits functions to int (#3725). [Ryszard Rozak, Antmicro Ltd] * Fix missing UNUSED warnings with --coverage (#3736). [alejandro-castro-ortegon] * Fix tracing parameters overridden with -G (#3723). [Iztok Jeras] diff --git a/include/verilated.cpp b/include/verilated.cpp index c975b76e0..ad7570598 100644 --- a/include/verilated.cpp +++ b/include/verilated.cpp @@ -2883,6 +2883,14 @@ void Verilated::overWidthError(const char* signame) VL_MT_SAFE { VL_UNREACHABLE; } +void Verilated::scTraceBeforeElaboration() VL_MT_SAFE { + // Slowpath - Called only when trace file opened before SystemC elaboration + VL_FATAL_MT("unknown", 0, "", + "%Error: Verilated*Sc::open(...) was called before sc_core::sc_start(). " + "Run sc_core::sc_start(sc_core::SC_ZERO_TIME) before opening a wave file."); + VL_UNREACHABLE; +} + void Verilated::mkdir(const char* dirname) VL_MT_UNSAFE { #if defined(_WIN32) || defined(__MINGW32__) ::mkdir(dirname); diff --git a/include/verilated.h b/include/verilated.h index 9aee9cfad..aaab1dc37 100644 --- a/include/verilated.h +++ b/include/verilated.h @@ -861,6 +861,7 @@ public: // Internal: Throw signal assertion static void nullPointerError(const char* filename, int linenum) VL_ATTR_NORETURN VL_MT_SAFE; static void overWidthError(const char* signame) VL_ATTR_NORETURN VL_MT_SAFE; + static void scTraceBeforeElaboration() VL_ATTR_NORETURN VL_MT_SAFE; // Internal: Get and set DPI context static const VerilatedScope* dpiScope() VL_MT_SAFE { return t_s.t_dpiScopep; } diff --git a/include/verilated_fst_sc.cpp b/include/verilated_fst_sc.cpp index b093e1eac..807d2beff 100644 --- a/include/verilated_fst_sc.cpp +++ b/include/verilated_fst_sc.cpp @@ -14,80 +14,11 @@ /// \file /// \brief Verilated tracing in FST for SystemC implementation code /// -/// This file must be compiled and linked against all Verilated objects -/// that use --sc --trace-fst. -/// -/// Use "verilator --sc --trace-fst" to add this to the Makefile for the linker. +/// This file is deprecated, only verilated_fst_sc.h is needed. +/// It is provided only for backward compatibility with user's linker scripts. /// //============================================================================= -#include "verilatedos.h" - -#include "verilated_fst_sc.h" - -//====================================================================== -//====================================================================== - -void VerilatedFstSc::open(const char* filename) { - if (VL_UNLIKELY(!sc_core::sc_get_curr_simcontext()->elaboration_done())) { - vl_fatal(__FILE__, __LINE__, "VerilatedFstSc", - ("%Error: VerilatedFstSc::open(\"" + std::string{filename} - + "\") is called before sc_core::sc_start(). " - "Run sc_core::sc_start(sc_core::SC_ZERO_TIME) before opening a wave file.") - .c_str()); - } - VerilatedFstC::open(filename); -} - -//-------------------------------------------------- -// SystemC 2.1.v1 -// cppcheck-suppress unusedFunction -void VerilatedFstSc::write_comment(const std::string&) {} -void VerilatedFstSc::trace(const unsigned int&, const std::string&, const char**) {} - -#define DECL_TRACE_METHOD_A(tp) \ - void VerilatedFstSc::trace(const tp& object, const std::string& name) {} -#define DECL_TRACE_METHOD_B(tp) \ - void VerilatedFstSc::trace(const tp& object, const std::string& name, int width) {} - -// clang-format off -#if (SYSTEMC_VERSION >= 20171012) - DECL_TRACE_METHOD_A( sc_event ) - DECL_TRACE_METHOD_A( sc_time ) +#ifdef VL_NO_LEGACY +#error "verilated_fst_sc.cpp is deprecated; verilated_fst_sc.h is self-sufficient" #endif - - DECL_TRACE_METHOD_A( bool ) - DECL_TRACE_METHOD_A( sc_dt::sc_bit ) - DECL_TRACE_METHOD_A( sc_dt::sc_logic ) - - DECL_TRACE_METHOD_B( unsigned char ) - DECL_TRACE_METHOD_B( unsigned short ) - DECL_TRACE_METHOD_B( unsigned int ) - DECL_TRACE_METHOD_B( unsigned long ) - DECL_TRACE_METHOD_B( char ) - DECL_TRACE_METHOD_B( short ) - DECL_TRACE_METHOD_B( int ) - DECL_TRACE_METHOD_B( long ) - DECL_TRACE_METHOD_B( sc_dt::int64 ) - DECL_TRACE_METHOD_B( sc_dt::uint64 ) - - DECL_TRACE_METHOD_A( float ) - DECL_TRACE_METHOD_A( double ) - DECL_TRACE_METHOD_A( sc_dt::sc_int_base ) - DECL_TRACE_METHOD_A( sc_dt::sc_uint_base ) - DECL_TRACE_METHOD_A( sc_dt::sc_signed ) - DECL_TRACE_METHOD_A( sc_dt::sc_unsigned ) - - DECL_TRACE_METHOD_A( sc_dt::sc_fxval ) - DECL_TRACE_METHOD_A( sc_dt::sc_fxval_fast ) - DECL_TRACE_METHOD_A( sc_dt::sc_fxnum ) - DECL_TRACE_METHOD_A( sc_dt::sc_fxnum_fast ) - - DECL_TRACE_METHOD_A( sc_dt::sc_bv_base ) - DECL_TRACE_METHOD_A( sc_dt::sc_lv_base ) -// clang-format on - -#undef DECL_TRACE_METHOD_A -#undef DECL_TRACE_METHOD_B - -//******************************************************************** diff --git a/include/verilated_fst_sc.h b/include/verilated_fst_sc.h index a34d72d0b..82c0a0003 100644 --- a/include/verilated_fst_sc.h +++ b/include/verilated_fst_sc.h @@ -10,7 +10,7 @@ //============================================================================= /// /// \file -/// \brief Verilator tracing in FST format for SystemC header +/// \brief Verilated tracing in FST format for SystemC header /// /// User wrapper code should use this header when creating FST SystemC /// traces. @@ -19,8 +19,8 @@ /// //============================================================================= -#ifndef _VERILATED_FST_SC_H_ -#define _VERILATED_FST_SC_H_ 1 +#ifndef VERILATOR_VERILATED_VCD_SC_H_ +#define VERILATOR_VERILATED_VCD_SC_H_ #include "verilatedos.h" @@ -32,40 +32,48 @@ //============================================================================= // VerilatedFstSc /// -/// This class is passed to the SystemC simulation kernel, just like a -/// documented SystemC trace format. +/// Class representing a Verilator-friendly FST trace format registered +/// with the SystemC simulation kernel, just like a SystemC-documented +/// trace format. class VerilatedFstSc final : sc_trace_file, public VerilatedFstC { // CONSTRUCTORS VL_UNCOPYABLE(VerilatedFstSc); public: + /// Construct a SC trace object, and register with the SystemC kernel VerilatedFstSc() { sc_get_curr_simcontext()->add_trace_file(this); // We want to avoid a depreciated warning, but still be back compatible. // Turning off the message just for this still results in an // annoying "to turn off" message. - const sc_time t1sec(1, SC_SEC); + const sc_time t1sec{1, SC_SEC}; if (t1sec.to_default_time_units() != 0) { - const sc_time tunits(1.0 / t1sec.to_default_time_units(), SC_SEC); + const sc_time tunits{1.0 / t1sec.to_default_time_units(), SC_SEC}; spTrace()->set_time_unit(tunits.to_string()); } spTrace()->set_time_resolution(sc_get_time_resolution().to_string()); } + /// Destruct, flush, and close the dump ~VerilatedFstSc() override { close(); } - // METHODS - /// Called by SystemC simulate() + // METHODS - for SC kernel + // Called by SystemC simulate() void cycle(bool delta_cycle) override { - if (!delta_cycle) { this->dump(sc_time_stamp().to_double()); } + if (!delta_cycle) this->dump(sc_time_stamp().to_double()); } // Override VerilatedFstC. Must be called after starting simulation. // Note: this is not a virtual function in the base class, so no 'override' - virtual void open(const char* filename) VL_MT_SAFE; + virtual void open(const char* filename) VL_MT_SAFE { + if (VL_UNLIKELY(!sc_core::sc_get_curr_simcontext()->elaboration_done())) { + Verilated::scTraceBeforeElaboration(); + } + VerilatedFstC::open(filename); + } private: - /// Fake outs for linker + // METHODS - Fake outs for linker #ifdef NC_SYSTEMC // Cadence Incisive has these as abstract functions so we must create them @@ -73,14 +81,16 @@ private: #endif void set_time_unit(double v, sc_time_unit tu) override {} // LCOV_EXCL_LINE -//-------------------------------------------------- -// SystemC 2.1.v1 -#define DECL_TRACE_METHOD_A(tp) void trace(const tp& object, const std::string& name) override; -#define DECL_TRACE_METHOD_B(tp) \ - void trace(const tp& object, const std::string& name, int width) override; + //-------------------------------------------------- + // SystemC 2.1.v1 - void write_comment(const std::string&) override; - void trace(const unsigned int&, const std::string&, const char**) override; + void write_comment(const std::string&) override {} + void trace(const unsigned int&, const std::string&, const char**) override {} + +#define DECL_TRACE_METHOD_A(tp) \ + void trace(const tp& object, const std::string& name) override {} +#define DECL_TRACE_METHOD_B(tp) \ + void trace(const tp& object, const std::string& name, int width) override {} // clang-format off // Formatting matches that of sc_trace.h diff --git a/include/verilated_vcd_sc.cpp b/include/verilated_vcd_sc.cpp index 2da4de7b1..dcccc975b 100644 --- a/include/verilated_vcd_sc.cpp +++ b/include/verilated_vcd_sc.cpp @@ -14,80 +14,11 @@ /// \file /// \brief Verilated tracing in VCD Format implementation code /// -/// This file must be compiled and linked against all Verilated objects -/// that use --trace. -/// -/// Use "verilator --trace" to add this to the Makefile for the linker. +/// This file is deprecated, only verilated_vcd_sc.h is needed. +/// It is provided only for backward compatibility with user's linker scripts. /// //============================================================================= -#include "verilatedos.h" - -#include "verilated_vcd_sc.h" - -//====================================================================== -//====================================================================== - -void VerilatedVcdSc::open(const char* filename) { - if (VL_UNLIKELY(!sc_core::sc_get_curr_simcontext()->elaboration_done())) { - vl_fatal(__FILE__, __LINE__, "VerilatedVcdSc", - ("%Error: VerilatedVcdSc::open(\"" + std::string{filename} - + "\") is called before sc_core::sc_start(). " - "Run sc_core::sc_start(sc_core::SC_ZERO_TIME) before opening a wave file.") - .c_str()); - } - VerilatedVcdC::open(filename); -} - -//-------------------------------------------------- -// SystemC 2.1.v1 -// cppcheck-suppress unusedFunction -void VerilatedVcdSc::write_comment(const std::string&) {} -void VerilatedVcdSc::trace(const unsigned int&, const std::string&, const char**) {} - -#define DECL_TRACE_METHOD_A(tp) \ - void VerilatedVcdSc::trace(const tp& object, const std::string& name) {} -#define DECL_TRACE_METHOD_B(tp) \ - void VerilatedVcdSc::trace(const tp& object, const std::string& name, int width) {} - -// clang-format off -#if (SYSTEMC_VERSION >= 20171012) - DECL_TRACE_METHOD_A( sc_event ) - DECL_TRACE_METHOD_A( sc_time ) +#ifdef VL_NO_LEGACY +#error "verilated_vcd_sc.cpp is deprecated; verilated_vcd_sc.h is self-sufficient" #endif - - DECL_TRACE_METHOD_A( bool ) - DECL_TRACE_METHOD_A( sc_dt::sc_bit ) - DECL_TRACE_METHOD_A( sc_dt::sc_logic ) - - DECL_TRACE_METHOD_B( unsigned char ) - DECL_TRACE_METHOD_B( unsigned short ) - DECL_TRACE_METHOD_B( unsigned int ) - DECL_TRACE_METHOD_B( unsigned long ) - DECL_TRACE_METHOD_B( char ) - DECL_TRACE_METHOD_B( short ) - DECL_TRACE_METHOD_B( int ) - DECL_TRACE_METHOD_B( long ) - DECL_TRACE_METHOD_B( sc_dt::int64 ) - DECL_TRACE_METHOD_B( sc_dt::uint64 ) - - DECL_TRACE_METHOD_A( float ) - DECL_TRACE_METHOD_A( double ) - DECL_TRACE_METHOD_A( sc_dt::sc_int_base ) - DECL_TRACE_METHOD_A( sc_dt::sc_uint_base ) - DECL_TRACE_METHOD_A( sc_dt::sc_signed ) - DECL_TRACE_METHOD_A( sc_dt::sc_unsigned ) - - DECL_TRACE_METHOD_A( sc_dt::sc_fxval ) - DECL_TRACE_METHOD_A( sc_dt::sc_fxval_fast ) - DECL_TRACE_METHOD_A( sc_dt::sc_fxnum ) - DECL_TRACE_METHOD_A( sc_dt::sc_fxnum_fast ) - - DECL_TRACE_METHOD_A( sc_dt::sc_bv_base ) - DECL_TRACE_METHOD_A( sc_dt::sc_lv_base ) -// clang-format on - -#undef DECL_TRACE_METHOD_A -#undef DECL_TRACE_METHOD_B - -//******************************************************************** diff --git a/include/verilated_vcd_sc.h b/include/verilated_vcd_sc.h index ad8de7133..ec8023f10 100644 --- a/include/verilated_vcd_sc.h +++ b/include/verilated_vcd_sc.h @@ -64,7 +64,12 @@ public: } // Override VerilatedVcdC. Must be called after starting simulation. - void open(const char* filename) override VL_MT_SAFE; + void open(const char* filename) override VL_MT_SAFE { + if (VL_UNLIKELY(!sc_core::sc_get_curr_simcontext()->elaboration_done())) { + Verilated::scTraceBeforeElaboration(); + } + VerilatedVcdC::open(filename); + } private: // METHODS - Fake outs for linker @@ -75,14 +80,16 @@ private: #endif void set_time_unit(double v, sc_time_unit tu) override {} // LCOV_EXCL_LINE -//-------------------------------------------------- -// SystemC 2.1.v1 -#define DECL_TRACE_METHOD_A(tp) void trace(const tp& object, const std::string& name) override; -#define DECL_TRACE_METHOD_B(tp) \ - void trace(const tp& object, const std::string& name, int width) override; + //-------------------------------------------------- + // SystemC 2.1.v1 - void write_comment(const std::string&) override; - void trace(const unsigned int&, const std::string&, const char**) override; + void write_comment(const std::string&) override {} + void trace(const unsigned int&, const std::string&, const char**) override {} + +#define DECL_TRACE_METHOD_A(tp) \ + void trace(const tp& object, const std::string& name) override {} +#define DECL_TRACE_METHOD_B(tp) \ + void trace(const tp& object, const std::string& name, int width) override {} // clang-format off // Formatting matches that of sc_trace.h diff --git a/src/V3EmitCMake.cpp b/src/V3EmitCMake.cpp index 06ef3be8f..f6845df70 100644 --- a/src/V3EmitCMake.cpp +++ b/src/V3EmitCMake.cpp @@ -158,10 +158,6 @@ class CMakeEmitter final { if (v3Global.opt.trace()) { global.emplace_back("${VERILATOR_ROOT}/include/" + v3Global.opt.traceSourceBase() + "_c.cpp"); - if (v3Global.opt.systemC()) { - global.emplace_back("${VERILATOR_ROOT}/include/" + v3Global.opt.traceSourceLang() - + ".cpp"); - } } if (v3Global.usesTiming()) { global.emplace_back("${VERILATOR_ROOT}/include/verilated_timing.cpp"); diff --git a/src/V3EmitMk.cpp b/src/V3EmitMk.cpp index eefba5e92..26083c2f0 100644 --- a/src/V3EmitMk.cpp +++ b/src/V3EmitMk.cpp @@ -105,9 +105,6 @@ public: if (v3Global.opt.coverage()) putMakeClassEntry(of, "verilated_cov.cpp"); if (v3Global.opt.trace()) { putMakeClassEntry(of, v3Global.opt.traceSourceBase() + "_c.cpp"); - if (v3Global.opt.systemC()) { - putMakeClassEntry(of, v3Global.opt.traceSourceLang() + ".cpp"); - } } if (v3Global.usesTiming()) putMakeClassEntry(of, "verilated_timing.cpp"); if (v3Global.opt.threads()) putMakeClassEntry(of, "verilated_threads.cpp");