comm_monitor.hh revision 11904
18981Sandreas.hansson@arm.com/* 210902Sandreas.sandberg@arm.com * Copyright (c) 2012-2013, 2015 ARM Limited 311804Srjthakur@google.com * Copyright (c) 2016 Google Inc. 411904Spierre-yves.peneau@lirmm.fr * Copyright (c) 2017, Centre National de la Recherche Scientifique 511804Srjthakur@google.com * All rights reserved. 68981Sandreas.hansson@arm.com * 78981Sandreas.hansson@arm.com * The license below extends only to copyright in the software and shall 88981Sandreas.hansson@arm.com * not be construed as granting a license to any other intellectual 98981Sandreas.hansson@arm.com * property including but not limited to intellectual property relating 108981Sandreas.hansson@arm.com * to a hardware implementation of the functionality of the software 118981Sandreas.hansson@arm.com * licensed hereunder. You may use the software subject to the license 128981Sandreas.hansson@arm.com * terms below provided that you ensure that this notice is replicated 138981Sandreas.hansson@arm.com * unmodified and in its entirety in all distributions of the software, 148981Sandreas.hansson@arm.com * modified or unmodified, in source code or in binary form. 158981Sandreas.hansson@arm.com * 168981Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 178981Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 188981Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 198981Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 208981Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 218981Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 228981Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 238981Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 248981Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 258981Sandreas.hansson@arm.com * this software without specific prior written permission. 268981Sandreas.hansson@arm.com * 278981Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 288981Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 298981Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 308981Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 318981Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 328981Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 338981Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 348981Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 358981Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 368981Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 378981Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 388981Sandreas.hansson@arm.com * 398981Sandreas.hansson@arm.com * Authors: Thomas Grass 408981Sandreas.hansson@arm.com * Andreas Hansson 4111804Srjthakur@google.com * Rahul Thakur 4211904Spierre-yves.peneau@lirmm.fr * Pierre-Yves Peneau 438981Sandreas.hansson@arm.com */ 448981Sandreas.hansson@arm.com 458981Sandreas.hansson@arm.com#ifndef __MEM_COMM_MONITOR_HH__ 468981Sandreas.hansson@arm.com#define __MEM_COMM_MONITOR_HH__ 478981Sandreas.hansson@arm.com 488981Sandreas.hansson@arm.com#include "base/statistics.hh" 498981Sandreas.hansson@arm.com#include "mem/mem_object.hh" 508981Sandreas.hansson@arm.com#include "params/CommMonitor.hh" 5110994Sandreas.sandberg@arm.com#include "sim/probe/mem.hh" 528981Sandreas.hansson@arm.com 538981Sandreas.hansson@arm.com/** 548981Sandreas.hansson@arm.com * The communication monitor is a MemObject which can monitor statistics of 558981Sandreas.hansson@arm.com * the communication happening between two ports in the memory system. 568981Sandreas.hansson@arm.com * 578981Sandreas.hansson@arm.com * Currently the following stats are implemented: Histograms of read/write 588981Sandreas.hansson@arm.com * transactions, read/write burst lengths, read/write bandwidth, 598981Sandreas.hansson@arm.com * outstanding read/write requests, read latency and inter transaction time 608981Sandreas.hansson@arm.com * (read-read, write-write, read/write-read/write). Furthermore it allows 618981Sandreas.hansson@arm.com * to capture the number of accesses to an address over time ("heat map"). 628981Sandreas.hansson@arm.com * All stats can be disabled from Python. 638981Sandreas.hansson@arm.com */ 648981Sandreas.hansson@arm.comclass CommMonitor : public MemObject 658981Sandreas.hansson@arm.com{ 668981Sandreas.hansson@arm.com 6710902Sandreas.sandberg@arm.com public: // Construction & SimObject interfaces 688981Sandreas.hansson@arm.com 698981Sandreas.hansson@arm.com /** Parameters of communication monitor */ 708981Sandreas.hansson@arm.com typedef CommMonitorParams Params; 718981Sandreas.hansson@arm.com const Params* params() const 728981Sandreas.hansson@arm.com { return reinterpret_cast<const Params*>(_params); } 738981Sandreas.hansson@arm.com 748981Sandreas.hansson@arm.com /** 758981Sandreas.hansson@arm.com * Constructor based on the Python params 768981Sandreas.hansson@arm.com * 778981Sandreas.hansson@arm.com * @param params Python parameters 788981Sandreas.hansson@arm.com */ 798981Sandreas.hansson@arm.com CommMonitor(Params* params); 808981Sandreas.hansson@arm.com 8111168Sandreas.hansson@arm.com void init() override; 8211168Sandreas.hansson@arm.com void regStats() override; 8311168Sandreas.hansson@arm.com void startup() override; 8411168Sandreas.hansson@arm.com void regProbePoints() override; 858981Sandreas.hansson@arm.com 8610902Sandreas.sandberg@arm.com public: // MemObject interfaces 8710902Sandreas.sandberg@arm.com BaseMasterPort& getMasterPort(const std::string& if_name, 8811168Sandreas.hansson@arm.com PortID idx = InvalidPortID) override; 898981Sandreas.hansson@arm.com 9010902Sandreas.sandberg@arm.com BaseSlavePort& getSlavePort(const std::string& if_name, 9111168Sandreas.hansson@arm.com PortID idx = InvalidPortID) override; 928981Sandreas.hansson@arm.com 938981Sandreas.hansson@arm.com private: 948981Sandreas.hansson@arm.com 958981Sandreas.hansson@arm.com /** 968981Sandreas.hansson@arm.com * Sender state class for the monitor so that we can annotate 978981Sandreas.hansson@arm.com * packets with a transmit time and receive time. 988981Sandreas.hansson@arm.com */ 998981Sandreas.hansson@arm.com class CommMonitorSenderState : public Packet::SenderState 1008981Sandreas.hansson@arm.com { 1018981Sandreas.hansson@arm.com 1028981Sandreas.hansson@arm.com public: 1038981Sandreas.hansson@arm.com 1048981Sandreas.hansson@arm.com /** 1059542Sandreas.hansson@arm.com * Construct a new sender state and store the time so we can 1069542Sandreas.hansson@arm.com * calculate round-trip latency. 1078981Sandreas.hansson@arm.com * 1088981Sandreas.hansson@arm.com * @param _transmitTime Time of packet transmission 1098981Sandreas.hansson@arm.com */ 1109542Sandreas.hansson@arm.com CommMonitorSenderState(Tick _transmitTime) 1119542Sandreas.hansson@arm.com : transmitTime(_transmitTime) 1128981Sandreas.hansson@arm.com { } 1138981Sandreas.hansson@arm.com 1148981Sandreas.hansson@arm.com /** Destructor */ 1158981Sandreas.hansson@arm.com ~CommMonitorSenderState() { } 1168981Sandreas.hansson@arm.com 1178981Sandreas.hansson@arm.com /** Tick when request is transmitted */ 1188981Sandreas.hansson@arm.com Tick transmitTime; 1198981Sandreas.hansson@arm.com 1208981Sandreas.hansson@arm.com }; 1218981Sandreas.hansson@arm.com 1228981Sandreas.hansson@arm.com /** 1238981Sandreas.hansson@arm.com * This is the master port of the communication monitor. All recv 1248981Sandreas.hansson@arm.com * functions call a function in CommMonitor, where the 1258981Sandreas.hansson@arm.com * send function of the slave port is called. Besides this, these 1268981Sandreas.hansson@arm.com * functions can also perform actions for capturing statistics. 1278981Sandreas.hansson@arm.com */ 1288981Sandreas.hansson@arm.com class MonitorMasterPort : public MasterPort 1298981Sandreas.hansson@arm.com { 1308981Sandreas.hansson@arm.com 1318981Sandreas.hansson@arm.com public: 1328981Sandreas.hansson@arm.com 1338981Sandreas.hansson@arm.com MonitorMasterPort(const std::string& _name, CommMonitor& _mon) 1348981Sandreas.hansson@arm.com : MasterPort(_name, &_mon), mon(_mon) 1358981Sandreas.hansson@arm.com { } 1368981Sandreas.hansson@arm.com 1378981Sandreas.hansson@arm.com protected: 1388981Sandreas.hansson@arm.com 1398981Sandreas.hansson@arm.com void recvFunctionalSnoop(PacketPtr pkt) 1408981Sandreas.hansson@arm.com { 1418981Sandreas.hansson@arm.com mon.recvFunctionalSnoop(pkt); 1428981Sandreas.hansson@arm.com } 1438981Sandreas.hansson@arm.com 1448981Sandreas.hansson@arm.com Tick recvAtomicSnoop(PacketPtr pkt) 1458981Sandreas.hansson@arm.com { 1468981Sandreas.hansson@arm.com return mon.recvAtomicSnoop(pkt); 1478981Sandreas.hansson@arm.com } 1488981Sandreas.hansson@arm.com 1498981Sandreas.hansson@arm.com bool recvTimingResp(PacketPtr pkt) 1508981Sandreas.hansson@arm.com { 1518981Sandreas.hansson@arm.com return mon.recvTimingResp(pkt); 1528981Sandreas.hansson@arm.com } 1538981Sandreas.hansson@arm.com 1548981Sandreas.hansson@arm.com void recvTimingSnoopReq(PacketPtr pkt) 1558981Sandreas.hansson@arm.com { 1568981Sandreas.hansson@arm.com mon.recvTimingSnoopReq(pkt); 1578981Sandreas.hansson@arm.com } 1588981Sandreas.hansson@arm.com 1598981Sandreas.hansson@arm.com void recvRangeChange() 1608981Sandreas.hansson@arm.com { 1618981Sandreas.hansson@arm.com mon.recvRangeChange(); 1628981Sandreas.hansson@arm.com } 1638981Sandreas.hansson@arm.com 1648981Sandreas.hansson@arm.com bool isSnooping() const 1658981Sandreas.hansson@arm.com { 1668981Sandreas.hansson@arm.com return mon.isSnooping(); 1678981Sandreas.hansson@arm.com } 1688981Sandreas.hansson@arm.com 16910713Sandreas.hansson@arm.com void recvReqRetry() 1708981Sandreas.hansson@arm.com { 17110713Sandreas.hansson@arm.com mon.recvReqRetry(); 1728981Sandreas.hansson@arm.com } 1738981Sandreas.hansson@arm.com 17411173Sandreas.hansson@arm.com void recvRetrySnoopResp() 17511173Sandreas.hansson@arm.com { 17611173Sandreas.hansson@arm.com mon.recvRetrySnoopResp(); 17711173Sandreas.hansson@arm.com } 17811173Sandreas.hansson@arm.com 1798981Sandreas.hansson@arm.com private: 1808981Sandreas.hansson@arm.com 1818981Sandreas.hansson@arm.com CommMonitor& mon; 1828981Sandreas.hansson@arm.com 1838981Sandreas.hansson@arm.com }; 1848981Sandreas.hansson@arm.com 1858981Sandreas.hansson@arm.com /** Instance of master port, facing the memory side */ 1868981Sandreas.hansson@arm.com MonitorMasterPort masterPort; 1878981Sandreas.hansson@arm.com 1888981Sandreas.hansson@arm.com /** 1898981Sandreas.hansson@arm.com * This is the slave port of the communication monitor. All recv 1908981Sandreas.hansson@arm.com * functions call a function in CommMonitor, where the 1918981Sandreas.hansson@arm.com * send function of the master port is called. Besides this, these 1928981Sandreas.hansson@arm.com * functions can also perform actions for capturing statistics. 1938981Sandreas.hansson@arm.com */ 1948981Sandreas.hansson@arm.com class MonitorSlavePort : public SlavePort 1958981Sandreas.hansson@arm.com { 1968981Sandreas.hansson@arm.com 1978981Sandreas.hansson@arm.com public: 1988981Sandreas.hansson@arm.com 1998981Sandreas.hansson@arm.com MonitorSlavePort(const std::string& _name, CommMonitor& _mon) 2008981Sandreas.hansson@arm.com : SlavePort(_name, &_mon), mon(_mon) 2018981Sandreas.hansson@arm.com { } 2028981Sandreas.hansson@arm.com 2038981Sandreas.hansson@arm.com protected: 2048981Sandreas.hansson@arm.com 2058981Sandreas.hansson@arm.com void recvFunctional(PacketPtr pkt) 2068981Sandreas.hansson@arm.com { 2078981Sandreas.hansson@arm.com mon.recvFunctional(pkt); 2088981Sandreas.hansson@arm.com } 2098981Sandreas.hansson@arm.com 2108981Sandreas.hansson@arm.com Tick recvAtomic(PacketPtr pkt) 2118981Sandreas.hansson@arm.com { 2128981Sandreas.hansson@arm.com return mon.recvAtomic(pkt); 2138981Sandreas.hansson@arm.com } 2148981Sandreas.hansson@arm.com 2158981Sandreas.hansson@arm.com bool recvTimingReq(PacketPtr pkt) 2168981Sandreas.hansson@arm.com { 2178981Sandreas.hansson@arm.com return mon.recvTimingReq(pkt); 2188981Sandreas.hansson@arm.com } 2198981Sandreas.hansson@arm.com 2208981Sandreas.hansson@arm.com bool recvTimingSnoopResp(PacketPtr pkt) 2218981Sandreas.hansson@arm.com { 2228981Sandreas.hansson@arm.com return mon.recvTimingSnoopResp(pkt); 2238981Sandreas.hansson@arm.com } 2248981Sandreas.hansson@arm.com 2259090Sandreas.hansson@arm.com AddrRangeList getAddrRanges() const 2268981Sandreas.hansson@arm.com { 2278981Sandreas.hansson@arm.com return mon.getAddrRanges(); 2288981Sandreas.hansson@arm.com } 2298981Sandreas.hansson@arm.com 23010713Sandreas.hansson@arm.com void recvRespRetry() 2318981Sandreas.hansson@arm.com { 23210713Sandreas.hansson@arm.com mon.recvRespRetry(); 2338981Sandreas.hansson@arm.com } 2348981Sandreas.hansson@arm.com 2358981Sandreas.hansson@arm.com private: 2368981Sandreas.hansson@arm.com 2378981Sandreas.hansson@arm.com CommMonitor& mon; 2388981Sandreas.hansson@arm.com 2398981Sandreas.hansson@arm.com }; 2408981Sandreas.hansson@arm.com 2418981Sandreas.hansson@arm.com /** Instance of slave port, i.e. on the CPU side */ 2428981Sandreas.hansson@arm.com MonitorSlavePort slavePort; 2438981Sandreas.hansson@arm.com 2448981Sandreas.hansson@arm.com void recvFunctional(PacketPtr pkt); 2458981Sandreas.hansson@arm.com 2468981Sandreas.hansson@arm.com void recvFunctionalSnoop(PacketPtr pkt); 2478981Sandreas.hansson@arm.com 2488981Sandreas.hansson@arm.com Tick recvAtomic(PacketPtr pkt); 2498981Sandreas.hansson@arm.com 2508981Sandreas.hansson@arm.com Tick recvAtomicSnoop(PacketPtr pkt); 2518981Sandreas.hansson@arm.com 2528981Sandreas.hansson@arm.com bool recvTimingReq(PacketPtr pkt); 2538981Sandreas.hansson@arm.com 2548981Sandreas.hansson@arm.com bool recvTimingResp(PacketPtr pkt); 2558981Sandreas.hansson@arm.com 2568981Sandreas.hansson@arm.com void recvTimingSnoopReq(PacketPtr pkt); 2578981Sandreas.hansson@arm.com 2588981Sandreas.hansson@arm.com bool recvTimingSnoopResp(PacketPtr pkt); 2598981Sandreas.hansson@arm.com 26011173Sandreas.hansson@arm.com void recvRetrySnoopResp(); 26111173Sandreas.hansson@arm.com 2629090Sandreas.hansson@arm.com AddrRangeList getAddrRanges() const; 2638981Sandreas.hansson@arm.com 2648981Sandreas.hansson@arm.com bool isSnooping() const; 2658981Sandreas.hansson@arm.com 26610713Sandreas.hansson@arm.com void recvReqRetry(); 2678981Sandreas.hansson@arm.com 26810713Sandreas.hansson@arm.com void recvRespRetry(); 2698981Sandreas.hansson@arm.com 2708981Sandreas.hansson@arm.com void recvRangeChange(); 2718981Sandreas.hansson@arm.com 2728981Sandreas.hansson@arm.com /** Stats declarations, all in a struct for convenience. */ 2738981Sandreas.hansson@arm.com struct MonitorStats 2748981Sandreas.hansson@arm.com { 2758981Sandreas.hansson@arm.com 27611848Spierre-yves.peneau@lirmm.fr /** Disable flag for burst length histograms **/ 2778981Sandreas.hansson@arm.com bool disableBurstLengthHists; 2788981Sandreas.hansson@arm.com 2798981Sandreas.hansson@arm.com /** Histogram of read burst lengths */ 2808981Sandreas.hansson@arm.com Stats::Histogram readBurstLengthHist; 2818981Sandreas.hansson@arm.com 2828981Sandreas.hansson@arm.com /** Histogram of write burst lengths */ 2838981Sandreas.hansson@arm.com Stats::Histogram writeBurstLengthHist; 2848981Sandreas.hansson@arm.com 2858981Sandreas.hansson@arm.com /** Disable flag for the bandwidth histograms */ 2868981Sandreas.hansson@arm.com bool disableBandwidthHists; 2878981Sandreas.hansson@arm.com 2888981Sandreas.hansson@arm.com /** 2898981Sandreas.hansson@arm.com * Histogram for read bandwidth per sample window. The 2908981Sandreas.hansson@arm.com * internal counter is an unsigned int rather than a stat. 2918981Sandreas.hansson@arm.com */ 2928981Sandreas.hansson@arm.com unsigned int readBytes; 2938981Sandreas.hansson@arm.com Stats::Histogram readBandwidthHist; 2948981Sandreas.hansson@arm.com Stats::Formula averageReadBW; 2958981Sandreas.hansson@arm.com Stats::Scalar totalReadBytes; 2968981Sandreas.hansson@arm.com 2978981Sandreas.hansson@arm.com /** 2988981Sandreas.hansson@arm.com * Histogram for write bandwidth per sample window. The 2998981Sandreas.hansson@arm.com * internal counter is an unsigned int rather than a stat. 3008981Sandreas.hansson@arm.com */ 3018981Sandreas.hansson@arm.com unsigned int writtenBytes; 3028981Sandreas.hansson@arm.com Stats::Histogram writeBandwidthHist; 3038981Sandreas.hansson@arm.com Stats::Formula averageWriteBW; 3048981Sandreas.hansson@arm.com Stats::Scalar totalWrittenBytes; 3058981Sandreas.hansson@arm.com 3068981Sandreas.hansson@arm.com /** Disable flag for latency histograms. */ 3078981Sandreas.hansson@arm.com bool disableLatencyHists; 3088981Sandreas.hansson@arm.com 3098981Sandreas.hansson@arm.com /** Histogram of read request-to-response latencies */ 3108981Sandreas.hansson@arm.com Stats::Histogram readLatencyHist; 3118981Sandreas.hansson@arm.com 3128981Sandreas.hansson@arm.com /** Histogram of write request-to-response latencies */ 3138981Sandreas.hansson@arm.com Stats::Histogram writeLatencyHist; 3148981Sandreas.hansson@arm.com 3158981Sandreas.hansson@arm.com /** Disable flag for ITT distributions. */ 3168981Sandreas.hansson@arm.com bool disableITTDists; 3178981Sandreas.hansson@arm.com 3188981Sandreas.hansson@arm.com /** 3198981Sandreas.hansson@arm.com * Inter transaction time (ITT) distributions. There are 3208981Sandreas.hansson@arm.com * histograms of the time between two read, write or arbitrary 3218981Sandreas.hansson@arm.com * accesses. The time of a request is the tick at which the 3228981Sandreas.hansson@arm.com * request is forwarded by the monitor. 3238981Sandreas.hansson@arm.com */ 3248981Sandreas.hansson@arm.com Stats::Distribution ittReadRead; 3258981Sandreas.hansson@arm.com Stats::Distribution ittWriteWrite; 3268981Sandreas.hansson@arm.com Stats::Distribution ittReqReq; 3278981Sandreas.hansson@arm.com Tick timeOfLastRead; 3288981Sandreas.hansson@arm.com Tick timeOfLastWrite; 3298981Sandreas.hansson@arm.com Tick timeOfLastReq; 3308981Sandreas.hansson@arm.com 3318981Sandreas.hansson@arm.com /** Disable flag for outstanding histograms. */ 3328981Sandreas.hansson@arm.com bool disableOutstandingHists; 3338981Sandreas.hansson@arm.com 3348981Sandreas.hansson@arm.com /** 3358981Sandreas.hansson@arm.com * Histogram of outstanding read requests. Counter for 3368981Sandreas.hansson@arm.com * outstanding read requests is an unsigned integer because 3378981Sandreas.hansson@arm.com * it should not be reset when stats are reset. 3388981Sandreas.hansson@arm.com */ 3398981Sandreas.hansson@arm.com Stats::Histogram outstandingReadsHist; 3408981Sandreas.hansson@arm.com unsigned int outstandingReadReqs; 3418981Sandreas.hansson@arm.com 3428981Sandreas.hansson@arm.com /** 3438981Sandreas.hansson@arm.com * Histogram of outstanding write requests. Counter for 3448981Sandreas.hansson@arm.com * outstanding write requests is an unsigned integer because 3458981Sandreas.hansson@arm.com * it should not be reset when stats are reset. 3468981Sandreas.hansson@arm.com */ 3478981Sandreas.hansson@arm.com Stats::Histogram outstandingWritesHist; 3488981Sandreas.hansson@arm.com unsigned int outstandingWriteReqs; 3498981Sandreas.hansson@arm.com 3508981Sandreas.hansson@arm.com /** Disable flag for transaction histograms. */ 3518981Sandreas.hansson@arm.com bool disableTransactionHists; 3528981Sandreas.hansson@arm.com 3538981Sandreas.hansson@arm.com /** Histogram of number of read transactions per time bin */ 3548981Sandreas.hansson@arm.com Stats::Histogram readTransHist; 3558981Sandreas.hansson@arm.com unsigned int readTrans; 3568981Sandreas.hansson@arm.com 3578981Sandreas.hansson@arm.com /** Histogram of number of timing write transactions per time bin */ 3588981Sandreas.hansson@arm.com Stats::Histogram writeTransHist; 3598981Sandreas.hansson@arm.com unsigned int writeTrans; 3608981Sandreas.hansson@arm.com 3618981Sandreas.hansson@arm.com /** Disable flag for address distributions. */ 3628981Sandreas.hansson@arm.com bool disableAddrDists; 3638981Sandreas.hansson@arm.com 36411804Srjthakur@google.com /** Address mask for sources of read accesses to be captured */ 36511804Srjthakur@google.com const Addr readAddrMask; 36611804Srjthakur@google.com 36711804Srjthakur@google.com /** Address mask for sources of write accesses to be captured */ 36811804Srjthakur@google.com const Addr writeAddrMask; 36911804Srjthakur@google.com 3708981Sandreas.hansson@arm.com /** 3718981Sandreas.hansson@arm.com * Histogram of number of read accesses to addresses over 3728981Sandreas.hansson@arm.com * time. 3738981Sandreas.hansson@arm.com */ 3748981Sandreas.hansson@arm.com Stats::SparseHistogram readAddrDist; 3758981Sandreas.hansson@arm.com 3768981Sandreas.hansson@arm.com /** 3778981Sandreas.hansson@arm.com * Histogram of number of write accesses to addresses over 3788981Sandreas.hansson@arm.com * time. 3798981Sandreas.hansson@arm.com */ 3808981Sandreas.hansson@arm.com Stats::SparseHistogram writeAddrDist; 3818981Sandreas.hansson@arm.com 3828981Sandreas.hansson@arm.com /** 3838981Sandreas.hansson@arm.com * Create the monitor stats and initialise all the members 3848981Sandreas.hansson@arm.com * that are not statistics themselves, but used to control the 3858981Sandreas.hansson@arm.com * stats or track values during a sample period. 3868981Sandreas.hansson@arm.com */ 3878981Sandreas.hansson@arm.com MonitorStats(const CommMonitorParams* params) : 3888981Sandreas.hansson@arm.com disableBurstLengthHists(params->disable_burst_length_hists), 3898981Sandreas.hansson@arm.com disableBandwidthHists(params->disable_bandwidth_hists), 3908981Sandreas.hansson@arm.com readBytes(0), writtenBytes(0), 3918981Sandreas.hansson@arm.com disableLatencyHists(params->disable_latency_hists), 3928981Sandreas.hansson@arm.com disableITTDists(params->disable_itt_dists), 3938981Sandreas.hansson@arm.com timeOfLastRead(0), timeOfLastWrite(0), timeOfLastReq(0), 3948981Sandreas.hansson@arm.com disableOutstandingHists(params->disable_outstanding_hists), 3958981Sandreas.hansson@arm.com outstandingReadReqs(0), outstandingWriteReqs(0), 3968981Sandreas.hansson@arm.com disableTransactionHists(params->disable_transaction_hists), 3978981Sandreas.hansson@arm.com readTrans(0), writeTrans(0), 39811804Srjthakur@google.com disableAddrDists(params->disable_addr_dists), 39911804Srjthakur@google.com readAddrMask(params->read_addr_mask), 40011804Srjthakur@google.com writeAddrMask(params->write_addr_mask) 4018981Sandreas.hansson@arm.com { } 4028981Sandreas.hansson@arm.com 40311804Srjthakur@google.com void updateReqStats(const ProbePoints::PacketInfo& pkt, bool is_atomic, 40411804Srjthakur@google.com bool expects_response); 40511804Srjthakur@google.com void updateRespStats(const ProbePoints::PacketInfo& pkt, Tick latency, 40611804Srjthakur@google.com bool is_atomic); 4078981Sandreas.hansson@arm.com }; 4088981Sandreas.hansson@arm.com 4098981Sandreas.hansson@arm.com /** This function is called periodically at the end of each time bin */ 4108981Sandreas.hansson@arm.com void samplePeriodic(); 4118981Sandreas.hansson@arm.com 4128981Sandreas.hansson@arm.com /** Periodic event called at the end of each simulation time bin */ 4138981Sandreas.hansson@arm.com EventWrapper<CommMonitor, &CommMonitor::samplePeriodic> samplePeriodicEvent; 4148981Sandreas.hansson@arm.com 41510902Sandreas.sandberg@arm.com /** 41610902Sandreas.sandberg@arm.com *@{ 41710902Sandreas.sandberg@arm.com * @name Configuration 41810902Sandreas.sandberg@arm.com */ 41910902Sandreas.sandberg@arm.com 4208981Sandreas.hansson@arm.com /** Length of simulation time bin*/ 42110902Sandreas.sandberg@arm.com const Tick samplePeriodTicks; 42210902Sandreas.sandberg@arm.com /** Sample period in seconds */ 42310902Sandreas.sandberg@arm.com const double samplePeriod; 4248981Sandreas.hansson@arm.com 42510902Sandreas.sandberg@arm.com /** @} */ 42610902Sandreas.sandberg@arm.com 4278981Sandreas.hansson@arm.com /** Instantiate stats */ 4288981Sandreas.hansson@arm.com MonitorStats stats; 42910994Sandreas.sandberg@arm.com 43010994Sandreas.sandberg@arm.com protected: // Probe points 43110994Sandreas.sandberg@arm.com /** 43210994Sandreas.sandberg@arm.com * @{ 43310994Sandreas.sandberg@arm.com * @name Memory system probe points 43410994Sandreas.sandberg@arm.com */ 43510994Sandreas.sandberg@arm.com 43610994Sandreas.sandberg@arm.com /** Successfully forwarded request packet */ 43710994Sandreas.sandberg@arm.com ProbePoints::PacketUPtr ppPktReq; 43810994Sandreas.sandberg@arm.com 43910994Sandreas.sandberg@arm.com /** Successfully forwarded response packet */ 44010994Sandreas.sandberg@arm.com ProbePoints::PacketUPtr ppPktResp; 44110994Sandreas.sandberg@arm.com 44210994Sandreas.sandberg@arm.com /** @} */ 4438981Sandreas.hansson@arm.com}; 4448981Sandreas.hansson@arm.com 4458981Sandreas.hansson@arm.com#endif //__MEM_COMM_MONITOR_HH__ 446