summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2018-08-30 15:49:56 -0700
committerGabe Black <gabeblack@google.com>2018-10-03 00:25:29 +0000
commit48701ed4bdfd5b9fc717efe4b758edcc0c7f5e8f (patch)
treee34fc1b0bd5ef269f6e395bee7c16d3369668768
parentef73520db53ca400b96f83a9f3cdcfbbf5577004 (diff)
downloadgem5-48701ed4bdfd5b9fc717efe4b758edcc0c7f5e8f.tar.xz
systemc: Add a "changeStamp" value to the scheduler.
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>
-rw-r--r--src/systemc/core/sc_prim.cc8
-rw-r--r--src/systemc/core/scheduler.cc8
-rw-r--r--src/systemc/core/scheduler.hh14
-rw-r--r--src/systemc/ext/core/sc_prim.hh2
4 files changed, 29 insertions, 3 deletions
diff --git a/src/systemc/core/sc_prim.cc b/src/systemc/core/sc_prim.cc
index 91befa836..170abb541 100644
--- a/src/systemc/core/sc_prim.cc
+++ b/src/systemc/core/sc_prim.cc
@@ -29,8 +29,16 @@
#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
{
diff --git a/src/systemc/core/scheduler.cc b/src/systemc/core/scheduler.cc
index 9b431acba..e2d8e62f4 100644
--- a/src/systemc/core/scheduler.cc
+++ b/src/systemc/core/scheduler.cc
@@ -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())
diff --git a/src/systemc/core/scheduler.hh b/src/systemc/core/scheduler.hh
index f55ff1f83..2bee0b090 100644
--- a/src/systemc/core/scheduler.hh
+++ b/src/systemc/core/scheduler.hh
@@ -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;
diff --git a/src/systemc/ext/core/sc_prim.hh b/src/systemc/ext/core/sc_prim.hh
index 99e231456..73b8784a6 100644
--- a/src/systemc/ext/core/sc_prim.hh
+++ b/src/systemc/ext/core/sc_prim.hh
@@ -38,6 +38,8 @@ namespace sc_gem5
class Channel;
+uint64_t getChangeStamp();
+
} // namespace sc_gem5
namespace sc_core