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