base.cc revision 12691
15347Ssaidi@eecs.umich.edu/*
27534Ssteve.reinhardt@amd.com * Copyright (c) 2013,2016 ARM Limited
33395Shsul@eecs.umich.edu * All rights reserved.
43395Shsul@eecs.umich.edu *
53395Shsul@eecs.umich.edu * The license below extends only to copyright in the software and shall
63395Shsul@eecs.umich.edu * not be construed as granting a license to any other intellectual
73395Shsul@eecs.umich.edu * property including but not limited to intellectual property relating
83395Shsul@eecs.umich.edu * to a hardware implementation of the functionality of the software
93395Shsul@eecs.umich.edu * licensed hereunder.  You may use the software subject to the license
103395Shsul@eecs.umich.edu * terms below provided that you ensure that this notice is replicated
113395Shsul@eecs.umich.edu * unmodified and in its entirety in all distributions of the software,
123395Shsul@eecs.umich.edu * modified or unmodified, in source code or in binary form.
133395Shsul@eecs.umich.edu *
143395Shsul@eecs.umich.edu * Copyright (c) 2003-2005 The Regents of The University of Michigan
153395Shsul@eecs.umich.edu * All rights reserved.
163395Shsul@eecs.umich.edu *
173395Shsul@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
183395Shsul@eecs.umich.edu * modification, are permitted provided that the following conditions are
193395Shsul@eecs.umich.edu * met: redistributions of source code must retain the above copyright
203395Shsul@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
213395Shsul@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
223395Shsul@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
233395Shsul@eecs.umich.edu * documentation and/or other materials provided with the distribution;
243395Shsul@eecs.umich.edu * neither the name of the copyright holders nor the names of its
253395Shsul@eecs.umich.edu * contributors may be used to endorse or promote products derived from
263395Shsul@eecs.umich.edu * this software without specific prior written permission.
273395Shsul@eecs.umich.edu *
283395Shsul@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
293395Shsul@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
309457Svilanova@ac.upc.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
313395Shsul@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
323509Shsul@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
336654Snate@binkert.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
343395Shsul@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
356654Snate@binkert.org * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
363395Shsul@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
376654Snate@binkert.org * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
388724Srdreslin@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
396654Snate@binkert.org *
406654Snate@binkert.org * Authors: Erik Hallnor
413395Shsul@eecs.umich.edu *          Ron Dreslinski
429139Snilay@cs.wisc.edu */
439139Snilay@cs.wisc.edu
449139Snilay@cs.wisc.edu/**
459139Snilay@cs.wisc.edu * @file
469139Snilay@cs.wisc.edu * Definitions of BaseTags.
479139Snilay@cs.wisc.edu */
489139Snilay@cs.wisc.edu
499139Snilay@cs.wisc.edu#include "mem/cache/tags/base.hh"
509139Snilay@cs.wisc.edu
519139Snilay@cs.wisc.edu#include "cpu/smt.hh" //maxThreadsPerCPU
529139Snilay@cs.wisc.edu#include "mem/cache/base.hh"
539139Snilay@cs.wisc.edu#include "sim/sim_exit.hh"
549139Snilay@cs.wisc.edu
559139Snilay@cs.wisc.eduBaseTags::BaseTags(const Params *p)
569139Snilay@cs.wisc.edu    : ClockedObject(p), blkSize(p->block_size), blkMask(blkSize - 1),
573481Shsul@eecs.umich.edu      size(p->size),
589139Snilay@cs.wisc.edu      lookupLatency(p->tag_latency),
593481Shsul@eecs.umich.edu      accessLatency(p->sequential_access ?
609139Snilay@cs.wisc.edu                    p->tag_latency + p->data_latency :
619139Snilay@cs.wisc.edu                    std::max(p->tag_latency, p->data_latency)),
629139Snilay@cs.wisc.edu      cache(nullptr),
639139Snilay@cs.wisc.edu      warmupBound((p->warmup_percentage/100.0) * (p->size / p->block_size)),
649139Snilay@cs.wisc.edu      warmedUp(false), numBlocks(p->size / p->block_size),
659139Snilay@cs.wisc.edu      dataBlks(new uint8_t[p->size]) // Allocate data storage in one big chunk
669139Snilay@cs.wisc.edu{
679139Snilay@cs.wisc.edu}
689139Snilay@cs.wisc.edu
699139Snilay@cs.wisc.eduvoid
708718Snilay@cs.wisc.eduBaseTags::setCache(BaseCache *_cache)
719139Snilay@cs.wisc.edu{
723481Shsul@eecs.umich.edu    assert(!cache);
739139Snilay@cs.wisc.edu    cache = _cache;
743481Shsul@eecs.umich.edu}
753481Shsul@eecs.umich.edu
769139Snilay@cs.wisc.eduvoid
779139Snilay@cs.wisc.eduBaseTags::insertBlock(PacketPtr pkt, CacheBlk *blk)
783481Shsul@eecs.umich.edu{
799139Snilay@cs.wisc.edu    // Get address
809139Snilay@cs.wisc.edu    Addr addr = pkt->getAddr();
819139Snilay@cs.wisc.edu
829139Snilay@cs.wisc.edu    // Update warmup data
839139Snilay@cs.wisc.edu    if (!blk->isTouched) {
843481Shsul@eecs.umich.edu        if (!warmedUp && tagsInUse.value() >= warmupBound) {
853481Shsul@eecs.umich.edu            warmedUp = true;
863481Shsul@eecs.umich.edu            warmupCycle = curTick();
878919Snilay@cs.wisc.edu        }
888919Snilay@cs.wisc.edu    }
898919Snilay@cs.wisc.edu
908919Snilay@cs.wisc.edu    // If we're replacing a block that was previously valid update
918919Snilay@cs.wisc.edu    // stats for it. This can't be done in findBlock() because a
928919Snilay@cs.wisc.edu    // found block might not actually be replaced there if the
938919Snilay@cs.wisc.edu    // coherence protocol says it can't be.
948919Snilay@cs.wisc.edu    if (blk->isValid()) {
958919Snilay@cs.wisc.edu        replacements[0]++;
968919Snilay@cs.wisc.edu        totalRefs += blk->refCount;
978919Snilay@cs.wisc.edu        ++sampledRefs;
988919Snilay@cs.wisc.edu
998919Snilay@cs.wisc.edu        invalidate(blk);
1008919Snilay@cs.wisc.edu        blk->invalidate();
1018919Snilay@cs.wisc.edu    }
1023481Shsul@eecs.umich.edu
1039140Snilay@cs.wisc.edu    // Previous block, if existed, has been removed, and now we have
1049140Snilay@cs.wisc.edu    // to insert the new one
1059140Snilay@cs.wisc.edu    tagsInUse++;
1069140Snilay@cs.wisc.edu
1079140Snilay@cs.wisc.edu    // Deal with what we are bringing in
1089140Snilay@cs.wisc.edu    MasterID master_id = pkt->req->masterId();
1099140Snilay@cs.wisc.edu    assert(master_id < cache->system->maxMasters());
1109140Snilay@cs.wisc.edu    occupancies[master_id]++;
1119140Snilay@cs.wisc.edu
1129140Snilay@cs.wisc.edu    // Insert block with tag, src master id and task id
1139140Snilay@cs.wisc.edu    blk->insert(extractTag(addr), pkt->isSecure(), master_id,
1149140Snilay@cs.wisc.edu                pkt->req->taskId());
1159140Snilay@cs.wisc.edu
1169140Snilay@cs.wisc.edu    // We only need to write into one tag and one data block.
1179140Snilay@cs.wisc.edu    tagAccesses += 1;
1189140Snilay@cs.wisc.edu    dataAccesses += 1;
1199140Snilay@cs.wisc.edu}
1209140Snilay@cs.wisc.edu
1219140Snilay@cs.wisc.eduvoid
1229140Snilay@cs.wisc.eduBaseTags::regStats()
1239140Snilay@cs.wisc.edu{
1249140Snilay@cs.wisc.edu    ClockedObject::regStats();
1259140Snilay@cs.wisc.edu
1269140Snilay@cs.wisc.edu    using namespace Stats;
1279140Snilay@cs.wisc.edu
1289140Snilay@cs.wisc.edu    replacements
1299140Snilay@cs.wisc.edu        .init(maxThreadsPerCPU)
1309140Snilay@cs.wisc.edu        .name(name() + ".replacements")
1319140Snilay@cs.wisc.edu        .desc("number of replacements")
1329140Snilay@cs.wisc.edu        .flags(total)
1339140Snilay@cs.wisc.edu        ;
1349140Snilay@cs.wisc.edu
1359140Snilay@cs.wisc.edu    tagsInUse
1369140Snilay@cs.wisc.edu        .name(name() + ".tagsinuse")
1379140Snilay@cs.wisc.edu        .desc("Cycle average of tags in use")
1389140Snilay@cs.wisc.edu        ;
1399140Snilay@cs.wisc.edu
1409140Snilay@cs.wisc.edu    totalRefs
1419140Snilay@cs.wisc.edu        .name(name() + ".total_refs")
1429140Snilay@cs.wisc.edu        .desc("Total number of references to valid blocks.")
1439140Snilay@cs.wisc.edu        ;
1449140Snilay@cs.wisc.edu
1459140Snilay@cs.wisc.edu    sampledRefs
1469140Snilay@cs.wisc.edu        .name(name() + ".sampled_refs")
1479140Snilay@cs.wisc.edu        .desc("Sample count of references to valid blocks.")
1489140Snilay@cs.wisc.edu        ;
1499140Snilay@cs.wisc.edu
1509140Snilay@cs.wisc.edu    avgRefs
1519140Snilay@cs.wisc.edu        .name(name() + ".avg_refs")
1529140Snilay@cs.wisc.edu        .desc("Average number of references to valid blocks.")
1539140Snilay@cs.wisc.edu        ;
1549140Snilay@cs.wisc.edu
1559140Snilay@cs.wisc.edu    avgRefs = totalRefs/sampledRefs;
1569140Snilay@cs.wisc.edu
1579215Sandreas.hansson@arm.com    warmupCycle
1589140Snilay@cs.wisc.edu        .name(name() + ".warmup_cycle")
1599140Snilay@cs.wisc.edu        .desc("Cycle when the warmup percentage was hit.")
1609140Snilay@cs.wisc.edu        ;
1619140Snilay@cs.wisc.edu
1629140Snilay@cs.wisc.edu    occupancies
1639140Snilay@cs.wisc.edu        .init(cache->system->maxMasters())
1649140Snilay@cs.wisc.edu        .name(name() + ".occ_blocks")
1659140Snilay@cs.wisc.edu        .desc("Average occupied blocks per requestor")
1669140Snilay@cs.wisc.edu        .flags(nozero | nonan)
1679140Snilay@cs.wisc.edu        ;
1689140Snilay@cs.wisc.edu    for (int i = 0; i < cache->system->maxMasters(); i++) {
1699140Snilay@cs.wisc.edu        occupancies.subname(i, cache->system->getMasterName(i));
1709140Snilay@cs.wisc.edu    }
1719140Snilay@cs.wisc.edu
1729140Snilay@cs.wisc.edu    avgOccs
1739140Snilay@cs.wisc.edu        .name(name() + ".occ_percent")
1749140Snilay@cs.wisc.edu        .desc("Average percentage of cache occupancy")
1759140Snilay@cs.wisc.edu        .flags(nozero | total)
1769140Snilay@cs.wisc.edu        ;
1779140Snilay@cs.wisc.edu    for (int i = 0; i < cache->system->maxMasters(); i++) {
1789140Snilay@cs.wisc.edu        avgOccs.subname(i, cache->system->getMasterName(i));
1799140Snilay@cs.wisc.edu    }
1809140Snilay@cs.wisc.edu
1819140Snilay@cs.wisc.edu    avgOccs = occupancies / Stats::constant(numBlocks);
1829140Snilay@cs.wisc.edu
1839140Snilay@cs.wisc.edu    occupanciesTaskId
1849156Sandreas.hansson@arm.com        .init(ContextSwitchTaskId::NumTaskId)
1859140Snilay@cs.wisc.edu        .name(name() + ".occ_task_id_blocks")
1869140Snilay@cs.wisc.edu        .desc("Occupied blocks per task id")
1879140Snilay@cs.wisc.edu        .flags(nozero | nonan)
1889140Snilay@cs.wisc.edu        ;
1899140Snilay@cs.wisc.edu
1909140Snilay@cs.wisc.edu    ageTaskId
1919140Snilay@cs.wisc.edu        .init(ContextSwitchTaskId::NumTaskId, 5)
1929140Snilay@cs.wisc.edu        .name(name() + ".age_task_id_blocks")
1939140Snilay@cs.wisc.edu        .desc("Occupied blocks per task id")
1949140Snilay@cs.wisc.edu        .flags(nozero | nonan)
1959140Snilay@cs.wisc.edu        ;
1969140Snilay@cs.wisc.edu
1979140Snilay@cs.wisc.edu    percentOccsTaskId
1989140Snilay@cs.wisc.edu        .name(name() + ".occ_task_id_percent")
1999140Snilay@cs.wisc.edu        .desc("Percentage of cache occupancy per task id")
2009140Snilay@cs.wisc.edu        .flags(nozero)
2019140Snilay@cs.wisc.edu        ;
2029140Snilay@cs.wisc.edu
2039140Snilay@cs.wisc.edu    percentOccsTaskId = occupanciesTaskId / Stats::constant(numBlocks);
2049140Snilay@cs.wisc.edu
2059140Snilay@cs.wisc.edu    tagAccesses
2069140Snilay@cs.wisc.edu        .name(name() + ".tag_accesses")
2079140Snilay@cs.wisc.edu        .desc("Number of tag accesses")
2089140Snilay@cs.wisc.edu        ;
2099140Snilay@cs.wisc.edu
2109140Snilay@cs.wisc.edu    dataAccesses
2119140Snilay@cs.wisc.edu        .name(name() + ".data_accesses")
2129140Snilay@cs.wisc.edu        .desc("Number of data accesses")
2139140Snilay@cs.wisc.edu        ;
2149140Snilay@cs.wisc.edu
2159140Snilay@cs.wisc.edu    registerDumpCallback(new BaseTagsDumpCallback(this));
2169140Snilay@cs.wisc.edu    registerExitCallback(new BaseTagsCallback(this));
2179140Snilay@cs.wisc.edu}
2189140Snilay@cs.wisc.edu