18981Sandreas.hansson@arm.com/* 214208Sandreas.sandberg@arm.com * Copyright (c) 2012-2013, 2015, 2018-2019 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 4511793Sbrandon.potter@amd.com#include "mem/comm_monitor.hh" 4611793Sbrandon.potter@amd.com 479356Snilay@cs.wisc.edu#include "base/trace.hh" 488981Sandreas.hansson@arm.com#include "debug/CommMonitor.hh" 498981Sandreas.hansson@arm.com#include "sim/stats.hh" 508981Sandreas.hansson@arm.com 518981Sandreas.hansson@arm.comCommMonitor::CommMonitor(Params* params) 5213892Sgabeblack@google.com : SimObject(params), 538981Sandreas.hansson@arm.com masterPort(name() + "-master", *this), 548981Sandreas.hansson@arm.com slavePort(name() + "-slave", *this), 5512084Sspwilson2@wisc.edu samplePeriodicEvent([this]{ samplePeriodic(); }, name()), 568981Sandreas.hansson@arm.com samplePeriodTicks(params->sample_period), 5710902Sandreas.sandberg@arm.com samplePeriod(params->sample_period / SimClock::Float::s), 5814208Sandreas.sandberg@arm.com stats(this, params) 598981Sandreas.hansson@arm.com{ 608981Sandreas.hansson@arm.com DPRINTF(CommMonitor, 6110064Sandreas.hansson@arm.com "Created monitor %s with sample period %d ticks (%f ms)\n", 6210902Sandreas.sandberg@arm.com name(), samplePeriodTicks, samplePeriod * 1E3); 638981Sandreas.hansson@arm.com} 648981Sandreas.hansson@arm.com 658981Sandreas.hansson@arm.comCommMonitor* 668981Sandreas.hansson@arm.comCommMonitorParams::create() 678981Sandreas.hansson@arm.com{ 688981Sandreas.hansson@arm.com return new CommMonitor(this); 698981Sandreas.hansson@arm.com} 708981Sandreas.hansson@arm.com 718981Sandreas.hansson@arm.comvoid 728981Sandreas.hansson@arm.comCommMonitor::init() 738981Sandreas.hansson@arm.com{ 748981Sandreas.hansson@arm.com // make sure both sides of the monitor are connected 758981Sandreas.hansson@arm.com if (!slavePort.isConnected() || !masterPort.isConnected()) 768981Sandreas.hansson@arm.com fatal("Communication monitor is not connected on both sides.\n"); 778981Sandreas.hansson@arm.com} 788981Sandreas.hansson@arm.com 7910994Sandreas.sandberg@arm.comvoid 8010994Sandreas.sandberg@arm.comCommMonitor::regProbePoints() 8110994Sandreas.sandberg@arm.com{ 8210994Sandreas.sandberg@arm.com ppPktReq.reset(new ProbePoints::Packet(getProbeManager(), "PktRequest")); 8310994Sandreas.sandberg@arm.com ppPktResp.reset(new ProbePoints::Packet(getProbeManager(), "PktResponse")); 8410994Sandreas.sandberg@arm.com} 8510994Sandreas.sandberg@arm.com 8613784Sgabeblack@google.comPort & 8713784Sgabeblack@google.comCommMonitor::getPort(const std::string &if_name, PortID idx) 888981Sandreas.hansson@arm.com{ 898981Sandreas.hansson@arm.com if (if_name == "master") { 908981Sandreas.hansson@arm.com return masterPort; 9113784Sgabeblack@google.com } else if (if_name == "slave") { 928981Sandreas.hansson@arm.com return slavePort; 938981Sandreas.hansson@arm.com } else { 9413892Sgabeblack@google.com return SimObject::getPort(if_name, idx); 958981Sandreas.hansson@arm.com } 968981Sandreas.hansson@arm.com} 978981Sandreas.hansson@arm.com 988981Sandreas.hansson@arm.comvoid 998981Sandreas.hansson@arm.comCommMonitor::recvFunctional(PacketPtr pkt) 1008981Sandreas.hansson@arm.com{ 1018981Sandreas.hansson@arm.com masterPort.sendFunctional(pkt); 1028981Sandreas.hansson@arm.com} 1038981Sandreas.hansson@arm.com 1048981Sandreas.hansson@arm.comvoid 1058981Sandreas.hansson@arm.comCommMonitor::recvFunctionalSnoop(PacketPtr pkt) 1068981Sandreas.hansson@arm.com{ 1078981Sandreas.hansson@arm.com slavePort.sendFunctionalSnoop(pkt); 1088981Sandreas.hansson@arm.com} 1098981Sandreas.hansson@arm.com 11014208Sandreas.sandberg@arm.comCommMonitor::MonitorStats::MonitorStats(Stats::Group *parent, 11114208Sandreas.sandberg@arm.com const CommMonitorParams *params) 11214208Sandreas.sandberg@arm.com : Stats::Group(parent), 11314208Sandreas.sandberg@arm.com 11414208Sandreas.sandberg@arm.com disableBurstLengthHists(params->disable_burst_length_hists), 11514208Sandreas.sandberg@arm.com ADD_STAT(readBurstLengthHist, 11614208Sandreas.sandberg@arm.com "Histogram of burst lengths of transmitted packets"), 11714208Sandreas.sandberg@arm.com ADD_STAT(writeBurstLengthHist, 11814208Sandreas.sandberg@arm.com "Histogram of burst lengths of transmitted packets"), 11914208Sandreas.sandberg@arm.com 12014208Sandreas.sandberg@arm.com disableBandwidthHists(params->disable_bandwidth_hists), 12114208Sandreas.sandberg@arm.com readBytes(0), 12214208Sandreas.sandberg@arm.com ADD_STAT(readBandwidthHist, 12314208Sandreas.sandberg@arm.com "Histogram of read bandwidth per sample period (bytes/s)"), 12414208Sandreas.sandberg@arm.com ADD_STAT(totalReadBytes, "Number of bytes read"), 12514208Sandreas.sandberg@arm.com ADD_STAT(averageReadBandwidth, "Average read bandwidth (bytes/s)", 12614208Sandreas.sandberg@arm.com totalReadBytes / simSeconds), 12714208Sandreas.sandberg@arm.com 12814208Sandreas.sandberg@arm.com writtenBytes(0), 12914208Sandreas.sandberg@arm.com ADD_STAT(writeBandwidthHist, "Histogram of write bandwidth (bytes/s)"), 13014208Sandreas.sandberg@arm.com ADD_STAT(totalWrittenBytes, "Number of bytes written"), 13114208Sandreas.sandberg@arm.com ADD_STAT(averageWriteBandwidth, "Average write bandwidth (bytes/s)", 13214208Sandreas.sandberg@arm.com totalWrittenBytes / simSeconds), 13314208Sandreas.sandberg@arm.com 13414208Sandreas.sandberg@arm.com disableLatencyHists(params->disable_latency_hists), 13514208Sandreas.sandberg@arm.com ADD_STAT(readLatencyHist, "Read request-response latency"), 13614208Sandreas.sandberg@arm.com ADD_STAT(writeLatencyHist, "Write request-response latency"), 13714208Sandreas.sandberg@arm.com 13814208Sandreas.sandberg@arm.com disableITTDists(params->disable_itt_dists), 13914208Sandreas.sandberg@arm.com ADD_STAT(ittReadRead, "Read-to-read inter transaction time"), 14014208Sandreas.sandberg@arm.com ADD_STAT(ittWriteWrite , "Write-to-write inter transaction time"), 14114208Sandreas.sandberg@arm.com ADD_STAT(ittReqReq, "Request-to-request inter transaction time"), 14214208Sandreas.sandberg@arm.com timeOfLastRead(0), timeOfLastWrite(0), timeOfLastReq(0), 14314208Sandreas.sandberg@arm.com 14414208Sandreas.sandberg@arm.com disableOutstandingHists(params->disable_outstanding_hists), 14514208Sandreas.sandberg@arm.com ADD_STAT(outstandingReadsHist, "Outstanding read transactions"), 14614208Sandreas.sandberg@arm.com outstandingReadReqs(0), 14714208Sandreas.sandberg@arm.com ADD_STAT(outstandingWritesHist, "Outstanding write transactions"), 14814208Sandreas.sandberg@arm.com outstandingWriteReqs(0), 14914208Sandreas.sandberg@arm.com 15014208Sandreas.sandberg@arm.com disableTransactionHists(params->disable_transaction_hists), 15114208Sandreas.sandberg@arm.com ADD_STAT(readTransHist, 15214208Sandreas.sandberg@arm.com "Histogram of read transactions per sample period"), 15314208Sandreas.sandberg@arm.com readTrans(0), 15414208Sandreas.sandberg@arm.com ADD_STAT(writeTransHist, 15514208Sandreas.sandberg@arm.com "Histogram of write transactions per sample period"), 15614208Sandreas.sandberg@arm.com writeTrans(0), 15714208Sandreas.sandberg@arm.com 15814208Sandreas.sandberg@arm.com disableAddrDists(params->disable_addr_dists), 15914208Sandreas.sandberg@arm.com readAddrMask(params->read_addr_mask), 16014208Sandreas.sandberg@arm.com writeAddrMask(params->write_addr_mask), 16114208Sandreas.sandberg@arm.com ADD_STAT(readAddrDist, "Read address distribution"), 16214208Sandreas.sandberg@arm.com ADD_STAT(writeAddrDist, "Write address distribution") 16314208Sandreas.sandberg@arm.com{ 16414208Sandreas.sandberg@arm.com using namespace Stats; 16514208Sandreas.sandberg@arm.com 16614208Sandreas.sandberg@arm.com readBurstLengthHist 16714208Sandreas.sandberg@arm.com .init(params->burst_length_bins) 16814208Sandreas.sandberg@arm.com .flags(disableBurstLengthHists ? nozero : pdf); 16914208Sandreas.sandberg@arm.com 17014208Sandreas.sandberg@arm.com writeBurstLengthHist 17114208Sandreas.sandberg@arm.com .init(params->burst_length_bins) 17214208Sandreas.sandberg@arm.com .flags(disableBurstLengthHists ? nozero : pdf); 17314208Sandreas.sandberg@arm.com 17414208Sandreas.sandberg@arm.com // Stats based on received responses 17514208Sandreas.sandberg@arm.com readBandwidthHist 17614208Sandreas.sandberg@arm.com .init(params->bandwidth_bins) 17714208Sandreas.sandberg@arm.com .flags(disableBandwidthHists ? nozero : pdf); 17814208Sandreas.sandberg@arm.com 17914208Sandreas.sandberg@arm.com averageReadBandwidth 18014208Sandreas.sandberg@arm.com .flags(disableBandwidthHists ? nozero : pdf); 18114208Sandreas.sandberg@arm.com 18214208Sandreas.sandberg@arm.com totalReadBytes 18314208Sandreas.sandberg@arm.com .flags(disableBandwidthHists ? nozero : pdf); 18414208Sandreas.sandberg@arm.com 18514208Sandreas.sandberg@arm.com // Stats based on successfully sent requests 18614208Sandreas.sandberg@arm.com writeBandwidthHist 18714208Sandreas.sandberg@arm.com .init(params->bandwidth_bins) 18814208Sandreas.sandberg@arm.com .flags(disableBandwidthHists ? (pdf | nozero) : pdf); 18914208Sandreas.sandberg@arm.com 19014208Sandreas.sandberg@arm.com averageWriteBandwidth 19114208Sandreas.sandberg@arm.com .flags(disableBandwidthHists ? nozero : pdf); 19214208Sandreas.sandberg@arm.com 19314208Sandreas.sandberg@arm.com totalWrittenBytes 19414208Sandreas.sandberg@arm.com .flags(disableBandwidthHists ? nozero : pdf); 19514208Sandreas.sandberg@arm.com 19614208Sandreas.sandberg@arm.com 19714208Sandreas.sandberg@arm.com readLatencyHist 19814208Sandreas.sandberg@arm.com .init(params->latency_bins) 19914208Sandreas.sandberg@arm.com .flags(disableLatencyHists ? nozero : pdf); 20014208Sandreas.sandberg@arm.com 20114208Sandreas.sandberg@arm.com writeLatencyHist 20214208Sandreas.sandberg@arm.com .init(params->latency_bins) 20314208Sandreas.sandberg@arm.com .flags(disableLatencyHists ? nozero : pdf); 20414208Sandreas.sandberg@arm.com 20514208Sandreas.sandberg@arm.com ittReadRead 20614208Sandreas.sandberg@arm.com .init(1, params->itt_max_bin, params->itt_max_bin / 20714208Sandreas.sandberg@arm.com params->itt_bins) 20814208Sandreas.sandberg@arm.com .flags(disableITTDists ? nozero : pdf); 20914208Sandreas.sandberg@arm.com 21014208Sandreas.sandberg@arm.com ittWriteWrite 21114208Sandreas.sandberg@arm.com .init(1, params->itt_max_bin, params->itt_max_bin / 21214208Sandreas.sandberg@arm.com params->itt_bins) 21314208Sandreas.sandberg@arm.com .flags(disableITTDists ? nozero : pdf); 21414208Sandreas.sandberg@arm.com 21514208Sandreas.sandberg@arm.com ittReqReq 21614208Sandreas.sandberg@arm.com .init(1, params->itt_max_bin, params->itt_max_bin / 21714208Sandreas.sandberg@arm.com params->itt_bins) 21814208Sandreas.sandberg@arm.com .flags(disableITTDists ? nozero : pdf); 21914208Sandreas.sandberg@arm.com 22014208Sandreas.sandberg@arm.com outstandingReadsHist 22114208Sandreas.sandberg@arm.com .init(params->outstanding_bins) 22214208Sandreas.sandberg@arm.com .flags(disableOutstandingHists ? nozero : pdf); 22314208Sandreas.sandberg@arm.com 22414208Sandreas.sandberg@arm.com outstandingWritesHist 22514208Sandreas.sandberg@arm.com .init(params->outstanding_bins) 22614208Sandreas.sandberg@arm.com .flags(disableOutstandingHists ? nozero : pdf); 22714208Sandreas.sandberg@arm.com 22814208Sandreas.sandberg@arm.com readTransHist 22914208Sandreas.sandberg@arm.com .init(params->transaction_bins) 23014208Sandreas.sandberg@arm.com .flags(disableTransactionHists ? nozero : pdf); 23114208Sandreas.sandberg@arm.com 23214208Sandreas.sandberg@arm.com writeTransHist 23314208Sandreas.sandberg@arm.com .init(params->transaction_bins) 23414208Sandreas.sandberg@arm.com .flags(disableTransactionHists ? nozero : pdf); 23514208Sandreas.sandberg@arm.com 23614208Sandreas.sandberg@arm.com readAddrDist 23714208Sandreas.sandberg@arm.com .init(0) 23814208Sandreas.sandberg@arm.com .flags(disableAddrDists ? nozero : pdf); 23914208Sandreas.sandberg@arm.com 24014208Sandreas.sandberg@arm.com writeAddrDist 24114208Sandreas.sandberg@arm.com .init(0) 24214208Sandreas.sandberg@arm.com .flags(disableAddrDists ? nozero : pdf); 24314208Sandreas.sandberg@arm.com} 24414208Sandreas.sandberg@arm.com 24511804Srjthakur@google.comvoid 24611804Srjthakur@google.comCommMonitor::MonitorStats::updateReqStats( 24711804Srjthakur@google.com const ProbePoints::PacketInfo& pkt_info, bool is_atomic, 24811804Srjthakur@google.com bool expects_response) 24911804Srjthakur@google.com{ 25011804Srjthakur@google.com if (pkt_info.cmd.isRead()) { 25111804Srjthakur@google.com // Increment number of observed read transactions 25211804Srjthakur@google.com if (!disableTransactionHists) 25311804Srjthakur@google.com ++readTrans; 25411804Srjthakur@google.com 25511804Srjthakur@google.com // Get sample of burst length 25611804Srjthakur@google.com if (!disableBurstLengthHists) 25711804Srjthakur@google.com readBurstLengthHist.sample(pkt_info.size); 25811804Srjthakur@google.com 25911804Srjthakur@google.com // Sample the masked address 26011804Srjthakur@google.com if (!disableAddrDists) 26111804Srjthakur@google.com readAddrDist.sample(pkt_info.addr & readAddrMask); 26211804Srjthakur@google.com 26311804Srjthakur@google.com if (!disableITTDists) { 26411804Srjthakur@google.com // Sample value of read-read inter transaction time 26511804Srjthakur@google.com if (timeOfLastRead != 0) 26611804Srjthakur@google.com ittReadRead.sample(curTick() - timeOfLastRead); 26711804Srjthakur@google.com timeOfLastRead = curTick(); 26811804Srjthakur@google.com 26911804Srjthakur@google.com // Sample value of req-req inter transaction time 27011804Srjthakur@google.com if (timeOfLastReq != 0) 27111804Srjthakur@google.com ittReqReq.sample(curTick() - timeOfLastReq); 27211804Srjthakur@google.com timeOfLastReq = curTick(); 27311804Srjthakur@google.com } 27411804Srjthakur@google.com if (!is_atomic && !disableOutstandingHists && expects_response) 27511804Srjthakur@google.com ++outstandingReadReqs; 27611804Srjthakur@google.com 27711804Srjthakur@google.com } else if (pkt_info.cmd.isWrite()) { 27811804Srjthakur@google.com // Same as for reads 27911804Srjthakur@google.com if (!disableTransactionHists) 28011804Srjthakur@google.com ++writeTrans; 28111804Srjthakur@google.com 28211804Srjthakur@google.com if (!disableBurstLengthHists) 28311804Srjthakur@google.com writeBurstLengthHist.sample(pkt_info.size); 28411804Srjthakur@google.com 28511804Srjthakur@google.com // Update the bandwidth stats on the request 28611804Srjthakur@google.com if (!disableBandwidthHists) { 28711804Srjthakur@google.com writtenBytes += pkt_info.size; 28811804Srjthakur@google.com totalWrittenBytes += pkt_info.size; 28911804Srjthakur@google.com } 29011804Srjthakur@google.com 29111804Srjthakur@google.com // Sample the masked write address 29211804Srjthakur@google.com if (!disableAddrDists) 29311804Srjthakur@google.com writeAddrDist.sample(pkt_info.addr & writeAddrMask); 29411804Srjthakur@google.com 29511804Srjthakur@google.com if (!disableITTDists) { 29611804Srjthakur@google.com // Sample value of write-to-write inter transaction time 29711804Srjthakur@google.com if (timeOfLastWrite != 0) 29811804Srjthakur@google.com ittWriteWrite.sample(curTick() - timeOfLastWrite); 29911804Srjthakur@google.com timeOfLastWrite = curTick(); 30011804Srjthakur@google.com 30111804Srjthakur@google.com // Sample value of req-to-req inter transaction time 30211804Srjthakur@google.com if (timeOfLastReq != 0) 30311804Srjthakur@google.com ittReqReq.sample(curTick() - timeOfLastReq); 30411804Srjthakur@google.com timeOfLastReq = curTick(); 30511804Srjthakur@google.com } 30611804Srjthakur@google.com 30711804Srjthakur@google.com if (!is_atomic && !disableOutstandingHists && expects_response) 30811804Srjthakur@google.com ++outstandingWriteReqs; 30911804Srjthakur@google.com } 31011804Srjthakur@google.com} 31111804Srjthakur@google.com 31211804Srjthakur@google.comvoid 31311804Srjthakur@google.comCommMonitor::MonitorStats::updateRespStats( 31411804Srjthakur@google.com const ProbePoints::PacketInfo& pkt_info, Tick latency, bool is_atomic) 31511804Srjthakur@google.com{ 31611804Srjthakur@google.com if (pkt_info.cmd.isRead()) { 31711804Srjthakur@google.com // Decrement number of outstanding read requests 31811804Srjthakur@google.com if (!is_atomic && !disableOutstandingHists) { 31911804Srjthakur@google.com assert(outstandingReadReqs != 0); 32011804Srjthakur@google.com --outstandingReadReqs; 32111804Srjthakur@google.com } 32211804Srjthakur@google.com 32311804Srjthakur@google.com if (!disableLatencyHists) 32411804Srjthakur@google.com readLatencyHist.sample(latency); 32511804Srjthakur@google.com 32611804Srjthakur@google.com // Update the bandwidth stats based on responses for reads 32711804Srjthakur@google.com if (!disableBandwidthHists) { 32811804Srjthakur@google.com readBytes += pkt_info.size; 32911804Srjthakur@google.com totalReadBytes += pkt_info.size; 33011804Srjthakur@google.com } 33111804Srjthakur@google.com 33211804Srjthakur@google.com } else if (pkt_info.cmd.isWrite()) { 33311804Srjthakur@google.com // Decrement number of outstanding write requests 33411804Srjthakur@google.com if (!is_atomic && !disableOutstandingHists) { 33511804Srjthakur@google.com assert(outstandingWriteReqs != 0); 33611804Srjthakur@google.com --outstandingWriteReqs; 33711804Srjthakur@google.com } 33811804Srjthakur@google.com 33911804Srjthakur@google.com if (!disableLatencyHists) 34011804Srjthakur@google.com writeLatencyHist.sample(latency); 34111804Srjthakur@google.com } 34211804Srjthakur@google.com} 34311804Srjthakur@google.com 3448981Sandreas.hansson@arm.comTick 3458981Sandreas.hansson@arm.comCommMonitor::recvAtomic(PacketPtr pkt) 3468981Sandreas.hansson@arm.com{ 34711804Srjthakur@google.com const bool expects_response(pkt->needsResponse() && 34811804Srjthakur@google.com !pkt->cacheResponding()); 34911139Sandreas.hansson@arm.com ProbePoints::PacketInfo req_pkt_info(pkt); 35011139Sandreas.hansson@arm.com ppPktReq->notify(req_pkt_info); 35110994Sandreas.sandberg@arm.com 35210994Sandreas.sandberg@arm.com const Tick delay(masterPort.sendAtomic(pkt)); 35311804Srjthakur@google.com 35411804Srjthakur@google.com stats.updateReqStats(req_pkt_info, true, expects_response); 35511804Srjthakur@google.com if (expects_response) 35611804Srjthakur@google.com stats.updateRespStats(req_pkt_info, delay, true); 35711804Srjthakur@google.com 35814084Schunchenhsu@google.com // Some packets, such as WritebackDirty, don't need response. 35914084Schunchenhsu@google.com assert(pkt->isResponse() || !expects_response); 36011139Sandreas.hansson@arm.com ProbePoints::PacketInfo resp_pkt_info(pkt); 36111139Sandreas.hansson@arm.com ppPktResp->notify(resp_pkt_info); 36210994Sandreas.sandberg@arm.com return delay; 3638981Sandreas.hansson@arm.com} 3648981Sandreas.hansson@arm.com 3658981Sandreas.hansson@arm.comTick 3668981Sandreas.hansson@arm.comCommMonitor::recvAtomicSnoop(PacketPtr pkt) 3678981Sandreas.hansson@arm.com{ 3688981Sandreas.hansson@arm.com return slavePort.sendAtomicSnoop(pkt); 3698981Sandreas.hansson@arm.com} 3708981Sandreas.hansson@arm.com 3718981Sandreas.hansson@arm.combool 3728981Sandreas.hansson@arm.comCommMonitor::recvTimingReq(PacketPtr pkt) 3738981Sandreas.hansson@arm.com{ 3748981Sandreas.hansson@arm.com // should always see a request 3758981Sandreas.hansson@arm.com assert(pkt->isRequest()); 3768981Sandreas.hansson@arm.com 3778981Sandreas.hansson@arm.com // Store relevant fields of packet, because packet may be modified 3788981Sandreas.hansson@arm.com // or even deleted when sendTiming() is called. 37911139Sandreas.hansson@arm.com const ProbePoints::PacketInfo pkt_info(pkt); 38011139Sandreas.hansson@arm.com 38111804Srjthakur@google.com const bool expects_response(pkt->needsResponse() && 38211804Srjthakur@google.com !pkt->cacheResponding()); 3838981Sandreas.hansson@arm.com 3848981Sandreas.hansson@arm.com // If a cache miss is served by a cache, a monitor near the memory 3858981Sandreas.hansson@arm.com // would see a request which needs a response, but this response 38611284Sandreas.hansson@arm.com // would not come back from the memory. Therefore we additionally 38711284Sandreas.hansson@arm.com // have to check the cacheResponding flag 3889785Sandreas.hansson@arm.com if (expects_response && !stats.disableLatencyHists) { 3899542Sandreas.hansson@arm.com pkt->pushSenderState(new CommMonitorSenderState(curTick())); 3908981Sandreas.hansson@arm.com } 3918981Sandreas.hansson@arm.com 39211284Sandreas.hansson@arm.com // Attempt to send the packet 3938981Sandreas.hansson@arm.com bool successful = masterPort.sendTimingReq(pkt); 3948981Sandreas.hansson@arm.com 3958981Sandreas.hansson@arm.com // If not successful, restore the sender state 3969785Sandreas.hansson@arm.com if (!successful && expects_response && !stats.disableLatencyHists) { 3979542Sandreas.hansson@arm.com delete pkt->popSenderState(); 3988981Sandreas.hansson@arm.com } 3998981Sandreas.hansson@arm.com 40010994Sandreas.sandberg@arm.com if (successful) { 40111139Sandreas.hansson@arm.com ppPktReq->notify(pkt_info); 40210994Sandreas.sandberg@arm.com } 40310994Sandreas.sandberg@arm.com 40411804Srjthakur@google.com if (successful) { 40511847Spierre-yves.peneau@lirmm.fr DPRINTF(CommMonitor, "Forwarded %s request\n", pkt->isRead() ? "read" : 40611847Spierre-yves.peneau@lirmm.fr pkt->isWrite() ? "write" : "non read/write"); 40711804Srjthakur@google.com stats.updateReqStats(pkt_info, false, expects_response); 4088981Sandreas.hansson@arm.com } 4098981Sandreas.hansson@arm.com return successful; 4108981Sandreas.hansson@arm.com} 4118981Sandreas.hansson@arm.com 4128981Sandreas.hansson@arm.combool 4138981Sandreas.hansson@arm.comCommMonitor::recvTimingResp(PacketPtr pkt) 4148981Sandreas.hansson@arm.com{ 4158981Sandreas.hansson@arm.com // should always see responses 4168981Sandreas.hansson@arm.com assert(pkt->isResponse()); 4178981Sandreas.hansson@arm.com 4188981Sandreas.hansson@arm.com // Store relevant fields of packet, because packet may be modified 4198981Sandreas.hansson@arm.com // or even deleted when sendTiming() is called. 42011139Sandreas.hansson@arm.com const ProbePoints::PacketInfo pkt_info(pkt); 42111139Sandreas.hansson@arm.com 4228981Sandreas.hansson@arm.com Tick latency = 0; 4239785Sandreas.hansson@arm.com CommMonitorSenderState* received_state = 4248981Sandreas.hansson@arm.com dynamic_cast<CommMonitorSenderState*>(pkt->senderState); 4258981Sandreas.hansson@arm.com 4268981Sandreas.hansson@arm.com if (!stats.disableLatencyHists) { 4278981Sandreas.hansson@arm.com // Restore initial sender state 4289785Sandreas.hansson@arm.com if (received_state == NULL) 4298981Sandreas.hansson@arm.com panic("Monitor got a response without monitor sender state\n"); 4308981Sandreas.hansson@arm.com 4318981Sandreas.hansson@arm.com // Restore the sate 4329785Sandreas.hansson@arm.com pkt->senderState = received_state->predecessor; 4338981Sandreas.hansson@arm.com } 4348981Sandreas.hansson@arm.com 4358981Sandreas.hansson@arm.com // Attempt to send the packet 4368981Sandreas.hansson@arm.com bool successful = slavePort.sendTimingResp(pkt); 4378981Sandreas.hansson@arm.com 4388981Sandreas.hansson@arm.com if (!stats.disableLatencyHists) { 4398981Sandreas.hansson@arm.com // If packet successfully send, sample value of latency, 4408981Sandreas.hansson@arm.com // afterwards delete sender state, otherwise restore state 4418981Sandreas.hansson@arm.com if (successful) { 4429785Sandreas.hansson@arm.com latency = curTick() - received_state->transmitTime; 4438981Sandreas.hansson@arm.com DPRINTF(CommMonitor, "Latency: %d\n", latency); 4449785Sandreas.hansson@arm.com delete received_state; 4458981Sandreas.hansson@arm.com } else { 4468981Sandreas.hansson@arm.com // Don't delete anything and let the packet look like we 4478981Sandreas.hansson@arm.com // did not touch it 4489785Sandreas.hansson@arm.com pkt->senderState = received_state; 4498981Sandreas.hansson@arm.com } 4508981Sandreas.hansson@arm.com } 4518981Sandreas.hansson@arm.com 45210994Sandreas.sandberg@arm.com if (successful) { 45311139Sandreas.hansson@arm.com ppPktResp->notify(pkt_info); 45411847Spierre-yves.peneau@lirmm.fr DPRINTF(CommMonitor, "Received %s response\n", pkt->isRead() ? "read" : 45511847Spierre-yves.peneau@lirmm.fr pkt->isWrite() ? "write" : "non read/write"); 45611804Srjthakur@google.com stats.updateRespStats(pkt_info, latency, false); 4578981Sandreas.hansson@arm.com } 4588981Sandreas.hansson@arm.com return successful; 4598981Sandreas.hansson@arm.com} 4608981Sandreas.hansson@arm.com 4618981Sandreas.hansson@arm.comvoid 4628981Sandreas.hansson@arm.comCommMonitor::recvTimingSnoopReq(PacketPtr pkt) 4638981Sandreas.hansson@arm.com{ 4648981Sandreas.hansson@arm.com slavePort.sendTimingSnoopReq(pkt); 4658981Sandreas.hansson@arm.com} 4668981Sandreas.hansson@arm.com 4678981Sandreas.hansson@arm.combool 4688981Sandreas.hansson@arm.comCommMonitor::recvTimingSnoopResp(PacketPtr pkt) 4698981Sandreas.hansson@arm.com{ 4708981Sandreas.hansson@arm.com return masterPort.sendTimingSnoopResp(pkt); 4718981Sandreas.hansson@arm.com} 4728981Sandreas.hansson@arm.com 47311173Sandreas.hansson@arm.comvoid 47411173Sandreas.hansson@arm.comCommMonitor::recvRetrySnoopResp() 47511173Sandreas.hansson@arm.com{ 47611173Sandreas.hansson@arm.com slavePort.sendRetrySnoopResp(); 47711173Sandreas.hansson@arm.com} 47811173Sandreas.hansson@arm.com 4798981Sandreas.hansson@arm.combool 4808981Sandreas.hansson@arm.comCommMonitor::isSnooping() const 4818981Sandreas.hansson@arm.com{ 4829088Sandreas.hansson@arm.com // check if the connected master port is snooping 4839088Sandreas.hansson@arm.com return slavePort.isSnooping(); 4848981Sandreas.hansson@arm.com} 4858981Sandreas.hansson@arm.com 4868981Sandreas.hansson@arm.comAddrRangeList 4879090Sandreas.hansson@arm.comCommMonitor::getAddrRanges() const 4888981Sandreas.hansson@arm.com{ 4899089Sandreas.hansson@arm.com // get the address ranges of the connected slave port 4909089Sandreas.hansson@arm.com return masterPort.getAddrRanges(); 4918981Sandreas.hansson@arm.com} 4928981Sandreas.hansson@arm.com 4938981Sandreas.hansson@arm.comvoid 49410713Sandreas.hansson@arm.comCommMonitor::recvReqRetry() 4958981Sandreas.hansson@arm.com{ 49610713Sandreas.hansson@arm.com slavePort.sendRetryReq(); 4978981Sandreas.hansson@arm.com} 4988981Sandreas.hansson@arm.com 4998981Sandreas.hansson@arm.comvoid 50010713Sandreas.hansson@arm.comCommMonitor::recvRespRetry() 5018981Sandreas.hansson@arm.com{ 50210713Sandreas.hansson@arm.com masterPort.sendRetryResp(); 5038981Sandreas.hansson@arm.com} 5048981Sandreas.hansson@arm.com 50513573Ssascha.bischoff@arm.combool 50613573Ssascha.bischoff@arm.comCommMonitor::tryTiming(PacketPtr pkt) 50713573Ssascha.bischoff@arm.com{ 50813573Ssascha.bischoff@arm.com return masterPort.tryTiming(pkt); 50913573Ssascha.bischoff@arm.com} 51013573Ssascha.bischoff@arm.com 5118981Sandreas.hansson@arm.comvoid 5128981Sandreas.hansson@arm.comCommMonitor::recvRangeChange() 5138981Sandreas.hansson@arm.com{ 5148981Sandreas.hansson@arm.com slavePort.sendRangeChange(); 5158981Sandreas.hansson@arm.com} 5168981Sandreas.hansson@arm.com 5178981Sandreas.hansson@arm.comvoid 5188981Sandreas.hansson@arm.comCommMonitor::samplePeriodic() 5198981Sandreas.hansson@arm.com{ 5208981Sandreas.hansson@arm.com // the periodic stats update runs on the granularity of sample 5218981Sandreas.hansson@arm.com // periods, but in combination with this there may also be a 5228981Sandreas.hansson@arm.com // external resets and dumps of the stats (through schedStatEvent) 5238981Sandreas.hansson@arm.com // causing the stats themselves to capture less than a sample 5248981Sandreas.hansson@arm.com // period 5258981Sandreas.hansson@arm.com 5268981Sandreas.hansson@arm.com // only capture if we have not reset the stats during the last 5278981Sandreas.hansson@arm.com // sample period 5288981Sandreas.hansson@arm.com if (simTicks.value() >= samplePeriodTicks) { 5298981Sandreas.hansson@arm.com if (!stats.disableTransactionHists) { 5308981Sandreas.hansson@arm.com stats.readTransHist.sample(stats.readTrans); 5318981Sandreas.hansson@arm.com stats.writeTransHist.sample(stats.writeTrans); 5328981Sandreas.hansson@arm.com } 5338981Sandreas.hansson@arm.com 5348981Sandreas.hansson@arm.com if (!stats.disableBandwidthHists) { 5358981Sandreas.hansson@arm.com stats.readBandwidthHist.sample(stats.readBytes / samplePeriod); 5368981Sandreas.hansson@arm.com stats.writeBandwidthHist.sample(stats.writtenBytes / samplePeriod); 5378981Sandreas.hansson@arm.com } 5388981Sandreas.hansson@arm.com 5398981Sandreas.hansson@arm.com if (!stats.disableOutstandingHists) { 5408981Sandreas.hansson@arm.com stats.outstandingReadsHist.sample(stats.outstandingReadReqs); 5418981Sandreas.hansson@arm.com stats.outstandingWritesHist.sample(stats.outstandingWriteReqs); 5428981Sandreas.hansson@arm.com } 5438981Sandreas.hansson@arm.com } 5448981Sandreas.hansson@arm.com 5458981Sandreas.hansson@arm.com // reset the sampled values 5468981Sandreas.hansson@arm.com stats.readTrans = 0; 5478981Sandreas.hansson@arm.com stats.writeTrans = 0; 5488981Sandreas.hansson@arm.com 5498981Sandreas.hansson@arm.com stats.readBytes = 0; 5508981Sandreas.hansson@arm.com stats.writtenBytes = 0; 5518981Sandreas.hansson@arm.com 5528981Sandreas.hansson@arm.com schedule(samplePeriodicEvent, curTick() + samplePeriodTicks); 5538981Sandreas.hansson@arm.com} 5548981Sandreas.hansson@arm.com 5558981Sandreas.hansson@arm.comvoid 5568981Sandreas.hansson@arm.comCommMonitor::startup() 5578981Sandreas.hansson@arm.com{ 5588981Sandreas.hansson@arm.com schedule(samplePeriodicEvent, curTick() + samplePeriodTicks); 5598981Sandreas.hansson@arm.com} 560