systemc: Add a "changeStamp" value to the scheduler.
authorGabe Black <gabeblack@google.com>
Thu, 30 Aug 2018 22:49:56 +0000 (15:49 -0700)
committerGabe Black <gabeblack@google.com>
Wed, 3 Oct 2018 00:25:29 +0000 (00:25 +0000)
This value is incremented after each delta cycle's evaluate stage and
after timed notifications happen. Its value is used by some channels
to determine whether certain events happened within the previous update
phase to implement the "event()", "posedge()", and "negedge()"
functions.

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

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

index 91befa836aa3f48aef4a63d2f0e9443b3674468c..170abb541efff60d9ad972f69fbfc7969949c866 100644 (file)
 
 #include "base/logging.hh"
 #include "systemc/core/channel.hh"
+#include "systemc/core/scheduler.hh"
 #include "systemc/ext/core/sc_prim.hh"
 
+namespace sc_gem5
+{
+
+uint64_t getChangeStamp() { return scheduler.changeStamp(); }
+
+} // namespace sc_gem5
+
 namespace sc_core
 {
 
index 9b431acba7dd8299108d4839d3be89edf9f077ee..e2d8e62f4e9083db23688769a4201d840907f109 100644 (file)
@@ -46,7 +46,7 @@ Scheduler::Scheduler() :
     starvationEvent(this, false, StarvationPriority),
     _started(false), _paused(false), _stopped(false),
     maxTickEvent(this, false, MaxTickPriority),
-    _numCycles(0), _current(nullptr), initDone(false),
+    _numCycles(0), _changeStamp(0), _current(nullptr), initDone(false),
     runOnce(false)
 {}
 
@@ -265,14 +265,17 @@ void
 Scheduler::runReady()
 {
     bool empty = readyList.empty();
+    lastReadyTick = getCurTick();
 
     // The evaluation phase.
     do {
         yield();
     } while (!readyList.empty());
 
-    if (!empty)
+    if (!empty) {
         _numCycles++;
+        _changeStamp++;
+    }
 
     // The update phase.
     update();
@@ -334,6 +337,7 @@ Scheduler::start(Tick max_tick, bool run_to_time)
     runToTime = run_to_time;
 
     maxTick = max_tick;
+    lastReadyTick = getCurTick();
 
     if (initDone) {
         if (!runToTime && starved())
index f55ff1f83f747e5ec86ccac5153b935435c721e6..2bee0b090393866514208f11c0f4372edae76304 100644 (file)
@@ -275,6 +275,7 @@ class Scheduler
     void
     completeTimeSlot(TimeSlot *ts)
     {
+        _changeStamp++;
         assert(ts == timeSlots.begin()->second);
         timeSlots.erase(timeSlots.begin());
         if (!runToTime && starved())
@@ -327,6 +328,8 @@ class Scheduler
     bool paused() { return _paused; }
     bool stopped() { return _stopped; }
 
+    uint64_t changeStamp() { return _changeStamp; }
+
   private:
     typedef const EventBase::Priority Priority;
     static Priority DefaultPriority = EventBase::Default_Pri;
@@ -388,9 +391,18 @@ class Scheduler
     bool _stopped;
 
     Tick maxTick;
-    EventWrapper<Scheduler, &Scheduler::pause> maxTickEvent;
+    Tick lastReadyTick;
+    void
+    maxTickFunc()
+    {
+        if (lastReadyTick != getCurTick())
+            _changeStamp++;
+        pause();
+    }
+    EventWrapper<Scheduler, &Scheduler::maxTickFunc> maxTickEvent;
 
     uint64_t _numCycles;
+    uint64_t _changeStamp;
 
     Process *_current;
 
index 99e23145681f11f02fb738452b2569582ea0b720..73b8784a6ac96c3bc63fc0b4a1979baec148b0bc 100644 (file)
@@ -38,6 +38,8 @@ namespace sc_gem5
 
 class Channel;
 
+uint64_t getChangeStamp();
+
 } // namespace sc_gem5
 
 namespace sc_core