diff options
author | Gabe Black <gabeblack@google.com> | 2018-08-30 15:49:56 -0700 |
---|---|---|
committer | Gabe Black <gabeblack@google.com> | 2018-10-03 00:25:29 +0000 |
commit | 48701ed4bdfd5b9fc717efe4b758edcc0c7f5e8f (patch) | |
tree | e34fc1b0bd5ef269f6e395bee7c16d3369668768 /src/systemc/core/scheduler.hh | |
parent | ef73520db53ca400b96f83a9f3cdcfbbf5577004 (diff) | |
download | gem5-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>
Diffstat (limited to 'src/systemc/core/scheduler.hh')
-rw-r--r-- | src/systemc/core/scheduler.hh | 14 |
1 files changed, 13 insertions, 1 deletions
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; |