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:
@@ -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
|
||||
{
|
||||
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -38,6 +38,8 @@ namespace sc_gem5
|
||||
|
||||
class Channel;
|
||||
|
||||
uint64_t getChangeStamp();
|
||||
|
||||
} // namespace sc_gem5
|
||||
|
||||
namespace sc_core
|
||||
|
||||
Reference in New Issue
Block a user