2012-04-13 01:08:20 +00:00
|
|
|
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
2010-01-24 23:37:01 +00:00
|
|
|
//=============================================================================
|
|
|
|
//
|
|
|
|
// THIS MODULE IS PUBLICLY LICENSED
|
|
|
|
//
|
2020-01-06 23:05:53 +00:00
|
|
|
// Copyright 2001-2020 by Wilson Snyder. This program is free software;
|
2010-01-24 23:37:01 +00:00
|
|
|
// you can redistribute it and/or modify it under the terms of either the GNU
|
|
|
|
// Lesser General Public License Version 3 or the Perl Artistic License Version 2.0.
|
|
|
|
//
|
|
|
|
// This is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
|
|
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
|
|
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
|
|
// for more details.
|
|
|
|
//
|
|
|
|
//=============================================================================
|
|
|
|
///
|
|
|
|
/// \file
|
2014-11-24 03:00:00 +00:00
|
|
|
/// \brief Verilator tracing in VCD format
|
2010-01-24 23:37:01 +00:00
|
|
|
///
|
2017-10-27 00:05:42 +00:00
|
|
|
/// This class is not threadsafe, as the SystemC kernel is not threadsafe.
|
|
|
|
///
|
2010-01-24 23:37:01 +00:00
|
|
|
//=============================================================================
|
|
|
|
// SPDIFF_OFF
|
|
|
|
|
|
|
|
#ifndef _VERILATED_VCD_SC_H_
|
|
|
|
#define _VERILATED_VCD_SC_H_ 1
|
|
|
|
|
2018-10-14 17:43:24 +00:00
|
|
|
#include "verilatedos.h"
|
2010-01-24 23:37:01 +00:00
|
|
|
#include "verilated_sc.h"
|
|
|
|
#include "verilated_vcd_c.h"
|
|
|
|
|
|
|
|
// SPDIFF_ON
|
|
|
|
//=============================================================================
|
|
|
|
// VerilatedVcdSc
|
|
|
|
///
|
|
|
|
/// This class is passed to the SystemC simulation kernel, just like a
|
|
|
|
/// documented SystemC trace format.
|
|
|
|
|
|
|
|
class VerilatedVcdSc
|
|
|
|
: sc_trace_file
|
|
|
|
, public VerilatedVcdC
|
|
|
|
{
|
2017-11-01 22:51:41 +00:00
|
|
|
// CONSTRUCTORS
|
|
|
|
VL_UNCOPYABLE(VerilatedVcdSc);
|
2010-01-24 23:37:01 +00:00
|
|
|
public:
|
|
|
|
VerilatedVcdSc() {
|
2018-08-22 23:14:06 +00:00
|
|
|
sc_get_curr_simcontext()->add_trace_file(this);
|
2010-01-24 23:37:01 +00:00
|
|
|
# if (SYSTEMC_VERSION>=20060505)
|
2018-08-22 23:14:06 +00:00
|
|
|
// We want to avoid a depreciated warning, but still be back compatible.
|
2019-05-15 02:49:21 +00:00
|
|
|
// Turning off the message just for this still results in an
|
|
|
|
// annoying "to turn off" message.
|
2018-08-22 23:14:06 +00:00
|
|
|
sc_time t1sec(1,SC_SEC);
|
|
|
|
if (t1sec.to_default_time_units()!=0) {
|
|
|
|
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());
|
2010-01-24 23:37:01 +00:00
|
|
|
# elif (SYSTEMC_VERSION>20011000)
|
2018-08-22 23:14:06 +00:00
|
|
|
// To confuse matters 2.1.beta returns a char* here, while 2.1.v1 returns a std::string
|
|
|
|
// we allow both flavors with overloaded set_time_* functions.
|
|
|
|
spTrace()->set_time_unit(sc_get_default_time_unit().to_string());
|
|
|
|
spTrace()->set_time_resolution(sc_get_time_resolution().to_string());
|
2010-01-24 23:37:01 +00:00
|
|
|
# endif
|
|
|
|
}
|
2020-03-02 02:39:23 +00:00
|
|
|
virtual ~VerilatedVcdSc() { close(); }
|
2017-11-01 22:51:41 +00:00
|
|
|
|
|
|
|
// METHODS
|
2010-01-24 23:37:01 +00:00
|
|
|
/// Called by SystemC simulate()
|
2018-08-22 23:14:06 +00:00
|
|
|
virtual void cycle(bool delta_cycle) {
|
2010-01-24 23:37:01 +00:00
|
|
|
# if (SYSTEMC_VERSION>20011000)
|
2018-08-22 23:14:06 +00:00
|
|
|
if (!delta_cycle) { this->dump(sc_time_stamp().to_double()); }
|
2010-01-24 23:37:01 +00:00
|
|
|
# else
|
2019-05-15 02:49:21 +00:00
|
|
|
// VCD files must have integer timestamps, so we write all times in
|
|
|
|
// increments of time_resolution
|
2018-08-22 23:14:06 +00:00
|
|
|
if (!delta_cycle) { this->dump(sc_time_stamp().to_double()); }
|
2010-01-24 23:37:01 +00:00
|
|
|
# endif
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
/// Fake outs for linker
|
|
|
|
|
|
|
|
#ifdef NC_SYSTEMC
|
|
|
|
// Cadence Incisive has these as abstract functions so we must create them
|
2018-08-22 23:14:06 +00:00
|
|
|
virtual void set_time_unit(int exponent10_seconds) {} // deprecated
|
2012-01-20 00:48:37 +00:00
|
|
|
#endif
|
|
|
|
#if defined(NC_SYSTEMC) || (SYSTEMC_VERSION>=20111100)
|
2018-08-22 23:14:06 +00:00
|
|
|
virtual void set_time_unit(double v, sc_time_unit tu) {}
|
2010-01-24 23:37:01 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------
|
|
|
|
# if (SYSTEMC_VERSION>=20050714)
|
|
|
|
// SystemC 2.1.v1
|
|
|
|
# define DECL_TRACE_METHOD_A(tp) \
|
2018-08-22 23:14:06 +00:00
|
|
|
virtual void trace(const tp& object, const std::string& name);
|
2010-01-24 23:37:01 +00:00
|
|
|
# define DECL_TRACE_METHOD_B(tp) \
|
2018-08-22 23:14:06 +00:00
|
|
|
virtual void trace(const tp& object, const std::string& name, int width);
|
2010-01-24 23:37:01 +00:00
|
|
|
|
2019-11-10 01:35:12 +00:00
|
|
|
virtual void write_comment(const std::string&);
|
|
|
|
virtual void trace(const unsigned int&, const std::string&, const char**);
|
2010-01-24 23:37:01 +00:00
|
|
|
|
2017-12-17 13:23:22 +00:00
|
|
|
#if (SYSTEMC_VERSION>=20171012)
|
|
|
|
DECL_TRACE_METHOD_A( sc_event )
|
|
|
|
DECL_TRACE_METHOD_A( sc_time )
|
|
|
|
#endif
|
|
|
|
|
2010-01-24 23:37:01 +00:00
|
|
|
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 )
|
|
|
|
#ifdef SYSTEMC_64BIT_PATCHES
|
|
|
|
DECL_TRACE_METHOD_B( unsigned long long)
|
|
|
|
#endif
|
|
|
|
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 )
|
|
|
|
|
|
|
|
//--------------------------------------------------
|
|
|
|
# elif (SYSTEMC_VERSION>20011000)
|
|
|
|
// SystemC 2.0.1
|
|
|
|
# define DECL_TRACE_METHOD_A(tp) \
|
2018-08-22 23:14:06 +00:00
|
|
|
virtual void trace(const tp& object, const sc_string& name);
|
2010-01-24 23:37:01 +00:00
|
|
|
# define DECL_TRACE_METHOD_B(tp) \
|
2018-08-22 23:14:06 +00:00
|
|
|
virtual void trace(const tp& object, const sc_string& name, int width);
|
2010-01-24 23:37:01 +00:00
|
|
|
|
2019-11-10 01:35:12 +00:00
|
|
|
virtual void write_comment(const sc_string&);
|
|
|
|
virtual void trace(const unsigned int&, const sc_string&, const char**);
|
2018-08-22 23:14:06 +00:00
|
|
|
virtual void delta_cycles(bool) {}
|
|
|
|
virtual void space(int n) {}
|
2010-01-24 23:37:01 +00:00
|
|
|
|
|
|
|
DECL_TRACE_METHOD_A( bool )
|
|
|
|
DECL_TRACE_METHOD_A( sc_bit )
|
|
|
|
DECL_TRACE_METHOD_A( 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 )
|
|
|
|
#ifdef SYSTEMC_64BIT_PATCHES
|
|
|
|
DECL_TRACE_METHOD_B( unsigned long long)
|
|
|
|
#endif
|
|
|
|
#if (SYSTEMC_VERSION>20041000)
|
|
|
|
DECL_TRACE_METHOD_B( unsigned long long)
|
|
|
|
DECL_TRACE_METHOD_B( long long)
|
|
|
|
#endif
|
|
|
|
DECL_TRACE_METHOD_B( char )
|
|
|
|
DECL_TRACE_METHOD_B( short )
|
|
|
|
DECL_TRACE_METHOD_B( int )
|
|
|
|
DECL_TRACE_METHOD_B( long )
|
|
|
|
DECL_TRACE_METHOD_A( float )
|
|
|
|
DECL_TRACE_METHOD_A( double )
|
|
|
|
DECL_TRACE_METHOD_A( sc_int_base )
|
|
|
|
DECL_TRACE_METHOD_A( sc_uint_base )
|
|
|
|
DECL_TRACE_METHOD_A( sc_signed )
|
|
|
|
DECL_TRACE_METHOD_A( sc_unsigned )
|
|
|
|
DECL_TRACE_METHOD_A( sc_fxval )
|
|
|
|
DECL_TRACE_METHOD_A( sc_fxval_fast )
|
|
|
|
DECL_TRACE_METHOD_A( sc_fxnum )
|
|
|
|
DECL_TRACE_METHOD_A( sc_fxnum_fast )
|
|
|
|
DECL_TRACE_METHOD_A( sc_bv_base )
|
|
|
|
DECL_TRACE_METHOD_A( sc_lv_base )
|
|
|
|
|
|
|
|
//--------------------------------------------------
|
|
|
|
# else
|
|
|
|
// SystemC 1.2.1beta
|
|
|
|
# define DECL_TRACE_METHOD_A(tp) \
|
2018-08-22 23:14:06 +00:00
|
|
|
virtual void trace(const tp& object, const sc_string& name);
|
2010-01-24 23:37:01 +00:00
|
|
|
# define DECL_TRACE_METHOD_B(tp) \
|
2018-08-22 23:14:06 +00:00
|
|
|
virtual void trace(const tp& object, const sc_string& name, int width);
|
2010-01-24 23:37:01 +00:00
|
|
|
|
2019-11-10 01:35:12 +00:00
|
|
|
virtual void write_comment(const sc_string&);
|
|
|
|
virtual void trace(const unsigned int&, const sc_string&, const char**);
|
2010-01-24 23:37:01 +00:00
|
|
|
|
|
|
|
DECL_TRACE_METHOD_A( bool )
|
|
|
|
DECL_TRACE_METHOD_B( unsigned char )
|
|
|
|
DECL_TRACE_METHOD_B( short unsigned int )
|
|
|
|
DECL_TRACE_METHOD_B( unsigned int )
|
|
|
|
DECL_TRACE_METHOD_B( long unsigned int )
|
|
|
|
DECL_TRACE_METHOD_B( char )
|
|
|
|
DECL_TRACE_METHOD_B( short int )
|
|
|
|
DECL_TRACE_METHOD_B( int )
|
|
|
|
DECL_TRACE_METHOD_B( long int )
|
|
|
|
DECL_TRACE_METHOD_A( float )
|
|
|
|
DECL_TRACE_METHOD_A( double )
|
|
|
|
DECL_TRACE_METHOD_A( sc_bit )
|
|
|
|
DECL_TRACE_METHOD_A( sc_logic )
|
|
|
|
DECL_TRACE_METHOD_A( sc_bool_vector )
|
|
|
|
DECL_TRACE_METHOD_A( sc_logic_vector )
|
|
|
|
DECL_TRACE_METHOD_A( sc_signal_bool_vector )
|
|
|
|
DECL_TRACE_METHOD_A( sc_signal_logic_vector )
|
|
|
|
DECL_TRACE_METHOD_A( sc_uint_base )
|
|
|
|
DECL_TRACE_METHOD_A( sc_int_base )
|
|
|
|
DECL_TRACE_METHOD_A( sc_unsigned )
|
|
|
|
DECL_TRACE_METHOD_A( sc_signed )
|
|
|
|
DECL_TRACE_METHOD_A( sc_signal_resolved )
|
|
|
|
DECL_TRACE_METHOD_A( sc_signal_resolved_vector )
|
|
|
|
DECL_TRACE_METHOD_A( sc_bv_ns::sc_bv_base )
|
|
|
|
DECL_TRACE_METHOD_A( sc_bv_ns::sc_lv_base )
|
|
|
|
# endif
|
|
|
|
|
|
|
|
# undef DECL_TRACE_METHOD_A
|
|
|
|
# undef DECL_TRACE_METHOD_B
|
|
|
|
};
|
|
|
|
|
2018-08-22 23:14:06 +00:00
|
|
|
#endif // Guard
|