gem5 v24.0.0.0
Loading...
Searching...
No Matches
voltage_domain.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2012-2014, 2019 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 */
37
38#include "sim/voltage_domain.hh"
39
40#include <algorithm>
41
42#include "base/logging.hh"
43#include "base/trace.hh"
44#include "debug/VoltageDomain.hh"
45#include "params/VoltageDomain.hh"
46#include "sim/serialize.hh"
47
48namespace gem5
49{
50
52 : SimObject(p), voltageOpPoints(p.voltage), _perfLevel(0), stats(*this)
53{
54 fatal_if(voltageOpPoints.empty(), "DVFS: Empty set of voltages for "\
55 "voltage domain %s\n", name());
56
57 // Voltages must be sorted in descending order.
58 fatal_if(!std::is_sorted(voltageOpPoints.begin(), voltageOpPoints.end(),
59 std::greater<Voltages::value_type>()), "DVFS: Voltage operation "\
60 "points not in descending order for voltage domain %s\n",
61 name());
62}
63
64void
66{
67 gem5_assert(perf_level < voltageOpPoints.size(),
68 "DVFS: Requested voltage ID %d is outside the known "\
69 "range for domain %s.\n", perf_level, name());
70
71 if (perf_level == _perfLevel) {
72 // Silently ignore identical overwrites
73 return;
74 }
75
76 _perfLevel = perf_level;
77
78 DPRINTF(VoltageDomain, "Setting voltage to %.3fV idx: %d for domain %s\n",
79 voltage(), perf_level, name());
80}
81
82bool
84{
85 if (numVoltages() == 1)
86 return false;
87
88 // Find the highest requested performance level and update the voltage
89 // domain with it
90 PerfLevel perf_max = (PerfLevel)-1;
91 for (auto dit = srcClockChildren.begin(); dit != srcClockChildren.end();
92 ++dit) {
94 gem5_assert(d->voltageDomain() == this, "DVFS: Clock domain %s "\
95 "(id: %d) should not be registered with voltage domain "\
96 "%s\n", d->name(), d->domainID(), name());
97
98 PerfLevel perf = d->perfLevel();
99
100 DPRINTF(VoltageDomain, "DVFS: Clock domain %s (id: %d) requests perf "\
101 "level %d\n", d->name(), d->domainID(), perf);
102
103 // NOTE: Descending sort of performance levels: 0 - fast, 5 - slow
104 if (perf < perf_max) {
105 DPRINTF(VoltageDomain, "DVFS: Updating max perf level %d -> %d\n",
106 perf_max, perf);
107 perf_max = perf;
108 }
109 }
110 DPRINTF(VoltageDomain, "DVFS: Setting perf level of voltage domain %s "\
111 "from %d to %d.\n", name(), perfLevel(), perf_max);
112
113 // Set the performance level
114 if (perf_max != perfLevel()) {
115 perfLevel(perf_max);
116 return true;
117 } else {
118 return false;
119 }
120}
121
122void
124 bool changed = sanitiseVoltages();
125 if (changed) {
126 warn("DVFS: Perf level for voltage domain %s adapted to "\
127 "requested perf levels from source clock domains.\n", name());
128 }
129}
130
131void
136
137void
143
145 : statistics::Group(&vd),
146 ADD_STAT(voltage, statistics::units::Volt::get(), "Voltage in Volts")
147{
149}
150
151} // namespace gem5
#define DPRINTF(x,...)
Definition trace.hh:210
virtual std::string name() const
Definition named.hh:47
Abstract superclass for simulation objects.
The source clock domains provides the notion of a clock domain that is connected to a tunable clock s...
A VoltageDomain is used to group clock domains that operate under the same voltage.
PerfLevel perfLevel() const
Get the voltage point of the domain.
double voltage() const
Get the current voltage.
const Voltages voltageOpPoints
List of possible minimum voltage at each of the frequency operational points, should be in descending...
void unserialize(CheckpointIn &cp) override
Unserialize an object.
VoltageDomainParams Params
void startup() override
Startup has all SrcClockDomains registered with this voltage domain, so try to make sure that all per...
void serialize(CheckpointOut &cp) const override
Serialize an object.
uint32_t numVoltages() const
SrcClockChildren srcClockChildren
bool sanitiseVoltages()
Recomputes the highest (fastest, i.e., numerically lowest) requested performance level of all associa...
SrcClockDomain::PerfLevel PerfLevel
VoltageDomain(const Params &p)
Statistics container.
Definition group.hh:93
Derived & method(T *obj, V(T::*method)() const)
Extended functor that calls the specified method of the provided object.
#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:236
#define gem5_assert(cond,...)
The assert macro will function like a normal assert, but will use panic instead of straight abort().
Definition logging.hh:317
#define warn(...)
Definition logging.hh:256
Bitfield< 24 > dit
Definition misc_types.hh:57
Bitfield< 9 > d
Definition misc_types.hh:64
Bitfield< 0 > p
Bitfield< 11, 7 > vd
Definition types.hh:163
Copyright (c) 2024 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
Definition binary32.hh:36
std::ostream CheckpointOut
Definition serialize.hh:66
#define UNSERIALIZE_SCALAR(scalar)
Definition serialize.hh:575
#define SERIALIZE_SCALAR(scalar)
Definition serialize.hh:568
statistics::Value voltage
Stat for reporting voltage of the domain.

Generated on Tue Jun 18 2024 16:24:06 for gem5 by doxygen 1.11.0