base_set_assoc.cc revision 10815
110263Satgutier@umich.edu/* 210263Satgutier@umich.edu * Copyright (c) 2012-2013 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 4810263Satgutier@umich.edu#include <string> 4910263Satgutier@umich.edu 5010263Satgutier@umich.edu#include "base/intmath.hh" 5110263Satgutier@umich.edu#include "mem/cache/tags/base_set_assoc.hh" 5210263Satgutier@umich.edu#include "sim/core.hh" 5310263Satgutier@umich.edu 5410263Satgutier@umich.eduusing namespace std; 5510263Satgutier@umich.edu 5610263Satgutier@umich.eduBaseSetAssoc::BaseSetAssoc(const Params *p) 5710263Satgutier@umich.edu :BaseTags(p), assoc(p->assoc), 5810263Satgutier@umich.edu numSets(p->size / (p->block_size * p->assoc)), 5910263Satgutier@umich.edu sequentialAccess(p->sequential_access) 6010263Satgutier@umich.edu{ 6110263Satgutier@umich.edu // Check parameters 6210263Satgutier@umich.edu if (blkSize < 4 || !isPowerOf2(blkSize)) { 6310263Satgutier@umich.edu fatal("Block size must be at least 4 and a power of 2"); 6410263Satgutier@umich.edu } 6510263Satgutier@umich.edu if (numSets <= 0 || !isPowerOf2(numSets)) { 6610263Satgutier@umich.edu fatal("# of sets must be non-zero and a power of 2"); 6710263Satgutier@umich.edu } 6810263Satgutier@umich.edu if (assoc <= 0) { 6910263Satgutier@umich.edu fatal("associativity must be greater than zero"); 7010263Satgutier@umich.edu } 7110263Satgutier@umich.edu 7210263Satgutier@umich.edu blkMask = blkSize - 1; 7310263Satgutier@umich.edu setShift = floorLog2(blkSize); 7410263Satgutier@umich.edu setMask = numSets - 1; 7510263Satgutier@umich.edu tagShift = setShift + floorLog2(numSets); 7610263Satgutier@umich.edu /** @todo Make warmup percentage a parameter. */ 7710263Satgutier@umich.edu warmupBound = numSets * assoc; 7810263Satgutier@umich.edu 7910263Satgutier@umich.edu sets = new SetType[numSets]; 8010263Satgutier@umich.edu blks = new BlkType[numSets * assoc]; 8110263Satgutier@umich.edu // allocate data storage in one big chunk 8210263Satgutier@umich.edu numBlocks = numSets * assoc; 8310263Satgutier@umich.edu dataBlks = new uint8_t[numBlocks * blkSize]; 8410263Satgutier@umich.edu 8510263Satgutier@umich.edu unsigned blkIndex = 0; // index into blks array 8610263Satgutier@umich.edu for (unsigned i = 0; i < numSets; ++i) { 8710263Satgutier@umich.edu sets[i].assoc = assoc; 8810263Satgutier@umich.edu 8910263Satgutier@umich.edu sets[i].blks = new BlkType*[assoc]; 9010263Satgutier@umich.edu 9110263Satgutier@umich.edu // link in the data blocks 9210263Satgutier@umich.edu for (unsigned j = 0; j < assoc; ++j) { 9310263Satgutier@umich.edu // locate next cache block 9410263Satgutier@umich.edu BlkType *blk = &blks[blkIndex]; 9510263Satgutier@umich.edu blk->data = &dataBlks[blkSize*blkIndex]; 9610263Satgutier@umich.edu ++blkIndex; 9710263Satgutier@umich.edu 9810263Satgutier@umich.edu // invalidate new cache block 9910263Satgutier@umich.edu blk->invalidate(); 10010263Satgutier@umich.edu 10110263Satgutier@umich.edu //EGH Fix Me : do we need to initialize blk? 10210263Satgutier@umich.edu 10310263Satgutier@umich.edu // Setting the tag to j is just to prevent long chains in the hash 10410263Satgutier@umich.edu // table; won't matter because the block is invalid 10510263Satgutier@umich.edu blk->tag = j; 10610263Satgutier@umich.edu blk->whenReady = 0; 10710263Satgutier@umich.edu blk->isTouched = false; 10810263Satgutier@umich.edu blk->size = blkSize; 10910263Satgutier@umich.edu sets[i].blks[j]=blk; 11010263Satgutier@umich.edu blk->set = i; 11110263Satgutier@umich.edu } 11210263Satgutier@umich.edu } 11310263Satgutier@umich.edu} 11410263Satgutier@umich.edu 11510263Satgutier@umich.eduBaseSetAssoc::~BaseSetAssoc() 11610263Satgutier@umich.edu{ 11710263Satgutier@umich.edu delete [] dataBlks; 11810263Satgutier@umich.edu delete [] blks; 11910263Satgutier@umich.edu delete [] sets; 12010263Satgutier@umich.edu} 12110263Satgutier@umich.edu 12210815Sdavid.guillen@arm.comCacheBlk* 12310263Satgutier@umich.eduBaseSetAssoc::findBlock(Addr addr, bool is_secure) const 12410263Satgutier@umich.edu{ 12510263Satgutier@umich.edu Addr tag = extractTag(addr); 12610263Satgutier@umich.edu unsigned set = extractSet(addr); 12710263Satgutier@umich.edu BlkType *blk = sets[set].findBlk(tag, is_secure); 12810263Satgutier@umich.edu return blk; 12910263Satgutier@umich.edu} 13010263Satgutier@umich.edu 13110263Satgutier@umich.eduvoid 13210263Satgutier@umich.eduBaseSetAssoc::clearLocks() 13310263Satgutier@umich.edu{ 13410263Satgutier@umich.edu for (int i = 0; i < numBlocks; i++){ 13510263Satgutier@umich.edu blks[i].clearLoadLocks(); 13610263Satgutier@umich.edu } 13710263Satgutier@umich.edu} 13810263Satgutier@umich.edu 13910263Satgutier@umich.edustd::string 14010263Satgutier@umich.eduBaseSetAssoc::print() const { 14110263Satgutier@umich.edu std::string cache_state; 14210263Satgutier@umich.edu for (unsigned i = 0; i < numSets; ++i) { 14310263Satgutier@umich.edu // link in the data blocks 14410263Satgutier@umich.edu for (unsigned j = 0; j < assoc; ++j) { 14510263Satgutier@umich.edu BlkType *blk = sets[i].blks[j]; 14610263Satgutier@umich.edu if (blk->isValid()) 14710263Satgutier@umich.edu cache_state += csprintf("\tset: %d block: %d %s\n", i, j, 14810263Satgutier@umich.edu blk->print()); 14910263Satgutier@umich.edu } 15010263Satgutier@umich.edu } 15110263Satgutier@umich.edu if (cache_state.empty()) 15210263Satgutier@umich.edu cache_state = "no valid tags\n"; 15310263Satgutier@umich.edu return cache_state; 15410263Satgutier@umich.edu} 15510263Satgutier@umich.edu 15610263Satgutier@umich.eduvoid 15710263Satgutier@umich.eduBaseSetAssoc::cleanupRefs() 15810263Satgutier@umich.edu{ 15910263Satgutier@umich.edu for (unsigned i = 0; i < numSets*assoc; ++i) { 16010263Satgutier@umich.edu if (blks[i].isValid()) { 16110263Satgutier@umich.edu totalRefs += blks[i].refCount; 16210263Satgutier@umich.edu ++sampledRefs; 16310263Satgutier@umich.edu } 16410263Satgutier@umich.edu } 16510263Satgutier@umich.edu} 16610263Satgutier@umich.edu 16710263Satgutier@umich.eduvoid 16810263Satgutier@umich.eduBaseSetAssoc::computeStats() 16910263Satgutier@umich.edu{ 17010263Satgutier@umich.edu for (unsigned i = 0; i < ContextSwitchTaskId::NumTaskId; ++i) { 17110263Satgutier@umich.edu occupanciesTaskId[i] = 0; 17210263Satgutier@umich.edu for (unsigned j = 0; j < 5; ++j) { 17310263Satgutier@umich.edu ageTaskId[i][j] = 0; 17410263Satgutier@umich.edu } 17510263Satgutier@umich.edu } 17610263Satgutier@umich.edu 17710263Satgutier@umich.edu for (unsigned i = 0; i < numSets * assoc; ++i) { 17810263Satgutier@umich.edu if (blks[i].isValid()) { 17910263Satgutier@umich.edu assert(blks[i].task_id < ContextSwitchTaskId::NumTaskId); 18010263Satgutier@umich.edu occupanciesTaskId[blks[i].task_id]++; 18110373Sandreas.hansson@arm.com assert(blks[i].tickInserted <= curTick()); 18210263Satgutier@umich.edu Tick age = curTick() - blks[i].tickInserted; 18310263Satgutier@umich.edu 18410263Satgutier@umich.edu int age_index; 18510263Satgutier@umich.edu if (age / SimClock::Int::us < 10) { // <10us 18610263Satgutier@umich.edu age_index = 0; 18710263Satgutier@umich.edu } else if (age / SimClock::Int::us < 100) { // <100us 18810263Satgutier@umich.edu age_index = 1; 18910263Satgutier@umich.edu } else if (age / SimClock::Int::ms < 1) { // <1ms 19010263Satgutier@umich.edu age_index = 2; 19110263Satgutier@umich.edu } else if (age / SimClock::Int::ms < 10) { // <10ms 19210263Satgutier@umich.edu age_index = 3; 19310263Satgutier@umich.edu } else 19410263Satgutier@umich.edu age_index = 4; // >10ms 19510263Satgutier@umich.edu 19610263Satgutier@umich.edu ageTaskId[blks[i].task_id][age_index]++; 19710263Satgutier@umich.edu } 19810263Satgutier@umich.edu } 19910263Satgutier@umich.edu} 200