base.cc revision 13215
15643Sgblack@eecs.umich.edu/*
25643Sgblack@eecs.umich.edu * Copyright (c) 2013,2016,2018 ARM Limited
35643Sgblack@eecs.umich.edu * All rights reserved.
45643Sgblack@eecs.umich.edu *
55643Sgblack@eecs.umich.edu * The license below extends only to copyright in the software and shall
65643Sgblack@eecs.umich.edu * not be construed as granting a license to any other intellectual
75643Sgblack@eecs.umich.edu * property including but not limited to intellectual property relating
85643Sgblack@eecs.umich.edu * to a hardware implementation of the functionality of the software
95643Sgblack@eecs.umich.edu * licensed hereunder.  You may use the software subject to the license
105643Sgblack@eecs.umich.edu * terms below provided that you ensure that this notice is replicated
115643Sgblack@eecs.umich.edu * unmodified and in its entirety in all distributions of the software,
125643Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form.
135643Sgblack@eecs.umich.edu *
145643Sgblack@eecs.umich.edu * Copyright (c) 2003-2005 The Regents of The University of Michigan
155643Sgblack@eecs.umich.edu * All rights reserved.
165643Sgblack@eecs.umich.edu *
175643Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
185643Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
195643Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
205643Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
215643Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
225643Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
235643Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
245643Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
255643Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
265643Sgblack@eecs.umich.edu * this software without specific prior written permission.
275643Sgblack@eecs.umich.edu *
285643Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
295643Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
305643Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
316138Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
325651Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
338746Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
348232Snate@binkert.org * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
355643Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
365657Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
375643Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
385643Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
395643Sgblack@eecs.umich.edu *
405643Sgblack@eecs.umich.edu * Authors: Erik Hallnor
419805Sstever@gmail.com *          Ron Dreslinski
429805Sstever@gmail.com */
439805Sstever@gmail.com
445643Sgblack@eecs.umich.edu/**
457913SBrad.Beckmann@amd.com * @file
467913SBrad.Beckmann@amd.com * Definitions of BaseTags.
477913SBrad.Beckmann@amd.com */
487913SBrad.Beckmann@amd.com
497913SBrad.Beckmann@amd.com#include "mem/cache/tags/base.hh"
506136Sgblack@eecs.umich.edu
515643Sgblack@eecs.umich.edu#include <cassert>
525643Sgblack@eecs.umich.edu
535653Sgblack@eecs.umich.edu#include "base/types.hh"
545653Sgblack@eecs.umich.edu#include "mem/cache/base.hh"
555653Sgblack@eecs.umich.edu#include "mem/request.hh"
565653Sgblack@eecs.umich.edu#include "sim/core.hh"
575827Sgblack@eecs.umich.edu#include "sim/sim_exit.hh"
585653Sgblack@eecs.umich.edu#include "sim/system.hh"
599805Sstever@gmail.com
609805Sstever@gmail.comBaseTags::BaseTags(const Params *p)
615643Sgblack@eecs.umich.edu    : ClockedObject(p), blkSize(p->block_size), blkMask(blkSize - 1),
625643Sgblack@eecs.umich.edu      size(p->size),
637913SBrad.Beckmann@amd.com      lookupLatency(p->tag_latency),
647913SBrad.Beckmann@amd.com      accessLatency(p->sequential_access ?
657913SBrad.Beckmann@amd.com                    p->tag_latency + p->data_latency :
667913SBrad.Beckmann@amd.com                    std::max(p->tag_latency, p->data_latency)),
677913SBrad.Beckmann@amd.com      cache(nullptr),
687913SBrad.Beckmann@amd.com      warmupBound((p->warmup_percentage/100.0) * (p->size / p->block_size)),
697913SBrad.Beckmann@amd.com      warmedUp(false), numBlocks(p->size / p->block_size),
709805Sstever@gmail.com      dataBlks(new uint8_t[p->size]) // Allocate data storage in one big chunk
717913SBrad.Beckmann@amd.com{
727913SBrad.Beckmann@amd.com}
737913SBrad.Beckmann@amd.com
749805Sstever@gmail.comvoid
759805Sstever@gmail.comBaseTags::setCache(BaseCache *_cache)
769805Sstever@gmail.com{
779805Sstever@gmail.com    assert(!cache);
789805Sstever@gmail.com    cache = _cache;
799805Sstever@gmail.com}
809805Sstever@gmail.com
819805Sstever@gmail.comvoid
829805Sstever@gmail.comBaseTags::insertBlock(const Addr addr, const bool is_secure,
839805Sstever@gmail.com                      const int src_master_ID, const uint32_t task_ID,
849805Sstever@gmail.com                      CacheBlk *blk)
859805Sstever@gmail.com{
869805Sstever@gmail.com    assert(!blk->isValid());
879805Sstever@gmail.com
889805Sstever@gmail.com    // Previous block, if existed, has been removed, and now we have
899805Sstever@gmail.com    // to insert the new one
909805Sstever@gmail.com    // Deal with what we are bringing in
919805Sstever@gmail.com    assert(src_master_ID < cache->system->maxMasters());
925643Sgblack@eecs.umich.edu    occupancies[src_master_ID]++;
935643Sgblack@eecs.umich.edu
945643Sgblack@eecs.umich.edu    // Insert block with tag, src master id and task id
955643Sgblack@eecs.umich.edu    blk->insert(extractTag(addr), is_secure, src_master_ID, task_ID);
965643Sgblack@eecs.umich.edu
975643Sgblack@eecs.umich.edu    // Check if cache warm up is done
985643Sgblack@eecs.umich.edu    if (!warmedUp && tagsInUse.value() >= warmupBound) {
995643Sgblack@eecs.umich.edu        warmedUp = true;
1005643Sgblack@eecs.umich.edu        warmupCycle = curTick();
1015643Sgblack@eecs.umich.edu    }
1025643Sgblack@eecs.umich.edu
1035643Sgblack@eecs.umich.edu    // We only need to write into one tag and one data block.
1045643Sgblack@eecs.umich.edu    tagAccesses += 1;
1055643Sgblack@eecs.umich.edu    dataAccesses += 1;
1065643Sgblack@eecs.umich.edu}
1075898Sgblack@eecs.umich.edu
1089805Sstever@gmail.comvoid
1095643Sgblack@eecs.umich.eduBaseTags::cleanupRefsVisitor(CacheBlk &blk)
1105643Sgblack@eecs.umich.edu{
1115643Sgblack@eecs.umich.edu    if (blk.isValid()) {
1125643Sgblack@eecs.umich.edu        totalRefs += blk.refCount;
1135643Sgblack@eecs.umich.edu        ++sampledRefs;
1145643Sgblack@eecs.umich.edu    }
1155643Sgblack@eecs.umich.edu}
1165643Sgblack@eecs.umich.edu
1175643Sgblack@eecs.umich.eduvoid
1185643Sgblack@eecs.umich.eduBaseTags::cleanupRefs()
1195643Sgblack@eecs.umich.edu{
1205643Sgblack@eecs.umich.edu    forEachBlk([this](CacheBlk &blk) { cleanupRefsVisitor(blk); });
1215643Sgblack@eecs.umich.edu}
1225643Sgblack@eecs.umich.edu
1235643Sgblack@eecs.umich.eduvoid
1245643Sgblack@eecs.umich.eduBaseTags::computeStatsVisitor(CacheBlk &blk)
1255643Sgblack@eecs.umich.edu{
1265898Sgblack@eecs.umich.edu    if (blk.isValid()) {
1279805Sstever@gmail.com        assert(blk.task_id < ContextSwitchTaskId::NumTaskId);
1285643Sgblack@eecs.umich.edu        occupanciesTaskId[blk.task_id]++;
1295643Sgblack@eecs.umich.edu        assert(blk.tickInserted <= curTick());
1305643Sgblack@eecs.umich.edu        Tick age = curTick() - blk.tickInserted;
1315643Sgblack@eecs.umich.edu
1325643Sgblack@eecs.umich.edu        int age_index;
1335643Sgblack@eecs.umich.edu        if (age / SimClock::Int::us < 10) { // <10us
1347913SBrad.Beckmann@amd.com            age_index = 0;
1355643Sgblack@eecs.umich.edu        } else if (age / SimClock::Int::us < 100) { // <100us
1365643Sgblack@eecs.umich.edu            age_index = 1;
1375643Sgblack@eecs.umich.edu        } else if (age / SimClock::Int::ms < 1) { // <1ms
1387913SBrad.Beckmann@amd.com            age_index = 2;
1395643Sgblack@eecs.umich.edu        } else if (age / SimClock::Int::ms < 10) { // <10ms
1405643Sgblack@eecs.umich.edu            age_index = 3;
1415643Sgblack@eecs.umich.edu        } else
1425643Sgblack@eecs.umich.edu            age_index = 4; // >10ms
1435643Sgblack@eecs.umich.edu
1445643Sgblack@eecs.umich.edu        ageTaskId[blk.task_id][age_index]++;
1455643Sgblack@eecs.umich.edu    }
1465643Sgblack@eecs.umich.edu}
1475643Sgblack@eecs.umich.edu
1485643Sgblack@eecs.umich.eduvoid
1495643Sgblack@eecs.umich.eduBaseTags::computeStats()
1505643Sgblack@eecs.umich.edu{
1515643Sgblack@eecs.umich.edu    for (unsigned i = 0; i < ContextSwitchTaskId::NumTaskId; ++i) {
1525643Sgblack@eecs.umich.edu        occupanciesTaskId[i] = 0;
1535643Sgblack@eecs.umich.edu        for (unsigned j = 0; j < 5; ++j) {
1545643Sgblack@eecs.umich.edu            ageTaskId[i][j] = 0;
1555643Sgblack@eecs.umich.edu        }
1565643Sgblack@eecs.umich.edu    }
1575643Sgblack@eecs.umich.edu
1585643Sgblack@eecs.umich.edu    forEachBlk([this](CacheBlk &blk) { computeStatsVisitor(blk); });
1595643Sgblack@eecs.umich.edu}
1605643Sgblack@eecs.umich.edu
1615643Sgblack@eecs.umich.edustd::string
1625643Sgblack@eecs.umich.eduBaseTags::print()
1635643Sgblack@eecs.umich.edu{
1645643Sgblack@eecs.umich.edu    std::string str;
1655643Sgblack@eecs.umich.edu
1665643Sgblack@eecs.umich.edu    auto print_blk = [&str](CacheBlk &blk) {
1675643Sgblack@eecs.umich.edu        if (blk.isValid())
1685643Sgblack@eecs.umich.edu            str += csprintf("\tset: %d way: %d %s\n", blk.set, blk.way,
1695643Sgblack@eecs.umich.edu                            blk.print());
1705643Sgblack@eecs.umich.edu    };
1715643Sgblack@eecs.umich.edu    forEachBlk(print_blk);
1725643Sgblack@eecs.umich.edu
1735643Sgblack@eecs.umich.edu    if (str.empty())
1745643Sgblack@eecs.umich.edu        str = "no valid tags\n";
1755643Sgblack@eecs.umich.edu
1765643Sgblack@eecs.umich.edu    return str;
1775643Sgblack@eecs.umich.edu}
1785643Sgblack@eecs.umich.edu
1795643Sgblack@eecs.umich.eduvoid
1805643Sgblack@eecs.umich.eduBaseTags::regStats()
1815643Sgblack@eecs.umich.edu{
1825643Sgblack@eecs.umich.edu    ClockedObject::regStats();
1835643Sgblack@eecs.umich.edu
1845643Sgblack@eecs.umich.edu    using namespace Stats;
1855643Sgblack@eecs.umich.edu
1865643Sgblack@eecs.umich.edu    tagsInUse
1875643Sgblack@eecs.umich.edu        .name(name() + ".tagsinuse")
1885643Sgblack@eecs.umich.edu        .desc("Cycle average of tags in use")
1895643Sgblack@eecs.umich.edu        ;
1906712Snate@binkert.org
1915651Sgblack@eecs.umich.edu    totalRefs
1925657Sgblack@eecs.umich.edu        .name(name() + ".total_refs")
1935657Sgblack@eecs.umich.edu        .desc("Total number of references to valid blocks.")
1945657Sgblack@eecs.umich.edu        ;
1955657Sgblack@eecs.umich.edu
1965657Sgblack@eecs.umich.edu    sampledRefs
1975657Sgblack@eecs.umich.edu        .name(name() + ".sampled_refs")
1985651Sgblack@eecs.umich.edu        .desc("Sample count of references to valid blocks.")
1995651Sgblack@eecs.umich.edu        ;
2005654Sgblack@eecs.umich.edu
2015654Sgblack@eecs.umich.edu    avgRefs
2026138Sgblack@eecs.umich.edu        .name(name() + ".avg_refs")
2036138Sgblack@eecs.umich.edu        .desc("Average number of references to valid blocks.")
2046138Sgblack@eecs.umich.edu        ;
2056138Sgblack@eecs.umich.edu
2066138Sgblack@eecs.umich.edu    avgRefs = totalRefs/sampledRefs;
2076138Sgblack@eecs.umich.edu
2086138Sgblack@eecs.umich.edu    warmupCycle
2096138Sgblack@eecs.umich.edu        .name(name() + ".warmup_cycle")
2106138Sgblack@eecs.umich.edu        .desc("Cycle when the warmup percentage was hit.")
2116138Sgblack@eecs.umich.edu        ;
2126138Sgblack@eecs.umich.edu
2136138Sgblack@eecs.umich.edu    occupancies
2146138Sgblack@eecs.umich.edu        .init(cache->system->maxMasters())
2156138Sgblack@eecs.umich.edu        .name(name() + ".occ_blocks")
2166138Sgblack@eecs.umich.edu        .desc("Average occupied blocks per requestor")
2176138Sgblack@eecs.umich.edu        .flags(nozero | nonan)
2186138Sgblack@eecs.umich.edu        ;
2198746Sgblack@eecs.umich.edu    for (int i = 0; i < cache->system->maxMasters(); i++) {
2208746Sgblack@eecs.umich.edu        occupancies.subname(i, cache->system->getMasterName(i));
2216138Sgblack@eecs.umich.edu    }
2226138Sgblack@eecs.umich.edu
2238746Sgblack@eecs.umich.edu    avgOccs
2246138Sgblack@eecs.umich.edu        .name(name() + ".occ_percent")
2256138Sgblack@eecs.umich.edu        .desc("Average percentage of cache occupancy")
2266139Sgblack@eecs.umich.edu        .flags(nozero | total)
2276139Sgblack@eecs.umich.edu        ;
2286139Sgblack@eecs.umich.edu    for (int i = 0; i < cache->system->maxMasters(); i++) {
2296139Sgblack@eecs.umich.edu        avgOccs.subname(i, cache->system->getMasterName(i));
2306139Sgblack@eecs.umich.edu    }
2316139Sgblack@eecs.umich.edu
2326139Sgblack@eecs.umich.edu    avgOccs = occupancies / Stats::constant(numBlocks);
2336139Sgblack@eecs.umich.edu
2346139Sgblack@eecs.umich.edu    occupanciesTaskId
2356139Sgblack@eecs.umich.edu        .init(ContextSwitchTaskId::NumTaskId)
2366139Sgblack@eecs.umich.edu        .name(name() + ".occ_task_id_blocks")
2376139Sgblack@eecs.umich.edu        .desc("Occupied blocks per task id")
2386139Sgblack@eecs.umich.edu        .flags(nozero | nonan)
2396139Sgblack@eecs.umich.edu        ;
2406139Sgblack@eecs.umich.edu
2416139Sgblack@eecs.umich.edu    ageTaskId
2426138Sgblack@eecs.umich.edu        .init(ContextSwitchTaskId::NumTaskId, 5)
2436138Sgblack@eecs.umich.edu        .name(name() + ".age_task_id_blocks")
2449524SAndreas.Sandberg@ARM.com        .desc("Occupied blocks per task id")
2455643Sgblack@eecs.umich.edu        .flags(nozero | nonan)
2465643Sgblack@eecs.umich.edu        ;
2475643Sgblack@eecs.umich.edu
2485827Sgblack@eecs.umich.edu    percentOccsTaskId
2495827Sgblack@eecs.umich.edu        .name(name() + ".occ_task_id_percent")
2505827Sgblack@eecs.umich.edu        .desc("Percentage of cache occupancy per task id")
2515827Sgblack@eecs.umich.edu        .flags(nozero)
2525827Sgblack@eecs.umich.edu        ;
2535827Sgblack@eecs.umich.edu
2545827Sgblack@eecs.umich.edu    percentOccsTaskId = occupanciesTaskId / Stats::constant(numBlocks);
2555827Sgblack@eecs.umich.edu
2565827Sgblack@eecs.umich.edu    tagAccesses
2575827Sgblack@eecs.umich.edu        .name(name() + ".tag_accesses")
2585827Sgblack@eecs.umich.edu        .desc("Number of tag accesses")
2595827Sgblack@eecs.umich.edu        ;
2605827Sgblack@eecs.umich.edu
2615827Sgblack@eecs.umich.edu    dataAccesses
2625827Sgblack@eecs.umich.edu        .name(name() + ".data_accesses")
2635827Sgblack@eecs.umich.edu        .desc("Number of data accesses")
2646137Sgblack@eecs.umich.edu        ;
2657903Shestness@cs.utexas.edu
2667903Shestness@cs.utexas.edu    registerDumpCallback(new BaseTagsDumpCallback(this));
2677903Shestness@cs.utexas.edu    registerExitCallback(new BaseTagsCallback(this));
2687903Shestness@cs.utexas.edu}
2697903Shestness@cs.utexas.edu