util,systemc: Update systemc connection

Change-Id: I5b5c7de9e734dd8a58160193d68c9a13d649b739
Issue-On: https://gem5.atlassian.net/browse/GEM5-1218
Signed-off-by: Jason Lowe-Power <jason@lowepower.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/59589
Reviewed-by: Matthias Jung <jungma@eit.uni-kl.de>
Maintainer: Bobby Bruce <bbruce@ucdavis.edu>
Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
Jason Lowe-Power
2022-05-11 11:24:39 -07:00
committed by Jason Lowe-Power
parent 128b78177c
commit e8e0a2ed06
8 changed files with 104 additions and 47 deletions

View File

@@ -36,14 +36,14 @@
ARCH = ARM
VARIANT = opt
SYSTEMC_INC = ./systemc/include
SYSTEMC_LIB = ./systemc/lib-linux64
SYSTEMC_INC = /opt/systemc/include
SYSTEMC_LIB = /opt/systemc/lib-linux64
CXXFLAGS = -I../../../build/$(ARCH) -L../../../build/$(ARCH)
CXXFLAGS += -I$(SYSTEMC_INC) -L$(SYSTEMC_LIB)
CXXFLAGS += -std=c++0x
CXXFLAGS += -g
LIBS = -lgem5_$(VARIANT) -lsystemc
CXXFLAGS += -std=c++17
CXXFLAGS += -g -DTRACING_ON
LIBS = -lgem5_$(VARIANT) -lsystemc -lpng
ALL = gem5.$(VARIANT).sc

View File

@@ -32,12 +32,12 @@ normal gem5 (cxx-config not needed, Python needed):
> cd ../../..
> scons build/ARM/gem5.opt
> scons --with-cxx-config --without-python USE_SYSTEMC=0 \
> scons --with-cxx-config --without-python --without-tcmalloc USE_SYSTEMC=0 \
> build/ARM/libgem5_opt.so
> cd util/systemc
Note: For MAC / OSX this command should be used:
> scons --with-cxx-config --without-python USE_SYSTEMC=0 \
> scons --with-cxx-config --without-python --without-tcmalloc USE_SYSTEMC=0 \
> build/ARM/libgem5_opt.dylib
Set a proper LD_LIBRARY_PATH e.g. for bash:

View File

@@ -64,8 +64,8 @@
#include "sc_module.hh"
#include "sim/cxx_config_ini.hh"
#include "sim/cxx_manager.hh"
#include "sim/globals.hh"
#include "sim/init_signals.hh"
#include "sim/serialize.hh"
#include "sim/simulate.hh"
#include "sim/stat_control.hh"
#include "sim/system.hh"
@@ -156,8 +156,6 @@ SimControl::SimControl(sc_core::sc_module_name name,
if (argc == 1)
usage(prog_name);
cxxConfigInit();
/* Pass DPRINTF messages to SystemC */
Trace::setDebugLogger(&logger);
@@ -296,8 +294,9 @@ void SimControl::run()
if (checkpoint_restore) {
std::cerr << "Restoring checkpoint\n";
CheckpointIn *checkpoint = new CheckpointIn(checkpoint_dir,
config_manager->getSimObjectResolver());
SimObject::setSimObjectResolver(
&config_manager->getSimObjectResolver());
CheckpointIn *checkpoint = new CheckpointIn(checkpoint_dir);
/* Catch SystemC up with gem5 after checkpoint restore.
* Note that gem5 leading SystemC is always a violation of the
@@ -305,7 +304,6 @@ void SimControl::run()
* catchup */
DrainManager::instance().preCheckpointRestore();
Serializable::unserializeGlobals(*checkpoint);
Tick systemc_time = sc_core::sc_time_stamp().value();
if (curTick() > systemc_time) {
@@ -353,7 +351,7 @@ void SimControl::run()
/* FIXME, this should really be serialising just for
* config_manager rather than using serializeAll's ugly
* SimObject static object list */
Serializable::serializeAll(checkpoint_dir);
SimObject::serializeAll(checkpoint_dir);
std::cerr << "Completed checkpoint\n";

View File

@@ -214,8 +214,6 @@ Gem5TopLevelModule::Gem5TopLevelModule(sc_core::sc_module_name name,
{
SC_THREAD(run);
gem5::cxxConfigInit();
/* Pass DPRINTF messages to SystemC */
gem5::Trace::setDebugLogger(&logger);
@@ -237,12 +235,12 @@ Gem5TopLevelModule::Gem5TopLevelModule(sc_core::sc_module_name name,
/* Enable stats */
gem5::statistics::initSimStats();
gem5::statistics::registerHandlers(gem5::CxxConfig::statsReset,
gem5::CxxConfig::statsDump);
gem5::statistics::registerHandlers(CxxConfig::statsReset,
CxxConfig::statsDump);
gem5::Trace::enable();
config_file = new CxxIniFile();
config_file = new gem5::CxxIniFile();
if (!config_file->load(config_filename)) {
fatal("Gem5TopLevelModule: Can't open config file: %s",
@@ -251,7 +249,7 @@ Gem5TopLevelModule::Gem5TopLevelModule(sc_core::sc_module_name name,
root_manager = new gem5::CxxConfigManager(*config_file);
gem5::CxxConfig::statsEnable();
CxxConfig::statsEnable();
/* Make the root object */
try {
@@ -285,7 +283,7 @@ Gem5TopLevelModule::run()
std::cerr << "Exit at tick " << gem5::curTick()
<< ", cause: " << exit_event->getCause() << '\n';
getEventQueue(0)->dump();
gem5::getEventQueue(0)->dump();
}
void

View File

@@ -77,7 +77,7 @@ class CuttingStreambuf : public std::streambuf
void CuttingStreambuf::outputLine()
{
logger->logMessage((Tick)-1, "gem5", "", line.str());
logger->logMessage((gem5::Tick)-1, "gem5", "", line.str());
line.clear();
line.str("");
}

View File

@@ -63,6 +63,7 @@
#include "sim/core.hh"
#include "sim/cur_tick.hh"
#include "sim/eventq.hh"
#include "sim/sim_events.hh"
#include "sim/sim_exit.hh"
#include "sim/stat_control.hh"
@@ -101,19 +102,19 @@ Module::SCEventQueue::wakeup(gem5::Tick when)
void
Module::setupEventQueues(Module &module)
{
fatal_if(mainEventQueue.size() != 0,
fatal_if(gem5::mainEventQueue.size() != 0,
"Gem5SystemC::Module::setupEventQueues must be called"
" before any gem5 event queues are set up");
gem5::numMainEventQueues = 1;
gem5::mainEventQueue.push_back(new SCEventQueue("events", module));
gem5::curEventQueue(getEventQueue(0));
gem5::curEventQueue(gem5::getEventQueue(0));
}
void
Module::catchup()
{
gem5::EventQueue *eventq = getEventQueue(0);
gem5::EventQueue *eventq = gem5::getEventQueue(0);
gem5::Tick systemc_time = sc_core::sc_time_stamp().value();
gem5::Tick gem5_time = gem5::curTick();
@@ -144,7 +145,7 @@ Module::serviceAsyncEvent()
gem5::EventQueue *eventq = gem5::getEventQueue(0);
std::lock_guard<gem5::EventQueue> lock(*eventq);
assert(async_event);
assert(gem5::async_event);
/* Catch up gem5 time with SystemC time so that any event here won't
* be in the past relative to the current time */
@@ -153,36 +154,37 @@ Module::serviceAsyncEvent()
/* Move time on to match SystemC */
catchup();
async_event = false;
if (async_statdump || async_statreset) {
statistics::schedStatEvent(async_statdump, async_statreset);
async_statdump = false;
async_statreset = false;
gem5::async_event = false;
if (gem5::async_statdump || gem5::async_statreset) {
gem5::statistics::schedStatEvent(gem5::async_statdump,
gem5::async_statreset);
gem5::async_statdump = false;
gem5::async_statreset = false;
}
if (async_exit) {
async_exit = false;
if (gem5::async_exit) {
gem5::async_exit = false;
gem5::exitSimLoop("user interrupt received");
}
if (async_io) {
async_io = false;
pollQueue.service();
if (gem5::async_io) {
gem5::async_io = false;
gem5::pollQueue.service();
}
if (async_exception)
if (gem5::async_exception)
fatal("received async_exception, shouldn't be possible");
}
void
Module::serviceExternalEvent()
{
gem5::EventQueue *eventq = getEventQueue(0);
gem5::EventQueue *eventq = gem5::getEventQueue(0);
if (!in_simulate && !async_event)
if (!in_simulate && !gem5::async_event)
warn("Gem5SystemC external event received while not in simulate");
if (async_event)
if (gem5::async_event)
serviceAsyncEvent();
if (in_simulate && !eventq->empty())
@@ -192,12 +194,12 @@ Module::serviceExternalEvent()
void
Module::eventLoop()
{
gem5::EventQueue *eventq = getEventQueue(0);
gem5::EventQueue *eventq = gem5::getEventQueue(0);
fatal_if(!in_simulate, "Gem5SystemC event loop entered while"
" outside Gem5SystemC::Module::simulate");
if (async_event)
if (gem5::async_event)
serviceAsyncEvent();
while (!eventq->empty()) {
@@ -248,8 +250,8 @@ Module::eventLoop()
fatal("Ran out of events without seeing exit event");
}
GlobalSimLoopExitEvent *
Module::simulate(Tick num_cycles)
gem5::GlobalSimLoopExitEvent *
Module::simulate(gem5::Tick num_cycles)
{
inform("Entering event queue @ %d. Starting simulation...",
gem5::curTick());
@@ -259,8 +261,9 @@ Module::simulate(Tick num_cycles)
else /* counter would roll over or be set to MaxTick anyhow */
num_cycles = gem5::MaxTick;
gem5::GlobalEvent *limit_event = new GlobalSimLoopExitEvent(num_cycles,
"simulate() limit reached", 0, 0);
gem5::GlobalEvent *limit_event =
new gem5::GlobalSimLoopExitEvent(num_cycles,
"simulate() limit reached", 0, 0);
exitEvent = NULL;
@@ -286,7 +289,7 @@ Module::simulate(Tick num_cycles)
assert(global_event != NULL);
gem5::GlobalSimLoopExitEvent *global_exit_event =
dynamic_cast<GlobalSimLoopExitEvent *>(global_event);
dynamic_cast<gem5::GlobalSimLoopExitEvent *>(global_event);
assert(global_exit_event != NULL);
if (global_exit_event != limit_event) {