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:
Christopher Torng 2013-12-29 19:29:45 -06:00
parent 903b442228
commit b4b03a60b1
3 changed files with 52 additions and 0 deletions

View file

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

View file

@ -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;
}; };
/** /**

View file

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