comm_monitor.hh revision 10412:6400a2ab4e22
18012Ssaidi@eecs.umich.edu/* 28012Ssaidi@eecs.umich.edu * Copyright (c) 2012-2013 ARM Limited 38012Ssaidi@eecs.umich.edu * All rights reserved 48012Ssaidi@eecs.umich.edu * 58012Ssaidi@eecs.umich.edu * The license below extends only to copyright in the software and shall 68012Ssaidi@eecs.umich.edu * not be construed as granting a license to any other intellectual 78012Ssaidi@eecs.umich.edu * property including but not limited to intellectual property relating 88012Ssaidi@eecs.umich.edu * to a hardware implementation of the functionality of the software 98012Ssaidi@eecs.umich.edu * licensed hereunder. You may use the software subject to the license 108012Ssaidi@eecs.umich.edu * terms below provided that you ensure that this notice is replicated 118012Ssaidi@eecs.umich.edu * unmodified and in its entirety in all distributions of the software, 128012Ssaidi@eecs.umich.edu * modified or unmodified, in source code or in binary form. 138012Ssaidi@eecs.umich.edu * 148012Ssaidi@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 158012Ssaidi@eecs.umich.edu * modification, are permitted provided that the following conditions are 168012Ssaidi@eecs.umich.edu * met: redistributions of source code must retain the above copyright 178012Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 188012Ssaidi@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 198012Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 208012Ssaidi@eecs.umich.edu * documentation and/or other materials provided with the distribution; 218012Ssaidi@eecs.umich.edu * neither the name of the copyright holders nor the names of its 228012Ssaidi@eecs.umich.edu * contributors may be used to endorse or promote products derived from 237997Ssaidi@eecs.umich.edu * this software without specific prior written permission. 247997Ssaidi@eecs.umich.edu * 257997Ssaidi@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 267997Ssaidi@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 277997Ssaidi@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 287997Ssaidi@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 297997Ssaidi@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 307997Ssaidi@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 317997Ssaidi@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 327997Ssaidi@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 337997Ssaidi@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 347997Ssaidi@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 357997Ssaidi@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 367997Ssaidi@eecs.umich.edu * 377997Ssaidi@eecs.umich.edu * Authors: Thomas Grass 387997Ssaidi@eecs.umich.edu * Andreas Hansson 397997Ssaidi@eecs.umich.edu */ 407997Ssaidi@eecs.umich.edu 417997Ssaidi@eecs.umich.edu#ifndef __MEM_COMM_MONITOR_HH__ 427997Ssaidi@eecs.umich.edu#define __MEM_COMM_MONITOR_HH__ 437997Ssaidi@eecs.umich.edu 447997Ssaidi@eecs.umich.edu#include "base/statistics.hh" 457997Ssaidi@eecs.umich.edu#include "base/time.hh" 467997Ssaidi@eecs.umich.edu#include "mem/mem_object.hh" 477997Ssaidi@eecs.umich.edu#include "params/CommMonitor.hh" 487997Ssaidi@eecs.umich.edu#include "proto/protoio.hh" 497997Ssaidi@eecs.umich.edu#include "sim/system.hh" 507997Ssaidi@eecs.umich.edu 517997Ssaidi@eecs.umich.edu/** 527997Ssaidi@eecs.umich.edu * The communication monitor is a MemObject which can monitor statistics of 537997Ssaidi@eecs.umich.edu * the communication happening between two ports in the memory system. 547997Ssaidi@eecs.umich.edu * 557997Ssaidi@eecs.umich.edu * Currently the following stats are implemented: Histograms of read/write 567997Ssaidi@eecs.umich.edu * transactions, read/write burst lengths, read/write bandwidth, 577997Ssaidi@eecs.umich.edu * outstanding read/write requests, read latency and inter transaction time 587997Ssaidi@eecs.umich.edu * (read-read, write-write, read/write-read/write). Furthermore it allows 597997Ssaidi@eecs.umich.edu * to capture the number of accesses to an address over time ("heat map"). 607997Ssaidi@eecs.umich.edu * All stats can be disabled from Python. 617997Ssaidi@eecs.umich.edu */ 627997Ssaidi@eecs.umich.educlass CommMonitor : public MemObject 637997Ssaidi@eecs.umich.edu{ 647997Ssaidi@eecs.umich.edu 657997Ssaidi@eecs.umich.edu public: 667997Ssaidi@eecs.umich.edu 677997Ssaidi@eecs.umich.edu /** Parameters of communication monitor */ 687997Ssaidi@eecs.umich.edu typedef CommMonitorParams Params; 697997Ssaidi@eecs.umich.edu const Params* params() const 707997Ssaidi@eecs.umich.edu { return reinterpret_cast<const Params*>(_params); } 717997Ssaidi@eecs.umich.edu 727997Ssaidi@eecs.umich.edu /** 737997Ssaidi@eecs.umich.edu * Constructor based on the Python params 747997Ssaidi@eecs.umich.edu * 757997Ssaidi@eecs.umich.edu * @param params Python parameters 767997Ssaidi@eecs.umich.edu */ 777997Ssaidi@eecs.umich.edu CommMonitor(Params* params); 787997Ssaidi@eecs.umich.edu 797997Ssaidi@eecs.umich.edu /** Destructor */ 807997Ssaidi@eecs.umich.edu ~CommMonitor(); 817997Ssaidi@eecs.umich.edu 827997Ssaidi@eecs.umich.edu /** 837997Ssaidi@eecs.umich.edu * Callback to flush and close all open output streams on exit. If 847997Ssaidi@eecs.umich.edu * we were calling the destructor it could be done there. 857997Ssaidi@eecs.umich.edu */ 867997Ssaidi@eecs.umich.edu void closeStreams(); 877997Ssaidi@eecs.umich.edu 887997Ssaidi@eecs.umich.edu virtual BaseMasterPort& getMasterPort(const std::string& if_name, 897997Ssaidi@eecs.umich.edu PortID idx = InvalidPortID); 907997Ssaidi@eecs.umich.edu 917997Ssaidi@eecs.umich.edu virtual BaseSlavePort& getSlavePort(const std::string& if_name, 927997Ssaidi@eecs.umich.edu PortID idx = InvalidPortID); 937997Ssaidi@eecs.umich.edu 947997Ssaidi@eecs.umich.edu virtual void init(); 957997Ssaidi@eecs.umich.edu 967997Ssaidi@eecs.umich.edu /** Register statistics */ 977997Ssaidi@eecs.umich.edu void regStats(); 987997Ssaidi@eecs.umich.edu 997997Ssaidi@eecs.umich.edu private: 1007997Ssaidi@eecs.umich.edu 1017997Ssaidi@eecs.umich.edu /** 1027997Ssaidi@eecs.umich.edu * Sender state class for the monitor so that we can annotate 1037997Ssaidi@eecs.umich.edu * packets with a transmit time and receive time. 1047997Ssaidi@eecs.umich.edu */ 1057997Ssaidi@eecs.umich.edu class CommMonitorSenderState : public Packet::SenderState 1067997Ssaidi@eecs.umich.edu { 1077997Ssaidi@eecs.umich.edu 1087997Ssaidi@eecs.umich.edu public: 1097997Ssaidi@eecs.umich.edu 1107997Ssaidi@eecs.umich.edu /** 1117997Ssaidi@eecs.umich.edu * Construct a new sender state and store the time so we can 1127997Ssaidi@eecs.umich.edu * calculate round-trip latency. 1137997Ssaidi@eecs.umich.edu * 1147997Ssaidi@eecs.umich.edu * @param _transmitTime Time of packet transmission 1157997Ssaidi@eecs.umich.edu */ 1167997Ssaidi@eecs.umich.edu CommMonitorSenderState(Tick _transmitTime) 1177997Ssaidi@eecs.umich.edu : transmitTime(_transmitTime) 1187997Ssaidi@eecs.umich.edu { } 1197997Ssaidi@eecs.umich.edu 1207997Ssaidi@eecs.umich.edu /** Destructor */ 1217997Ssaidi@eecs.umich.edu ~CommMonitorSenderState() { } 1227997Ssaidi@eecs.umich.edu 1237997Ssaidi@eecs.umich.edu /** Tick when request is transmitted */ 1247997Ssaidi@eecs.umich.edu Tick transmitTime; 1257997Ssaidi@eecs.umich.edu 1267997Ssaidi@eecs.umich.edu }; 1277997Ssaidi@eecs.umich.edu 1287997Ssaidi@eecs.umich.edu /** 1297997Ssaidi@eecs.umich.edu * This is the master port of the communication monitor. All recv 1307997Ssaidi@eecs.umich.edu * functions call a function in CommMonitor, where the 1317997Ssaidi@eecs.umich.edu * send function of the slave port is called. Besides this, these 1327997Ssaidi@eecs.umich.edu * functions can also perform actions for capturing statistics. 1337997Ssaidi@eecs.umich.edu */ 1347997Ssaidi@eecs.umich.edu class MonitorMasterPort : public MasterPort 1357997Ssaidi@eecs.umich.edu { 1367997Ssaidi@eecs.umich.edu 1377997Ssaidi@eecs.umich.edu public: 1387997Ssaidi@eecs.umich.edu 1397997Ssaidi@eecs.umich.edu MonitorMasterPort(const std::string& _name, CommMonitor& _mon) 1407997Ssaidi@eecs.umich.edu : MasterPort(_name, &_mon), mon(_mon) 1417997Ssaidi@eecs.umich.edu { } 1427997Ssaidi@eecs.umich.edu 1437997Ssaidi@eecs.umich.edu protected: 1447997Ssaidi@eecs.umich.edu 1457997Ssaidi@eecs.umich.edu void recvFunctionalSnoop(PacketPtr pkt) 1467997Ssaidi@eecs.umich.edu { 1477997Ssaidi@eecs.umich.edu mon.recvFunctionalSnoop(pkt); 1487997Ssaidi@eecs.umich.edu } 1497997Ssaidi@eecs.umich.edu 1507997Ssaidi@eecs.umich.edu Tick recvAtomicSnoop(PacketPtr pkt) 1517997Ssaidi@eecs.umich.edu { 1527997Ssaidi@eecs.umich.edu return mon.recvAtomicSnoop(pkt); 1537997Ssaidi@eecs.umich.edu } 1547997Ssaidi@eecs.umich.edu 1557997Ssaidi@eecs.umich.edu bool recvTimingResp(PacketPtr pkt) 1567997Ssaidi@eecs.umich.edu { 1577997Ssaidi@eecs.umich.edu return mon.recvTimingResp(pkt); 1587997Ssaidi@eecs.umich.edu } 1597997Ssaidi@eecs.umich.edu 1607997Ssaidi@eecs.umich.edu void recvTimingSnoopReq(PacketPtr pkt) 1617997Ssaidi@eecs.umich.edu { 1627997Ssaidi@eecs.umich.edu mon.recvTimingSnoopReq(pkt); 1637997Ssaidi@eecs.umich.edu } 1647997Ssaidi@eecs.umich.edu 1657997Ssaidi@eecs.umich.edu void recvRangeChange() 1667997Ssaidi@eecs.umich.edu { 1677997Ssaidi@eecs.umich.edu mon.recvRangeChange(); 1687997Ssaidi@eecs.umich.edu } 1697997Ssaidi@eecs.umich.edu 1707997Ssaidi@eecs.umich.edu bool isSnooping() const 1717997Ssaidi@eecs.umich.edu { 1727997Ssaidi@eecs.umich.edu return mon.isSnooping(); 1737997Ssaidi@eecs.umich.edu } 1747997Ssaidi@eecs.umich.edu 1757997Ssaidi@eecs.umich.edu void recvRetry() 1767997Ssaidi@eecs.umich.edu { 1777997Ssaidi@eecs.umich.edu mon.recvRetryMaster(); 1787997Ssaidi@eecs.umich.edu } 1797997Ssaidi@eecs.umich.edu 1807997Ssaidi@eecs.umich.edu private: 1817997Ssaidi@eecs.umich.edu 1827997Ssaidi@eecs.umich.edu CommMonitor& mon; 1837997Ssaidi@eecs.umich.edu 1847997Ssaidi@eecs.umich.edu }; 1857997Ssaidi@eecs.umich.edu 1867997Ssaidi@eecs.umich.edu /** Instance of master port, facing the memory side */ 1877997Ssaidi@eecs.umich.edu MonitorMasterPort masterPort; 1887997Ssaidi@eecs.umich.edu 1897997Ssaidi@eecs.umich.edu /** 1907997Ssaidi@eecs.umich.edu * This is the slave port of the communication monitor. All recv 1917997Ssaidi@eecs.umich.edu * functions call a function in CommMonitor, where the 1927997Ssaidi@eecs.umich.edu * send function of the master port is called. Besides this, these 1937997Ssaidi@eecs.umich.edu * functions can also perform actions for capturing statistics. 1947997Ssaidi@eecs.umich.edu */ 1957997Ssaidi@eecs.umich.edu class MonitorSlavePort : public SlavePort 1967997Ssaidi@eecs.umich.edu { 1977997Ssaidi@eecs.umich.edu 1987997Ssaidi@eecs.umich.edu public: 1997997Ssaidi@eecs.umich.edu 2007997Ssaidi@eecs.umich.edu MonitorSlavePort(const std::string& _name, CommMonitor& _mon) 2017997Ssaidi@eecs.umich.edu : SlavePort(_name, &_mon), mon(_mon) 2027997Ssaidi@eecs.umich.edu { } 2037997Ssaidi@eecs.umich.edu 2047997Ssaidi@eecs.umich.edu protected: 2057997Ssaidi@eecs.umich.edu 2067997Ssaidi@eecs.umich.edu void recvFunctional(PacketPtr pkt) 2077997Ssaidi@eecs.umich.edu { 2087997Ssaidi@eecs.umich.edu mon.recvFunctional(pkt); 2097997Ssaidi@eecs.umich.edu } 2107997Ssaidi@eecs.umich.edu 2117997Ssaidi@eecs.umich.edu Tick recvAtomic(PacketPtr pkt) 2127997Ssaidi@eecs.umich.edu { 2137997Ssaidi@eecs.umich.edu return mon.recvAtomic(pkt); 2147997Ssaidi@eecs.umich.edu } 2157997Ssaidi@eecs.umich.edu 2167997Ssaidi@eecs.umich.edu bool recvTimingReq(PacketPtr pkt) 2177997Ssaidi@eecs.umich.edu { 2187997Ssaidi@eecs.umich.edu return mon.recvTimingReq(pkt); 2197997Ssaidi@eecs.umich.edu } 2207997Ssaidi@eecs.umich.edu 2217997Ssaidi@eecs.umich.edu bool recvTimingSnoopResp(PacketPtr pkt) 2227997Ssaidi@eecs.umich.edu { 2237997Ssaidi@eecs.umich.edu return mon.recvTimingSnoopResp(pkt); 2247997Ssaidi@eecs.umich.edu } 2257997Ssaidi@eecs.umich.edu 2267997Ssaidi@eecs.umich.edu AddrRangeList getAddrRanges() const 2277997Ssaidi@eecs.umich.edu { 2287997Ssaidi@eecs.umich.edu return mon.getAddrRanges(); 2297997Ssaidi@eecs.umich.edu } 2307997Ssaidi@eecs.umich.edu 2317997Ssaidi@eecs.umich.edu void recvRetry() 2327997Ssaidi@eecs.umich.edu { 2337997Ssaidi@eecs.umich.edu mon.recvRetrySlave(); 2347997Ssaidi@eecs.umich.edu } 2357997Ssaidi@eecs.umich.edu 2367997Ssaidi@eecs.umich.edu private: 2377997Ssaidi@eecs.umich.edu 2387997Ssaidi@eecs.umich.edu CommMonitor& mon; 2397997Ssaidi@eecs.umich.edu 2407997Ssaidi@eecs.umich.edu }; 2417997Ssaidi@eecs.umich.edu 2427997Ssaidi@eecs.umich.edu /** Instance of slave port, i.e. on the CPU side */ 2437997Ssaidi@eecs.umich.edu MonitorSlavePort slavePort; 2447997Ssaidi@eecs.umich.edu 2457997Ssaidi@eecs.umich.edu void recvFunctional(PacketPtr pkt); 2467997Ssaidi@eecs.umich.edu 2477997Ssaidi@eecs.umich.edu void recvFunctionalSnoop(PacketPtr pkt); 2487997Ssaidi@eecs.umich.edu 2497997Ssaidi@eecs.umich.edu Tick recvAtomic(PacketPtr pkt); 2507997Ssaidi@eecs.umich.edu 2517997Ssaidi@eecs.umich.edu Tick recvAtomicSnoop(PacketPtr pkt); 2527997Ssaidi@eecs.umich.edu 2537997Ssaidi@eecs.umich.edu bool recvTimingReq(PacketPtr pkt); 2547997Ssaidi@eecs.umich.edu 2557997Ssaidi@eecs.umich.edu bool recvTimingResp(PacketPtr pkt); 2567997Ssaidi@eecs.umich.edu 2577997Ssaidi@eecs.umich.edu void recvTimingSnoopReq(PacketPtr pkt); 2587997Ssaidi@eecs.umich.edu 2597997Ssaidi@eecs.umich.edu bool recvTimingSnoopResp(PacketPtr pkt); 2607997Ssaidi@eecs.umich.edu 2617997Ssaidi@eecs.umich.edu AddrRangeList getAddrRanges() const; 2627997Ssaidi@eecs.umich.edu 2637997Ssaidi@eecs.umich.edu bool isSnooping() const; 2647997Ssaidi@eecs.umich.edu 2657997Ssaidi@eecs.umich.edu void recvRetryMaster(); 2667997Ssaidi@eecs.umich.edu 2677997Ssaidi@eecs.umich.edu void recvRetrySlave(); 2687997Ssaidi@eecs.umich.edu 2697997Ssaidi@eecs.umich.edu void recvRangeChange(); 2707997Ssaidi@eecs.umich.edu 2717997Ssaidi@eecs.umich.edu void periodicTraceDump(); 2727997Ssaidi@eecs.umich.edu 2737997Ssaidi@eecs.umich.edu /** Stats declarations, all in a struct for convenience. */ 2747997Ssaidi@eecs.umich.edu struct MonitorStats 2757997Ssaidi@eecs.umich.edu { 2767997Ssaidi@eecs.umich.edu 2777997Ssaidi@eecs.umich.edu /** Disable flag for burst length historgrams **/ 2787997Ssaidi@eecs.umich.edu bool disableBurstLengthHists; 2797997Ssaidi@eecs.umich.edu 2807997Ssaidi@eecs.umich.edu /** Histogram of read burst lengths */ 2817997Ssaidi@eecs.umich.edu Stats::Histogram readBurstLengthHist; 2827997Ssaidi@eecs.umich.edu 2837997Ssaidi@eecs.umich.edu /** Histogram of write burst lengths */ 2847997Ssaidi@eecs.umich.edu Stats::Histogram writeBurstLengthHist; 2857997Ssaidi@eecs.umich.edu 2867997Ssaidi@eecs.umich.edu /** Disable flag for the bandwidth histograms */ 2877997Ssaidi@eecs.umich.edu bool disableBandwidthHists; 2887997Ssaidi@eecs.umich.edu 2897997Ssaidi@eecs.umich.edu /** 2907997Ssaidi@eecs.umich.edu * Histogram for read bandwidth per sample window. The 2917997Ssaidi@eecs.umich.edu * internal counter is an unsigned int rather than a stat. 2927997Ssaidi@eecs.umich.edu */ 2937997Ssaidi@eecs.umich.edu unsigned int readBytes; 2947997Ssaidi@eecs.umich.edu Stats::Histogram readBandwidthHist; 2957997Ssaidi@eecs.umich.edu Stats::Formula averageReadBW; 2967997Ssaidi@eecs.umich.edu Stats::Scalar totalReadBytes; 2977997Ssaidi@eecs.umich.edu 2987997Ssaidi@eecs.umich.edu /** 2997997Ssaidi@eecs.umich.edu * Histogram for write bandwidth per sample window. The 3007997Ssaidi@eecs.umich.edu * internal counter is an unsigned int rather than a stat. 3017997Ssaidi@eecs.umich.edu */ 3027997Ssaidi@eecs.umich.edu unsigned int writtenBytes; 3037997Ssaidi@eecs.umich.edu Stats::Histogram writeBandwidthHist; 3047997Ssaidi@eecs.umich.edu Stats::Formula averageWriteBW; 3057997Ssaidi@eecs.umich.edu Stats::Scalar totalWrittenBytes; 3067997Ssaidi@eecs.umich.edu 3077997Ssaidi@eecs.umich.edu /** Disable flag for latency histograms. */ 3087997Ssaidi@eecs.umich.edu bool disableLatencyHists; 3097997Ssaidi@eecs.umich.edu 3107997Ssaidi@eecs.umich.edu /** Histogram of read request-to-response latencies */ 3117997Ssaidi@eecs.umich.edu Stats::Histogram readLatencyHist; 3127997Ssaidi@eecs.umich.edu 3137997Ssaidi@eecs.umich.edu /** Histogram of write request-to-response latencies */ 3147997Ssaidi@eecs.umich.edu Stats::Histogram writeLatencyHist; 3157997Ssaidi@eecs.umich.edu 3167997Ssaidi@eecs.umich.edu /** Disable flag for ITT distributions. */ 3177997Ssaidi@eecs.umich.edu bool disableITTDists; 3187997Ssaidi@eecs.umich.edu 3197997Ssaidi@eecs.umich.edu /** 3207997Ssaidi@eecs.umich.edu * Inter transaction time (ITT) distributions. There are 3217997Ssaidi@eecs.umich.edu * histograms of the time between two read, write or arbitrary 3227997Ssaidi@eecs.umich.edu * accesses. The time of a request is the tick at which the 3237997Ssaidi@eecs.umich.edu * request is forwarded by the monitor. 3247997Ssaidi@eecs.umich.edu */ 3257997Ssaidi@eecs.umich.edu Stats::Distribution ittReadRead; 3267997Ssaidi@eecs.umich.edu Stats::Distribution ittWriteWrite; 3277997Ssaidi@eecs.umich.edu Stats::Distribution ittReqReq; 3287997Ssaidi@eecs.umich.edu Tick timeOfLastRead; 3297997Ssaidi@eecs.umich.edu Tick timeOfLastWrite; 3307997Ssaidi@eecs.umich.edu Tick timeOfLastReq; 3317997Ssaidi@eecs.umich.edu 3327997Ssaidi@eecs.umich.edu /** Disable flag for outstanding histograms. */ 3337997Ssaidi@eecs.umich.edu bool disableOutstandingHists; 3347997Ssaidi@eecs.umich.edu 3357997Ssaidi@eecs.umich.edu /** 3367997Ssaidi@eecs.umich.edu * Histogram of outstanding read requests. Counter for 3377997Ssaidi@eecs.umich.edu * outstanding read requests is an unsigned integer because 3387997Ssaidi@eecs.umich.edu * it should not be reset when stats are reset. 3397997Ssaidi@eecs.umich.edu */ 3407997Ssaidi@eecs.umich.edu Stats::Histogram outstandingReadsHist; 3417997Ssaidi@eecs.umich.edu unsigned int outstandingReadReqs; 3427997Ssaidi@eecs.umich.edu 3437997Ssaidi@eecs.umich.edu /** 3447997Ssaidi@eecs.umich.edu * Histogram of outstanding write requests. Counter for 3457997Ssaidi@eecs.umich.edu * outstanding write requests is an unsigned integer because 3467997Ssaidi@eecs.umich.edu * it should not be reset when stats are reset. 3477997Ssaidi@eecs.umich.edu */ 3487997Ssaidi@eecs.umich.edu Stats::Histogram outstandingWritesHist; 3497997Ssaidi@eecs.umich.edu unsigned int outstandingWriteReqs; 3507997Ssaidi@eecs.umich.edu 3517997Ssaidi@eecs.umich.edu /** Disable flag for transaction histograms. */ 3527997Ssaidi@eecs.umich.edu bool disableTransactionHists; 3537997Ssaidi@eecs.umich.edu 3547997Ssaidi@eecs.umich.edu /** Histogram of number of read transactions per time bin */ 3557997Ssaidi@eecs.umich.edu Stats::Histogram readTransHist; 3567997Ssaidi@eecs.umich.edu unsigned int readTrans; 3577997Ssaidi@eecs.umich.edu 3587997Ssaidi@eecs.umich.edu /** Histogram of number of timing write transactions per time bin */ 3597997Ssaidi@eecs.umich.edu Stats::Histogram writeTransHist; 3607997Ssaidi@eecs.umich.edu unsigned int writeTrans; 3617997Ssaidi@eecs.umich.edu 3627997Ssaidi@eecs.umich.edu /** Disable flag for address distributions. */ 3637997Ssaidi@eecs.umich.edu bool disableAddrDists; 3647997Ssaidi@eecs.umich.edu 3657997Ssaidi@eecs.umich.edu /** 3667997Ssaidi@eecs.umich.edu * Histogram of number of read accesses to addresses over 3677997Ssaidi@eecs.umich.edu * time. 3687997Ssaidi@eecs.umich.edu */ 3697997Ssaidi@eecs.umich.edu Stats::SparseHistogram readAddrDist; 3707997Ssaidi@eecs.umich.edu 3717997Ssaidi@eecs.umich.edu /** 3727997Ssaidi@eecs.umich.edu * Histogram of number of write accesses to addresses over 3737997Ssaidi@eecs.umich.edu * time. 3747997Ssaidi@eecs.umich.edu */ 3757997Ssaidi@eecs.umich.edu Stats::SparseHistogram writeAddrDist; 3767997Ssaidi@eecs.umich.edu 3777997Ssaidi@eecs.umich.edu /** 3787997Ssaidi@eecs.umich.edu * Create the monitor stats and initialise all the members 3797997Ssaidi@eecs.umich.edu * that are not statistics themselves, but used to control the 3807997Ssaidi@eecs.umich.edu * stats or track values during a sample period. 3817997Ssaidi@eecs.umich.edu */ 3827997Ssaidi@eecs.umich.edu MonitorStats(const CommMonitorParams* params) : 3837997Ssaidi@eecs.umich.edu disableBurstLengthHists(params->disable_burst_length_hists), 3847997Ssaidi@eecs.umich.edu disableBandwidthHists(params->disable_bandwidth_hists), 3857997Ssaidi@eecs.umich.edu readBytes(0), writtenBytes(0), 3867997Ssaidi@eecs.umich.edu disableLatencyHists(params->disable_latency_hists), 3877997Ssaidi@eecs.umich.edu disableITTDists(params->disable_itt_dists), 3887997Ssaidi@eecs.umich.edu timeOfLastRead(0), timeOfLastWrite(0), timeOfLastReq(0), 3897997Ssaidi@eecs.umich.edu disableOutstandingHists(params->disable_outstanding_hists), 3907997Ssaidi@eecs.umich.edu outstandingReadReqs(0), outstandingWriteReqs(0), 3917997Ssaidi@eecs.umich.edu disableTransactionHists(params->disable_transaction_hists), 3927997Ssaidi@eecs.umich.edu readTrans(0), writeTrans(0), 3937997Ssaidi@eecs.umich.edu disableAddrDists(params->disable_addr_dists) 3947997Ssaidi@eecs.umich.edu { } 3957997Ssaidi@eecs.umich.edu 3967997Ssaidi@eecs.umich.edu }; 3977997Ssaidi@eecs.umich.edu 3987997Ssaidi@eecs.umich.edu /** This function is called periodically at the end of each time bin */ 3997997Ssaidi@eecs.umich.edu void samplePeriodic(); 4007997Ssaidi@eecs.umich.edu 4017997Ssaidi@eecs.umich.edu /** Schedule the first periodic event */ 4027997Ssaidi@eecs.umich.edu void startup(); 4037997Ssaidi@eecs.umich.edu 4047997Ssaidi@eecs.umich.edu /** Periodic event called at the end of each simulation time bin */ 4057997Ssaidi@eecs.umich.edu EventWrapper<CommMonitor, &CommMonitor::samplePeriodic> samplePeriodicEvent; 4067997Ssaidi@eecs.umich.edu 4077997Ssaidi@eecs.umich.edu /** Length of simulation time bin*/ 4087997Ssaidi@eecs.umich.edu Tick samplePeriodTicks; 4097997Ssaidi@eecs.umich.edu Time samplePeriod; 4107997Ssaidi@eecs.umich.edu 4117997Ssaidi@eecs.umich.edu /** Address mask for sources of read accesses to be captured */ 4127997Ssaidi@eecs.umich.edu Addr readAddrMask; 4137997Ssaidi@eecs.umich.edu 4147997Ssaidi@eecs.umich.edu /** Address mask for sources of write accesses to be captured */ 4157997Ssaidi@eecs.umich.edu Addr writeAddrMask; 4167997Ssaidi@eecs.umich.edu 4177997Ssaidi@eecs.umich.edu /** Instantiate stats */ 4187997Ssaidi@eecs.umich.edu MonitorStats stats; 4197997Ssaidi@eecs.umich.edu 4207997Ssaidi@eecs.umich.edu /** Output stream for a potential trace. */ 4217997Ssaidi@eecs.umich.edu ProtoOutputStream* traceStream; 4227997Ssaidi@eecs.umich.edu 4237997Ssaidi@eecs.umich.edu /** The system in which the monitor lives */ 4247997Ssaidi@eecs.umich.edu System *system; 4257997Ssaidi@eecs.umich.edu}; 4267997Ssaidi@eecs.umich.edu 4277997Ssaidi@eecs.umich.edu#endif //__MEM_COMM_MONITOR_HH__ 4287997Ssaidi@eecs.umich.edu