Line 25... |
Line 25... |
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
|
|
// $Id: TraceSC.cpp 302 2009-02-13 17:22:07Z jeremy $
|
// $Id: TraceSC.cpp 302 2009-02-13 17:22:07Z jeremy $
|
|
|
#include "TraceSC.h"
|
#include "TraceSC.h"
|
|
#include <systemc.h>
|
|
|
using namespace std;
|
using namespace std;
|
|
|
|
#define DEBUG_TRACESC 1
|
|
|
SC_HAS_PROCESS( TraceSC );
|
SC_HAS_PROCESS( TraceSC );
|
|
|
//! Constructor for the trace module
|
//! Constructor for the trace module
|
|
|
//! @param name Name of this module, passed to the parent
|
//! @param name Name of this module, passed to the parent
|
Line 50... |
Line 53... |
// Setup the name of the VCD dump file
|
// Setup the name of the VCD dump file
|
string dumpNameDefault("vlt-dump.vcd");
|
string dumpNameDefault("vlt-dump.vcd");
|
string testNameString;
|
string testNameString;
|
string vcdDumpFile;
|
string vcdDumpFile;
|
|
|
// Search through the command line parameters for the "-vcd" option
|
// Search through the command line parameters for VCD dump options
|
|
dump_start_delay = 0;
|
|
dump_stop_set = 0;
|
|
int time_val;
|
int cmdline_name_found=0;
|
int cmdline_name_found=0;
|
if (argc > 1)
|
if (argc > 1)
|
{
|
{
|
for(int i=1; i<argc; i++)
|
for(int i=1; i<argc; i++)
|
{
|
{
|
if (strcmp(argv[i], "-vcd")==0)
|
if ((strcmp(argv[i], "-vcd")==0) ||
|
|
(strcmp(argv[i], "--vcd")==0))
|
{
|
{
|
testNameString = (argv[i+1]);
|
testNameString = (argv[i+1]);
|
vcdDumpFile = testNameString;
|
vcdDumpFile = testNameString;
|
cmdline_name_found=1;
|
cmdline_name_found=1;
|
|
}
|
|
else if ( (strcmp(argv[i], "-vcdstart")==0) ||
|
|
(strcmp(argv[i], "--vcdstart")==0) )
|
|
{
|
|
time_val = atoi(argv[i+1]);
|
|
sc_time dump_start_time(time_val,SC_NS);
|
|
dump_start = dump_start_time;
|
|
if (DEBUG_TRACESC) cout << "TraceSC(): Dump start time set at " << dump_start.to_string() << endl;
|
|
dump_start_delay = 1;
|
|
break;
|
|
}
|
|
else if ( (strcmp(argv[i], "-vcdstop")==0) ||
|
|
(strcmp(argv[i], "--vcdstop")==0) )
|
|
{
|
|
time_val = atoi(argv[i+1]);
|
|
sc_time dump_stop_time(time_val,SC_NS);
|
|
dump_stop = dump_stop_time;
|
|
if (DEBUG_TRACESC) cout << "TraceSC(): Dump stop time set at " << dump_stop.to_string() << endl;
|
|
dump_stop_set = 1;
|
break;
|
break;
|
}
|
}
|
}
|
}
|
}
|
}
|
|
|
if(cmdline_name_found==0) // otherwise use our default VCD dump file name
|
if(cmdline_name_found==0) // otherwise use our default VCD dump file name
|
vcdDumpFile = dumpNameDefault;
|
vcdDumpFile = dumpNameDefault;
|
|
|
Verilated::traceEverOn (true);
|
Verilated::traceEverOn (true);
|
|
|
cout << "Enabling VCD trace" << endl;
|
cout << "* Enabling VCD trace";
|
|
|
printf("VCD dumpfile: %s\n", vcdDumpFile.c_str());
|
if (dump_start_delay)
|
|
cout << ", on at time " << dump_start.to_string();
|
|
if (dump_stop_set)
|
|
cout << ", off at time " << dump_stop.to_string();
|
|
|
|
cout << endl;
|
|
|
|
|
|
printf("* VCD dumpfile: %s\n", vcdDumpFile.c_str());
|
|
|
// Establish a new trace with its correct time resolution, and trace to
|
// Establish a new trace with its correct time resolution, and trace to
|
// great depth.
|
// great depth.
|
spTraceFile = new SpTraceVcdCFile ();
|
spTraceFile = new SpTraceVcdCFile ();
|
setSpTimeResolution (sc_get_time_resolution ());
|
setSpTimeResolution (sc_get_time_resolution ());
|
traceTarget->trace (spTraceFile, 99);
|
traceTarget->trace (spTraceFile, 99);
|
spTraceFile->open (vcdDumpFile.c_str());
|
spTraceFile->open (vcdDumpFile.c_str());
|
|
|
|
if (dump_start_delay == 1)
|
|
dumping_now = 0; // We'll wait for the time to dump
|
|
else
|
|
dumping_now = 1; // Begin with dumping turned on
|
|
|
|
|
// Method to drive the dump on each clock edge
|
// Method to drive the dump on each clock edge
|
SC_METHOD (driveTrace);
|
//SC_METHOD (driveTrace);
|
sensitive << clk;
|
//sensitive << clk;
|
|
|
#endif
|
#endif
|
|
|
} // TraceSC ()
|
} // TraceSC ()
|
|
|
Line 104... |
Line 144... |
#endif
|
#endif
|
|
|
} // ~TraceSC ()
|
} // ~TraceSC ()
|
|
|
|
|
//! Method to drive the trace. We're called on ever clock edge, and also at
|
//! Method to drive the trace. We're called on every clock edge, and also at
|
//! initialization (to get initial values into the dump).
|
//! initialization (to get initial values into the dump).
|
void
|
void
|
TraceSC::driveTrace()
|
TraceSC::driveTrace()
|
{
|
{
|
#if VM_TRACE
|
#if VM_TRACE
|
|
|
|
if (DEBUG_TRACESC) cout << "TraceSC(): " << endl;
|
|
if (dumping_now == 0)
|
|
{
|
|
// Check the time, see if we should enable dumping
|
|
if (sc_time_stamp() >= dump_start)
|
|
{
|
|
// Give a message
|
|
cout << "* VCD tracing turned on at time " << dump_start.to_string() << endl;
|
|
dumping_now = 1;
|
|
}
|
|
}
|
|
|
|
if (dumping_now == 1)
|
spTraceFile->dump (sc_time_stamp().to_double());
|
spTraceFile->dump (sc_time_stamp().to_double());
|
|
|
|
|
|
// Should we turn off tracing?
|
|
if ((dumping_now == 1) && (dump_stop_set == 1))
|
|
{
|
|
if (sc_time_stamp() >= dump_stop)
|
|
{
|
|
// Give a message
|
|
cout << "* VCD tracing turned off at time " << dump_stop.to_string() << endl;
|
|
dumping_now = 0; // Turn off the dump
|
|
}
|
|
}
|
|
|
#endif
|
#endif
|
|
|
} // driveTrace()
|
} // driveTrace()
|
|
|
|
|
Line 133... |
Line 200... |
int val; // Integral value of the precision
|
int val; // Integral value of the precision
|
const char *units; // Units as text
|
const char *units; // Units as text
|
|
|
if (secs < 1.0e-15)
|
if (secs < 1.0e-15)
|
{
|
{
|
cerr << "VCD time resolution " << secs << " too small: ignored" << endl;
|
cerr << "* VCD time resolution " << secs << " too small: ignored" << endl;
|
return;
|
return;
|
}
|
}
|
else if (secs < 1.0e-12)
|
else if (secs < 1.0e-12)
|
{
|
{
|
val = secs / 1.0e-15;
|
val = secs / 1.0e-15;
|