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:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user