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) {
279 for (
const auto& sector : entries) {
281 if (blk->matchTag(tag, is_secure)) {
293 const uint64_t partition_id)
306 for (
const auto& sector : sector_entries) {
308 if (sector_blk->
matchTag(tag, is_secure)) {
309 victim_sector = sector_blk;
315 if (victim_sector ==
nullptr){
319 if (sector_entries.size() == 0){
332 if (victim_sector->
matchTag(tag, is_secure)) {
338 for (
const auto& blk : victim_sector->
blks){
339 if (blk->isValid()) {
340 evict_blks.push_back(blk);
362 const Addr sec_addr =
369 : statistics::
Group(&base_group), tags(_tags),
370 ADD_STAT(evictionsReplacement, statistics::units::Count::get(),
371 "Number of blocks evicted due to a replacement")
380 evictionsReplacement.init(tags.numBlocksPerSector + 1);
381 for (
unsigned i = 0;
i <= tags.numBlocksPerSector; ++
i) {
382 evictionsReplacement.subname(
i, std::to_string(
i));
383 evictionsReplacement.subdesc(
i,
"Number of replacements that caused " \
384 "the eviction of " + std::to_string(
i) +
" blocks");
Defines global host-dependent types: Counter, Tick, and (indirectly) {int,uint}{8,...
virtual Addr regenerateAddr(const Addr tag, const ReplaceableEntry *entry) const =0
Regenerate an entry's address from its tag and assigned indexing bits.
void setEntry(ReplaceableEntry *entry, const uint64_t index)
Associate a pointer to an entry to its physical counterpart.
virtual std::vector< ReplaceableEntry * > getPossibleEntries(const Addr addr) const =0
Find all possible entries for insertion and replacement of an address.
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.
virtual Addr getTag() const
Get tag associated to this block.
virtual bool isValid() const
Checks if the entry is valid.
Cycles is a wrapper class for representing cycle counts, i.e.
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 matchTag(Addr tag, bool is_secure) const
Checks if the given tag information corresponds to this entry's.
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 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.