From a56dbe9338272273ac576514685e1c01ded173a2 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Fri, 17 Aug 2018 17:30:31 -0700 Subject: [PATCH] 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 Maintainer: Gabe Black --- src/systemc/core/scheduler.cc | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/systemc/core/scheduler.cc b/src/systemc/core/scheduler.cc index 77015dd46..e18855c4d 100644 --- a/src/systemc/core/scheduler.cc +++ b/src/systemc/core/scheduler.cc @@ -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); } -- 2.30.2