sim: Add support for dynamic frequency scaling
This patch provides support for DFS by having ClockedObjects register themselves with their clock domain at construction time in a member list. Using this list, a clock domain can update each member's tick to the curTick() before modifying the clock period. Committed by: Nilay Vaish <nilay@cs.wisc.edu>
This commit is contained in:
parent
903b442228
commit
b4b03a60b1
3 changed files with 52 additions and 0 deletions
|
@ -1,5 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2013 ARM Limited
|
||||
* Copyright (c) 2013 Cornell University
|
||||
* All rights reserved
|
||||
*
|
||||
* The license below extends only to copyright in the software and shall
|
||||
|
@ -37,6 +38,7 @@
|
|||
* Authors: Vasileios Spiliopoulos
|
||||
* Akash Bagdia
|
||||
* Andreas Hansson
|
||||
* Christopher Torng
|
||||
*/
|
||||
|
||||
#include "debug/ClockDomain.hh"
|
||||
|
@ -45,6 +47,7 @@
|
|||
#include "params/SrcClockDomain.hh"
|
||||
#include "sim/clock_domain.hh"
|
||||
#include "sim/voltage_domain.hh"
|
||||
#include "sim/clocked_object.hh"
|
||||
|
||||
double
|
||||
ClockDomain::voltage() const
|
||||
|
@ -65,6 +68,11 @@ SrcClockDomain::clockPeriod(Tick clock_period)
|
|||
fatal("%s has a clock period of zero\n", name());
|
||||
}
|
||||
|
||||
// Align all members to the current tick
|
||||
for (auto m = members.begin(); m != members.end(); ++m) {
|
||||
(*m)->updateClockPeriod();
|
||||
}
|
||||
|
||||
_clockPeriod = clock_period;
|
||||
|
||||
DPRINTF(ClockDomain,
|
||||
|
@ -105,6 +113,11 @@ DerivedClockDomain::DerivedClockDomain(const Params *p) :
|
|||
void
|
||||
DerivedClockDomain::updateClockPeriod()
|
||||
{
|
||||
// Align all members to the current tick
|
||||
for (auto m = members.begin(); m != members.end(); ++m) {
|
||||
(*m)->updateClockPeriod();
|
||||
}
|
||||
|
||||
// recalculate the clock period, relying on the fact that changes
|
||||
// propagate downwards in the tree
|
||||
_clockPeriod = parent.clockPeriod() * clockDivider;
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2013 ARM Limited
|
||||
* Copyright (c) 2013 Cornell University
|
||||
* All rights reserved
|
||||
*
|
||||
* The license below extends only to copyright in the software and shall
|
||||
|
@ -36,6 +37,7 @@
|
|||
*
|
||||
* Authors: Vasileios Spiliopoulos
|
||||
* Akash Bagdia
|
||||
* Christopher Torng
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -46,6 +48,8 @@
|
|||
#ifndef __SIM_CLOCK_DOMAIN_HH__
|
||||
#define __SIM_CLOCK_DOMAIN_HH__
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#include "base/statistics.hh"
|
||||
#include "params/ClockDomain.hh"
|
||||
#include "params/DerivedClockDomain.hh"
|
||||
|
@ -57,6 +61,7 @@
|
|||
*/
|
||||
class DerivedClockDomain;
|
||||
class VoltageDomain;
|
||||
class ClockedObject;
|
||||
|
||||
/**
|
||||
* The ClockDomain provides clock to group of clocked objects bundled
|
||||
|
@ -86,6 +91,12 @@ class ClockDomain : public SimObject
|
|||
*/
|
||||
std::vector<DerivedClockDomain*> children;
|
||||
|
||||
/**
|
||||
* Pointers to members of this clock domain, so that when the clock
|
||||
* period changes, we can update each member's tick.
|
||||
*/
|
||||
std::vector<ClockedObject*> members;
|
||||
|
||||
public:
|
||||
|
||||
typedef ClockDomainParams Params;
|
||||
|
@ -101,6 +112,18 @@ class ClockDomain : public SimObject
|
|||
*/
|
||||
inline Tick clockPeriod() const { return _clockPeriod; }
|
||||
|
||||
/**
|
||||
* Register a ClockedObject to this ClockDomain.
|
||||
*
|
||||
* @param ClockedObject to add as a member
|
||||
*/
|
||||
void registerWithClockDomain(ClockedObject *c)
|
||||
{
|
||||
assert(c != NULL);
|
||||
assert(std::find(members.begin(), members.end(), c) == members.end());
|
||||
members.push_back(c);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the voltage domain.
|
||||
*
|
||||
|
@ -145,6 +168,8 @@ class SrcClockDomain : public ClockDomain
|
|||
*/
|
||||
void clockPeriod(Tick clock_period);
|
||||
|
||||
// Explicitly import the otherwise hidden clockPeriod
|
||||
using ClockDomain::clockPeriod;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2012-2013 ARM Limited
|
||||
* Copyright (c) 2013 Cornell University
|
||||
* All rights reserved
|
||||
*
|
||||
* The license below extends only to copyright in the software and shall
|
||||
|
@ -35,6 +36,7 @@
|
|||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Authors: Andreas Hansson
|
||||
* Christopher Torng
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -118,6 +120,9 @@ class ClockedObject : public SimObject
|
|||
ClockedObject(const ClockedObjectParams* p) :
|
||||
SimObject(p), tick(0), cycle(0), clockDomain(*p->clk_domain)
|
||||
{
|
||||
// Register with the clock domain, so that if the clock domain
|
||||
// frequency changes, we can update this object's tick.
|
||||
clockDomain.registerWithClockDomain(this);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -139,6 +144,15 @@ class ClockedObject : public SimObject
|
|||
|
||||
public:
|
||||
|
||||
/**
|
||||
* Update the tick to the current tick.
|
||||
*
|
||||
*/
|
||||
inline void updateClockPeriod() const
|
||||
{
|
||||
update();
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine the tick when a cycle begins, by default the current
|
||||
* one, but the argument also enables the caller to determine a
|
||||
|
|
Loading…
Reference in a new issue