gem5  [DEVELOP-FOR-23.0]
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
pipeline.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013-2014, 2020 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 "cpu/minor/pipeline.hh"
39 
40 #include <algorithm>
41 
42 #include "cpu/minor/decode.hh"
43 #include "cpu/minor/execute.hh"
44 #include "cpu/minor/fetch1.hh"
45 #include "cpu/minor/fetch2.hh"
46 #include "debug/Drain.hh"
47 #include "debug/MinorCPU.hh"
48 #include "debug/MinorTrace.hh"
49 #include "debug/Quiesce.hh"
50 
51 namespace gem5
52 {
53 
54 namespace minor
55 {
56 
57 Pipeline::Pipeline(MinorCPU &cpu_, const BaseMinorCPUParams &params) :
58  Ticked(cpu_, &(cpu_.BaseCPU::baseStats.numCycles)),
59  cpu(cpu_),
60  allow_idling(params.enableIdling),
61  f1ToF2(cpu.name() + ".f1ToF2", "lines",
62  params.fetch1ToFetch2ForwardDelay),
63  f2ToF1(cpu.name() + ".f2ToF1", "prediction",
64  params.fetch1ToFetch2BackwardDelay, true),
65  f2ToD(cpu.name() + ".f2ToD", "insts",
66  params.fetch2ToDecodeForwardDelay),
67  dToE(cpu.name() + ".dToE", "insts",
68  params.decodeToExecuteForwardDelay),
69  eToF1(cpu.name() + ".eToF1", "branch",
70  params.executeBranchDelay),
71  execute(cpu.name() + ".execute", cpu, params,
72  dToE.output(), eToF1.input()),
73  decode(cpu.name() + ".decode", cpu, params,
74  f2ToD.output(), dToE.input(), execute.inputBuffer),
75  fetch2(cpu.name() + ".fetch2", cpu, params,
76  f1ToF2.output(), eToF1.output(), f2ToF1.input(), f2ToD.input(),
77  decode.inputBuffer),
78  fetch1(cpu.name() + ".fetch1", cpu, params,
79  eToF1.output(), f1ToF2.input(), f2ToF1.output(), fetch2.inputBuffer),
80  activityRecorder(cpu.name() + ".activity", Num_StageId,
81  /* The max depth of inter-stage FIFOs */
82  std::max(params.fetch1ToFetch2ForwardDelay,
83  std::max(params.fetch2ToDecodeForwardDelay,
84  std::max(params.decodeToExecuteForwardDelay,
85  params.executeBranchDelay)))),
86  needToSignalDrained(false)
87 {
88  if (params.fetch1ToFetch2ForwardDelay < 1) {
89  fatal("%s: fetch1ToFetch2ForwardDelay must be >= 1 (%d)\n",
90  cpu.name(), params.fetch1ToFetch2ForwardDelay);
91  }
92 
93  if (params.fetch2ToDecodeForwardDelay < 1) {
94  fatal("%s: fetch2ToDecodeForwardDelay must be >= 1 (%d)\n",
95  cpu.name(), params.fetch2ToDecodeForwardDelay);
96  }
97 
98  if (params.decodeToExecuteForwardDelay < 1) {
99  fatal("%s: decodeToExecuteForwardDelay must be >= 1 (%d)\n",
100  cpu.name(), params.decodeToExecuteForwardDelay);
101  }
102 
103  if (params.executeBranchDelay < 1) {
104  fatal("%s: executeBranchDelay must be >= 1\n",
105  cpu.name(), params.executeBranchDelay);
106  }
107 }
108 
109 void
111 {
112  fetch1.minorTrace();
113  f1ToF2.minorTrace();
114  f2ToF1.minorTrace();
115  fetch2.minorTrace();
116  f2ToD.minorTrace();
117  decode.minorTrace();
118  dToE.minorTrace();
120  eToF1.minorTrace();
122 }
123 
124 void
126 {
128  cpu.tick();
129 
130  /* Note that it's important to evaluate the stages in order to allow
131  * 'immediate', 0-time-offset TimeBuffer activity to be visible from
132  * later stages to earlier ones in the same cycle */
133  execute.evaluate();
134  decode.evaluate();
135  fetch2.evaluate();
136  fetch1.evaluate();
137 
138  if (debug::MinorTrace)
139  minorTrace();
140 
141  /* Update the time buffers after the stages */
142  f1ToF2.evaluate();
143  f2ToF1.evaluate();
144  f2ToD.evaluate();
145  dToE.evaluate();
146  eToF1.evaluate();
147 
148  /* The activity recorder must be be called after all the stages and
149  * before the idler (which acts on the advice of the activity recorder */
151 
152  if (allow_idling) {
153  /* Become idle if we can but are not draining */
155  DPRINTF(Quiesce, "Suspending as the processor is idle\n");
156  stop();
157  }
158 
159  /* Deactivate all stages. Note that the stages *could*
160  * activate and deactivate themselves but that's fraught
161  * with additional difficulty.
162  * As organised herre */
168  }
169 
170  if (needToSignalDrained) /* Must be draining */
171  {
172  DPRINTF(Drain, "Still draining\n");
173  if (isDrained()) {
174  DPRINTF(Drain, "Signalling end of draining\n");
176  needToSignalDrained = false;
177  stop();
178  }
179  }
180 }
181 
184 {
185  return fetch1.getIcachePort();
186 }
187 
190 {
191  return execute.getDcachePort();
192 }
193 
194 void
196 {
197  fetch1.wakeupFetch(tid);
198 }
199 
200 bool
202 {
203  DPRINTF(MinorCPU, "Draining pipeline by halting inst fetches. "
204  " Execution should drain naturally\n");
205 
206  execute.drain();
207 
208  /* Make sure that needToSignalDrained isn't accidentally set if we
209  * are 'pre-drained' */
210  bool drained = isDrained();
211  needToSignalDrained = !drained;
212 
213  return drained;
214 }
215 
216 void
218 {
219  DPRINTF(Drain, "Drain resume\n");
220 
221  for (ThreadID tid = 0; tid < cpu.numThreads; tid++) {
222  fetch1.wakeupFetch(tid);
223  }
224 
226 }
227 
228 bool
230 {
231  bool fetch1_drained = fetch1.isDrained();
232  bool fetch2_drained = fetch2.isDrained();
233  bool decode_drained = decode.isDrained();
234  bool execute_drained = execute.isDrained();
235 
236  bool f1_to_f2_drained = f1ToF2.empty();
237  bool f2_to_f1_drained = f2ToF1.empty();
238  bool f2_to_d_drained = f2ToD.empty();
239  bool d_to_e_drained = dToE.empty();
240 
241  bool ret = fetch1_drained && fetch2_drained &&
242  decode_drained && execute_drained &&
243  f1_to_f2_drained && f2_to_f1_drained &&
244  f2_to_d_drained && d_to_e_drained;
245 
246  DPRINTF(MinorCPU, "Pipeline undrained stages state:%s%s%s%s%s%s%s%s\n",
247  (fetch1_drained ? "" : " Fetch1"),
248  (fetch2_drained ? "" : " Fetch2"),
249  (decode_drained ? "" : " Decode"),
250  (execute_drained ? "" : " Execute"),
251  (f1_to_f2_drained ? "" : " F1->F2"),
252  (f2_to_f1_drained ? "" : " F2->F1"),
253  (f2_to_d_drained ? "" : " F2->D"),
254  (d_to_e_drained ? "" : " D->E")
255  );
256 
257  return ret;
258 }
259 
260 } // namespace minor
261 } // namespace gem5
fatal
#define fatal(...)
This implements a cprintf based fatal() function.
Definition: logging.hh:200
gem5::minor::Pipeline::wakeupFetch
void wakeupFetch(ThreadID tid)
Wake up the Fetch unit.
Definition: pipeline.cc:195
gem5::minor::Pipeline::isDrained
bool isDrained()
Test to see if the CPU is drained.
Definition: pipeline.cc:229
gem5::minor::Decode::minorTrace
void minorTrace() const
Definition: decode.cc:341
gem5::minor::Pipeline::f2ToD
Latch< ForwardInstData > f2ToD
Definition: pipeline.hh:82
gem5::minor::Execute::drain
unsigned int drain()
Like the drain interface on SimObject.
Definition: execute.cc:1825
gem5::minor::Pipeline::execute
Execute execute
Definition: pipeline.hh:86
gem5::output
static void output(const char *filename)
Definition: debug.cc:60
gem5::MinorCPU::tick
void tick()
The tick method in the MinorCPU is simply updating the cycle counters as the ticking of the pipeline ...
Definition: cpu.hh:198
gem5::MinorCPU::MinorCPUPort
Provide a non-protected base class for Minor's Ports as derived classes are created by Fetch1 and Exe...
Definition: cpu.hh:105
gem5::minor::Pipeline::Pipeline
Pipeline(MinorCPU &cpu_, const BaseMinorCPUParams &params)
Definition: pipeline.cc:57
gem5::minor::Decode::isDrained
bool isDrained()
Is this stage drained? For Decoed, draining is initiated by Execute halting Fetch1 causing Fetch2 to ...
Definition: decode.cc:330
minor
gem5::MinorCPU
MinorCPU is an in-order CPU model with four fixed pipeline stages:
Definition: cpu.hh:84
gem5::Ticked
Ticked attaches gem5's event queue/scheduler to evaluate calls and provides a start/stop interface to...
Definition: ticked_object.hh:61
gem5::minor::Execute::evaluate
void evaluate()
Pass on input/buffer data to the output if you can.
Definition: execute.cc:1421
gem5::minor::Fetch2::minorTrace
void minorTrace() const
Definition: fetch2.cc:631
gem5::minor::Pipeline::fetch1
Fetch1 fetch1
Definition: pipeline.hh:89
gem5::minor::Pipeline::eToF1
Latch< BranchData > eToF1
Definition: pipeline.hh:84
execute.hh
gem5::minor::MinorActivityRecorder::minorTrace
void minorTrace() const
Definition: activity.cc:51
gem5::minor::Pipeline::Fetch1StageId
@ Fetch1StageId
Definition: pipeline.hh:103
fetch2.hh
gem5::BaseCPU::numThreads
ThreadID numThreads
Number of threads we're actually simulating (<= SMT_MAX_THREADS).
Definition: base.hh:384
gem5::minor::Pipeline::drain
bool drain()
Try to drain the CPU.
Definition: pipeline.cc:201
decode.hh
gem5::minor::Pipeline::ExecuteStageId
@ ExecuteStageId
Definition: pipeline.hh:103
gem5::minor::Pipeline::f1ToF2
Latch< ForwardLineData > f1ToF2
Definition: pipeline.hh:80
gem5::minor::Pipeline::cpu
MinorCPU & cpu
Definition: pipeline.hh:75
gem5::minor::Fetch1::getIcachePort
MinorCPU::MinorCPUPort & getIcachePort()
Returns the IcachePort owned by this Fetch1.
Definition: fetch1.hh:396
gem5::minor::Execute::minorTrace
void minorTrace() const
Definition: execute.cc:1654
gem5::Named::name
virtual std::string name() const
Definition: named.hh:47
gem5::minor::Pipeline::minorTrace
void minorTrace() const
Definition: pipeline.cc:110
DPRINTF
#define DPRINTF(x,...)
Definition: trace.hh:210
gem5::minor::Execute::isDrained
bool isDrained()
After thread suspension, has Execute been drained of in-flight instructions and memory accesses.
Definition: execute.cc:1847
pipeline.hh
gem5::minor::Pipeline::CPUStageId
@ CPUStageId
Definition: pipeline.hh:101
gem5::minor::Pipeline::fetch2
Fetch2 fetch2
Definition: pipeline.hh:88
gem5::BaseCPU
Definition: base.hh:104
gem5::minor::Execute::getDcachePort
MinorCPU::MinorCPUPort & getDcachePort()
Returns the DcachePort owned by this Execute to pass upwards.
Definition: execute.cc:1890
gem5::minor::Pipeline::evaluate
void evaluate() override
A custom evaluate allows report in the right place (between stages and pipeline advance)
Definition: pipeline.cc:125
gem5::minor::Decode::evaluate
void evaluate()
Pass on input/buffer data to the output if you can.
Definition: decode.cc:127
gem5::minor::Pipeline::Fetch2StageId
@ Fetch2StageId
Definition: pipeline.hh:103
gem5::minor::Pipeline::activityRecorder
MinorActivityRecorder activityRecorder
Activity recording for the pipeline.
Definition: pipeline.hh:94
gem5::minor::Pipeline::drainResume
void drainResume()
Definition: pipeline.cc:217
gem5::MinorCPU::signalDrainDone
void signalDrainDone()
Signal from Pipeline that MinorCPU should signal that a drain is complete and set its drainState.
Definition: cpu.cc:189
gem5::minor::Fetch2::evaluate
void evaluate()
Pass on input/buffer data to the output if you can.
Definition: fetch2.cc:239
name
const std::string & name()
Definition: trace.cc:48
gem5::minor::Fetch2::isDrained
bool isDrained()
Is this stage drained? For Fetch2, draining is initiated by Execute halting Fetch1 causing Fetch2 to ...
Definition: fetch2.cc:590
gem5::minor::Pipeline::dToE
Latch< ForwardInstData > dToE
Definition: pipeline.hh:83
gem5::minor::Pipeline::allow_idling
bool allow_idling
Allow cycles to be skipped when the pipeline is idle.
Definition: pipeline.hh:78
gem5::minor::Fetch1::wakeupFetch
void wakeupFetch(ThreadID tid)
Initiate fetch1 fetching.
Definition: fetch1.cc:717
std
Overload hash function for BasicBlockRange type.
Definition: misc.hh:2909
gem5::minor::Fetch1::minorTrace
void minorTrace() const
Definition: fetch1.cc:765
gem5::minor::Pipeline::f2ToF1
Latch< BranchData > f2ToF1
Definition: pipeline.hh:81
gem5::ActivityRecorder::active
bool active()
Returns if the CPU should be active.
Definition: activity.hh:91
gem5::minor::Pipeline::DecodeStageId
@ DecodeStageId
Definition: pipeline.hh:103
gem5::minor::Execute::drainResume
void drainResume()
Definition: execute.cc:1782
gem5::Ticked::stop
void stop()
Cancel the next tick event and issue no more.
Definition: ticked_object.hh:133
gem5::minor::MinorActivityRecorder::evaluate
void evaluate()
Ticked interface.
Definition: activity.hh:61
gem5::minor::Fetch1::evaluate
void evaluate()
Pass on input/buffer data to the output if you can.
Definition: fetch1.cc:576
gem5
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
Definition: gpu_translation_state.hh:37
gem5::ActivityRecorder::deactivateStage
void deactivateStage(const int idx)
Deactivates a stage.
Definition: activity.cc:108
gem5::minor::Pipeline::getInstPort
MinorCPU::MinorCPUPort & getInstPort()
Functions below here are BaseCPU operations passed on to pipeline stages.
Definition: pipeline.cc:183
gem5::minor::Fetch1::isDrained
bool isDrained()
Is this stage drained? For Fetch1, draining is initiated by Execute signalling a branch with the reas...
Definition: fetch1.cc:731
gem5::minor::Pipeline::getDataPort
MinorCPU::MinorCPUPort & getDataPort()
Return the DcachePort belonging to Execute for the CPU.
Definition: pipeline.cc:189
fetch1.hh
gem5::minor::Pipeline::needToSignalDrained
bool needToSignalDrained
True after drain is called but draining isn't complete.
Definition: pipeline.hh:108
gem5::ThreadID
int16_t ThreadID
Thread index/ID type.
Definition: types.hh:235
gem5::minor::Pipeline::decode
Decode decode
Definition: pipeline.hh:87

Generated on Sun Jul 30 2023 01:56:52 for gem5 by doxygen 1.8.17