systemc: Make sure sc_start waits for simulation even when starving.

Even if the simulation would return from sc_start immediately because
of starvation, this change ensures that sc_start gives control back
to gem5 so that the scheduler will have a chance to set up
sensitivities, etc., before things get torn down.

Change-Id: I39b1fd704fcbe12c299cad9dbd30258e8fe9d032
Reviewed-on: https://gem5-review.googlesource.com/12218
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
This commit is contained in:
Gabe Black
2018-08-17 17:30:31 -07:00
parent dd30c7ef76
commit a56dbe9338

View File

@@ -74,8 +74,11 @@ Scheduler::initPhase()
eq->schedule(ets.first, ets.second);
eventsToSchedule.clear();
if (_started)
if (_started) {
if (starved() && !runToTime)
scheduleStarvationEvent();
eq->schedule(&maxTickEvent, maxTick);
}
initDone = true;
}
@@ -170,9 +173,11 @@ void
Scheduler::scheduleStarvationEvent()
{
if (!starvationEvent.scheduled()) {
panic_if(!eq, "Need to schedule starvation event, "
"but no event manager.\n");
eq->schedule(&starvationEvent, eq->getCurTick());
Tick now = getCurTick();
if (initDone)
eq->schedule(&starvationEvent, now);
else
eventsToSchedule[&starvationEvent] = now;
if (readyEvent.scheduled())
eq->deschedule(&readyEvent);
}
@@ -249,10 +254,9 @@ Scheduler::start(Tick max_tick, bool run_to_time)
maxTick = max_tick;
if (starved() && !runToTime)
return;
if (initDone) {
if (starved() && !runToTime)
scheduleStarvationEvent();
kernel->status(::sc_core::SC_RUNNING);
eq->schedule(&maxTickEvent, maxTick);
}