gem5  v19.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
comm_monitor.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012-2013, 2015, 2018-2019 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 #ifndef __MEM_COMM_MONITOR_HH__
46 #define __MEM_COMM_MONITOR_HH__
47 
48 #include "base/statistics.hh"
49 #include "mem/port.hh"
50 #include "params/CommMonitor.hh"
51 #include "sim/probe/mem.hh"
52 #include "sim/sim_object.hh"
53 
65 class CommMonitor : public SimObject
66 {
67 
68  public: // Construction & SimObject interfaces
69 
71  typedef CommMonitorParams Params;
72  const Params* params() const
73  { return reinterpret_cast<const Params*>(_params); }
74 
80  CommMonitor(Params* params);
81 
82  void init() override;
83  void startup() override;
84  void regProbePoints() override;
85 
86  public: // SimObject interfaces
87  Port &getPort(const std::string &if_name,
88  PortID idx=InvalidPortID) override;
89 
90  private:
91 
97  {
98 
99  public:
100 
108  : transmitTime(_transmitTime)
109  { }
110 
113 
116 
117  };
118 
126  {
127 
128  public:
129 
130  MonitorMasterPort(const std::string& _name, CommMonitor& _mon)
131  : MasterPort(_name, &_mon), mon(_mon)
132  { }
133 
134  protected:
135 
137  {
138  mon.recvFunctionalSnoop(pkt);
139  }
140 
142  {
143  return mon.recvAtomicSnoop(pkt);
144  }
145 
147  {
148  return mon.recvTimingResp(pkt);
149  }
150 
152  {
153  mon.recvTimingSnoopReq(pkt);
154  }
155 
157  {
158  mon.recvRangeChange();
159  }
160 
161  bool isSnooping() const
162  {
163  return mon.isSnooping();
164  }
165 
167  {
168  mon.recvReqRetry();
169  }
170 
172  {
173  mon.recvRetrySnoopResp();
174  }
175 
176  private:
177 
179 
180  };
181 
184 
192  {
193 
194  public:
195 
196  MonitorSlavePort(const std::string& _name, CommMonitor& _mon)
197  : SlavePort(_name, &_mon), mon(_mon)
198  { }
199 
200  protected:
201 
203  {
204  mon.recvFunctional(pkt);
205  }
206 
208  {
209  return mon.recvAtomic(pkt);
210  }
211 
213  {
214  return mon.recvTimingReq(pkt);
215  }
216 
218  {
219  return mon.recvTimingSnoopResp(pkt);
220  }
221 
223  {
224  return mon.getAddrRanges();
225  }
226 
228  {
229  mon.recvRespRetry();
230  }
231 
233  {
234  return mon.tryTiming(pkt);
235  }
236 
237  private:
238 
240 
241  };
242 
245 
246  void recvFunctional(PacketPtr pkt);
247 
248  void recvFunctionalSnoop(PacketPtr pkt);
249 
251 
253 
254  bool recvTimingReq(PacketPtr pkt);
255 
256  bool recvTimingResp(PacketPtr pkt);
257 
258  void recvTimingSnoopReq(PacketPtr pkt);
259 
260  bool recvTimingSnoopResp(PacketPtr pkt);
261 
262  void recvRetrySnoopResp();
263 
265 
266  bool isSnooping() const;
267 
268  void recvReqRetry();
269 
270  void recvRespRetry();
271 
272  void recvRangeChange();
273 
274  bool tryTiming(PacketPtr pkt);
275 
277  struct MonitorStats : public Stats::Group
278  {
281 
284 
287 
290 
295  unsigned int readBytes;
299 
304  unsigned int writtenBytes;
308 
311 
314 
317 
320 
333 
336 
343  unsigned int outstandingReadReqs;
344 
351  unsigned int outstandingWriteReqs;
352 
355 
358  unsigned int readTrans;
359 
362  unsigned int writeTrans;
363 
366 
369 
372 
378 
384 
390  MonitorStats(Stats::Group *parent, const CommMonitorParams* params);
391 
392  void updateReqStats(const ProbePoints::PacketInfo& pkt, bool is_atomic,
393  bool expects_response);
394  void updateRespStats(const ProbePoints::PacketInfo& pkt, Tick latency,
395  bool is_atomic);
396  };
397 
399  void samplePeriodic();
400 
403 
412  const double samplePeriod;
413 
418 
419  protected: // Probe points
427 
430 
432 };
433 
434 #endif //__MEM_COMM_MONITOR_HH__
A MasterPort is a specialisation of a BaseMasterPort, which implements the default protocol for the t...
Definition: port.hh:75
unsigned int writtenBytes
Histogram for write bandwidth per sample window.
void startup() override
startup() is the final initialization call before simulation.
bool recvTimingResp(PacketPtr pkt)
Receive a timing response from the peer.
Ports are used to interface objects to each other.
Definition: port.hh:60
Tick recvAtomic(PacketPtr pkt)
void recvTimingSnoopReq(PacketPtr pkt)
Receive a timing snoop request from the peer.
bool disableBurstLengthHists
Disable flag for burst length histograms.
EventFunctionWrapper samplePeriodicEvent
Periodic event called at the end of each simulation time bin.
AddrRangeList getAddrRanges() const
void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
Definition: comm_monitor.cc:72
AddrRangeList getAddrRanges() const
Get a list of the non-overlapping address ranges the owner is responsible for.
const Tick samplePeriodTicks
Length of simulation time bin.
const PortID InvalidPortID
Definition: types.hh:238
unsigned int readBytes
Histogram for read bandwidth per sample window.
MonitorMasterPort(const std::string &_name, CommMonitor &_mon)
Sender state class for the monitor so that we can annotate packets with a transmit time and receive t...
Definition: comm_monitor.hh:96
const Params * params() const
Definition: comm_monitor.hh:72
void recvRespRetry()
bool isSnooping() const
bool tryTiming(PacketPtr pkt)
Availability request from the peer.
void recvRespRetry()
Called by the peer if sendTimingResp was called on this protocol (causing recvTimingResp to be called...
bool recvTimingReq(PacketPtr pkt)
void recvReqRetry()
Called by the peer if sendTimingReq was called on this peer (causing recvTimingReq to be called on th...
MonitorSlavePort(const std::string &_name, CommMonitor &_mon)
A SlavePort is a specialisation of a port.
Definition: port.hh:258
Tick recvAtomic(PacketPtr pkt)
Receive an atomic request packet from the peer.
CommMonitor(Params *params)
Constructor based on the Python params.
Definition: comm_monitor.cc:51
unsigned int outstandingWriteReqs
void recvRetrySnoopResp()
Called by the peer if sendTimingSnoopResp was called on this protocol (causing recvTimingSnoopResp to...
bool disableITTDists
Disable flag for ITT distributions.
Declaration of Statistics objects.
This is a simple scalar statistic, like a counter.
Definition: statistics.hh:2508
void recvReqRetry()
void recvFunctionalSnoop(PacketPtr pkt)
std::unique_ptr< Packet > PacketUPtr
Definition: mem.hh:105
Stats declarations, all in a struct for convenience.
Stats::Histogram readTransHist
Histogram of number of read transactions per time bin.
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.
const Addr writeAddrMask
Address mask for sources of write accesses to be captured.
This is the slave port of the communication monitor.
CommMonitorParams Params
Parameters of communication monitor.
Definition: comm_monitor.hh:71
This is the master port of the communication monitor.
bool recvTimingResp(PacketPtr pkt)
bool isSnooping() const
Determine if this master port is snooping or not.
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)
Definition: comm_monitor.cc:99
uint64_t Tick
Tick count type.
Definition: types.hh:63
A simple distribution stat.
Definition: statistics.hh:2592
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
Tick recvAtomicSnoop(PacketPtr pkt)
Receive an atomic snoop request packet from our peer.
A simple histogram stat.
Definition: statistics.hh:2629
bool recvTimingSnoopResp(PacketPtr pkt)
Receive a timing snoop response from the peer.
CommMonitorSenderState(Tick _transmitTime)
Construct a new sender state and store the time so we can calculate round-trip latency.
Tick transmitTime
Tick when request is transmitted.
Port Object Declaration.
MonitorSlavePort slavePort
Instance of slave port, i.e.
Stats::Formula averageReadBandwidth
The communication monitor is a SimObject which can monitor statistics of the communication happening ...
Definition: comm_monitor.hh:65
Stats::Distribution ittWriteWrite
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:142
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:255
Stats::Distribution ittReadRead
Inter transaction time (ITT) distributions.
Statistics container.
Definition: group.hh:85
void recvRangeChange()
A virtual base opaque structure used to hold state associated with the packet (e.g., an MSHR), specific to a SimObject that sees the packet.
Definition: packet.hh:403
A formula for statistics that is calculated when printed.
Definition: statistics.hh:3012
const Addr readAddrMask
Address mask for sources of read accesses to be captured.
MonitorMasterPort masterPort
Instance of master port, facing the memory side.
Stats::Scalar totalWrittenBytes
bool recvTimingReq(PacketPtr pkt)
Receive a timing request from the peer.
bool tryTiming(PacketPtr pkt)
Stats::Histogram readBandwidthHist
void recvRangeChange()
Called to receive an address range change from the peer slave port.
bool disableBandwidthHists
Disable flag for the bandwidth histograms.
const SimObjectParams * _params
Cached copy of the object parameters.
Definition: sim_object.hh:110
Stats::Histogram readBurstLengthHist
Histogram of read burst lengths.
void recvTimingSnoopReq(PacketPtr pkt)
ProbePoints::PacketUPtr ppPktResp
Successfully forwarded response packet.
void recvFunctional(PacketPtr pkt)
Receive a functional request packet from the peer.
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
Definition: types.hh:237
void samplePeriodic()
This function is called periodically at the end of each time bin.
const double samplePeriod
Sample period in seconds.
unsigned int outstandingReadReqs
Tick recvAtomicSnoop(PacketPtr pkt)
Stats::Histogram outstandingReadsHist
Histogram of outstanding read requests.
Stats::SparseHistogram readAddrDist
Histogram of number of read accesses to addresses over time.
void recvFunctionalSnoop(PacketPtr pkt)
Receive a functional snoop request packet from the peer.
Port & getPort(const std::string &if_name, PortID idx=InvalidPortID) override
Get a port with a given name and index.
Definition: comm_monitor.cc:87
Stats::Histogram writeBandwidthHist
Abstract superclass for simulation objects.
Definition: sim_object.hh:96
Stats::Distribution ittReqReq
Stats::SparseHistogram writeAddrDist
Histogram of number of write accesses to addresses over time.
bool recvTimingSnoopResp(PacketPtr pkt)
MonitorStats stats
Instantiate stats.
Stats::Formula averageWriteBandwidth
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.

Generated on Fri Feb 28 2020 16:27:02 for gem5 by doxygen 1.8.13