systemc: Make sure sc_start waits for simulation even when starving.
authorGabe Black <gabeblack@google.com>
Sat, 18 Aug 2018 00:30:31 +0000 (17:30 -0700)
committerGabe Black <gabeblack@google.com>
Tue, 25 Sep 2018 23:51:31 +0000 (23:51 +0000)
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>

src/systemc/core/scheduler.cc

index 77015dd46da5f9375ff95eaf2898cf02a891c880..e18855c4d2d675d5bbe4641a77f2bef10e503029 100644 (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);
     }