base.cc revision 13419
12889Sbinkertn@umich.edu/* 22889Sbinkertn@umich.edu * Copyright (c) 2013,2016,2018 ARM Limited 32889Sbinkertn@umich.edu * All rights reserved. 42889Sbinkertn@umich.edu * 52889Sbinkertn@umich.edu * The license below extends only to copyright in the software and shall 62889Sbinkertn@umich.edu * not be construed as granting a license to any other intellectual 72889Sbinkertn@umich.edu * property including but not limited to intellectual property relating 82889Sbinkertn@umich.edu * to a hardware implementation of the functionality of the software 92889Sbinkertn@umich.edu * licensed hereunder. You may use the software subject to the license 102889Sbinkertn@umich.edu * terms below provided that you ensure that this notice is replicated 112889Sbinkertn@umich.edu * unmodified and in its entirety in all distributions of the software, 122889Sbinkertn@umich.edu * modified or unmodified, in source code or in binary form. 132889Sbinkertn@umich.edu * 142889Sbinkertn@umich.edu * Copyright (c) 2003-2005 The Regents of The University of Michigan 152889Sbinkertn@umich.edu * All rights reserved. 162889Sbinkertn@umich.edu * 172889Sbinkertn@umich.edu * Redistribution and use in source and binary forms, with or without 182889Sbinkertn@umich.edu * modification, are permitted provided that the following conditions are 192889Sbinkertn@umich.edu * met: redistributions of source code must retain the above copyright 202889Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer; 212889Sbinkertn@umich.edu * redistributions in binary form must reproduce the above copyright 222889Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer in the 232889Sbinkertn@umich.edu * documentation and/or other materials provided with the distribution; 242889Sbinkertn@umich.edu * neither the name of the copyright holders nor the names of its 252889Sbinkertn@umich.edu * contributors may be used to endorse or promote products derived from 262889Sbinkertn@umich.edu * this software without specific prior written permission. 272889Sbinkertn@umich.edu * 282889Sbinkertn@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 292889Sbinkertn@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 302889Sbinkertn@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 312889Sbinkertn@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 324053Sbinkertn@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 332889Sbinkertn@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 342889Sbinkertn@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 352889Sbinkertn@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 362889Sbinkertn@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 372889Sbinkertn@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 382889Sbinkertn@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 392889Sbinkertn@umich.edu * 402889Sbinkertn@umich.edu * Authors: Erik Hallnor 412889Sbinkertn@umich.edu * Ron Dreslinski 422889Sbinkertn@umich.edu */ 432889Sbinkertn@umich.edu 444053Sbinkertn@umich.edu/** 454053Sbinkertn@umich.edu * @file 464053Sbinkertn@umich.edu * Definitions of BaseTags. 474053Sbinkertn@umich.edu */ 484053Sbinkertn@umich.edu 494053Sbinkertn@umich.edu#include "mem/cache/tags/base.hh" 504053Sbinkertn@umich.edu 514053Sbinkertn@umich.edu#include <cassert> 524053Sbinkertn@umich.edu 534053Sbinkertn@umich.edu#include "base/types.hh" 544053Sbinkertn@umich.edu#include "mem/cache/replacement_policies/replaceable_entry.hh" 554053Sbinkertn@umich.edu#include "mem/cache/tags/indexing_policies/base.hh" 564053Sbinkertn@umich.edu#include "mem/request.hh" 572889Sbinkertn@umich.edu#include "sim/core.hh" 582889Sbinkertn@umich.edu#include "sim/sim_exit.hh" 592889Sbinkertn@umich.edu#include "sim/system.hh" 602889Sbinkertn@umich.edu 612889Sbinkertn@umich.eduBaseTags::BaseTags(const Params *p) 622890Sbinkertn@umich.edu : ClockedObject(p), blkSize(p->block_size), blkMask(blkSize - 1), 632889Sbinkertn@umich.edu size(p->size), lookupLatency(p->tag_latency), 642889Sbinkertn@umich.edu system(p->system), indexingPolicy(p->indexing_policy), 652889Sbinkertn@umich.edu warmupBound((p->warmup_percentage/100.0) * (p->size / p->block_size)), 662889Sbinkertn@umich.edu warmedUp(false), numBlocks(p->size / p->block_size), 672889Sbinkertn@umich.edu dataBlks(new uint8_t[p->size]) // Allocate data storage in one big chunk 682889Sbinkertn@umich.edu{ 692889Sbinkertn@umich.edu} 702889Sbinkertn@umich.edu 712889Sbinkertn@umich.eduReplaceableEntry* 722889Sbinkertn@umich.eduBaseTags::findBlockBySetAndWay(int set, int way) const 732889Sbinkertn@umich.edu{ 742889Sbinkertn@umich.edu return indexingPolicy->getEntry(set, way); 752889Sbinkertn@umich.edu} 762889Sbinkertn@umich.edu 772889Sbinkertn@umich.eduCacheBlk* 782889Sbinkertn@umich.eduBaseTags::findBlock(Addr addr, bool is_secure) const 792889Sbinkertn@umich.edu{ 802889Sbinkertn@umich.edu // Extract block tag 812889Sbinkertn@umich.edu Addr tag = extractTag(addr); 822889Sbinkertn@umich.edu 832889Sbinkertn@umich.edu // Find possible entries that may contain the given address 842889Sbinkertn@umich.edu const std::vector<ReplaceableEntry*> entries = 852889Sbinkertn@umich.edu indexingPolicy->getPossibleEntries(addr); 862889Sbinkertn@umich.edu 872889Sbinkertn@umich.edu // Search for block 882889Sbinkertn@umich.edu for (const auto& location : entries) { 892889Sbinkertn@umich.edu CacheBlk* blk = static_cast<CacheBlk*>(location); 902889Sbinkertn@umich.edu if ((blk->tag == tag) && blk->isValid() && 912889Sbinkertn@umich.edu (blk->isSecure() == is_secure)) { 922889Sbinkertn@umich.edu return blk; 932889Sbinkertn@umich.edu } 942889Sbinkertn@umich.edu } 952889Sbinkertn@umich.edu 962889Sbinkertn@umich.edu // Did not find block 972889Sbinkertn@umich.edu return nullptr; 982889Sbinkertn@umich.edu} 992889Sbinkertn@umich.edu 1002889Sbinkertn@umich.eduvoid 1012889Sbinkertn@umich.eduBaseTags::insertBlock(const Addr addr, const bool is_secure, 1022889Sbinkertn@umich.edu const int src_master_ID, const uint32_t task_ID, 1032889Sbinkertn@umich.edu CacheBlk *blk) 1042889Sbinkertn@umich.edu{ 1052889Sbinkertn@umich.edu assert(!blk->isValid()); 1062889Sbinkertn@umich.edu 1072889Sbinkertn@umich.edu // Previous block, if existed, has been removed, and now we have 1082889Sbinkertn@umich.edu // to insert the new one 1092889Sbinkertn@umich.edu // Deal with what we are bringing in 1102889Sbinkertn@umich.edu assert(src_master_ID < system->maxMasters()); 1112889Sbinkertn@umich.edu occupancies[src_master_ID]++; 1122889Sbinkertn@umich.edu 1132889Sbinkertn@umich.edu // Insert block with tag, src master id and task id 1142889Sbinkertn@umich.edu blk->insert(extractTag(addr), is_secure, src_master_ID, task_ID); 1152889Sbinkertn@umich.edu 1162889Sbinkertn@umich.edu // Check if cache warm up is done 1172889Sbinkertn@umich.edu if (!warmedUp && tagsInUse.value() >= warmupBound) { 1182889Sbinkertn@umich.edu warmedUp = true; 1192889Sbinkertn@umich.edu warmupCycle = curTick(); 1202889Sbinkertn@umich.edu } 1212889Sbinkertn@umich.edu 1222889Sbinkertn@umich.edu // We only need to write into one tag and one data block. 1232889Sbinkertn@umich.edu tagAccesses += 1; 1242889Sbinkertn@umich.edu dataAccesses += 1; 1252889Sbinkertn@umich.edu} 1262889Sbinkertn@umich.edu 1272889Sbinkertn@umich.eduAddr 1282889Sbinkertn@umich.eduBaseTags::extractTag(const Addr addr) const 1292889Sbinkertn@umich.edu{ 1302889Sbinkertn@umich.edu return indexingPolicy->extractTag(addr); 1312899Sbinkertn@umich.edu} 1322899Sbinkertn@umich.edu 1332889Sbinkertn@umich.eduvoid 1342889Sbinkertn@umich.eduBaseTags::cleanupRefsVisitor(CacheBlk &blk) 1352889Sbinkertn@umich.edu{ 1362889Sbinkertn@umich.edu if (blk.isValid()) { 1372889Sbinkertn@umich.edu totalRefs += blk.refCount; 1382889Sbinkertn@umich.edu ++sampledRefs; 1392889Sbinkertn@umich.edu } 1402889Sbinkertn@umich.edu} 1412889Sbinkertn@umich.edu 1422889Sbinkertn@umich.eduvoid 1432889Sbinkertn@umich.eduBaseTags::cleanupRefs() 1442889Sbinkertn@umich.edu{ 1452889Sbinkertn@umich.edu forEachBlk([this](CacheBlk &blk) { cleanupRefsVisitor(blk); }); 1462889Sbinkertn@umich.edu} 1472889Sbinkertn@umich.edu 1482889Sbinkertn@umich.eduvoid 1492889Sbinkertn@umich.eduBaseTags::computeStatsVisitor(CacheBlk &blk) 1502889Sbinkertn@umich.edu{ 1512889Sbinkertn@umich.edu if (blk.isValid()) { 1524053Sbinkertn@umich.edu assert(blk.task_id < ContextSwitchTaskId::NumTaskId); 1534053Sbinkertn@umich.edu occupanciesTaskId[blk.task_id]++; 1542889Sbinkertn@umich.edu assert(blk.tickInserted <= curTick()); 1554053Sbinkertn@umich.edu Tick age = curTick() - blk.tickInserted; 1564044Sbinkertn@umich.edu 1574044Sbinkertn@umich.edu int age_index; 1582889Sbinkertn@umich.edu if (age / SimClock::Int::us < 10) { // <10us 1592889Sbinkertn@umich.edu age_index = 0; 1602889Sbinkertn@umich.edu } else if (age / SimClock::Int::us < 100) { // <100us 1612889Sbinkertn@umich.edu age_index = 1; 1622889Sbinkertn@umich.edu } else if (age / SimClock::Int::ms < 1) { // <1ms 1632889Sbinkertn@umich.edu age_index = 2; 1642889Sbinkertn@umich.edu } else if (age / SimClock::Int::ms < 10) { // <10ms 1652889Sbinkertn@umich.edu age_index = 3; 1662889Sbinkertn@umich.edu } else 1672903Ssaidi@eecs.umich.edu age_index = 4; // >10ms 1682889Sbinkertn@umich.edu 1692889Sbinkertn@umich.edu ageTaskId[blk.task_id][age_index]++; 1702889Sbinkertn@umich.edu } 1712889Sbinkertn@umich.edu} 1722889Sbinkertn@umich.edu 1732889Sbinkertn@umich.eduvoid 1742889Sbinkertn@umich.eduBaseTags::computeStats() 1752889Sbinkertn@umich.edu{ 1762889Sbinkertn@umich.edu for (unsigned i = 0; i < ContextSwitchTaskId::NumTaskId; ++i) { 1772889Sbinkertn@umich.edu occupanciesTaskId[i] = 0; 1782889Sbinkertn@umich.edu for (unsigned j = 0; j < 5; ++j) { 1792889Sbinkertn@umich.edu ageTaskId[i][j] = 0; 1802889Sbinkertn@umich.edu } 1812889Sbinkertn@umich.edu } 1822889Sbinkertn@umich.edu 1832889Sbinkertn@umich.edu forEachBlk([this](CacheBlk &blk) { computeStatsVisitor(blk); }); 1842889Sbinkertn@umich.edu} 1852889Sbinkertn@umich.edu 1862889Sbinkertn@umich.edustd::string 1872889Sbinkertn@umich.eduBaseTags::print() 1882889Sbinkertn@umich.edu{ 1892889Sbinkertn@umich.edu std::string str; 1904042Sbinkertn@umich.edu 1914042Sbinkertn@umich.edu auto print_blk = [&str](CacheBlk &blk) { 1923624Sbinkertn@umich.edu if (blk.isValid()) 1932889Sbinkertn@umich.edu str += csprintf("\tBlock: %s\n", blk.print()); 1942889Sbinkertn@umich.edu }; 1952889Sbinkertn@umich.edu forEachBlk(print_blk); 1962889Sbinkertn@umich.edu 1972889Sbinkertn@umich.edu if (str.empty()) 1982889Sbinkertn@umich.edu str = "no valid tags\n"; 1992889Sbinkertn@umich.edu 2002889Sbinkertn@umich.edu return str; 2012889Sbinkertn@umich.edu} 2022889Sbinkertn@umich.edu 2032889Sbinkertn@umich.eduvoid 2042889Sbinkertn@umich.eduBaseTags::regStats() 2052889Sbinkertn@umich.edu{ 2062889Sbinkertn@umich.edu ClockedObject::regStats(); 2072889Sbinkertn@umich.edu 2082889Sbinkertn@umich.edu using namespace Stats; 2092889Sbinkertn@umich.edu 2102889Sbinkertn@umich.edu tagsInUse 2112889Sbinkertn@umich.edu .name(name() + ".tagsinuse") 2122889Sbinkertn@umich.edu .desc("Cycle average of tags in use") 2132889Sbinkertn@umich.edu ; 2142889Sbinkertn@umich.edu 2152889Sbinkertn@umich.edu totalRefs 2162889Sbinkertn@umich.edu .name(name() + ".total_refs") 2172889Sbinkertn@umich.edu .desc("Total number of references to valid blocks.") 2182889Sbinkertn@umich.edu ; 2192889Sbinkertn@umich.edu 2202889Sbinkertn@umich.edu sampledRefs 2212889Sbinkertn@umich.edu .name(name() + ".sampled_refs") 2222889Sbinkertn@umich.edu .desc("Sample count of references to valid blocks.") 2234053Sbinkertn@umich.edu ; 2244053Sbinkertn@umich.edu 2254053Sbinkertn@umich.edu avgRefs 2264053Sbinkertn@umich.edu .name(name() + ".avg_refs") 2274053Sbinkertn@umich.edu .desc("Average number of references to valid blocks.") 2284053Sbinkertn@umich.edu ; 2294053Sbinkertn@umich.edu 2304053Sbinkertn@umich.edu avgRefs = totalRefs/sampledRefs; 2314053Sbinkertn@umich.edu 2324053Sbinkertn@umich.edu warmupCycle 2334053Sbinkertn@umich.edu .name(name() + ".warmup_cycle") 2344053Sbinkertn@umich.edu .desc("Cycle when the warmup percentage was hit.") 2354053Sbinkertn@umich.edu ; 2362889Sbinkertn@umich.edu 2372889Sbinkertn@umich.edu occupancies 2382889Sbinkertn@umich.edu .init(system->maxMasters()) 2392889Sbinkertn@umich.edu .name(name() + ".occ_blocks") 2402889Sbinkertn@umich.edu .desc("Average occupied blocks per requestor") 2412889Sbinkertn@umich.edu .flags(nozero | nonan) 2422889Sbinkertn@umich.edu ; 2433624Sbinkertn@umich.edu for (int i = 0; i < system->maxMasters(); i++) { 2442889Sbinkertn@umich.edu occupancies.subname(i, system->getMasterName(i)); 2452889Sbinkertn@umich.edu } 2462967Sktlim@umich.edu 2472967Sktlim@umich.edu avgOccs 2482967Sktlim@umich.edu .name(name() + ".occ_percent") 2492967Sktlim@umich.edu .desc("Average percentage of cache occupancy") 2502889Sbinkertn@umich.edu .flags(nozero | total) 2512889Sbinkertn@umich.edu ; 2522889Sbinkertn@umich.edu for (int i = 0; i < system->maxMasters(); i++) { 2532922Sktlim@umich.edu avgOccs.subname(i, system->getMasterName(i)); 2542922Sktlim@umich.edu } 2554053Sbinkertn@umich.edu 2562889Sbinkertn@umich.edu avgOccs = occupancies / Stats::constant(numBlocks); 2572889Sbinkertn@umich.edu 2582889Sbinkertn@umich.edu occupanciesTaskId 2593624Sbinkertn@umich.edu .init(ContextSwitchTaskId::NumTaskId) 2602889Sbinkertn@umich.edu .name(name() + ".occ_task_id_blocks") 2612889Sbinkertn@umich.edu .desc("Occupied blocks per task id") 2622889Sbinkertn@umich.edu .flags(nozero | nonan) 2632889Sbinkertn@umich.edu ; 2642889Sbinkertn@umich.edu 2652889Sbinkertn@umich.edu ageTaskId 2662889Sbinkertn@umich.edu .init(ContextSwitchTaskId::NumTaskId, 5) 2674078Sbinkertn@umich.edu .name(name() + ".age_task_id_blocks") 2682889Sbinkertn@umich.edu .desc("Occupied blocks per task id") 2692889Sbinkertn@umich.edu .flags(nozero | nonan) 2703645Sbinkertn@umich.edu ; 2713645Sbinkertn@umich.edu 2722889Sbinkertn@umich.edu percentOccsTaskId 2734053Sbinkertn@umich.edu .name(name() + ".occ_task_id_percent") 2744053Sbinkertn@umich.edu .desc("Percentage of cache occupancy per task id") 2754042Sbinkertn@umich.edu .flags(nozero) 2764053Sbinkertn@umich.edu ; 2774053Sbinkertn@umich.edu 2784053Sbinkertn@umich.edu percentOccsTaskId = occupanciesTaskId / Stats::constant(numBlocks); 2794053Sbinkertn@umich.edu 2804053Sbinkertn@umich.edu tagAccesses 2814053Sbinkertn@umich.edu .name(name() + ".tag_accesses") 2824053Sbinkertn@umich.edu .desc("Number of tag accesses") 2834053Sbinkertn@umich.edu ; 2844053Sbinkertn@umich.edu 2854053Sbinkertn@umich.edu dataAccesses 2864053Sbinkertn@umich.edu .name(name() + ".data_accesses") 2874053Sbinkertn@umich.edu .desc("Number of data accesses") 2884053Sbinkertn@umich.edu ; 2894053Sbinkertn@umich.edu 2904046Sbinkertn@umich.edu registerDumpCallback(new BaseTagsDumpCallback(this)); 2914042Sbinkertn@umich.edu registerExitCallback(new BaseTagsCallback(this)); 2924053Sbinkertn@umich.edu} 2934053Sbinkertn@umich.edu