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 ARM Limited
|
||||||
|
* Copyright (c) 2013 Cornell University
|
||||||
* All rights reserved
|
* All rights reserved
|
||||||
*
|
*
|
||||||
* The license below extends only to copyright in the software and shall
|
* The license below extends only to copyright in the software and shall
|
||||||
|
@ -37,6 +38,7 @@
|
||||||
* Authors: Vasileios Spiliopoulos
|
* Authors: Vasileios Spiliopoulos
|
||||||
* Akash Bagdia
|
* Akash Bagdia
|
||||||
* Andreas Hansson
|
* Andreas Hansson
|
||||||
|
* Christopher Torng
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "debug/ClockDomain.hh"
|
#include "debug/ClockDomain.hh"
|
||||||
|
@ -45,6 +47,7 @@
|
||||||
#include "params/SrcClockDomain.hh"
|
#include "params/SrcClockDomain.hh"
|
||||||
#include "sim/clock_domain.hh"
|
#include "sim/clock_domain.hh"
|
||||||
#include "sim/voltage_domain.hh"
|
#include "sim/voltage_domain.hh"
|
||||||
|
#include "sim/clocked_object.hh"
|
||||||
|
|
||||||
double
|
double
|
||||||
ClockDomain::voltage() const
|
ClockDomain::voltage() const
|
||||||
|
@ -65,6 +68,11 @@ SrcClockDomain::clockPeriod(Tick clock_period)
|
||||||
fatal("%s has a clock period of zero\n", name());
|
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;
|
_clockPeriod = clock_period;
|
||||||
|
|
||||||
DPRINTF(ClockDomain,
|
DPRINTF(ClockDomain,
|
||||||
|
@ -105,6 +113,11 @@ DerivedClockDomain::DerivedClockDomain(const Params *p) :
|
||||||
void
|
void
|
||||||
DerivedClockDomain::updateClockPeriod()
|
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
|
// recalculate the clock period, relying on the fact that changes
|
||||||
// propagate downwards in the tree
|
// propagate downwards in the tree
|
||||||
_clockPeriod = parent.clockPeriod() * clockDivider;
|
_clockPeriod = parent.clockPeriod() * clockDivider;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013 ARM Limited
|
* Copyright (c) 2013 ARM Limited
|
||||||
|
* Copyright (c) 2013 Cornell University
|
||||||
* All rights reserved
|
* All rights reserved
|
||||||
*
|
*
|
||||||
* The license below extends only to copyright in the software and shall
|
* The license below extends only to copyright in the software and shall
|
||||||
|
@ -36,6 +37,7 @@
|
||||||
*
|
*
|
||||||
* Authors: Vasileios Spiliopoulos
|
* Authors: Vasileios Spiliopoulos
|
||||||
* Akash Bagdia
|
* Akash Bagdia
|
||||||
|
* Christopher Torng
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -46,6 +48,8 @@
|
||||||
#ifndef __SIM_CLOCK_DOMAIN_HH__
|
#ifndef __SIM_CLOCK_DOMAIN_HH__
|
||||||
#define __SIM_CLOCK_DOMAIN_HH__
|
#define __SIM_CLOCK_DOMAIN_HH__
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
#include "base/statistics.hh"
|
#include "base/statistics.hh"
|
||||||
#include "params/ClockDomain.hh"
|
#include "params/ClockDomain.hh"
|
||||||
#include "params/DerivedClockDomain.hh"
|
#include "params/DerivedClockDomain.hh"
|
||||||
|
@ -57,6 +61,7 @@
|
||||||
*/
|
*/
|
||||||
class DerivedClockDomain;
|
class DerivedClockDomain;
|
||||||
class VoltageDomain;
|
class VoltageDomain;
|
||||||
|
class ClockedObject;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The ClockDomain provides clock to group of clocked objects bundled
|
* The ClockDomain provides clock to group of clocked objects bundled
|
||||||
|
@ -86,6 +91,12 @@ class ClockDomain : public SimObject
|
||||||
*/
|
*/
|
||||||
std::vector<DerivedClockDomain*> children;
|
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:
|
public:
|
||||||
|
|
||||||
typedef ClockDomainParams Params;
|
typedef ClockDomainParams Params;
|
||||||
|
@ -101,6 +112,18 @@ class ClockDomain : public SimObject
|
||||||
*/
|
*/
|
||||||
inline Tick clockPeriod() const { return _clockPeriod; }
|
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.
|
* Get the voltage domain.
|
||||||
*
|
*
|
||||||
|
@ -145,6 +168,8 @@ class SrcClockDomain : public ClockDomain
|
||||||
*/
|
*/
|
||||||
void clockPeriod(Tick clock_period);
|
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) 2012-2013 ARM Limited
|
||||||
|
* Copyright (c) 2013 Cornell University
|
||||||
* All rights reserved
|
* All rights reserved
|
||||||
*
|
*
|
||||||
* The license below extends only to copyright in the software and shall
|
* 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.
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* Authors: Andreas Hansson
|
* Authors: Andreas Hansson
|
||||||
|
* Christopher Torng
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -118,6 +120,9 @@ class ClockedObject : public SimObject
|
||||||
ClockedObject(const ClockedObjectParams* p) :
|
ClockedObject(const ClockedObjectParams* p) :
|
||||||
SimObject(p), tick(0), cycle(0), clockDomain(*p->clk_domain)
|
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:
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the tick to the current tick.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
inline void updateClockPeriod() const
|
||||||
|
{
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine the tick when a cycle begins, by default the current
|
* Determine the tick when a cycle begins, by default the current
|
||||||
* one, but the argument also enables the caller to determine a
|
* one, but the argument also enables the caller to determine a
|
||||||
|
|
Loading…
Reference in a new issue