base.cc revision 12728
11060SN/A/* 29814Sandreas.hansson@arm.com * Copyright (c) 2013,2016,2018 ARM Limited 39920Syasuko.eckert@amd.com * All rights reserved. 47944SGiacomo.Gabrielli@arm.com * 57944SGiacomo.Gabrielli@arm.com * The license below extends only to copyright in the software and shall 67944SGiacomo.Gabrielli@arm.com * not be construed as granting a license to any other intellectual 77944SGiacomo.Gabrielli@arm.com * property including but not limited to intellectual property relating 87944SGiacomo.Gabrielli@arm.com * to a hardware implementation of the functionality of the software 97944SGiacomo.Gabrielli@arm.com * licensed hereunder. You may use the software subject to the license 107944SGiacomo.Gabrielli@arm.com * terms below provided that you ensure that this notice is replicated 117944SGiacomo.Gabrielli@arm.com * unmodified and in its entirety in all distributions of the software, 127944SGiacomo.Gabrielli@arm.com * modified or unmodified, in source code or in binary form. 137944SGiacomo.Gabrielli@arm.com * 147944SGiacomo.Gabrielli@arm.com * Copyright (c) 2003-2005 The Regents of The University of Michigan 152702Sktlim@umich.edu * All rights reserved. 166973Stjones1@inf.ed.ac.uk * 171060SN/A * Redistribution and use in source and binary forms, with or without 181060SN/A * modification, are permitted provided that the following conditions are 191060SN/A * met: redistributions of source code must retain the above copyright 201060SN/A * notice, this list of conditions and the following disclaimer; 211060SN/A * redistributions in binary form must reproduce the above copyright 221060SN/A * notice, this list of conditions and the following disclaimer in the 231060SN/A * documentation and/or other materials provided with the distribution; 241060SN/A * neither the name of the copyright holders nor the names of its 251060SN/A * contributors may be used to endorse or promote products derived from 261060SN/A * this software without specific prior written permission. 271060SN/A * 281060SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 291060SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 301060SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 311060SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 321060SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 331060SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 341060SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 351060SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 361060SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 371060SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 381060SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 391060SN/A * 401060SN/A * Authors: Erik Hallnor 412665Ssaidi@eecs.umich.edu * Ron Dreslinski 422665Ssaidi@eecs.umich.edu */ 436973Stjones1@inf.ed.ac.uk 441060SN/A/** 451060SN/A * @file 461464SN/A * Definitions of BaseTags. 471464SN/A */ 481060SN/A 492731Sktlim@umich.edu#include "mem/cache/tags/base.hh" 502292SN/A 511464SN/A#include <cassert> 528733Sgeoffrey.blake@arm.com 531060SN/A#include "base/types.hh" 5410687SAndreas.Sandberg@ARM.com#include "mem/cache/base.hh" 557720Sgblack@eecs.umich.edu#include "mem/packet.hh" 561060SN/A#include "mem/request.hh" 576658Snate@binkert.org#include "sim/core.hh" 588887Sgeoffrey.blake@arm.com#include "sim/sim_exit.hh" 593770Sgblack@eecs.umich.edu#include "sim/system.hh" 6010319SAndreas.Sandberg@ARM.com 611464SN/ABaseTags::BaseTags(const Params *p) 621464SN/A : ClockedObject(p), blkSize(p->block_size), blkMask(blkSize - 1), 632669Sktlim@umich.edu size(p->size), 641060SN/A lookupLatency(p->tag_latency), 656973Stjones1@inf.ed.ac.uk accessLatency(p->sequential_access ? 662669Sktlim@umich.edu p->tag_latency + p->data_latency : 677678Sgblack@eecs.umich.edu std::max(p->tag_latency, p->data_latency)), 682292SN/A cache(nullptr), 691060SN/A warmupBound((p->warmup_percentage/100.0) * (p->size / p->block_size)), 701060SN/A warmedUp(false), numBlocks(p->size / p->block_size), 711060SN/A dataBlks(new uint8_t[p->size]) // Allocate data storage in one big chunk 721060SN/A{ 731060SN/A} 741060SN/A 751060SN/Avoid 7610319SAndreas.Sandberg@ARM.comBaseTags::setCache(BaseCache *_cache) 771060SN/A{ 781060SN/A assert(!cache); 791060SN/A cache = _cache; 802733Sktlim@umich.edu} 812733Sktlim@umich.edu 821060SN/Avoid 832292SN/ABaseTags::insertBlock(PacketPtr pkt, CacheBlk *blk) 842107SN/A{ 851060SN/A assert(!blk->isValid()); 862292SN/A 872292SN/A // Get address 888486Sgblack@eecs.umich.edu Addr addr = pkt->getAddr(); 892292SN/A 902292SN/A // Previous block, if existed, has been removed, and now we have 912292SN/A // to insert the new one 922292SN/A 931060SN/A // Deal with what we are bringing in 945543Ssaidi@eecs.umich.edu MasterID master_id = pkt->req->masterId(); 958902Sandreas.hansson@arm.com assert(master_id < cache->system->maxMasters()); 961060SN/A occupancies[master_id]++; 971060SN/A 989046SAli.Saidi@ARM.com // Insert block with tag, src master id and task id 999046SAli.Saidi@ARM.com blk->insert(extractTag(addr), pkt->isSecure(), master_id, 1009046SAli.Saidi@ARM.com pkt->req->taskId()); 1019046SAli.Saidi@ARM.com 1029046SAli.Saidi@ARM.com tagsInUse++; 1039046SAli.Saidi@ARM.com if (!warmedUp && tagsInUse.value() >= warmupBound) { 1049046SAli.Saidi@ARM.com warmedUp = true; 1059046SAli.Saidi@ARM.com warmupCycle = curTick(); 1069046SAli.Saidi@ARM.com } 1079046SAli.Saidi@ARM.com 1089046SAli.Saidi@ARM.com // We only need to write into one tag and one data block. 1099046SAli.Saidi@ARM.com tagAccesses += 1; 1109046SAli.Saidi@ARM.com dataAccesses += 1; 1119046SAli.Saidi@ARM.com} 1129046SAli.Saidi@ARM.com 1139046SAli.Saidi@ARM.comvoid 1149046SAli.Saidi@ARM.comBaseTags::cleanupRefsVisitor(CacheBlk &blk) 1159046SAli.Saidi@ARM.com{ 1169046SAli.Saidi@ARM.com if (blk.isValid()) { 1179046SAli.Saidi@ARM.com totalRefs += blk.refCount; 1189046SAli.Saidi@ARM.com ++sampledRefs; 1199046SAli.Saidi@ARM.com } 1209046SAli.Saidi@ARM.com} 1219046SAli.Saidi@ARM.com 1229046SAli.Saidi@ARM.comvoid 1239046SAli.Saidi@ARM.comBaseTags::cleanupRefs() 1249046SAli.Saidi@ARM.com{ 1259046SAli.Saidi@ARM.com forEachBlk([this](CacheBlk &blk) { cleanupRefsVisitor(blk); }); 1269046SAli.Saidi@ARM.com} 1279046SAli.Saidi@ARM.com 1289046SAli.Saidi@ARM.comvoid 1299046SAli.Saidi@ARM.comBaseTags::computeStatsVisitor(CacheBlk &blk) 1309046SAli.Saidi@ARM.com{ 1319046SAli.Saidi@ARM.com if (blk.isValid()) { 1329046SAli.Saidi@ARM.com assert(blk.task_id < ContextSwitchTaskId::NumTaskId); 1339046SAli.Saidi@ARM.com occupanciesTaskId[blk.task_id]++; 1349046SAli.Saidi@ARM.com assert(blk.tickInserted <= curTick()); 1359046SAli.Saidi@ARM.com Tick age = curTick() - blk.tickInserted; 1369046SAli.Saidi@ARM.com 1379046SAli.Saidi@ARM.com int age_index; 1389046SAli.Saidi@ARM.com if (age / SimClock::Int::us < 10) { // <10us 1399046SAli.Saidi@ARM.com age_index = 0; 1409046SAli.Saidi@ARM.com } else if (age / SimClock::Int::us < 100) { // <100us 1419046SAli.Saidi@ARM.com age_index = 1; 1429046SAli.Saidi@ARM.com } else if (age / SimClock::Int::ms < 1) { // <1ms 1439046SAli.Saidi@ARM.com age_index = 2; 1449046SAli.Saidi@ARM.com } else if (age / SimClock::Int::ms < 10) { // <10ms 1459046SAli.Saidi@ARM.com age_index = 3; 1469046SAli.Saidi@ARM.com } else 14710824SAndreas.Sandberg@ARM.com age_index = 4; // >10ms 1489046SAli.Saidi@ARM.com 1499046SAli.Saidi@ARM.com ageTaskId[blk.task_id][age_index]++; 1509046SAli.Saidi@ARM.com } 1519046SAli.Saidi@ARM.com} 1529046SAli.Saidi@ARM.com 1539046SAli.Saidi@ARM.comvoid 1549046SAli.Saidi@ARM.comBaseTags::computeStats() 1559046SAli.Saidi@ARM.com{ 1569046SAli.Saidi@ARM.com for (unsigned i = 0; i < ContextSwitchTaskId::NumTaskId; ++i) { 1572292SN/A occupanciesTaskId[i] = 0; 15810417Sandreas.hansson@arm.com for (unsigned j = 0; j < 5; ++j) { 1599046SAli.Saidi@ARM.com ageTaskId[i][j] = 0; 1609046SAli.Saidi@ARM.com } 1619046SAli.Saidi@ARM.com } 1629046SAli.Saidi@ARM.com 16310030SAli.Saidi@ARM.com forEachBlk([this](CacheBlk &blk) { computeStatsVisitor(blk); }); 16410030SAli.Saidi@ARM.com} 1659046SAli.Saidi@ARM.com 1669046SAli.Saidi@ARM.comstd::string 1679046SAli.Saidi@ARM.comBaseTags::print() 1689046SAli.Saidi@ARM.com{ 1699046SAli.Saidi@ARM.com std::string str; 1709046SAli.Saidi@ARM.com 1719046SAli.Saidi@ARM.com auto print_blk = [&str](CacheBlk &blk) { 1729046SAli.Saidi@ARM.com if (blk.isValid()) 1739046SAli.Saidi@ARM.com str += csprintf("\tset: %d way: %d %s\n", blk.set, blk.way, 1749046SAli.Saidi@ARM.com blk.print()); 1759046SAli.Saidi@ARM.com }; 1769046SAli.Saidi@ARM.com forEachBlk(print_blk); 1779046SAli.Saidi@ARM.com 1789046SAli.Saidi@ARM.com if (str.empty()) 1799046SAli.Saidi@ARM.com str = "no valid tags\n"; 1809046SAli.Saidi@ARM.com 1819046SAli.Saidi@ARM.com return str; 1829046SAli.Saidi@ARM.com} 1839046SAli.Saidi@ARM.com 1849046SAli.Saidi@ARM.comvoid 1859046SAli.Saidi@ARM.comBaseTags::regStats() 1869046SAli.Saidi@ARM.com{ 1879046SAli.Saidi@ARM.com ClockedObject::regStats(); 1889046SAli.Saidi@ARM.com 1899046SAli.Saidi@ARM.com using namespace Stats; 1909046SAli.Saidi@ARM.com 1919046SAli.Saidi@ARM.com tagsInUse 1929046SAli.Saidi@ARM.com .name(name() + ".tagsinuse") 1939046SAli.Saidi@ARM.com .desc("Cycle average of tags in use") 1949046SAli.Saidi@ARM.com ; 1959046SAli.Saidi@ARM.com 1969046SAli.Saidi@ARM.com totalRefs 1979046SAli.Saidi@ARM.com .name(name() + ".total_refs") 1989046SAli.Saidi@ARM.com .desc("Total number of references to valid blocks.") 1999046SAli.Saidi@ARM.com ; 2009046SAli.Saidi@ARM.com 2019046SAli.Saidi@ARM.com sampledRefs 2029046SAli.Saidi@ARM.com .name(name() + ".sampled_refs") 2039046SAli.Saidi@ARM.com .desc("Sample count of references to valid blocks.") 2049046SAli.Saidi@ARM.com ; 2059046SAli.Saidi@ARM.com 20610417Sandreas.hansson@arm.com avgRefs 2071060SN/A .name(name() + ".avg_refs") 2089046SAli.Saidi@ARM.com .desc("Average number of references to valid blocks.") 2099046SAli.Saidi@ARM.com ; 2109046SAli.Saidi@ARM.com 2119046SAli.Saidi@ARM.com avgRefs = totalRefs/sampledRefs; 2129046SAli.Saidi@ARM.com 2139046SAli.Saidi@ARM.com warmupCycle 2149046SAli.Saidi@ARM.com .name(name() + ".warmup_cycle") 2159046SAli.Saidi@ARM.com .desc("Cycle when the warmup percentage was hit.") 2169046SAli.Saidi@ARM.com ; 2179046SAli.Saidi@ARM.com 2189046SAli.Saidi@ARM.com occupancies 2199046SAli.Saidi@ARM.com .init(cache->system->maxMasters()) 2209046SAli.Saidi@ARM.com .name(name() + ".occ_blocks") 2219046SAli.Saidi@ARM.com .desc("Average occupied blocks per requestor") 2229046SAli.Saidi@ARM.com .flags(nozero | nonan) 2239046SAli.Saidi@ARM.com ; 2249046SAli.Saidi@ARM.com for (int i = 0; i < cache->system->maxMasters(); i++) { 2259046SAli.Saidi@ARM.com occupancies.subname(i, cache->system->getMasterName(i)); 2269046SAli.Saidi@ARM.com } 2279046SAli.Saidi@ARM.com 2289046SAli.Saidi@ARM.com avgOccs 2299046SAli.Saidi@ARM.com .name(name() + ".occ_percent") 2309046SAli.Saidi@ARM.com .desc("Average percentage of cache occupancy") 2319046SAli.Saidi@ARM.com .flags(nozero | total) 2329046SAli.Saidi@ARM.com ; 2339046SAli.Saidi@ARM.com for (int i = 0; i < cache->system->maxMasters(); i++) { 2349046SAli.Saidi@ARM.com avgOccs.subname(i, cache->system->getMasterName(i)); 2359046SAli.Saidi@ARM.com } 2369046SAli.Saidi@ARM.com 2379046SAli.Saidi@ARM.com avgOccs = occupancies / Stats::constant(numBlocks); 2389046SAli.Saidi@ARM.com 2399046SAli.Saidi@ARM.com occupanciesTaskId 2409046SAli.Saidi@ARM.com .init(ContextSwitchTaskId::NumTaskId) 2419046SAli.Saidi@ARM.com .name(name() + ".occ_task_id_blocks") 2429046SAli.Saidi@ARM.com .desc("Occupied blocks per task id") 2439046SAli.Saidi@ARM.com .flags(nozero | nonan) 2449046SAli.Saidi@ARM.com ; 2459046SAli.Saidi@ARM.com 2469046SAli.Saidi@ARM.com ageTaskId 2479046SAli.Saidi@ARM.com .init(ContextSwitchTaskId::NumTaskId, 5) 2489046SAli.Saidi@ARM.com .name(name() + ".age_task_id_blocks") 2499046SAli.Saidi@ARM.com .desc("Occupied blocks per task id") 2509046SAli.Saidi@ARM.com .flags(nozero | nonan) 2519046SAli.Saidi@ARM.com ; 2529046SAli.Saidi@ARM.com 2539046SAli.Saidi@ARM.com percentOccsTaskId 2549046SAli.Saidi@ARM.com .name(name() + ".occ_task_id_percent") 2559046SAli.Saidi@ARM.com .desc("Percentage of cache occupancy per task id") 2569046SAli.Saidi@ARM.com .flags(nozero) 2579046SAli.Saidi@ARM.com ; 2589046SAli.Saidi@ARM.com 2599046SAli.Saidi@ARM.com percentOccsTaskId = occupanciesTaskId / Stats::constant(numBlocks); 2609046SAli.Saidi@ARM.com 2619046SAli.Saidi@ARM.com tagAccesses 2629046SAli.Saidi@ARM.com .name(name() + ".tag_accesses") 2639046SAli.Saidi@ARM.com .desc("Number of tag accesses") 2649046SAli.Saidi@ARM.com ; 2659046SAli.Saidi@ARM.com 2669046SAli.Saidi@ARM.com dataAccesses 2679046SAli.Saidi@ARM.com .name(name() + ".data_accesses") 2689046SAli.Saidi@ARM.com .desc("Number of data accesses") 2699046SAli.Saidi@ARM.com ; 2709046SAli.Saidi@ARM.com 2719046SAli.Saidi@ARM.com registerDumpCallback(new BaseTagsDumpCallback(this)); 2729046SAli.Saidi@ARM.com registerExitCallback(new BaseTagsCallback(this)); 2739046SAli.Saidi@ARM.com} 2749046SAli.Saidi@ARM.com