comm_monitor.hh revision 8981
110461SAndreas.Sandberg@ARM.com/* 213637Sruben.ayrapetyan@arm.com * Copyright (c) 2012 ARM Limited 310461SAndreas.Sandberg@ARM.com * All rights reserved 410461SAndreas.Sandberg@ARM.com * 510461SAndreas.Sandberg@ARM.com * The license below extends only to copyright in the software and shall 610461SAndreas.Sandberg@ARM.com * not be construed as granting a license to any other intellectual 710461SAndreas.Sandberg@ARM.com * property including but not limited to intellectual property relating 810461SAndreas.Sandberg@ARM.com * to a hardware implementation of the functionality of the software 910461SAndreas.Sandberg@ARM.com * licensed hereunder. You may use the software subject to the license 1010461SAndreas.Sandberg@ARM.com * terms below provided that you ensure that this notice is replicated 1110461SAndreas.Sandberg@ARM.com * unmodified and in its entirety in all distributions of the software, 1210461SAndreas.Sandberg@ARM.com * modified or unmodified, in source code or in binary form. 1310461SAndreas.Sandberg@ARM.com * 1410461SAndreas.Sandberg@ARM.com * Redistribution and use in source and binary forms, with or without 1510461SAndreas.Sandberg@ARM.com * modification, are permitted provided that the following conditions are 1610461SAndreas.Sandberg@ARM.com * met: redistributions of source code must retain the above copyright 1710461SAndreas.Sandberg@ARM.com * notice, this list of conditions and the following disclaimer; 1810461SAndreas.Sandberg@ARM.com * redistributions in binary form must reproduce the above copyright 1910461SAndreas.Sandberg@ARM.com * notice, this list of conditions and the following disclaimer in the 2010461SAndreas.Sandberg@ARM.com * documentation and/or other materials provided with the distribution; 2110461SAndreas.Sandberg@ARM.com * neither the name of the copyright holders nor the names of its 2210461SAndreas.Sandberg@ARM.com * contributors may be used to endorse or promote products derived from 2310461SAndreas.Sandberg@ARM.com * this software without specific prior written permission. 2410461SAndreas.Sandberg@ARM.com * 2510461SAndreas.Sandberg@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2610461SAndreas.Sandberg@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2710461SAndreas.Sandberg@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2810461SAndreas.Sandberg@ARM.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2910461SAndreas.Sandberg@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3010461SAndreas.Sandberg@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3110461SAndreas.Sandberg@ARM.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3210461SAndreas.Sandberg@ARM.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3310461SAndreas.Sandberg@ARM.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3410461SAndreas.Sandberg@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3510461SAndreas.Sandberg@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3610461SAndreas.Sandberg@ARM.com * 3710461SAndreas.Sandberg@ARM.com * Authors: Thomas Grass 3810461SAndreas.Sandberg@ARM.com * Andreas Hansson 3910461SAndreas.Sandberg@ARM.com */ 4012286Sjose.marinho@arm.com 4110461SAndreas.Sandberg@ARM.com#ifndef __MEM_COMM_MONITOR_HH__ 4210461SAndreas.Sandberg@ARM.com#define __MEM_COMM_MONITOR_HH__ 4310461SAndreas.Sandberg@ARM.com 4410461SAndreas.Sandberg@ARM.com#include "base/statistics.hh" 4510609Sandreas.sandberg@arm.com#include "base/time.hh" 4610609Sandreas.sandberg@arm.com#include "mem/mem_object.hh" 4710461SAndreas.Sandberg@ARM.com#include "params/CommMonitor.hh" 4810461SAndreas.Sandberg@ARM.com 4910461SAndreas.Sandberg@ARM.com/** 5010461SAndreas.Sandberg@ARM.com * The communication monitor is a MemObject which can monitor statistics of 5110461SAndreas.Sandberg@ARM.com * the communication happening between two ports in the memory system. 5212286Sjose.marinho@arm.com * 5310461SAndreas.Sandberg@ARM.com * Currently the following stats are implemented: Histograms of read/write 5410461SAndreas.Sandberg@ARM.com * transactions, read/write burst lengths, read/write bandwidth, 5510461SAndreas.Sandberg@ARM.com * outstanding read/write requests, read latency and inter transaction time 5610461SAndreas.Sandberg@ARM.com * (read-read, write-write, read/write-read/write). Furthermore it allows 5713581Sgabeblack@google.com * to capture the number of accesses to an address over time ("heat map"). 5810461SAndreas.Sandberg@ARM.com * All stats can be disabled from Python. 5910461SAndreas.Sandberg@ARM.com */ 6010461SAndreas.Sandberg@ARM.comclass CommMonitor : public MemObject 6110461SAndreas.Sandberg@ARM.com{ 6210461SAndreas.Sandberg@ARM.com 6312117Sjose.marinho@arm.com public: 6410461SAndreas.Sandberg@ARM.com 6512286Sjose.marinho@arm.com /** Parameters of communication monitor */ 6612286Sjose.marinho@arm.com typedef CommMonitorParams Params; 6712286Sjose.marinho@arm.com const Params* params() const 6812286Sjose.marinho@arm.com { return reinterpret_cast<const Params*>(_params); } 6910461SAndreas.Sandberg@ARM.com 7012974Sgiacomo.travaglini@arm.com /** 7110461SAndreas.Sandberg@ARM.com * Constructor based on the Python params 7210461SAndreas.Sandberg@ARM.com * 7310461SAndreas.Sandberg@ARM.com * @param params Python parameters 7412286Sjose.marinho@arm.com */ 7510461SAndreas.Sandberg@ARM.com CommMonitor(Params* params); 7612286Sjose.marinho@arm.com 7710461SAndreas.Sandberg@ARM.com /** Destructor */ 7810461SAndreas.Sandberg@ARM.com ~CommMonitor() { } 7912973Sandreas.sandberg@arm.com 8012973Sandreas.sandberg@arm.com virtual MasterPort& getMasterPort(const std::string& if_name, 8112973Sandreas.sandberg@arm.com int idx = -1); 8210461SAndreas.Sandberg@ARM.com 8310461SAndreas.Sandberg@ARM.com virtual SlavePort& getSlavePort(const std::string& if_name, 8410461SAndreas.Sandberg@ARM.com int idx = -1); 8510461SAndreas.Sandberg@ARM.com 8610461SAndreas.Sandberg@ARM.com virtual void init(); 8710461SAndreas.Sandberg@ARM.com 8810461SAndreas.Sandberg@ARM.com /** Register statistics */ 8910461SAndreas.Sandberg@ARM.com void regStats(); 9010461SAndreas.Sandberg@ARM.com 9110461SAndreas.Sandberg@ARM.com private: 9210461SAndreas.Sandberg@ARM.com 9310461SAndreas.Sandberg@ARM.com /** 9410461SAndreas.Sandberg@ARM.com * Sender state class for the monitor so that we can annotate 9510461SAndreas.Sandberg@ARM.com * packets with a transmit time and receive time. 9610461SAndreas.Sandberg@ARM.com */ 9712973Sandreas.sandberg@arm.com class CommMonitorSenderState : public Packet::SenderState 9812973Sandreas.sandberg@arm.com { 9912973Sandreas.sandberg@arm.com 10012973Sandreas.sandberg@arm.com public: 10112973Sandreas.sandberg@arm.com 10212973Sandreas.sandberg@arm.com /** 10312973Sandreas.sandberg@arm.com * Construct a new sender state and remember the original one 10412973Sandreas.sandberg@arm.com * so that we can implement a stack. 10512286Sjose.marinho@arm.com * 10612286Sjose.marinho@arm.com * @param _origSenderState Sender state to remember 10712286Sjose.marinho@arm.com * @param _transmitTime Time of packet transmission 10812286Sjose.marinho@arm.com */ 10912286Sjose.marinho@arm.com CommMonitorSenderState(SenderState* _origSenderState, 11012286Sjose.marinho@arm.com Tick _transmitTime) 11112286Sjose.marinho@arm.com : origSenderState(_origSenderState), transmitTime(_transmitTime) 11212286Sjose.marinho@arm.com { } 11312286Sjose.marinho@arm.com 11412286Sjose.marinho@arm.com /** Destructor */ 11512286Sjose.marinho@arm.com ~CommMonitorSenderState() { } 11612286Sjose.marinho@arm.com 11712286Sjose.marinho@arm.com /** Pointer to old sender state of packet */ 11812286Sjose.marinho@arm.com SenderState* origSenderState; 11912286Sjose.marinho@arm.com 12012286Sjose.marinho@arm.com /** Tick when request is transmitted */ 12112286Sjose.marinho@arm.com Tick transmitTime; 12212286Sjose.marinho@arm.com 12312286Sjose.marinho@arm.com }; 12412286Sjose.marinho@arm.com 12512286Sjose.marinho@arm.com /** 12612286Sjose.marinho@arm.com * This is the master port of the communication monitor. All recv 12710461SAndreas.Sandberg@ARM.com * functions call a function in CommMonitor, where the 12810461SAndreas.Sandberg@ARM.com * send function of the slave port is called. Besides this, these 12910461SAndreas.Sandberg@ARM.com * functions can also perform actions for capturing statistics. 13012286Sjose.marinho@arm.com */ 13112286Sjose.marinho@arm.com class MonitorMasterPort : public MasterPort 13212286Sjose.marinho@arm.com { 13312286Sjose.marinho@arm.com 13412286Sjose.marinho@arm.com public: 13512286Sjose.marinho@arm.com 13612286Sjose.marinho@arm.com MonitorMasterPort(const std::string& _name, CommMonitor& _mon) 13712286Sjose.marinho@arm.com : MasterPort(_name, &_mon), mon(_mon) 13812286Sjose.marinho@arm.com { } 13912286Sjose.marinho@arm.com 14012286Sjose.marinho@arm.com protected: 14112286Sjose.marinho@arm.com 14212286Sjose.marinho@arm.com void recvFunctionalSnoop(PacketPtr pkt) 14312286Sjose.marinho@arm.com { 14412286Sjose.marinho@arm.com mon.recvFunctionalSnoop(pkt); 14512286Sjose.marinho@arm.com } 14612286Sjose.marinho@arm.com 14712286Sjose.marinho@arm.com Tick recvAtomicSnoop(PacketPtr pkt) 14812286Sjose.marinho@arm.com { 14912286Sjose.marinho@arm.com return mon.recvAtomicSnoop(pkt); 15012286Sjose.marinho@arm.com } 15112286Sjose.marinho@arm.com 15212286Sjose.marinho@arm.com bool recvTimingResp(PacketPtr pkt) 15312286Sjose.marinho@arm.com { 15412286Sjose.marinho@arm.com return mon.recvTimingResp(pkt); 15512117Sjose.marinho@arm.com } 15612117Sjose.marinho@arm.com 15712117Sjose.marinho@arm.com void recvTimingSnoopReq(PacketPtr pkt) 15812117Sjose.marinho@arm.com { 15912117Sjose.marinho@arm.com mon.recvTimingSnoopReq(pkt); 16012117Sjose.marinho@arm.com } 16112117Sjose.marinho@arm.com 16212117Sjose.marinho@arm.com void recvRangeChange() 16312117Sjose.marinho@arm.com { 16412117Sjose.marinho@arm.com mon.recvRangeChange(); 16512117Sjose.marinho@arm.com } 16610461SAndreas.Sandberg@ARM.com 16710461SAndreas.Sandberg@ARM.com bool isSnooping() const 16810461SAndreas.Sandberg@ARM.com { 16910461SAndreas.Sandberg@ARM.com return mon.isSnooping(); 17010461SAndreas.Sandberg@ARM.com } 17110461SAndreas.Sandberg@ARM.com 17210461SAndreas.Sandberg@ARM.com unsigned deviceBlockSize() const 17310461SAndreas.Sandberg@ARM.com { 17410461SAndreas.Sandberg@ARM.com return mon.deviceBlockSizeMaster(); 17510461SAndreas.Sandberg@ARM.com } 17612286Sjose.marinho@arm.com 17712286Sjose.marinho@arm.com void recvRetry() 17812286Sjose.marinho@arm.com { 17912286Sjose.marinho@arm.com mon.recvRetryMaster(); 18012286Sjose.marinho@arm.com } 18112286Sjose.marinho@arm.com 18212286Sjose.marinho@arm.com private: 18312286Sjose.marinho@arm.com 18412286Sjose.marinho@arm.com CommMonitor& mon; 18512286Sjose.marinho@arm.com 18612286Sjose.marinho@arm.com }; 18712286Sjose.marinho@arm.com 18812286Sjose.marinho@arm.com /** Instance of master port, facing the memory side */ 18912286Sjose.marinho@arm.com MonitorMasterPort masterPort; 19012286Sjose.marinho@arm.com 19112286Sjose.marinho@arm.com /** 19213581Sgabeblack@google.com * This is the slave port of the communication monitor. All recv 19310461SAndreas.Sandberg@ARM.com * functions call a function in CommMonitor, where the 19410461SAndreas.Sandberg@ARM.com * send function of the master port is called. Besides this, these 19510461SAndreas.Sandberg@ARM.com * functions can also perform actions for capturing statistics. 19610461SAndreas.Sandberg@ARM.com */ 19710461SAndreas.Sandberg@ARM.com class MonitorSlavePort : public SlavePort 19810461SAndreas.Sandberg@ARM.com { 19910461SAndreas.Sandberg@ARM.com 20010461SAndreas.Sandberg@ARM.com public: 20110461SAndreas.Sandberg@ARM.com 20210461SAndreas.Sandberg@ARM.com MonitorSlavePort(const std::string& _name, CommMonitor& _mon) 20310461SAndreas.Sandberg@ARM.com : SlavePort(_name, &_mon), mon(_mon) 20410461SAndreas.Sandberg@ARM.com { } 20510461SAndreas.Sandberg@ARM.com 20610461SAndreas.Sandberg@ARM.com protected: 20710461SAndreas.Sandberg@ARM.com 20810461SAndreas.Sandberg@ARM.com void recvFunctional(PacketPtr pkt) 20910461SAndreas.Sandberg@ARM.com { 21010461SAndreas.Sandberg@ARM.com mon.recvFunctional(pkt); 21110461SAndreas.Sandberg@ARM.com } 21210461SAndreas.Sandberg@ARM.com 21310461SAndreas.Sandberg@ARM.com Tick recvAtomic(PacketPtr pkt) 21410461SAndreas.Sandberg@ARM.com { 21510461SAndreas.Sandberg@ARM.com return mon.recvAtomic(pkt); 21610461SAndreas.Sandberg@ARM.com } 21713104Sgiacomo.travaglini@arm.com 21810461SAndreas.Sandberg@ARM.com bool recvTimingReq(PacketPtr pkt) 21910461SAndreas.Sandberg@ARM.com { 22010461SAndreas.Sandberg@ARM.com return mon.recvTimingReq(pkt); 22110461SAndreas.Sandberg@ARM.com } 22212286Sjose.marinho@arm.com 22312286Sjose.marinho@arm.com bool recvTimingSnoopResp(PacketPtr pkt) 22410461SAndreas.Sandberg@ARM.com { 22512286Sjose.marinho@arm.com return mon.recvTimingSnoopResp(pkt); 22610461SAndreas.Sandberg@ARM.com } 22710461SAndreas.Sandberg@ARM.com 22810461SAndreas.Sandberg@ARM.com unsigned deviceBlockSize() const 22912286Sjose.marinho@arm.com { 23010461SAndreas.Sandberg@ARM.com return mon.deviceBlockSizeSlave(); 23110461SAndreas.Sandberg@ARM.com } 23210461SAndreas.Sandberg@ARM.com 23310461SAndreas.Sandberg@ARM.com AddrRangeList getAddrRanges() 23410461SAndreas.Sandberg@ARM.com { 23510461SAndreas.Sandberg@ARM.com return mon.getAddrRanges(); 23612117Sjose.marinho@arm.com } 23710461SAndreas.Sandberg@ARM.com 23810461SAndreas.Sandberg@ARM.com void recvRetry() 23910461SAndreas.Sandberg@ARM.com { 24010461SAndreas.Sandberg@ARM.com mon.recvRetrySlave(); 24110461SAndreas.Sandberg@ARM.com } 24210461SAndreas.Sandberg@ARM.com 24310461SAndreas.Sandberg@ARM.com private: 24410461SAndreas.Sandberg@ARM.com 24512042Sandreas.sandberg@arm.com CommMonitor& mon; 24610461SAndreas.Sandberg@ARM.com 24710461SAndreas.Sandberg@ARM.com }; 24810461SAndreas.Sandberg@ARM.com 24910461SAndreas.Sandberg@ARM.com /** Instance of slave port, i.e. on the CPU side */ 25010461SAndreas.Sandberg@ARM.com MonitorSlavePort slavePort; 25110461SAndreas.Sandberg@ARM.com 25210461SAndreas.Sandberg@ARM.com void recvFunctional(PacketPtr pkt); 25310461SAndreas.Sandberg@ARM.com 25410461SAndreas.Sandberg@ARM.com void recvFunctionalSnoop(PacketPtr pkt); 25510461SAndreas.Sandberg@ARM.com 25610461SAndreas.Sandberg@ARM.com Tick recvAtomic(PacketPtr pkt); 25710461SAndreas.Sandberg@ARM.com 25810461SAndreas.Sandberg@ARM.com Tick recvAtomicSnoop(PacketPtr pkt); 25910461SAndreas.Sandberg@ARM.com 26010461SAndreas.Sandberg@ARM.com bool recvTimingReq(PacketPtr pkt); 26110461SAndreas.Sandberg@ARM.com 26210461SAndreas.Sandberg@ARM.com bool recvTimingResp(PacketPtr pkt); 26310461SAndreas.Sandberg@ARM.com 26410461SAndreas.Sandberg@ARM.com void recvTimingSnoopReq(PacketPtr pkt); 26510461SAndreas.Sandberg@ARM.com 26610461SAndreas.Sandberg@ARM.com bool recvTimingSnoopResp(PacketPtr pkt); 26710461SAndreas.Sandberg@ARM.com 26810461SAndreas.Sandberg@ARM.com unsigned deviceBlockSizeMaster(); 26910461SAndreas.Sandberg@ARM.com 27010461SAndreas.Sandberg@ARM.com unsigned deviceBlockSizeSlave(); 27110461SAndreas.Sandberg@ARM.com 27210461SAndreas.Sandberg@ARM.com AddrRangeList getAddrRanges(); 27310461SAndreas.Sandberg@ARM.com 27410461SAndreas.Sandberg@ARM.com bool isSnooping() const; 27510461SAndreas.Sandberg@ARM.com 27610461SAndreas.Sandberg@ARM.com void recvRetryMaster(); 27710461SAndreas.Sandberg@ARM.com 27810461SAndreas.Sandberg@ARM.com void recvRetrySlave(); 27910461SAndreas.Sandberg@ARM.com 28010461SAndreas.Sandberg@ARM.com void recvRangeChange(); 28110461SAndreas.Sandberg@ARM.com 28210461SAndreas.Sandberg@ARM.com void periodicTraceDump(); 28310461SAndreas.Sandberg@ARM.com 28410461SAndreas.Sandberg@ARM.com /** Stats declarations, all in a struct for convenience. */ 28510461SAndreas.Sandberg@ARM.com struct MonitorStats 28610461SAndreas.Sandberg@ARM.com { 28710461SAndreas.Sandberg@ARM.com 28810461SAndreas.Sandberg@ARM.com /** Disable flag for burst length historgrams **/ 28913104Sgiacomo.travaglini@arm.com bool disableBurstLengthHists; 29010461SAndreas.Sandberg@ARM.com 29110461SAndreas.Sandberg@ARM.com /** Histogram of read burst lengths */ 29210461SAndreas.Sandberg@ARM.com Stats::Histogram readBurstLengthHist; 29310461SAndreas.Sandberg@ARM.com 29410461SAndreas.Sandberg@ARM.com /** Histogram of write burst lengths */ 29510461SAndreas.Sandberg@ARM.com Stats::Histogram writeBurstLengthHist; 29610461SAndreas.Sandberg@ARM.com 29710461SAndreas.Sandberg@ARM.com /** Disable flag for the bandwidth histograms */ 29810461SAndreas.Sandberg@ARM.com bool disableBandwidthHists; 29910461SAndreas.Sandberg@ARM.com 30013581Sgabeblack@google.com /** 30110461SAndreas.Sandberg@ARM.com * Histogram for read bandwidth per sample window. The 30210461SAndreas.Sandberg@ARM.com * internal counter is an unsigned int rather than a stat. 30313581Sgabeblack@google.com */ 30410461SAndreas.Sandberg@ARM.com unsigned int readBytes; 30510461SAndreas.Sandberg@ARM.com Stats::Histogram readBandwidthHist; 30610461SAndreas.Sandberg@ARM.com Stats::Formula averageReadBW; 30710461SAndreas.Sandberg@ARM.com Stats::Scalar totalReadBytes; 30810461SAndreas.Sandberg@ARM.com 30913581Sgabeblack@google.com /** 31010461SAndreas.Sandberg@ARM.com * Histogram for write bandwidth per sample window. The 31110461SAndreas.Sandberg@ARM.com * internal counter is an unsigned int rather than a stat. 31210461SAndreas.Sandberg@ARM.com */ 31310461SAndreas.Sandberg@ARM.com unsigned int writtenBytes; 31410461SAndreas.Sandberg@ARM.com Stats::Histogram writeBandwidthHist; 31510461SAndreas.Sandberg@ARM.com Stats::Formula averageWriteBW; 31610461SAndreas.Sandberg@ARM.com Stats::Scalar totalWrittenBytes; 31710461SAndreas.Sandberg@ARM.com 31810461SAndreas.Sandberg@ARM.com /** Disable flag for latency histograms. */ 31910461SAndreas.Sandberg@ARM.com bool disableLatencyHists; 32010461SAndreas.Sandberg@ARM.com 32110461SAndreas.Sandberg@ARM.com /** Histogram of read request-to-response latencies */ 32210461SAndreas.Sandberg@ARM.com Stats::Histogram readLatencyHist; 32310461SAndreas.Sandberg@ARM.com 32410461SAndreas.Sandberg@ARM.com /** Histogram of write request-to-response latencies */ 32510461SAndreas.Sandberg@ARM.com Stats::Histogram writeLatencyHist; 32610461SAndreas.Sandberg@ARM.com 32710461SAndreas.Sandberg@ARM.com /** Disable flag for ITT distributions. */ 32810461SAndreas.Sandberg@ARM.com bool disableITTDists; 32910461SAndreas.Sandberg@ARM.com 33010461SAndreas.Sandberg@ARM.com /** 33110461SAndreas.Sandberg@ARM.com * Inter transaction time (ITT) distributions. There are 33210461SAndreas.Sandberg@ARM.com * histograms of the time between two read, write or arbitrary 33310461SAndreas.Sandberg@ARM.com * accesses. The time of a request is the tick at which the 33410461SAndreas.Sandberg@ARM.com * request is forwarded by the monitor. 33510461SAndreas.Sandberg@ARM.com */ 33610461SAndreas.Sandberg@ARM.com Stats::Distribution ittReadRead; 33710461SAndreas.Sandberg@ARM.com Stats::Distribution ittWriteWrite; 33812117Sjose.marinho@arm.com Stats::Distribution ittReqReq; 33910461SAndreas.Sandberg@ARM.com Tick timeOfLastRead; 34010461SAndreas.Sandberg@ARM.com Tick timeOfLastWrite; 34112117Sjose.marinho@arm.com Tick timeOfLastReq; 34212117Sjose.marinho@arm.com 34312117Sjose.marinho@arm.com /** Disable flag for outstanding histograms. */ 34412117Sjose.marinho@arm.com bool disableOutstandingHists; 34512117Sjose.marinho@arm.com 34612117Sjose.marinho@arm.com /** 34710461SAndreas.Sandberg@ARM.com * Histogram of outstanding read requests. Counter for 34812117Sjose.marinho@arm.com * outstanding read requests is an unsigned integer because 34910461SAndreas.Sandberg@ARM.com * it should not be reset when stats are reset. 35010461SAndreas.Sandberg@ARM.com */ 35112286Sjose.marinho@arm.com Stats::Histogram outstandingReadsHist; 35210461SAndreas.Sandberg@ARM.com unsigned int outstandingReadReqs; 35310461SAndreas.Sandberg@ARM.com 35412286Sjose.marinho@arm.com /** 35510461SAndreas.Sandberg@ARM.com * Histogram of outstanding write requests. Counter for 35610461SAndreas.Sandberg@ARM.com * outstanding write requests is an unsigned integer because 35710461SAndreas.Sandberg@ARM.com * it should not be reset when stats are reset. 35810461SAndreas.Sandberg@ARM.com */ 35910461SAndreas.Sandberg@ARM.com Stats::Histogram outstandingWritesHist; 36010461SAndreas.Sandberg@ARM.com unsigned int outstandingWriteReqs; 36110461SAndreas.Sandberg@ARM.com 36210461SAndreas.Sandberg@ARM.com /** Disable flag for transaction histograms. */ 36310461SAndreas.Sandberg@ARM.com bool disableTransactionHists; 36410461SAndreas.Sandberg@ARM.com 36510461SAndreas.Sandberg@ARM.com /** Histogram of number of read transactions per time bin */ 36610461SAndreas.Sandberg@ARM.com Stats::Histogram readTransHist; 36710461SAndreas.Sandberg@ARM.com unsigned int readTrans; 36812286Sjose.marinho@arm.com 36912286Sjose.marinho@arm.com /** Histogram of number of timing write transactions per time bin */ 37012286Sjose.marinho@arm.com Stats::Histogram writeTransHist; 37112286Sjose.marinho@arm.com unsigned int writeTrans; 37212286Sjose.marinho@arm.com 37310461SAndreas.Sandberg@ARM.com /** Disable flag for address distributions. */ 37410461SAndreas.Sandberg@ARM.com bool disableAddrDists; 37510461SAndreas.Sandberg@ARM.com 37610461SAndreas.Sandberg@ARM.com /** 37710461SAndreas.Sandberg@ARM.com * Histogram of number of read accesses to addresses over 37810461SAndreas.Sandberg@ARM.com * time. 37910461SAndreas.Sandberg@ARM.com */ 38010461SAndreas.Sandberg@ARM.com Stats::SparseHistogram readAddrDist; 38110461SAndreas.Sandberg@ARM.com 38210461SAndreas.Sandberg@ARM.com /** 38310461SAndreas.Sandberg@ARM.com * Histogram of number of write accesses to addresses over 38410461SAndreas.Sandberg@ARM.com * time. 38510461SAndreas.Sandberg@ARM.com */ 38610461SAndreas.Sandberg@ARM.com Stats::SparseHistogram writeAddrDist; 38710461SAndreas.Sandberg@ARM.com 38810461SAndreas.Sandberg@ARM.com /** 38910461SAndreas.Sandberg@ARM.com * Create the monitor stats and initialise all the members 39010461SAndreas.Sandberg@ARM.com * that are not statistics themselves, but used to control the 39110461SAndreas.Sandberg@ARM.com * stats or track values during a sample period. 39210461SAndreas.Sandberg@ARM.com */ 39310461SAndreas.Sandberg@ARM.com MonitorStats(const CommMonitorParams* params) : 39410461SAndreas.Sandberg@ARM.com disableBurstLengthHists(params->disable_burst_length_hists), 39510461SAndreas.Sandberg@ARM.com disableBandwidthHists(params->disable_bandwidth_hists), 39610461SAndreas.Sandberg@ARM.com readBytes(0), writtenBytes(0), 39710461SAndreas.Sandberg@ARM.com disableLatencyHists(params->disable_latency_hists), 39810461SAndreas.Sandberg@ARM.com disableITTDists(params->disable_itt_dists), 39910461SAndreas.Sandberg@ARM.com timeOfLastRead(0), timeOfLastWrite(0), timeOfLastReq(0), 40010461SAndreas.Sandberg@ARM.com disableOutstandingHists(params->disable_outstanding_hists), 40110461SAndreas.Sandberg@ARM.com outstandingReadReqs(0), outstandingWriteReqs(0), 40210461SAndreas.Sandberg@ARM.com disableTransactionHists(params->disable_transaction_hists), 40310461SAndreas.Sandberg@ARM.com readTrans(0), writeTrans(0), 40410461SAndreas.Sandberg@ARM.com disableAddrDists(params->disable_addr_dists) 40510461SAndreas.Sandberg@ARM.com { } 40610461SAndreas.Sandberg@ARM.com 40710461SAndreas.Sandberg@ARM.com }; 40810461SAndreas.Sandberg@ARM.com 40910461SAndreas.Sandberg@ARM.com /** This function is called periodically at the end of each time bin */ 41012286Sjose.marinho@arm.com void samplePeriodic(); 41110461SAndreas.Sandberg@ARM.com 41210461SAndreas.Sandberg@ARM.com /** Schedule the first periodic event */ 41310461SAndreas.Sandberg@ARM.com void startup(); 41410461SAndreas.Sandberg@ARM.com 41510461SAndreas.Sandberg@ARM.com /** Periodic event called at the end of each simulation time bin */ 41610461SAndreas.Sandberg@ARM.com EventWrapper<CommMonitor, &CommMonitor::samplePeriodic> samplePeriodicEvent; 41710461SAndreas.Sandberg@ARM.com 41810461SAndreas.Sandberg@ARM.com /** Length of simulation time bin*/ 41910461SAndreas.Sandberg@ARM.com Tick samplePeriodTicks; 42010461SAndreas.Sandberg@ARM.com Time samplePeriod; 42110461SAndreas.Sandberg@ARM.com 42210461SAndreas.Sandberg@ARM.com /** Address mask for sources of read accesses to be captured */ 42310461SAndreas.Sandberg@ARM.com Addr readAddrMask; 42410461SAndreas.Sandberg@ARM.com 42510461SAndreas.Sandberg@ARM.com /** Address mask for sources of write accesses to be captured */ 42610461SAndreas.Sandberg@ARM.com Addr writeAddrMask; 42710461SAndreas.Sandberg@ARM.com 42810461SAndreas.Sandberg@ARM.com /** Instantiate stats */ 42910461SAndreas.Sandberg@ARM.com MonitorStats stats; 43010461SAndreas.Sandberg@ARM.com}; 43112286Sjose.marinho@arm.com 43210461SAndreas.Sandberg@ARM.com#endif //__MEM_COMM_MONITOR_HH__ 43310461SAndreas.Sandberg@ARM.com