diff options
Diffstat (limited to 'src/systemc')
-rw-r--r-- | src/systemc/core/kernel.cc | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/src/systemc/core/kernel.cc b/src/systemc/core/kernel.cc index fd51b4c52..cc65fcc20 100644 --- a/src/systemc/core/kernel.cc +++ b/src/systemc/core/kernel.cc @@ -86,15 +86,12 @@ Kernel::init() callbackModule(nullptr); for (auto c: sc_gem5::allChannels) c->sc_chan()->before_end_of_elaboration(); - - if (stopAfterCallbacks) - stopWork(); } void Kernel::regStats() { - if (scMainDone) + if (scMainDone || stopAfterCallbacks) return; for (auto m: sc_gem5::allModules) @@ -113,9 +110,6 @@ Kernel::regStats() callbackModule(nullptr); for (auto c: sc_gem5::allChannels) c->sc_chan()->end_of_elaboration(); - - if (stopAfterCallbacks) - stopWork(); } void @@ -124,6 +118,11 @@ Kernel::startup() if (scMainDone) return; + schedule(t0Event, curTick()); + + if (stopAfterCallbacks) + return; + status(::sc_core::SC_START_OF_SIMULATION); for (auto m: sc_gem5::allModules) { m->sc_mod()->start_of_simulation(); @@ -142,7 +141,6 @@ Kernel::startup() kernel->status(::sc_core::SC_RUNNING); - schedule(t0Event, curTick()); // Run update once before the event queue starts. ::sc_gem5::scheduler.update(); } @@ -178,9 +176,14 @@ Kernel::stopWork() void Kernel::t0Handler() { - ::sc_gem5::scheduler.initPhase(); - - status(::sc_core::SC_RUNNING); + if (stopAfterCallbacks) { + scheduler.clear(); + ::sc_gem5::scheduler.initPhase(); + scheduler.scheduleStop(false); + } else { + ::sc_gem5::scheduler.initPhase(); + status(::sc_core::SC_RUNNING); + } } Kernel *kernel; |