gem5  v19.0.0.0
base.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012-2013, 2016-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  * Authors: Thomas Grass
38  * Andreas Hansson
39  * Sascha Bischoff
40  */
42 
43 #include <sstream>
44 
45 #include "base/intmath.hh"
46 #include "base/random.hh"
47 #include "config/have_protobuf.hh"
56 #include "debug/Checkpoint.hh"
57 #include "debug/TrafficGen.hh"
58 #include "enums/AddrMap.hh"
59 #include "params/BaseTrafficGen.hh"
60 #include "sim/sim_exit.hh"
61 #include "sim/stats.hh"
62 #include "sim/system.hh"
63 
64 #if HAVE_PROTOBUF
66 #endif
67 
68 
69 using namespace std;
70 
71 BaseTrafficGen::BaseTrafficGen(const BaseTrafficGenParams* p)
72  : ClockedObject(p),
73  system(p->system),
74  elasticReq(p->elastic_req),
75  progressCheck(p->progress_check),
76  noProgressEvent([this]{ noProgress(); }, name()),
78  nextPacketTick(0),
79  maxOutstandingReqs(p->max_outstanding_reqs),
80  port(name() + ".port", *this),
81  retryPkt(NULL),
83  updateEvent([this]{ update(); }, name()),
84  stats(this),
85  masterID(system->getMasterId(this)),
87 {
88 }
89 
91 {
92 }
93 
94 Port &
95 BaseTrafficGen::getPort(const string &if_name, PortID idx)
96 {
97  if (if_name == "port") {
98  return port;
99  } else {
100  return ClockedObject::getPort(if_name, idx);
101  }
102 }
103 
104 void
106 {
108 
109  if (!port.isConnected())
110  fatal("The port of %s is not connected!\n", name());
111 }
112 
115 {
116  if (!updateEvent.scheduled()) {
117  // no event has been scheduled yet (e.g. switched from atomic mode)
118  return DrainState::Drained;
119  }
120 
121  if (retryPkt == NULL) {
122  // shut things down
126  return DrainState::Drained;
127  } else {
128  return DrainState::Draining;
129  }
130 }
131 
132 void
134 {
135  warn("%s serialization does not keep all traffic generator"
136  " internal state\n", name());
137 
138  DPRINTF(Checkpoint, "Serializing BaseTrafficGen\n");
139 
140  // save ticks of the graph event if it is scheduled
141  Tick nextEvent = updateEvent.scheduled() ? updateEvent.when() : 0;
142 
143  DPRINTF(TrafficGen, "Saving nextEvent=%llu\n", nextEvent);
144 
145  SERIALIZE_SCALAR(nextEvent);
146 
148 
150 }
151 
152 void
154 {
155  warn("%s serialization does not restore all traffic generator"
156  " internal state\n", name());
157 
158  // restore scheduled events
159  Tick nextEvent;
160  UNSERIALIZE_SCALAR(nextEvent);
161  if (nextEvent != 0)
162  schedule(updateEvent, nextEvent);
163 
165 
167 }
168 
169 void
171 {
172  // shift our progress-tracking event forward
174 
175  // if we have reached the time for the next state transition, then
176  // perform the transition
177  if (curTick() >= nextTransitionTick) {
178  transition();
179  } else {
180  assert(curTick() >= nextPacketTick);
181  // get the next packet and try to send it
182  PacketPtr pkt = activeGenerator->getNextPacket();
183 
184  // If generating stream/substream IDs are enabled,
185  // try to pick and assign them to the new packet
186  if (streamGenerator) {
187  auto sid = streamGenerator->pickStreamID();
188  auto ssid = streamGenerator->pickSubStreamID();
189 
190  pkt->req->setStreamId(sid);
191 
192  if (streamGenerator->ssidValid()) {
193  pkt->req->setSubStreamId(ssid);
194  }
195  }
196 
197  // suppress packets that are not destined for a memory, such as
198  // device accesses that could be part of a trace
199  if (pkt && system->isMemAddr(pkt->getAddr())) {
200  stats.numPackets++;
201  // Only attempts to send if not blocked by pending responses
203  if (blockedWaitingResp || !port.sendTimingReq(pkt)) {
204  retryPkt = pkt;
205  retryPktTick = curTick();
206  }
207  } else if (pkt) {
208  DPRINTF(TrafficGen, "Suppressed packet %s 0x%x\n",
209  pkt->cmdString(), pkt->getAddr());
210 
212  if (!(static_cast<int>(stats.numSuppressed.value()) % 10000))
213  warn("%s suppressed %d packets with non-memory addresses\n",
215 
216  delete pkt;
217  pkt = nullptr;
218  }
219  }
220 
221  // if we are waiting for a retry or for a response, do not schedule any
222  // further events, in the case of a transition or a successful send, go
223  // ahead and determine when the next update should take place
224  if (retryPkt == NULL) {
225  nextPacketTick = activeGenerator->nextPacketTick(elasticReq, 0);
226  scheduleUpdate();
227  }
228 }
229 
230 void
232 {
233  if (activeGenerator)
234  activeGenerator->exit();
235 
237 
238  if (activeGenerator) {
239  const Tick duration = activeGenerator->duration;
240  if (duration != MaxTick && duration != 0) {
241  // we could have been delayed and not transitioned on the
242  // exact tick when we were supposed to (due to back
243  // pressure when sending a packet)
244  nextTransitionTick = curTick() + duration;
245  } else {
247  }
248 
249  activeGenerator->enter();
250  nextPacketTick = activeGenerator->nextPacketTick(elasticReq, 0);
251  } else {
254  assert(!updateEvent.scheduled());
255  }
256 }
257 
258 void
260 {
261  // Has the generator run out of work? In that case, force a
262  // transition if a transition period hasn't been configured.
263  while (activeGenerator &&
265  transition();
266  }
267 
268  if (!activeGenerator)
269  return;
270 
271  // schedule next update event based on either the next execute
272  // tick or the next transition, which ever comes first
273  const Tick nextEventTick = std::min(nextPacketTick, nextTransitionTick);
274 
275  DPRINTF(TrafficGen, "Next event scheduled at %lld\n", nextEventTick);
276 
277  // The next transition tick may be in the past if there was a
278  // retry, so ensure that we don't schedule anything in the past.
279  schedule(updateEvent, std::max(curTick(), nextEventTick));
280 }
281 
282 void
284 {
285  transition();
286  scheduleUpdate();
287 }
288 
289 void
291 {
292  DPRINTF(TrafficGen, "Received retry\n");
293  stats.numRetries++;
294  retryReq();
295 }
296 
297 void
299 {
300  assert(retryPkt != NULL);
301  assert(retryPktTick != 0);
302  assert(!blockedWaitingResp);
303 
304  // attempt to send the packet, and if we are successful start up
305  // the machinery again
306  if (port.sendTimingReq(retryPkt)) {
307  retryPkt = NULL;
308  // remember how much delay was incurred due to back-pressure
309  // when sending the request, we also use this to derive
310  // the tick for the next packet
311  Tick delay = curTick() - retryPktTick;
312  retryPktTick = 0;
313  stats.retryTicks += delay;
314 
315  if (drainState() != DrainState::Draining) {
316  // packet is sent, so find out when the next one is due
317  nextPacketTick = activeGenerator->nextPacketTick(elasticReq,
318  delay);
319  scheduleUpdate();
320  } else {
321  // shut things down
324  signalDrainDone();
325  }
326  }
327 }
328 
329 void
331 {
332  fatal("BaseTrafficGen %s spent %llu ticks without making progress",
333  name(), progressCheck);
334 }
335 
337  : Stats::Group(parent),
338  ADD_STAT(numSuppressed,
339  "Number of suppressed packets to non-memory space"),
340  ADD_STAT(numPackets, "Number of packets generated"),
341  ADD_STAT(numRetries, "Number of retries"),
342  ADD_STAT(retryTicks, "Time spent waiting due to back-pressure (ticks)"),
343  ADD_STAT(bytesRead, "Number of bytes read"),
344  ADD_STAT(bytesWritten, "Number of bytes written"),
345  ADD_STAT(totalReadLatency, "Total latency of read requests"),
346  ADD_STAT(totalWriteLatency, "Total latency of write requests"),
347  ADD_STAT(totalReads, "Total num of reads"),
348  ADD_STAT(totalWrites, "Total num of writes"),
349  ADD_STAT(avgReadLatency, "Avg latency of read requests",
350  totalReadLatency / totalReads),
351  ADD_STAT(avgWriteLatency, "Avg latency of write requests",
352  totalWriteLatency / totalWrites),
353  ADD_STAT(readBW, "Read bandwidth in bytes/s",
354  bytesRead / simSeconds),
355  ADD_STAT(writeBW, "Write bandwidth in bytes/s",
356  bytesWritten / simSeconds)
357 {
358 }
359 
360 std::shared_ptr<BaseGen>
362 {
363  return std::shared_ptr<BaseGen>(new IdleGen(*this, masterID, duration));
364 }
365 
366 std::shared_ptr<BaseGen>
368 {
369  return std::shared_ptr<BaseGen>(new ExitGen(*this, masterID, duration));
370 }
371 
372 std::shared_ptr<BaseGen>
374  Addr start_addr, Addr end_addr, Addr blocksize,
375  Tick min_period, Tick max_period,
376  uint8_t read_percent, Addr data_limit)
377 {
378  return std::shared_ptr<BaseGen>(new LinearGen(*this, masterID,
379  duration, start_addr,
380  end_addr, blocksize,
382  min_period, max_period,
383  read_percent, data_limit));
384 }
385 
386 std::shared_ptr<BaseGen>
388  Addr start_addr, Addr end_addr, Addr blocksize,
389  Tick min_period, Tick max_period,
390  uint8_t read_percent, Addr data_limit)
391 {
392  return std::shared_ptr<BaseGen>(new RandomGen(*this, masterID,
393  duration, start_addr,
394  end_addr, blocksize,
396  min_period, max_period,
397  read_percent, data_limit));
398 }
399 
400 std::shared_ptr<BaseGen>
402  Addr start_addr, Addr end_addr, Addr blocksize,
403  Tick min_period, Tick max_period,
404  uint8_t read_percent, Addr data_limit,
405  unsigned int num_seq_pkts, unsigned int page_size,
406  unsigned int nbr_of_banks_DRAM,
407  unsigned int nbr_of_banks_util,
408  Enums::AddrMap addr_mapping,
409  unsigned int nbr_of_ranks)
410 {
411  return std::shared_ptr<BaseGen>(new DramGen(*this, masterID,
412  duration, start_addr,
413  end_addr, blocksize,
415  min_period, max_period,
416  read_percent, data_limit,
417  num_seq_pkts, page_size,
418  nbr_of_banks_DRAM,
419  nbr_of_banks_util,
420  addr_mapping,
421  nbr_of_ranks));
422 }
423 
424 std::shared_ptr<BaseGen>
426  Addr start_addr, Addr end_addr, Addr blocksize,
427  Tick min_period, Tick max_period,
428  uint8_t read_percent, Addr data_limit,
429  unsigned int num_seq_pkts,
430  unsigned int page_size,
431  unsigned int nbr_of_banks_DRAM,
432  unsigned int nbr_of_banks_util,
433  Enums::AddrMap addr_mapping,
434  unsigned int nbr_of_ranks,
435  unsigned int max_seq_count_per_rank)
436 {
437  return std::shared_ptr<BaseGen>(new DramRotGen(*this, masterID,
438  duration, start_addr,
439  end_addr, blocksize,
441  min_period, max_period,
442  read_percent, data_limit,
443  num_seq_pkts, page_size,
444  nbr_of_banks_DRAM,
445  nbr_of_banks_util,
446  addr_mapping,
447  nbr_of_ranks,
448  max_seq_count_per_rank));
449 }
450 
451 std::shared_ptr<BaseGen>
453  const std::string& trace_file, Addr addr_offset)
454 {
455 #if HAVE_PROTOBUF
456  return std::shared_ptr<BaseGen>(
457  new TraceGen(*this, masterID, duration, trace_file, addr_offset));
458 #else
459  panic("Can't instantiate trace generation without Protobuf support!\n");
460 #endif
461 }
462 
463 bool
465 {
466  auto iter = waitingResp.find(pkt->req);
467 
468  panic_if(iter == waitingResp.end(), "%s: "
469  "Received unexpected response [%s reqPtr=%x]\n",
470  pkt->print(), pkt->req);
471 
472  assert(iter->second <= curTick());
473 
474  if (pkt->isWrite()) {
475  ++stats.totalWrites;
476  stats.bytesWritten += pkt->req->getSize();
477  stats.totalWriteLatency += curTick() - iter->second;
478  } else {
479  ++stats.totalReads;
480  stats.bytesRead += pkt->req->getSize();
481  stats.totalReadLatency += curTick() - iter->second;
482  }
483 
484  waitingResp.erase(iter);
485 
486  delete pkt;
487 
488  // Sends up the request if we were blocked
489  if (blockedWaitingResp) {
490  blockedWaitingResp = false;
491  retryReq();
492  }
493 
494  return true;
495 }
void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
Definition: base.cc:105
#define panic(...)
This implements a cprintf based panic() function.
Definition: logging.hh:167
#define DPRINTF(x,...)
Definition: trace.hh:229
virtual std::shared_ptr< BaseGen > nextGenerator()=0
std::shared_ptr< BaseGen > createDramRot(Tick duration, Addr start_addr, Addr end_addr, Addr blocksize, Tick min_period, Tick max_period, uint8_t read_percent, Addr data_limit, unsigned int num_seq_pkts, unsigned int page_size, unsigned int nbr_of_banks_DRAM, unsigned int nbr_of_banks_util, Enums::AddrMap addr_mapping, unsigned int nbr_of_ranks, unsigned int max_seq_count_per_rank)
Definition: base.cc:425
Ports are used to interface objects to each other.
Definition: port.hh:60
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition: base.cc:153
std::shared_ptr< BaseGen > createTrace(Tick duration, const std::string &trace_file, Addr addr_offset)
Definition: base.cc:452
virtual Port & getPort(const std::string &if_name, PortID idx=InvalidPortID)
Get a port with a given name and index.
Definition: sim_object.cc:126
void recvReqRetry()
Receive a retry from the neighbouring port and attempt to resend the waiting packet.
Definition: base.cc:290
#define fatal(...)
This implements a cprintf based fatal() function.
Definition: logging.hh:175
Port & getPort(const std::string &if_name, PortID idx=InvalidPortID) override
Get a port with a given name and index.
Definition: base.cc:95
std::unique_ptr< StreamGen > streamGenerator
Stream/SubStreamID Generator.
Definition: base.hh:314
TrafficGenPort port
The instance of master port used by the traffic generator.
Definition: base.hh:165
DrainState
Object drain/handover states.
Definition: drain.hh:71
Tick when() const
Get the time that the event is scheduled.
Definition: eventq.hh:401
Running normally.
The linear generator generates sequential requests from a start to an end address, with a fixed block size.
Definition: linear_gen.hh:64
void transition()
Transition to the next generator.
Definition: base.cc:231
bool allocateWaitingRespSlot(PacketPtr pkt)
Puts this packet in the waitingResp list and returns true if we are above the maximum number of ousta...
Definition: base.hh:180
std::shared_ptr< BaseGen > createRandom(Tick duration, Addr start_addr, Addr end_addr, Addr blocksize, Tick min_period, Tick max_period, uint8_t read_percent, Addr data_limit)
Definition: base.cc:387
DrainState drainState() const
Return the current drain state of an object.
Definition: drain.hh:282
Declaration of the trace generator that reads a trace file and plays the transactions.
std::shared_ptr< BaseGen > activeGenerator
Currently active generator.
Definition: base.hh:311
bool blockedWaitingResp
Set when we blocked waiting for outstanding reqs.
Definition: base.hh:174
const bool elasticReq
Determine whether to add elasticity in the request injection, thus responding to backpressure by slow...
Definition: base.hh:83
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: base.cc:133
void signalDrainDone() const
Signal that an object is drained.
Definition: drain.hh:267
Stats::Scalar numPackets
Count the number of generated packets.
Definition: base.hh:205
void scheduleUpdate()
Schedule the update event based on nextPacketTick and nextTransitionTick.
Definition: base.cc:259
Overload hash function for BasicBlockRange type.
Definition: vec_reg.hh:586
bool sendTimingReq(PacketPtr pkt)
Attempt to send a timing request to the slave port by calling its corresponding receive function...
Definition: port.hh:445
bool isConnected() const
Is this port currently connected to a peer?
Definition: port.hh:128
Declaration of DRAM rotation generator that rotates through each rank.
Definition: cprintf.cc:42
std::shared_ptr< BaseGen > createExit(Tick duration)
Definition: base.cc:367
bool isWrite() const
Definition: packet.hh:529
std::shared_ptr< BaseGen > createDram(Tick duration, Addr start_addr, Addr end_addr, Addr blocksize, Tick min_period, Tick max_period, uint8_t read_percent, Addr data_limit, unsigned int num_seq_pkts, unsigned int page_size, unsigned int nbr_of_banks_DRAM, unsigned int nbr_of_banks_util, Enums::AddrMap addr_mapping, unsigned int nbr_of_ranks)
Definition: base.cc:401
Declaration of the idle generator that does nothing.
Stats::Formula simSeconds
Definition: stat_control.cc:64
void deschedule(Event &event)
Definition: eventq.hh:750
const MasterID masterID
MasterID used in generated requests.
Definition: base.hh:308
~BaseTrafficGen()
Definition: base.cc:90
EventFunctionWrapper noProgressEvent
Event to keep track of our progress, or lack thereof.
Definition: base.hh:119
RequestPtr req
A pointer to the original request.
Definition: packet.hh:327
static StreamGen * create(const BaseTrafficGenParams *p)
Factory method for constructing a Stream generator.
Definition: stream_gen.cc:45
std::shared_ptr< BaseGen > createLinear(Tick duration, Addr start_addr, Addr end_addr, Addr blocksize, Tick min_period, Tick max_period, uint8_t read_percent, Addr data_limit)
Definition: base.cc:373
virtual void init()
init() is called after all C++ SimObjects have been created and all ports are connected.
Definition: sim_object.cc:76
#define UNSERIALIZE_SCALAR(scalar)
Definition: serialize.hh:645
The idle generator does nothing.
Definition: idle_gen.hh:59
The trace replay generator reads a trace file and plays back the transactions.
Definition: trace_gen.hh:63
const Tick MaxTick
Definition: types.hh:65
Tick retryPktTick
Tick when the stalled packet was meant to be sent.
Definition: base.hh:171
Tick curTick()
The current simulated tick.
Definition: core.hh:47
void update()
Schedules event for next update and generates a new packet or requests a new generatoir depending on ...
Definition: base.cc:170
bool scheduled() const
Determine if the current event is scheduled.
Definition: eventq.hh:385
Stats::Scalar numSuppressed
Count the number of dropped requests.
Definition: base.hh:202
void start()
Definition: base.cc:283
The traffic generator is a master module that generates stimuli for the memory system, based on a collection of simple behaviours that are either probabilistic or based on traces.
Definition: traffic_gen.hh:71
bool isMemAddr(Addr addr) const
Check if a physical address is within a range of a memory that is part of the global address map...
Definition: system.cc:459
uint64_t Tick
Tick count type.
Definition: types.hh:63
std::shared_ptr< BaseGen > createIdle(Tick duration)
Definition: base.cc:361
The ClockedObject class extends the SimObject with a clock and accessor functions to relate ticks to ...
Declaration of the base generator class for all generators.
Group()=delete
MasterID getMasterId(const SimObject *master, std::string submaster=std::string())
Request an id used to create a request object in the system.
Definition: system.cc:603
System *const system
The system used to determine which mode we are currently operating in.
Definition: base.hh:77
DRAM specific generator is for issuing request with variable page hit length and bank utilization...
Definition: dram_gen.hh:63
Addr getAddr() const
Definition: packet.hh:726
Tick nextPacketTick
Time of the next packet.
Definition: base.hh:125
The exit generator exits from the simulation once entered.
Definition: exit_gen.hh:54
bool recvTimingResp(PacketPtr pkt)
Definition: base.cc:464
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:142
Draining buffers pending serialization/handover.
virtual const std::string name() const
Definition: sim_object.hh:120
A Packet is used to encapsulate a transfer between two objects in the memory system (e...
Definition: packet.hh:255
Statistics container.
Definition: group.hh:85
Tick nextTransitionTick
Time of next transition.
Definition: base.hh:122
Declaration of the DRAM generator for issuing variable page hit length requests and bank utilisation...
Declaration of the linear generator that generates sequential requests.
Bitfield< 15 > system
Definition: misc.hh:999
PacketPtr retryPkt
Packet waiting to be sent.
Definition: base.hh:168
#define SERIALIZE_SCALAR(scalar)
Definition: serialize.hh:643
void reschedule(Event &event, Tick when, bool always=false)
Definition: eventq.hh:756
#define ADD_STAT(n,...)
Convenience macro to add a stat to a statistics group.
Definition: group.hh:69
Stats::Scalar retryTicks
Count the time incurred from back-pressure.
Definition: base.hh:211
std::ostream CheckpointOut
Definition: serialize.hh:68
Stats::Scalar numRetries
Count the number of retries.
Definition: base.hh:208
EventFunctionWrapper updateEvent
Event for scheduling updates.
Definition: base.hh:192
void print(std::ostream &o, int verbosity=0, const std::string &prefix="") const
Definition: packet.cc:376
The random generator is similar to the linear one, but does not generate sequential addresses...
Definition: random_gen.hh:62
void schedule(Event &event, Tick when)
Definition: eventq.hh:744
void noProgress()
Method to inform the user we have made no progress.
Definition: base.cc:330
Declaration of the random generator that randomly selects addresses within a range.
std::unordered_map< RequestPtr, Tick > waitingResp
Reqs waiting for response.
Definition: base.hh:196
const int maxOutstandingReqs
Definition: base.hh:127
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
Definition: types.hh:237
void retryReq()
Definition: base.cc:298
#define warn(...)
Definition: logging.hh:212
Declaration of the Stream generator for issuing memory requests with variable/fixed stream and substr...
const Tick progressCheck
Time to tolerate waiting for retries (not making progress), until we declare things broken...
Definition: base.hh:89
const std::string & cmdString() const
Return the string name of the cmd field (for debugging and tracing).
Definition: packet.hh:523
Declaration of the exit generator that ends the simulation.
Bitfield< 0 > p
#define panic_if(cond,...)
Conditional panic macro that checks the supplied condition and only panics if the condition is true a...
Definition: logging.hh:185
BaseTrafficGen::StatGroup stats
std::vector< Info * > stats
Definition: group.hh:177
Counter value() const
Return the current value of this stat as its base type.
Definition: statistics.hh:703
DrainState drain() override
Notify an object that it needs to drain its state.
Definition: base.cc:114
StatGroup(Stats::Group *parent)
Definition: base.cc:336
BaseTrafficGen(const BaseTrafficGenParams *p)
Definition: base.cc:71
unsigned int cacheLineSize() const
Get the cache line size of the system.
Definition: system.hh:188

Generated on Fri Feb 28 2020 16:26:59 for gem5 by doxygen 1.8.13