65 sequentialAccess(
p.sequential_access),
66 replacementPolicy(
p.replacement_policy),
67 numBlocksPerSector(
p.num_blocks_per_sector),
68 numSectors(numBlocks / numBlocksPerSector),
69 sectorShift(
floorLog2(blkSize)), sectorMask(numBlocksPerSector - 1),
70 sectorStats(stats, *this)
73 fatal_if(!
p.indexing_policy,
"An indexing policy is required");
77 "Block size must be at least 4 and a power of 2");
79 "# of blocks per sector must be non-zero and a power of 2");
81 "Using cache partitioning policies with sector and/or compressed "
82 "tags is not fully tested.");
93 unsigned blk_index = 0;
94 for (
unsigned sec_blk_index = 0; sec_blk_index <
numSectors;
110 blk = &
blks[blk_index];
166 if (blk !=
nullptr) {
174 if (blk !=
nullptr) {
221 const bool dest_was_valid =
240 if (!src_sector_blk->
isValid()) {
244 if (dest_was_valid) {
250 }
else if (!dest_was_valid) {
257 if (dest_was_valid) {
276 for (
const auto& sector : entries) {
278 if (blk->match(key)) {
289 const std::size_t size,
291 const uint64_t partition_id)
303 for (
const auto& sector : sector_entries) {
305 if (sector_blk->
match(key)) {
306 victim_sector = sector_blk;
312 if (victim_sector ==
nullptr){
316 if (sector_entries.size() == 0){
330 if (victim_sector->
match(key)) {
336 for (
const auto& blk : victim_sector->
blks){
337 if (blk->isValid()) {
338 evict_blks.push_back(blk);
360 const Addr sec_addr =
368 : statistics::
Group(&base_group), tags(_tags),
369 ADD_STAT(evictionsReplacement, statistics::units::Count::get(),
370 "Number of blocks evicted due to a replacement")
379 evictionsReplacement.init(tags.numBlocksPerSector + 1);
380 for (
unsigned i = 0;
i <= tags.numBlocksPerSector; ++
i) {
381 evictionsReplacement.subname(
i, std::to_string(
i));
382 evictionsReplacement.subdesc(
i,
"Number of replacements that caused " \
383 "the eviction of " + std::to_string(
i) +
" blocks");
Defines global host-dependent types: Counter, Tick, and (indirectly) {int,uint}{8,...
void increaseRefCount()
Get the number of references to this block since insertion.
uint8_t * data
Contains a copy of the data in this block for easy access.
Cycles is a wrapper class for representing cycle counts, i.e.
virtual Addr regenerateAddr(const KeyType &key, const ReplaceableEntry *entry) const =0
Regenerate an entry's address from its tag and assigned indexing bits.
virtual std::vector< ReplaceableEntry * > getPossibleEntries(const KeyType &key) const =0
Find all possible entries for insertion and replacement of an address.
void setEntry(ReplaceableEntry *entry, const uint64_t index)
Associate a pointer to an entry to its physical counterpart.
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
std::shared_ptr< replacement_policy::ReplacementData > replacementData
Replacement data associated to this entry.
std::vector< SectorSubBlk * > blks
List of blocks associated to this sector.
bool isValid() const override
Checks that a sector block is valid.
A sector is composed of sub-blocks, and each sub-block has information regarding its sector and a poi...
int getSectorOffset() const
Get offset of this sub-block within the sector.
void setSectorBlock(SectorBlk *sector_blk)
Set sector block associated to this block.
void setSectorOffset(const int sector_offset)
Set offset of this sub-block within the sector.
SectorBlk * getSectorBlock() const
Get sector block associated to this block.
virtual bool isValid() const
Checks if the entry is valid.
bool match(const KeyType &key) const
Checks if the given tag information corresponds to this entry's.
bool isSecure() const
Check if this block holds data from the secure memory space.
virtual Addr getTag() const
Get tag associated to this block.
void filterByPartition(std::vector< ReplaceableEntry * > &entries, const uint64_t partition_id) const
virtual void invalidate(const std::shared_ptr< ReplacementData > &replacement_data)=0
Invalidate replacement data to set it as the next probable victim.
virtual void reset(const std::shared_ptr< ReplacementData > &replacement_data, const PacketPtr pkt)
Reset replacement data.
virtual void touch(const std::shared_ptr< ReplacementData > &replacement_data, const PacketPtr pkt)
Update replacement data.
virtual ReplaceableEntry * getVictim(const ReplacementCandidates &candidates) const =0
Find replacement victim among candidates.
virtual std::shared_ptr< ReplacementData > instantiateEntry()=0
Instantiate a replacement data entry.
Counter value() const
Return the current value of this stat as its base type.
#define ADD_STAT(n,...)
Convenience macro to add a stat to a statistics group.
static constexpr std::enable_if_t< std::is_integral_v< T >, int > floorLog2(T x)
static constexpr bool isPowerOf2(const T &n)
#define fatal_if(cond,...)
Conditional fatal macro that checks the supplied condition and only causes a fatal error if the condi...
virtual void regStats()
Callback to set stat parameters.
#define warn_if(cond,...)
Conditional warning macro that checks the supplied condition and only prints a warning if the conditi...
Declares a basic cache interface BaseCache.
Copyright (c) 2024 Arm Limited All rights reserved.
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.