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>
This commit is contained in:
Gabe Black
2018-08-30 15:49:56 -07:00
parent ef73520db5
commit 48701ed4bd
4 changed files with 29 additions and 3 deletions

View File

@@ -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
{

View 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())

View 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;

View File

@@ -38,6 +38,8 @@ namespace sc_gem5
class Channel;
uint64_t getChangeStamp();
} // namespace sc_gem5
namespace sc_core