gem5 [DEVELOP-FOR-25.0]
Loading...
Searching...
No Matches
clock_domain.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2013-2014, 2019 ARM Limited
3 * Copyright (c) 2013 Cornell University
4 * All rights reserved
5 *
6 * The license below extends only to copyright in the software and shall
7 * not be construed as granting a license to any other intellectual
8 * property including but not limited to intellectual property relating
9 * to a hardware implementation of the functionality of the software
10 * licensed hereunder. You may use the software subject to the license
11 * terms below provided that you ensure that this notice is replicated
12 * unmodified and in its entirety in all distributions of the software,
13 * modified or unmodified, in source code or in binary form.
14 *
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions are
17 * met: redistributions of source code must retain the above copyright
18 * notice, this list of conditions and the following disclaimer;
19 * redistributions in binary form must reproduce the above copyright
20 * notice, this list of conditions and the following disclaimer in the
21 * documentation and/or other materials provided with the distribution;
22 * neither the name of the copyright holders nor the names of its
23 * contributors may be used to endorse or promote products derived from
24 * this software without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 */
38
39#include "sim/clock_domain.hh"
40
41#include <algorithm>
42#include <functional>
43
44#include "base/logging.hh"
45#include "base/trace.hh"
46#include "debug/ClockDomain.hh"
47#include "params/ClockDomain.hh"
48#include "params/DerivedClockDomain.hh"
49#include "params/SrcClockDomain.hh"
50#include "sim/clocked_object.hh"
51#include "sim/serialize.hh"
52#include "sim/voltage_domain.hh"
53
54namespace gem5
55{
56
58 : statistics::Group(&cd),
59 ADD_STAT(clock, statistics::units::Tick::get(), "Clock period in ticks")
60{
61 // Expose the current clock period as a stat for observability in
62 // the dumps
63 clock.scalar(cd._clockPeriod);
64}
65
67 : SimObject(p),
68 _clockPeriod(0),
69 _voltageDomain(voltage_domain),
70 stats(*this)
71{
72}
73
74double
76{
77 return _voltageDomain->voltage();
78}
79
81 ClockDomain(p, p.voltage_domain),
82 freqOpPoints(p.clock),
83 _domainID(p.domain_id),
84 _perfLevel(p.init_perf_level)
85{
86 VoltageDomain *vdom = p.voltage_domain;
87
88 fatal_if(freqOpPoints.empty(), "DVFS: Empty set of frequencies for "\
89 "domain %d %s\n", _domainID, name());
90
91 fatal_if(!vdom, "DVFS: Empty voltage domain specified for "\
92 "domain %d %s\n", _domainID, name());
93
94 fatal_if((vdom->numVoltages() > 1) &&
95 (vdom->numVoltages() != freqOpPoints.size()),
96 "DVFS: Number of frequency and voltage scaling points do "\
97 "not match: %d:%d ID: %d %s.\n", vdom->numVoltages(),
98 freqOpPoints.size(), _domainID, name());
99
100 // Frequency (& voltage) points should be declared in descending order,
101 // NOTE: Frequency is inverted to ticks, so checking for ascending ticks
102 fatal_if(!std::is_sorted(freqOpPoints.begin(), freqOpPoints.end()),
103 "DVFS: Frequency operation points not in descending order for "\
104 "domain with ID %d\n", _domainID);
105
106 fatal_if(_perfLevel >= freqOpPoints.size(), "DVFS: Initial DVFS point %d "\
107 "is outside of list for Domain ID: %d\n", _perfLevel, _domainID);
108
110
111 vdom->registerSrcClockDom(this);
112}
113
114void
116{
117 if (clock_period == 0) {
118 fatal("%s has a clock period of zero\n", name());
119 }
120
121 // Align all members to the current tick
122 for (auto m = members.begin(); m != members.end(); ++m) {
123 (*m)->updateClockPeriod();
124 }
125
126 _clockPeriod = clock_period;
127
129 "Setting clock period to %d ticks for source clock %s\n",
130 _clockPeriod, name());
131
132 // inform any derived clocks they need to updated their period
133 for (auto c = children.begin(); c != children.end(); ++c) {
134 (*c)->updateClockPeriod();
135 }
136}
137
138void
140{
141 assert(validPerfLevel(perf_level));
142
143 if (perf_level == _perfLevel) {
144 // Silently ignore identical overwrites
145 return;
146 }
147
148 DPRINTF(ClockDomain, "DVFS: Switching performance level of domain %s "\
149 "(id: %d) from %d to %d\n", name(), domainID(), _perfLevel,
150 perf_level);
151
152 _perfLevel = perf_level;
153
155}
156
158{
159 // Signal the voltage domain that we have changed our perf level so that the
160 // voltage domain can recompute its performance level
162
163 // Integrated switching of the actual clock value, too
165}
166
167void
173
174void
180
181void
183{
184 // Perform proper clock update when all related components have been
185 // created (i.e. after unserialization / object creation)
187}
188
190 ClockDomain(p, p.clk_domain->voltageDomain()),
191 parent(*p.clk_domain),
192 clockDivider(p.clk_divider)
193{
194 // Ensure that clock divider setting works as frequency divider and never
195 // work as frequency multiplier
196 if (clockDivider < 1) {
197 fatal("Clock divider param cannot be less than 1");
198 }
199
200 // let the parent keep track of this derived domain so that it can
201 // propagate changes
202 parent.addDerivedDomain(this);
203
204 // update our clock period based on the parents clock
206}
207
208void
210{
211 // Align all members to the current tick
212 for (auto m = members.begin(); m != members.end(); ++m) {
213 (*m)->updateClockPeriod();
214 }
215
216 // recalculate the clock period, relying on the fact that changes
217 // propagate downwards in the tree
218 _clockPeriod = parent.clockPeriod() * clockDivider;
219
221 "Setting clock period to %d ticks for derived clock %s\n",
222 _clockPeriod, name());
223
224 // inform any derived clocks
225 for (auto c = children.begin(); c != children.end(); ++c) {
226 (*c)->updateClockPeriod();
227 }
228}
229
230} // namespace gem5
#define DPRINTF(x,...)
Definition trace.hh:209
ClockDomainParams Params
VoltageDomain * _voltageDomain
Voltage domain this clock domain belongs to.
std::vector< DerivedClockDomain * > children
Pointers to potential derived clock domains so we can propagate changes.
VoltageDomain * voltageDomain() const
Get the voltage domain.
ClockDomain(const Params &p, VoltageDomain *voltage_domain)
Tick _clockPeriod
Pre-computed clock period in ticks.
std::vector< Clocked * > members
Pointers to members of this clock domain, so that when the clock period changes, we can update each m...
double voltage() const
Get the current voltage this clock domain operates at.
gem5::ClockDomain::ClockDomainStats stats
DerivedClockDomainParams Params
const uint64_t clockDivider
Local clock divider of the domain.
DerivedClockDomain(const Params &p)
ClockDomain & parent
Reference to the parent clock domain this clock domain derives its clock period from.
void updateClockPeriod()
Called by the parent clock domain to propagate changes.
virtual std::string name() const
Definition named.hh:60
bool validPerfLevel(PerfLevel perf_level) const
Checks whether the performance level requested exists in the current domain configuration.
Tick clkPeriodAtPerfLevel() const
const uint32_t _domainID
Software recognizable id number for the domain, should be unique for each domain.
const std::vector< Tick > freqOpPoints
List of possible frequency operational points, should be in descending order An empty list correspond...
SrcClockDomainParams Params
void signalPerfLevelUpdate()
Inform other components about the changed performance level.
uint32_t domainID() const
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Tick clockPeriod() const
Get the clock period.
void startup() override
startup() is the final initialization call before simulation.
void serialize(CheckpointOut &cp) const override
Serialize an object.
PerfLevel _perfLevel
Current performance level the domain is set to.
SrcClockDomain(const Params &p)
PerfLevel perfLevel() const
A VoltageDomain is used to group clock domains that operate under the same voltage.
void registerSrcClockDom(SrcClockDomain *src_clock_dom)
Register a SrcClockDomain with this voltage domain.
uint32_t numVoltages() const
bool sanitiseVoltages()
Recomputes the highest (fastest, i.e., numerically lowest) requested performance level of all associa...
ClockDomain declarations.
ClockedObject declaration and implementation.
#define ADD_STAT(n,...)
Convenience macro to add a stat to a statistics group.
Definition group.hh:75
#define fatal_if(cond,...)
Conditional fatal macro that checks the supplied condition and only causes a fatal error if the condi...
Definition logging.hh:268
#define fatal(...)
This implements a cprintf based fatal() function.
Definition logging.hh:232
virtual void unserialize(CheckpointIn &cp)=0
Unserialize an object.
virtual void serialize(CheckpointOut &cp) const =0
Serialize an object.
SimObject(const Params &p)
Definition sim_object.cc:58
Bitfield< 32 > cd
Bitfield< 29 > c
Definition misc_types.hh:53
Bitfield< 0 > m
Bitfield< 0 > p
Units for Stats.
Definition units.hh:113
Copyright (c) 2024 Arm Limited All rights reserved.
Definition binary32.hh:36
std::ostream CheckpointOut
Definition serialize.hh:66
uint64_t Tick
Tick count type.
Definition types.hh:58
#define UNSERIALIZE_SCALAR(scalar)
Definition serialize.hh:575
#define SERIALIZE_SCALAR(scalar)
Definition serialize.hh:568
statistics::Value clock
Stat to report clock period of clock domain.

Generated on Mon May 26 2025 09:19:13 for gem5 by doxygen 1.13.2