base.hh revision 12743
111375Sandreas.hansson@arm.com/* 211375Sandreas.hansson@arm.com * Copyright (c) 2012-2014,2016-2018 ARM Limited 311375Sandreas.hansson@arm.com * All rights reserved. 411375Sandreas.hansson@arm.com * 511375Sandreas.hansson@arm.com * The license below extends only to copyright in the software and shall 611375Sandreas.hansson@arm.com * not be construed as granting a license to any other intellectual 711375Sandreas.hansson@arm.com * property including but not limited to intellectual property relating 811375Sandreas.hansson@arm.com * to a hardware implementation of the functionality of the software 911375Sandreas.hansson@arm.com * licensed hereunder. You may use the software subject to the license 1011375Sandreas.hansson@arm.com * terms below provided that you ensure that this notice is replicated 1111375Sandreas.hansson@arm.com * unmodified and in its entirety in all distributions of the software, 1211375Sandreas.hansson@arm.com * modified or unmodified, in source code or in binary form. 1311375Sandreas.hansson@arm.com * 1411375Sandreas.hansson@arm.com * Copyright (c) 2003-2005 The Regents of The University of Michigan 1511375Sandreas.hansson@arm.com * All rights reserved. 1611375Sandreas.hansson@arm.com * 1711375Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 1811375Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 1911375Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 2011375Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 2111375Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 2211375Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 2311375Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 2411375Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 2511375Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 2611375Sandreas.hansson@arm.com * this software without specific prior written permission. 2711375Sandreas.hansson@arm.com * 2811375Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2911375Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3011375Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 3111375Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3211375Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3311375Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3411375Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3511375Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3611375Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3711375Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3811375Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3911375Sandreas.hansson@arm.com * 4011375Sandreas.hansson@arm.com * Authors: Erik Hallnor 4111375Sandreas.hansson@arm.com * Ron Dreslinski 4211375Sandreas.hansson@arm.com */ 4311375Sandreas.hansson@arm.com 4411375Sandreas.hansson@arm.com/** 4511375Sandreas.hansson@arm.com * @file 4611375Sandreas.hansson@arm.com * Declaration of a common base class for cache tagstore objects. 4711375Sandreas.hansson@arm.com */ 4811375Sandreas.hansson@arm.com 4911375Sandreas.hansson@arm.com#ifndef __MEM_CACHE_TAGS_BASE_HH__ 5011375Sandreas.hansson@arm.com#define __MEM_CACHE_TAGS_BASE_HH__ 5111375Sandreas.hansson@arm.com 5212727Snikos.nikoleris@arm.com#include <cassert> 5312727Snikos.nikoleris@arm.com#include <functional> 5411375Sandreas.hansson@arm.com#include <string> 5512727Snikos.nikoleris@arm.com 5611375Sandreas.hansson@arm.com#include "base/callback.hh" 5711375Sandreas.hansson@arm.com#include "base/logging.hh" 5812727Snikos.nikoleris@arm.com#include "base/statistics.hh" 5911375Sandreas.hansson@arm.com#include "base/types.hh" 6012727Snikos.nikoleris@arm.com#include "mem/cache/blk.hh" 6112727Snikos.nikoleris@arm.com#include "mem/packet.hh" 6211375Sandreas.hansson@arm.com#include "params/BaseTags.hh" 6312724Snikos.nikoleris@arm.com#include "sim/clocked_object.hh" 6411375Sandreas.hansson@arm.com 6511375Sandreas.hansson@arm.comclass BaseCache; 6611375Sandreas.hansson@arm.com 6711375Sandreas.hansson@arm.com/** 6811375Sandreas.hansson@arm.com * A common base class of Cache tagstore objects. 6911375Sandreas.hansson@arm.com */ 7011375Sandreas.hansson@arm.comclass BaseTags : public ClockedObject 7111375Sandreas.hansson@arm.com{ 7211375Sandreas.hansson@arm.com protected: 7311375Sandreas.hansson@arm.com /** The block size of the cache. */ 7411375Sandreas.hansson@arm.com const unsigned blkSize; 7511375Sandreas.hansson@arm.com /** Mask out all bits that aren't part of the block offset. */ 7611375Sandreas.hansson@arm.com const Addr blkMask; 7711375Sandreas.hansson@arm.com /** The size of the cache. */ 7811375Sandreas.hansson@arm.com const unsigned size; 7911375Sandreas.hansson@arm.com /** The tag lookup latency of the cache. */ 8011375Sandreas.hansson@arm.com const Cycles lookupLatency; 8111375Sandreas.hansson@arm.com /** 8211375Sandreas.hansson@arm.com * The total access latency of the cache. This latency 8311375Sandreas.hansson@arm.com * is different depending on the cache access mode 8411375Sandreas.hansson@arm.com * (parallel or sequential) 8512823Srmk35@cl.cam.ac.uk */ 8611375Sandreas.hansson@arm.com const Cycles accessLatency; 8711375Sandreas.hansson@arm.com /** Pointer to the parent cache. */ 8811375Sandreas.hansson@arm.com BaseCache *cache; 8911375Sandreas.hansson@arm.com 9011375Sandreas.hansson@arm.com /** 9111375Sandreas.hansson@arm.com * The number of tags that need to be touched to meet the warmup 9211375Sandreas.hansson@arm.com * percentage. 9311375Sandreas.hansson@arm.com */ 9411375Sandreas.hansson@arm.com const unsigned warmupBound; 9512724Snikos.nikoleris@arm.com /** Marked true when the cache is warmed up. */ 9611375Sandreas.hansson@arm.com bool warmedUp; 9711375Sandreas.hansson@arm.com 9811375Sandreas.hansson@arm.com /** the number of blocks in the cache */ 9911375Sandreas.hansson@arm.com const unsigned numBlocks; 10011375Sandreas.hansson@arm.com 10111375Sandreas.hansson@arm.com /** The data blocks, 1 per cache block. */ 10211375Sandreas.hansson@arm.com std::unique_ptr<uint8_t[]> dataBlks; 10311375Sandreas.hansson@arm.com 10411375Sandreas.hansson@arm.com // Statistics 10511375Sandreas.hansson@arm.com /** 10611375Sandreas.hansson@arm.com * TODO: It would be good if these stats were acquired after warmup. 10711375Sandreas.hansson@arm.com * @addtogroup CacheStatistics 10811375Sandreas.hansson@arm.com * @{ 10911375Sandreas.hansson@arm.com */ 11011375Sandreas.hansson@arm.com 11111375Sandreas.hansson@arm.com /** Per cycle average of the number of tags that hold valid data. */ 11211375Sandreas.hansson@arm.com Stats::Average tagsInUse; 11311375Sandreas.hansson@arm.com 11411375Sandreas.hansson@arm.com /** The total number of references to a block before it is replaced. */ 11511375Sandreas.hansson@arm.com Stats::Scalar totalRefs; 11611375Sandreas.hansson@arm.com 11711375Sandreas.hansson@arm.com /** 11811375Sandreas.hansson@arm.com * The number of reference counts sampled. This is different from 11911375Sandreas.hansson@arm.com * replacements because we sample all the valid blocks when the simulator 12011375Sandreas.hansson@arm.com * exits. 12111375Sandreas.hansson@arm.com */ 12211375Sandreas.hansson@arm.com Stats::Scalar sampledRefs; 12311375Sandreas.hansson@arm.com 12411375Sandreas.hansson@arm.com /** 12511375Sandreas.hansson@arm.com * Average number of references to a block before is was replaced. 12611375Sandreas.hansson@arm.com * @todo This should change to an average stat once we have them. 12711375Sandreas.hansson@arm.com */ 12811375Sandreas.hansson@arm.com Stats::Formula avgRefs; 12911375Sandreas.hansson@arm.com 13011375Sandreas.hansson@arm.com /** The cycle that the warmup percentage was hit. 0 on failure. */ 13111375Sandreas.hansson@arm.com Stats::Scalar warmupCycle; 13211375Sandreas.hansson@arm.com 13311375Sandreas.hansson@arm.com /** Average occupancy of each requestor using the cache */ 13411375Sandreas.hansson@arm.com Stats::AverageVector occupancies; 13511375Sandreas.hansson@arm.com 13611375Sandreas.hansson@arm.com /** Average occ % of each requestor using the cache */ 13711375Sandreas.hansson@arm.com Stats::Formula avgOccs; 13811375Sandreas.hansson@arm.com 13911375Sandreas.hansson@arm.com /** Occupancy of each context/cpu using the cache */ 14011375Sandreas.hansson@arm.com Stats::Vector occupanciesTaskId; 14111375Sandreas.hansson@arm.com 14211375Sandreas.hansson@arm.com /** Occupancy of each context/cpu using the cache */ 14311375Sandreas.hansson@arm.com Stats::Vector2d ageTaskId; 14411375Sandreas.hansson@arm.com 14511375Sandreas.hansson@arm.com /** Occ % of each context/cpu using the cache */ 14611375Sandreas.hansson@arm.com Stats::Formula percentOccsTaskId; 14711375Sandreas.hansson@arm.com 14811375Sandreas.hansson@arm.com /** Number of tags consulted over all accesses. */ 14911375Sandreas.hansson@arm.com Stats::Scalar tagAccesses; 15011375Sandreas.hansson@arm.com /** Number of data blocks consulted over all accesses. */ 15111375Sandreas.hansson@arm.com Stats::Scalar dataAccesses; 15211375Sandreas.hansson@arm.com 15313859Sodanrc@yahoo.com.br /** 15411375Sandreas.hansson@arm.com * @} 15511375Sandreas.hansson@arm.com */ 15611375Sandreas.hansson@arm.com 15711375Sandreas.hansson@arm.com public: 15811375Sandreas.hansson@arm.com typedef BaseTagsParams Params; 15911375Sandreas.hansson@arm.com BaseTags(const Params *p); 16011375Sandreas.hansson@arm.com 16111375Sandreas.hansson@arm.com /** 16211375Sandreas.hansson@arm.com * Destructor. 16311375Sandreas.hansson@arm.com */ 16411375Sandreas.hansson@arm.com virtual ~BaseTags() {} 16511375Sandreas.hansson@arm.com 16611375Sandreas.hansson@arm.com /** 16712823Srmk35@cl.cam.ac.uk * Set the parent cache back pointer. 16811375Sandreas.hansson@arm.com * @param _cache Pointer to parent cache. 16911375Sandreas.hansson@arm.com */ 17011375Sandreas.hansson@arm.com void setCache(BaseCache *_cache); 17111375Sandreas.hansson@arm.com 17211375Sandreas.hansson@arm.com /** 17311375Sandreas.hansson@arm.com * Register local statistics. 17411375Sandreas.hansson@arm.com */ 17511375Sandreas.hansson@arm.com void regStats(); 17611375Sandreas.hansson@arm.com 17711375Sandreas.hansson@arm.com /** 17811375Sandreas.hansson@arm.com * Average in the reference count for valid blocks when the simulation 17911375Sandreas.hansson@arm.com * exits. 18011375Sandreas.hansson@arm.com */ 18111375Sandreas.hansson@arm.com void cleanupRefs(); 18213861Sodanrc@yahoo.com.br 18313861Sodanrc@yahoo.com.br /** 18413861Sodanrc@yahoo.com.br * Computes stats just prior to dump event 18513861Sodanrc@yahoo.com.br */ 18611375Sandreas.hansson@arm.com void computeStats(); 18711375Sandreas.hansson@arm.com 18811375Sandreas.hansson@arm.com /** 189 * Print all tags used 190 */ 191 std::string print(); 192 193 /** 194 * Find a block using the memory address 195 */ 196 virtual CacheBlk * findBlock(Addr addr, bool is_secure) const = 0; 197 198 /** 199 * Find a block given set and way. 200 * 201 * @param set The set of the block. 202 * @param way The way of the block. 203 * @return The block. 204 */ 205 virtual ReplaceableEntry* findBlockBySetAndWay(int set, int way) const = 0; 206 207 /** 208 * Align an address to the block size. 209 * @param addr the address to align. 210 * @return The block address. 211 */ 212 Addr blkAlign(Addr addr) const 213 { 214 return addr & ~blkMask; 215 } 216 217 /** 218 * Calculate the block offset of an address. 219 * @param addr the address to get the offset of. 220 * @return the block offset. 221 */ 222 int extractBlkOffset(Addr addr) const 223 { 224 return (addr & blkMask); 225 } 226 227 /** 228 * Limit the allocation for the cache ways. 229 * @param ways The maximum number of ways available for replacement. 230 */ 231 virtual void setWayAllocationMax(int ways) 232 { 233 panic("This tag class does not implement way allocation limit!\n"); 234 } 235 236 /** 237 * Get the way allocation mask limit. 238 * @return The maximum number of ways available for replacement. 239 */ 240 virtual int getWayAllocationMax() const 241 { 242 panic("This tag class does not implement way allocation limit!\n"); 243 return -1; 244 } 245 246 /** 247 * This function updates the tags when a block is invalidated 248 * 249 * @param blk A valid block to invalidate. 250 */ 251 virtual void invalidate(CacheBlk *blk) 252 { 253 assert(blk); 254 assert(blk->isValid()); 255 256 tagsInUse--; 257 occupancies[blk->srcMasterId]--; 258 totalRefs += blk->refCount; 259 sampledRefs++; 260 261 blk->invalidate(); 262 } 263 264 /** 265 * Find replacement victim based on address. 266 * 267 * @param addr Address to find a victim for. 268 * @return Cache block to be replaced. 269 */ 270 virtual CacheBlk* findVictim(Addr addr) = 0; 271 272 virtual CacheBlk* accessBlock(Addr addr, bool is_secure, Cycles &lat) = 0; 273 274 virtual Addr extractTag(Addr addr) const = 0; 275 276 /** 277 * Insert the new block into the cache and update stats. 278 * 279 * @param pkt Packet holding the address to update 280 * @param blk The block to update. 281 */ 282 virtual void insertBlock(PacketPtr pkt, CacheBlk *blk); 283 284 /** 285 * Regenerate the block address. 286 * 287 * @param block The block. 288 * @return the block address. 289 */ 290 virtual Addr regenerateBlkAddr(const CacheBlk* blk) const = 0; 291 292 /** 293 * Visit each block in the tags and apply a visitor 294 * 295 * The visitor should be a std::function that takes a cache block 296 * reference as its parameter. 297 * 298 * @param visitor Visitor to call on each block. 299 */ 300 virtual void forEachBlk(std::function<void(CacheBlk &)> visitor) = 0; 301 302 /** 303 * Find if any of the blocks satisfies a condition 304 * 305 * The visitor should be a std::function that takes a cache block 306 * reference as its parameter. The visitor will terminate the 307 * traversal early if the condition is satisfied. 308 * 309 * @param visitor Visitor to call on each block. 310 */ 311 virtual bool anyBlk(std::function<bool(CacheBlk &)> visitor) = 0; 312 313 private: 314 /** 315 * Update the reference stats using data from the input block 316 * 317 * @param blk The input block 318 */ 319 void cleanupRefsVisitor(CacheBlk &blk); 320 321 /** 322 * Update the occupancy and age stats using data from the input block 323 * 324 * @param blk The input block 325 */ 326 void computeStatsVisitor(CacheBlk &blk); 327}; 328 329class BaseTagsCallback : public Callback 330{ 331 BaseTags *tags; 332 public: 333 BaseTagsCallback(BaseTags *t) : tags(t) {} 334 virtual void process() { tags->cleanupRefs(); }; 335}; 336 337class BaseTagsDumpCallback : public Callback 338{ 339 BaseTags *tags; 340 public: 341 BaseTagsDumpCallback(BaseTags *t) : tags(t) {} 342 virtual void process() { tags->computeStats(); }; 343}; 344 345#endif //__MEM_CACHE_TAGS_BASE_HH__ 346