systemc: Fix some issues with starvation checks.
authorGabe Black <gabeblack@google.com>
Sun, 26 Aug 2018 22:34:31 +0000 (15:34 -0700)
committerGabe Black <gabeblack@google.com>
Wed, 26 Sep 2018 00:02:52 +0000 (00:02 +0000)
Make sure we check for starvation after timed notifications and at the
very end of delta cycles (after delta notifications, not before). Also
reverse the order of starvation checks (whether they apply at all, then
if they're satisfied) to make those checks faster. Checking a bool
is a lot easier than checking if a bunch of other structures are
empty.

Change-Id: I514ff219909823f1f424fde69856d6b510655188
Reviewed-on: https://gem5-review.googlesource.com/12268
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>

src/systemc/core/scheduler.cc
src/systemc/core/scheduler.hh

index c84aa9a462214fab020c372e29d0cbb11f89b46c..46053b40fb55b3cc0eed07486f7455590c00cf6c 100644 (file)
@@ -124,7 +124,7 @@ Scheduler::initPhase()
     eventsToSchedule.clear();
 
     if (_started) {
-        if (starved() && !runToTime)
+        if (!runToTime && starved())
             scheduleStarvationEvent();
         kernel->status(::sc_core::SC_RUNNING);
     }
@@ -244,14 +244,14 @@ Scheduler::runReady()
     // The update phase.
     update();
 
-    if (starved() && !runToTime)
-        scheduleStarvationEvent();
-
     // The delta phase.
     for (auto &e: deltas)
         e->run();
     deltas.clear();
 
+    if (!runToTime && starved())
+        scheduleStarvationEvent();
+
     if (runOnce)
         schedulePause();
 }
@@ -303,7 +303,7 @@ Scheduler::start(Tick max_tick, bool run_to_time)
     maxTick = max_tick;
 
     if (initDone) {
-        if (starved() && !runToTime)
+        if (!runToTime && starved())
             scheduleStarvationEvent();
         kernel->status(::sc_core::SC_RUNNING);
     }
index 3068a0aaacddeb5e65898e55c7577396d3c8b97a..ff8434bef54afeabae9c0c05f13ab9a6146e962e 100644 (file)
@@ -266,6 +266,8 @@ class Scheduler
     {
         assert(ts == timeSlots.begin()->second);
         timeSlots.erase(timeSlots.begin());
+        if (!runToTime && starved())
+            scheduleStarvationEvent();
     }
 
     // Pending activity ignores gem5 activity, much like how a systemc