base_set_assoc.cc revision 12545
110263Satgutier@umich.edu/*
210941Sdavid.guillen@arm.com * Copyright (c) 2012-2014 ARM Limited
310263Satgutier@umich.edu * All rights reserved.
410263Satgutier@umich.edu *
510263Satgutier@umich.edu * The license below extends only to copyright in the software and shall
610263Satgutier@umich.edu * not be construed as granting a license to any other intellectual
710263Satgutier@umich.edu * property including but not limited to intellectual property relating
810263Satgutier@umich.edu * to a hardware implementation of the functionality of the software
910263Satgutier@umich.edu * licensed hereunder.  You may use the software subject to the license
1010263Satgutier@umich.edu * terms below provided that you ensure that this notice is replicated
1110263Satgutier@umich.edu * unmodified and in its entirety in all distributions of the software,
1210263Satgutier@umich.edu * modified or unmodified, in source code or in binary form.
1310263Satgutier@umich.edu *
1410263Satgutier@umich.edu * Copyright (c) 2003-2005,2014 The Regents of The University of Michigan
1510263Satgutier@umich.edu * All rights reserved.
1610263Satgutier@umich.edu *
1710263Satgutier@umich.edu * Redistribution and use in source and binary forms, with or without
1810263Satgutier@umich.edu * modification, are permitted provided that the following conditions are
1910263Satgutier@umich.edu * met: redistributions of source code must retain the above copyright
2010263Satgutier@umich.edu * notice, this list of conditions and the following disclaimer;
2110263Satgutier@umich.edu * redistributions in binary form must reproduce the above copyright
2210263Satgutier@umich.edu * notice, this list of conditions and the following disclaimer in the
2310263Satgutier@umich.edu * documentation and/or other materials provided with the distribution;
2410263Satgutier@umich.edu * neither the name of the copyright holders nor the names of its
2510263Satgutier@umich.edu * contributors may be used to endorse or promote products derived from
2610263Satgutier@umich.edu * this software without specific prior written permission.
2710263Satgutier@umich.edu *
2810263Satgutier@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2910263Satgutier@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3010263Satgutier@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3110263Satgutier@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3210263Satgutier@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3310263Satgutier@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3410263Satgutier@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3510263Satgutier@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3610263Satgutier@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3710263Satgutier@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3810263Satgutier@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3910263Satgutier@umich.edu *
4010263Satgutier@umich.edu * Authors: Erik Hallnor
4110263Satgutier@umich.edu */
4210263Satgutier@umich.edu
4310263Satgutier@umich.edu/**
4410263Satgutier@umich.edu * @file
4510263Satgutier@umich.edu * Definitions of a base set associative tag store.
4610263Satgutier@umich.edu */
4710263Satgutier@umich.edu
4811486Snikos.nikoleris@arm.com#include "mem/cache/tags/base_set_assoc.hh"
4911486Snikos.nikoleris@arm.com
5010263Satgutier@umich.edu#include <string>
5110263Satgutier@umich.edu
5210263Satgutier@umich.edu#include "base/intmath.hh"
5310263Satgutier@umich.edu#include "sim/core.hh"
5410263Satgutier@umich.edu
5510263Satgutier@umich.eduusing namespace std;
5610263Satgutier@umich.edu
5710263Satgutier@umich.eduBaseSetAssoc::BaseSetAssoc(const Params *p)
5810941Sdavid.guillen@arm.com    :BaseTags(p), assoc(p->assoc), allocAssoc(p->assoc),
5910263Satgutier@umich.edu     numSets(p->size / (p->block_size * p->assoc)),
6010263Satgutier@umich.edu     sequentialAccess(p->sequential_access)
6110263Satgutier@umich.edu{
6210263Satgutier@umich.edu    // Check parameters
6310263Satgutier@umich.edu    if (blkSize < 4 || !isPowerOf2(blkSize)) {
6410263Satgutier@umich.edu        fatal("Block size must be at least 4 and a power of 2");
6510263Satgutier@umich.edu    }
6612493Sodanrc@yahoo.com.br    if (!isPowerOf2(numSets)) {
6710263Satgutier@umich.edu        fatal("# of sets must be non-zero and a power of 2");
6810263Satgutier@umich.edu    }
6910263Satgutier@umich.edu    if (assoc <= 0) {
7010263Satgutier@umich.edu        fatal("associativity must be greater than zero");
7110263Satgutier@umich.edu    }
7210263Satgutier@umich.edu
7310263Satgutier@umich.edu    setShift = floorLog2(blkSize);
7410263Satgutier@umich.edu    setMask = numSets - 1;
7510263Satgutier@umich.edu    tagShift = setShift + floorLog2(numSets);
7610263Satgutier@umich.edu
7710263Satgutier@umich.edu    sets = new SetType[numSets];
7810263Satgutier@umich.edu    blks = new BlkType[numSets * assoc];
7910263Satgutier@umich.edu    // allocate data storage in one big chunk
8010263Satgutier@umich.edu    numBlocks = numSets * assoc;
8110263Satgutier@umich.edu    dataBlks = new uint8_t[numBlocks * blkSize];
8210263Satgutier@umich.edu
8310263Satgutier@umich.edu    unsigned blkIndex = 0;       // index into blks array
8410263Satgutier@umich.edu    for (unsigned i = 0; i < numSets; ++i) {
8510263Satgutier@umich.edu        sets[i].assoc = assoc;
8610263Satgutier@umich.edu
8712545Sodanrc@yahoo.com.br        sets[i].blks.resize(assoc);
8810263Satgutier@umich.edu
8910263Satgutier@umich.edu        // link in the data blocks
9010263Satgutier@umich.edu        for (unsigned j = 0; j < assoc; ++j) {
9110263Satgutier@umich.edu            // locate next cache block
9210263Satgutier@umich.edu            BlkType *blk = &blks[blkIndex];
9310263Satgutier@umich.edu            blk->data = &dataBlks[blkSize*blkIndex];
9410263Satgutier@umich.edu            ++blkIndex;
9510263Satgutier@umich.edu
9610263Satgutier@umich.edu            // invalidate new cache block
9710263Satgutier@umich.edu            blk->invalidate();
9810263Satgutier@umich.edu
9910263Satgutier@umich.edu            //EGH Fix Me : do we need to initialize blk?
10010263Satgutier@umich.edu
10110263Satgutier@umich.edu            // Setting the tag to j is just to prevent long chains in the hash
10210263Satgutier@umich.edu            // table; won't matter because the block is invalid
10310263Satgutier@umich.edu            blk->tag = j;
10410263Satgutier@umich.edu            blk->whenReady = 0;
10510263Satgutier@umich.edu            blk->isTouched = false;
10610263Satgutier@umich.edu            sets[i].blks[j]=blk;
10710263Satgutier@umich.edu            blk->set = i;
10810941Sdavid.guillen@arm.com            blk->way = j;
10910263Satgutier@umich.edu        }
11010263Satgutier@umich.edu    }
11110263Satgutier@umich.edu}
11210263Satgutier@umich.edu
11310263Satgutier@umich.eduBaseSetAssoc::~BaseSetAssoc()
11410263Satgutier@umich.edu{
11510263Satgutier@umich.edu    delete [] dataBlks;
11610263Satgutier@umich.edu    delete [] blks;
11710263Satgutier@umich.edu    delete [] sets;
11810263Satgutier@umich.edu}
11910263Satgutier@umich.edu
12010815Sdavid.guillen@arm.comCacheBlk*
12110263Satgutier@umich.eduBaseSetAssoc::findBlock(Addr addr, bool is_secure) const
12210263Satgutier@umich.edu{
12310263Satgutier@umich.edu    Addr tag = extractTag(addr);
12410263Satgutier@umich.edu    unsigned set = extractSet(addr);
12510263Satgutier@umich.edu    BlkType *blk = sets[set].findBlk(tag, is_secure);
12610263Satgutier@umich.edu    return blk;
12710263Satgutier@umich.edu}
12810263Satgutier@umich.edu
12910941Sdavid.guillen@arm.comCacheBlk*
13010941Sdavid.guillen@arm.comBaseSetAssoc::findBlockBySetAndWay(int set, int way) const
13110941Sdavid.guillen@arm.com{
13210941Sdavid.guillen@arm.com    return sets[set].blks[way];
13310941Sdavid.guillen@arm.com}
13410941Sdavid.guillen@arm.com
13510263Satgutier@umich.edustd::string
13610263Satgutier@umich.eduBaseSetAssoc::print() const {
13710263Satgutier@umich.edu    std::string cache_state;
13810263Satgutier@umich.edu    for (unsigned i = 0; i < numSets; ++i) {
13910263Satgutier@umich.edu        // link in the data blocks
14010263Satgutier@umich.edu        for (unsigned j = 0; j < assoc; ++j) {
14110263Satgutier@umich.edu            BlkType *blk = sets[i].blks[j];
14210263Satgutier@umich.edu            if (blk->isValid())
14310263Satgutier@umich.edu                cache_state += csprintf("\tset: %d block: %d %s\n", i, j,
14410263Satgutier@umich.edu                        blk->print());
14510263Satgutier@umich.edu        }
14610263Satgutier@umich.edu    }
14710263Satgutier@umich.edu    if (cache_state.empty())
14810263Satgutier@umich.edu        cache_state = "no valid tags\n";
14910263Satgutier@umich.edu    return cache_state;
15010263Satgutier@umich.edu}
15110263Satgutier@umich.edu
15210263Satgutier@umich.eduvoid
15310263Satgutier@umich.eduBaseSetAssoc::cleanupRefs()
15410263Satgutier@umich.edu{
15510263Satgutier@umich.edu    for (unsigned i = 0; i < numSets*assoc; ++i) {
15610263Satgutier@umich.edu        if (blks[i].isValid()) {
15710263Satgutier@umich.edu            totalRefs += blks[i].refCount;
15810263Satgutier@umich.edu            ++sampledRefs;
15910263Satgutier@umich.edu        }
16010263Satgutier@umich.edu    }
16110263Satgutier@umich.edu}
16210263Satgutier@umich.edu
16310263Satgutier@umich.eduvoid
16410263Satgutier@umich.eduBaseSetAssoc::computeStats()
16510263Satgutier@umich.edu{
16610263Satgutier@umich.edu    for (unsigned i = 0; i < ContextSwitchTaskId::NumTaskId; ++i) {
16710263Satgutier@umich.edu        occupanciesTaskId[i] = 0;
16810263Satgutier@umich.edu        for (unsigned j = 0; j < 5; ++j) {
16910263Satgutier@umich.edu            ageTaskId[i][j] = 0;
17010263Satgutier@umich.edu        }
17110263Satgutier@umich.edu    }
17210263Satgutier@umich.edu
17310263Satgutier@umich.edu    for (unsigned i = 0; i < numSets * assoc; ++i) {
17410263Satgutier@umich.edu        if (blks[i].isValid()) {
17510263Satgutier@umich.edu            assert(blks[i].task_id < ContextSwitchTaskId::NumTaskId);
17610263Satgutier@umich.edu            occupanciesTaskId[blks[i].task_id]++;
17710373Sandreas.hansson@arm.com            assert(blks[i].tickInserted <= curTick());
17810263Satgutier@umich.edu            Tick age = curTick() - blks[i].tickInserted;
17910263Satgutier@umich.edu
18010263Satgutier@umich.edu            int age_index;
18110263Satgutier@umich.edu            if (age / SimClock::Int::us < 10) { // <10us
18210263Satgutier@umich.edu                age_index = 0;
18310263Satgutier@umich.edu            } else if (age / SimClock::Int::us < 100) { // <100us
18410263Satgutier@umich.edu                age_index = 1;
18510263Satgutier@umich.edu            } else if (age / SimClock::Int::ms < 1) { // <1ms
18610263Satgutier@umich.edu                age_index = 2;
18710263Satgutier@umich.edu            } else if (age / SimClock::Int::ms < 10) { // <10ms
18810263Satgutier@umich.edu                age_index = 3;
18910263Satgutier@umich.edu            } else
19010263Satgutier@umich.edu                age_index = 4; // >10ms
19110263Satgutier@umich.edu
19210263Satgutier@umich.edu            ageTaskId[blks[i].task_id][age_index]++;
19310263Satgutier@umich.edu        }
19410263Satgutier@umich.edu    }
19510263Satgutier@umich.edu}
196