gem5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
comm_monitor.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012-2013, 2015 ARM Limited
3  * Copyright (c) 2016 Google Inc.
4  * Copyright (c) 2017, Centre National de la Recherche Scientifique
5  * All rights reserved.
6  *
7  * The license below extends only to copyright in the software and shall
8  * not be construed as granting a license to any other intellectual
9  * property including but not limited to intellectual property relating
10  * to a hardware implementation of the functionality of the software
11  * licensed hereunder. You may use the software subject to the license
12  * terms below provided that you ensure that this notice is replicated
13  * unmodified and in its entirety in all distributions of the software,
14  * modified or unmodified, in source code or in binary form.
15  *
16  * Redistribution and use in source and binary forms, with or without
17  * modification, are permitted provided that the following conditions are
18  * met: redistributions of source code must retain the above copyright
19  * notice, this list of conditions and the following disclaimer;
20  * redistributions in binary form must reproduce the above copyright
21  * notice, this list of conditions and the following disclaimer in the
22  * documentation and/or other materials provided with the distribution;
23  * neither the name of the copyright holders nor the names of its
24  * contributors may be used to endorse or promote products derived from
25  * this software without specific prior written permission.
26  *
27  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
28  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
29  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
30  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
31  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
32  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
33  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
36  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38  *
39  * Authors: Thomas Grass
40  * Andreas Hansson
41  * Rahul Thakur
42  * Pierre-Yves Peneau
43  */
44 
45 #include "mem/comm_monitor.hh"
46 
47 #include "base/trace.hh"
48 #include "debug/CommMonitor.hh"
49 #include "sim/stats.hh"
50 
52  : MemObject(params),
53  masterPort(name() + "-master", *this),
54  slavePort(name() + "-slave", *this),
55  samplePeriodicEvent(this),
56  samplePeriodTicks(params->sample_period),
57  samplePeriod(params->sample_period / SimClock::Float::s),
58  stats(params)
59 {
61  "Created monitor %s with sample period %d ticks (%f ms)\n",
63 }
64 
66 CommMonitorParams::create()
67 {
68  return new CommMonitor(this);
69 }
70 
71 void
73 {
74  // make sure both sides of the monitor are connected
76  fatal("Communication monitor is not connected on both sides.\n");
77 }
78 
79 void
81 {
82  ppPktReq.reset(new ProbePoints::Packet(getProbeManager(), "PktRequest"));
83  ppPktResp.reset(new ProbePoints::Packet(getProbeManager(), "PktResponse"));
84 }
85 
87 CommMonitor::getMasterPort(const std::string& if_name, PortID idx)
88 {
89  if (if_name == "master") {
90  return masterPort;
91  } else {
92  return MemObject::getMasterPort(if_name, idx);
93  }
94 }
95 
97 CommMonitor::getSlavePort(const std::string& if_name, PortID idx)
98 {
99  if (if_name == "slave") {
100  return slavePort;
101  } else {
102  return MemObject::getSlavePort(if_name, idx);
103  }
104 }
105 
106 void
108 {
110 }
111 
112 void
114 {
116 }
117 
118 void
120  const ProbePoints::PacketInfo& pkt_info, bool is_atomic,
121  bool expects_response)
122 {
123  if (pkt_info.cmd.isRead()) {
124  // Increment number of observed read transactions
126  ++readTrans;
127 
128  // Get sample of burst length
130  readBurstLengthHist.sample(pkt_info.size);
131 
132  // Sample the masked address
133  if (!disableAddrDists)
134  readAddrDist.sample(pkt_info.addr & readAddrMask);
135 
136  if (!disableITTDists) {
137  // Sample value of read-read inter transaction time
138  if (timeOfLastRead != 0)
141 
142  // Sample value of req-req inter transaction time
143  if (timeOfLastReq != 0)
146  }
147  if (!is_atomic && !disableOutstandingHists && expects_response)
149 
150  } else if (pkt_info.cmd.isWrite()) {
151  // Same as for reads
153  ++writeTrans;
154 
156  writeBurstLengthHist.sample(pkt_info.size);
157 
158  // Update the bandwidth stats on the request
159  if (!disableBandwidthHists) {
160  writtenBytes += pkt_info.size;
161  totalWrittenBytes += pkt_info.size;
162  }
163 
164  // Sample the masked write address
165  if (!disableAddrDists)
167 
168  if (!disableITTDists) {
169  // Sample value of write-to-write inter transaction time
170  if (timeOfLastWrite != 0)
173 
174  // Sample value of req-to-req inter transaction time
175  if (timeOfLastReq != 0)
178  }
179 
180  if (!is_atomic && !disableOutstandingHists && expects_response)
182  }
183 }
184 
185 void
187  const ProbePoints::PacketInfo& pkt_info, Tick latency, bool is_atomic)
188 {
189  if (pkt_info.cmd.isRead()) {
190  // Decrement number of outstanding read requests
191  if (!is_atomic && !disableOutstandingHists) {
192  assert(outstandingReadReqs != 0);
193  --outstandingReadReqs;
194  }
195 
196  if (!disableLatencyHists)
197  readLatencyHist.sample(latency);
198 
199  // Update the bandwidth stats based on responses for reads
200  if (!disableBandwidthHists) {
201  readBytes += pkt_info.size;
202  totalReadBytes += pkt_info.size;
203  }
204 
205  } else if (pkt_info.cmd.isWrite()) {
206  // Decrement number of outstanding write requests
207  if (!is_atomic && !disableOutstandingHists) {
208  assert(outstandingWriteReqs != 0);
209  --outstandingWriteReqs;
210  }
211 
212  if (!disableLatencyHists)
213  writeLatencyHist.sample(latency);
214  }
215 }
216 
217 Tick
219 {
220  const bool expects_response(pkt->needsResponse() &&
221  !pkt->cacheResponding());
222  ProbePoints::PacketInfo req_pkt_info(pkt);
223  ppPktReq->notify(req_pkt_info);
224 
225  const Tick delay(masterPort.sendAtomic(pkt));
226 
227  stats.updateReqStats(req_pkt_info, true, expects_response);
228  if (expects_response)
229  stats.updateRespStats(req_pkt_info, delay, true);
230 
231  assert(pkt->isResponse());
232  ProbePoints::PacketInfo resp_pkt_info(pkt);
233  ppPktResp->notify(resp_pkt_info);
234  return delay;
235 }
236 
237 Tick
239 {
240  return slavePort.sendAtomicSnoop(pkt);
241 }
242 
243 bool
245 {
246  // should always see a request
247  assert(pkt->isRequest());
248 
249  // Store relevant fields of packet, because packet may be modified
250  // or even deleted when sendTiming() is called.
251  const ProbePoints::PacketInfo pkt_info(pkt);
252 
253  const bool expects_response(pkt->needsResponse() &&
254  !pkt->cacheResponding());
255 
256  // If a cache miss is served by a cache, a monitor near the memory
257  // would see a request which needs a response, but this response
258  // would not come back from the memory. Therefore we additionally
259  // have to check the cacheResponding flag
260  if (expects_response && !stats.disableLatencyHists) {
262  }
263 
264  // Attempt to send the packet
265  bool successful = masterPort.sendTimingReq(pkt);
266 
267  // If not successful, restore the sender state
268  if (!successful && expects_response && !stats.disableLatencyHists) {
269  delete pkt->popSenderState();
270  }
271 
272  if (successful) {
273  ppPktReq->notify(pkt_info);
274  }
275 
276  if (successful) {
277  DPRINTF(CommMonitor, "Forwarded %s request\n", pkt->isRead() ? "read" :
278  pkt->isWrite() ? "write" : "non read/write");
279  stats.updateReqStats(pkt_info, false, expects_response);
280  }
281  return successful;
282 }
283 
284 bool
286 {
287  // should always see responses
288  assert(pkt->isResponse());
289 
290  // Store relevant fields of packet, because packet may be modified
291  // or even deleted when sendTiming() is called.
292  const ProbePoints::PacketInfo pkt_info(pkt);
293 
294  Tick latency = 0;
295  CommMonitorSenderState* received_state =
296  dynamic_cast<CommMonitorSenderState*>(pkt->senderState);
297 
298  if (!stats.disableLatencyHists) {
299  // Restore initial sender state
300  if (received_state == NULL)
301  panic("Monitor got a response without monitor sender state\n");
302 
303  // Restore the sate
304  pkt->senderState = received_state->predecessor;
305  }
306 
307  // Attempt to send the packet
308  bool successful = slavePort.sendTimingResp(pkt);
309 
310  if (!stats.disableLatencyHists) {
311  // If packet successfully send, sample value of latency,
312  // afterwards delete sender state, otherwise restore state
313  if (successful) {
314  latency = curTick() - received_state->transmitTime;
315  DPRINTF(CommMonitor, "Latency: %d\n", latency);
316  delete received_state;
317  } else {
318  // Don't delete anything and let the packet look like we
319  // did not touch it
320  pkt->senderState = received_state;
321  }
322  }
323 
324  if (successful) {
325  ppPktResp->notify(pkt_info);
326  DPRINTF(CommMonitor, "Received %s response\n", pkt->isRead() ? "read" :
327  pkt->isWrite() ? "write" : "non read/write");
328  stats.updateRespStats(pkt_info, latency, false);
329  }
330  return successful;
331 }
332 
333 void
335 {
337 }
338 
339 bool
341 {
342  return masterPort.sendTimingSnoopResp(pkt);
343 }
344 
345 void
347 {
349 }
350 
351 bool
353 {
354  // check if the connected master port is snooping
355  return slavePort.isSnooping();
356 }
357 
360 {
361  // get the address ranges of the connected slave port
362  return masterPort.getAddrRanges();
363 }
364 
365 void
367 {
369 }
370 
371 void
373 {
375 }
376 
377 void
379 {
381 }
382 
383 void
385 {
387 
388  // Initialise all the monitor stats
389  using namespace Stats;
390 
392  .init(params()->burst_length_bins)
393  .name(name() + ".readBurstLengthHist")
394  .desc("Histogram of burst lengths of transmitted packets")
396 
398  .init(params()->burst_length_bins)
399  .name(name() + ".writeBurstLengthHist")
400  .desc("Histogram of burst lengths of transmitted packets")
402 
403  // Stats based on received responses
405  .init(params()->bandwidth_bins)
406  .name(name() + ".readBandwidthHist")
407  .desc("Histogram of read bandwidth per sample period (bytes/s)")
409 
411  .name(name() + ".averageReadBandwidth")
412  .desc("Average read bandwidth (bytes/s)")
414 
416  .name(name() + ".totalReadBytes")
417  .desc("Number of bytes read")
419 
421 
422  // Stats based on successfully sent requests
424  .init(params()->bandwidth_bins)
425  .name(name() + ".writeBandwidthHist")
426  .desc("Histogram of write bandwidth (bytes/s)")
427  .flags(stats.disableBandwidthHists ? (pdf | nozero) : pdf);
428 
430  .name(name() + ".averageWriteBandwidth")
431  .desc("Average write bandwidth (bytes/s)")
433 
435  .name(name() + ".totalWrittenBytes")
436  .desc("Number of bytes written")
438 
440 
442  .init(params()->latency_bins)
443  .name(name() + ".readLatencyHist")
444  .desc("Read request-response latency")
446 
448  .init(params()->latency_bins)
449  .name(name() + ".writeLatencyHist")
450  .desc("Write request-response latency")
452 
454  .init(1, params()->itt_max_bin, params()->itt_max_bin /
455  params()->itt_bins)
456  .name(name() + ".ittReadRead")
457  .desc("Read-to-read inter transaction time")
458  .flags(stats.disableITTDists ? nozero : pdf);
459 
461  .init(1, params()->itt_max_bin, params()->itt_max_bin /
462  params()->itt_bins)
463  .name(name() + ".ittWriteWrite")
464  .desc("Write-to-write inter transaction time")
465  .flags(stats.disableITTDists ? nozero : pdf);
466 
468  .init(1, params()->itt_max_bin, params()->itt_max_bin /
469  params()->itt_bins)
470  .name(name() + ".ittReqReq")
471  .desc("Request-to-request inter transaction time")
472  .flags(stats.disableITTDists ? nozero : pdf);
473 
475  .init(params()->outstanding_bins)
476  .name(name() + ".outstandingReadsHist")
477  .desc("Outstanding read transactions")
479 
481  .init(params()->outstanding_bins)
482  .name(name() + ".outstandingWritesHist")
483  .desc("Outstanding write transactions")
485 
487  .init(params()->transaction_bins)
488  .name(name() + ".readTransHist")
489  .desc("Histogram of read transactions per sample period")
491 
493  .init(params()->transaction_bins)
494  .name(name() + ".writeTransHist")
495  .desc("Histogram of write transactions per sample period")
497 
499  .init(0)
500  .name(name() + ".readAddrDist")
501  .desc("Read address distribution")
503 
505  .init(0)
506  .name(name() + ".writeAddrDist")
507  .desc("Write address distribution")
509 }
510 
511 void
513 {
514  // the periodic stats update runs on the granularity of sample
515  // periods, but in combination with this there may also be a
516  // external resets and dumps of the stats (through schedStatEvent)
517  // causing the stats themselves to capture less than a sample
518  // period
519 
520  // only capture if we have not reset the stats during the last
521  // sample period
522  if (simTicks.value() >= samplePeriodTicks) {
526  }
527 
531  }
532 
536  }
537  }
538 
539  // reset the sampled values
540  stats.readTrans = 0;
541  stats.writeTrans = 0;
542 
543  stats.readBytes = 0;
544  stats.writtenBytes = 0;
545 
547 }
548 
549 void
551 {
553 }
Stats::Formula averageReadBW
unsigned int writtenBytes
Histogram for write bandwidth per sample window.
void startup() override
startup() is the final initialization call before simulation.
#define DPRINTF(x,...)
Definition: trace.hh:212
BaseSlavePort & getSlavePort(const std::string &if_name, PortID idx=InvalidPortID) override
Get a slave port with a given name and index.
Definition: comm_monitor.cc:97
const FlagsType pdf
Print the percent of the total that this entry represents.
Definition: info.hh:51
Tick recvAtomic(PacketPtr pkt)
bool disableBurstLengthHists
Disable flag for burst length histograms.
const std::string & name()
Definition: trace.cc:49
void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
Definition: comm_monitor.cc:72
const Tick samplePeriodTicks
Length of simulation time bin.
#define panic(...)
Definition: misc.hh:153
bool isSnooping() const
unsigned int readBytes
Histogram for read bandwidth per sample window.
Sender state class for the monitor so that we can annotate packets with a transmit time and receive t...
Definition: comm_monitor.hh:99
bool sendTimingSnoopResp(PacketPtr pkt)
Attempt to send a timing snoop response packet to the slave port by calling its corresponding receive...
Definition: port.cc:187
void updateRespStats(const ProbePoints::PacketInfo &pkt, Tick latency, bool is_atomic)
void recvRespRetry()
Tick sendAtomicSnoop(PacketPtr pkt)
Send an atomic snoop request packet, where the data is moved and the state is updated in zero time...
Definition: port.cc:237
bool isWrite() const
Definition: packet.hh:503
void regStats() override
Register statistics for this object.
void sendFunctionalSnoop(PacketPtr pkt)
Send a functional snoop request packet, where the data is instantly updated everywhere in the memory ...
Definition: port.cc:244
bool recvTimingReq(PacketPtr pkt)
Histogram & init(size_type size)
Set the parameters of this histogram.
Definition: statistics.hh:2560
bool sendTimingReq(PacketPtr pkt)
Attempt to send a timing request to the slave port by calling its corresponding receive function...
Definition: port.cc:180
virtual BaseSlavePort & getSlavePort(const std::string &if_name, PortID idx=InvalidPortID)
Get a slave port with a given name and index.
Definition: mem_object.cc:58
virtual void sendRetryResp()
Send a retry to the slave port that previously attempted a sendTimingResp to this master port and fai...
Definition: port.cc:194
CommMonitor(Params *params)
Constructor based on the Python params.
Definition: comm_monitor.cc:51
unsigned int outstandingWriteReqs
bool disableITTDists
Disable flag for ITT distributions.
bool isRequest() const
Definition: packet.hh:505
Derived & flags(Flags _flags)
Set the flags and marks this stat to print at the end of simulation.
Definition: statistics.hh:311
void sendRetrySnoopResp()
Send a retry to the master port that previously attempted a sendTimingSnoopResp to this slave port an...
Definition: port.cc:271
A BaseSlavePort is a protocol-agnostic slave port, responsible only for the structural connection to ...
Definition: port.hh:139
Stats::Formula simSeconds
Definition: stat_control.cc:64
void recvReqRetry()
void recvFunctionalSnoop(PacketPtr pkt)
bool isWrite() const
Definition: packet.hh:189
AddrRangeList getAddrRanges() const
Stats::Histogram readTransHist
Histogram of number of read transactions per time bin.
bool isSnooping() const
Find out if the peer master port is snooping or not.
Definition: port.hh:405
Stats::Histogram writeBurstLengthHist
Histogram of write burst lengths.
void recvRetrySnoopResp()
Stats::Scalar totalReadBytes
ProbePoints::PacketUPtr ppPktReq
Successfully forwarded request packet.
Stats::Histogram outstandingWritesHist
Histogram of outstanding write requests.
bool sendTimingResp(PacketPtr pkt)
Attempt to send a timing response to the master port by calling its corresponding receive function...
Definition: port.cc:251
Stats::Formula averageWriteBW
const Addr writeAddrMask
Address mask for sources of write accesses to be captured.
Tick curTick()
The current simulated tick.
Definition: core.hh:47
Bitfield< 4 > s
Definition: miscregs.hh:1738
CommMonitorParams Params
Parameters of communication monitor.
Definition: comm_monitor.hh:70
SenderState * predecessor
Definition: packet.hh:379
bool recvTimingResp(PacketPtr pkt)
Stats::Histogram writeLatencyHist
Histogram of write request-to-response latencies.
bool disableLatencyHists
Disable flag for latency histograms.
bool disableAddrDists
Disable flag for address distributions.
void recvFunctional(PacketPtr pkt)
uint64_t Tick
Tick count type.
Definition: types.hh:63
Stats::Histogram writeTransHist
Histogram of number of timing write transactions per time bin.
void regProbePoints() override
Register probe points for this object.
Definition: comm_monitor.cc:80
#define fatal(...)
Definition: misc.hh:163
bool needsResponse() const
Definition: packet.hh:516
Tick transmitTime
Tick when request is transmitted.
Distribution & init(Counter min, Counter max, Counter bkt)
Set the parameters of this distribution.
Definition: statistics.hh:2534
MonitorSlavePort slavePort
Instance of slave port, i.e.
The communication monitor is a MemObject which can monitor statistics of the communication happening ...
Definition: comm_monitor.hh:64
bool isRead() const
Definition: packet.hh:502
Stats::Distribution ittWriteWrite
bool cacheResponding() const
Definition: packet.hh:558
bool disableTransactionHists
Disable flag for transaction histograms.
bool disableOutstandingHists
Disable flag for outstanding histograms.
A Packet is used to encapsulate a transfer between two objects in the memory system (e...
Definition: packet.hh:245
Stats::Distribution ittReadRead
Inter transaction time (ITT) distributions.
void recvRangeChange()
void sendRangeChange() const
Called by the owner to send a range change.
Definition: port.hh:410
const Addr readAddrMask
Address mask for sources of read accesses to be captured.
MonitorMasterPort masterPort
Instance of master port, facing the memory side.
BaseMasterPort & getMasterPort(const std::string &if_name, PortID idx=InvalidPortID) override
Get a master port with a given name and index.
Definition: comm_monitor.cc:87
Derived & name(const std::string &name)
Set the name and marks this stat to print at the end of simulation.
Definition: statistics.hh:254
bool isConnected() const
Definition: port.cc:84
ProbePointArg generates a point for the class of Arg.
virtual const std::string name() const
Definition: sim_object.hh:117
AddrRangeList getAddrRanges() const
Get the address ranges of the connected slave port.
Definition: port.cc:160
Stats::Scalar totalWrittenBytes
void sendRetryReq()
Send a retry to the master port that previously attempted a sendTimingReq to this slave port and fail...
Definition: port.cc:265
SenderState * senderState
This packet's sender state.
Definition: packet.hh:454
Stats::Histogram readBandwidthHist
The MemObject class extends the ClockedObject with accessor functions to get its master and slave por...
Definition: mem_object.hh:60
A BaseMasterPort is a protocol-agnostic master port, responsible only for the structural connection t...
Definition: port.hh:115
ProbeManager * getProbeManager()
Get the probe manager for this object.
Definition: sim_object.cc:131
bool isConnected() const
Definition: port.cc:110
bool disableBandwidthHists
Disable flag for the bandwidth histograms.
void sendTimingSnoopReq(PacketPtr pkt)
Attempt to send a timing snoop request packet to the master port by calling its corresponding receive...
Definition: port.cc:258
Stats::Histogram readBurstLengthHist
Histogram of read burst lengths.
SparseHistogram & init(size_type size)
Set the parameters of this histogram.
Definition: statistics.hh:2880
void schedule(Event &event, Tick when)
Definition: eventq.hh:728
void recvTimingSnoopReq(PacketPtr pkt)
ProbePoints::PacketUPtr ppPktResp
Successfully forwarded response packet.
void pushSenderState(SenderState *sender_state)
Push a new sender state to the packet and make the current sender state the predecessor of the new on...
Definition: packet.cc:329
SenderState * popSenderState()
Pop the top of the state stack and return a pointer to it.
Definition: packet.cc:337
void sample(const U &v, int n=1)
Add a value to the distribtion n times.
Definition: statistics.hh:2766
Derived & desc(const std::string &_desc)
Set the description and marks this stat to print at the end of simulation.
Definition: statistics.hh:287
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
Definition: types.hh:181
Counter value()
Definition: statistics.hh:847
void samplePeriodic()
This function is called periodically at the end of each time bin.
const double samplePeriod
Sample period in seconds.
EventWrapper< CommMonitor,&CommMonitor::samplePeriodic > samplePeriodicEvent
Periodic event called at the end of each simulation time bin.
unsigned int outstandingReadReqs
Tick recvAtomicSnoop(PacketPtr pkt)
Stats::Histogram outstandingReadsHist
Histogram of outstanding read requests.
Tick sendAtomic(PacketPtr pkt)
Send an atomic request packet, where the data is moved and the state is updated in zero time...
Definition: port.cc:166
const FlagsType nozero
Don't print if this is zero.
Definition: info.hh:57
const Params * params() const
Definition: comm_monitor.hh:71
Stats::SparseHistogram readAddrDist
Histogram of number of read accesses to addresses over time.
bool isRead() const
Definition: packet.hh:188
void regStats() override
Register statistics for this object.
virtual BaseMasterPort & getMasterPort(const std::string &if_name, PortID idx=InvalidPortID)
Get a master port with a given name and index.
Definition: mem_object.cc:52
Stats::Histogram writeBandwidthHist
Stats::Distribution ittReqReq
void sample(const U &v, int n=1)
Add a value to the distribtion n times.
Definition: statistics.hh:1869
Stats::SparseHistogram writeAddrDist
Histogram of number of write accesses to addresses over time.
bool recvTimingSnoopResp(PacketPtr pkt)
void sendFunctional(PacketPtr pkt)
Send a functional request packet, where the data is instantly updated everywhere in the memory system...
Definition: port.cc:173
bool isResponse() const
Definition: packet.hh:506
Stats::Value simTicks
Definition: stat_control.cc:65
MonitorStats stats
Instantiate stats.
A struct to hold on to the essential fields from a packet, so that the packet and underlying request ...
Definition: mem.hh:54
Stats::Histogram readLatencyHist
Histogram of read request-to-response latencies.
void updateReqStats(const ProbePoints::PacketInfo &pkt, bool is_atomic, bool expects_response)

Generated on Fri Jun 9 2017 13:03:48 for gem5 by doxygen 1.8.6