gem5 [DEVELOP-FOR-25.1]
Loading...
Searching...
No Matches
base_set_assoc.hh
Go to the documentation of this file.
1/*
2 * Copyright (c) 2012-2014, 2017, 2023-2024 ARM Limited
3 * All rights reserved.
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
13 *
14 * Copyright (c) 2003-2005,2014 The Regents of The University of Michigan
15 * All rights reserved.
16 *
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions are
19 * met: redistributions of source code must retain the above copyright
20 * notice, this list of conditions and the following disclaimer;
21 * redistributions in binary form must reproduce the above copyright
22 * notice, this list of conditions and the following disclaimer in the
23 * documentation and/or other materials provided with the distribution;
24 * neither the name of the copyright holders nor the names of its
25 * contributors may be used to endorse or promote products derived from
26 * this software without specific prior written permission.
27 *
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 */
40
45
46#ifndef __MEM_CACHE_TAGS_BASE_SET_ASSOC_HH__
47#define __MEM_CACHE_TAGS_BASE_SET_ASSOC_HH__
48
49#include <cstdint>
50#include <functional>
51#include <string>
52#include <vector>
53
54#include "base/logging.hh"
55#include "base/types.hh"
62#include "mem/packet.hh"
63#include "params/BaseSetAssoc.hh"
64
65namespace gem5
66{
67
75class BaseSetAssoc : public BaseTags
76{
77 protected:
79 unsigned allocAssoc;
80
83
85 const bool sequentialAccess;
86
89
90 public:
92 typedef BaseSetAssocParams Params;
93
97 BaseSetAssoc(const Params &p);
98
102 virtual ~BaseSetAssoc() {};
103
107 void tagsInit() override;
108
115 void invalidate(CacheBlk *blk) override;
116
127 CacheBlk* accessBlock(const PacketPtr pkt, Cycles &lat) override
128 {
129 CacheBlk *blk = findBlock({pkt->getAddr(), pkt->isSecure()});
130
131 // Access all tags in parallel, hence one in each way. The data side
132 // either accesses all blocks in parallel, or one block sequentially on
133 // a hit. Sequential access with a miss doesn't access data.
134 stats.tagAccesses += allocAssoc;
135 if (sequentialAccess) {
136 if (blk != nullptr) {
137 stats.dataAccesses += 1;
138 }
139 } else {
140 stats.dataAccesses += allocAssoc;
141 }
142
143 // If a cache hit
144 if (blk != nullptr) {
145 // Update number of references to accessed block
146 blk->increaseRefCount();
147
148 // Update replacement data of accessed block
149 replacementPolicy->touch(blk->replacementData, pkt);
150 }
151
152 // The tag lookup latency is the same for a hit or a miss
153 lat = lookupLatency;
154
155 return blk;
156 }
157
170 const std::size_t size,
171 std::vector<CacheBlk*>& evict_blks,
172 const uint64_t partition_id=0) override
173 {
174 // Get possible entries to be victimized
176 indexingPolicy->getPossibleEntries(key);
177
178 // Filter entries based on PartitionID
179 if (partitionManager) {
180 partitionManager->filterByPartition(entries, partition_id);
181 }
182
183 // Choose replacement victim from replacement candidates
184 CacheBlk* victim = entries.empty() ? nullptr :
185 static_cast<CacheBlk*>(replacementPolicy->getVictim(entries));
186
187 // There is only one eviction for this replacement
188 evict_blks.push_back(victim);
189
190 return victim;
191 }
192
199 void insertBlock(const PacketPtr pkt, CacheBlk *blk) override
200 {
201 // Insert block
202 BaseTags::insertBlock(pkt, blk);
203
204 // Increment tag counter
205 stats.tagsInUse++;
206
207 if (partitionManager) {
208 auto partition_id = partitionManager->readPacketPartitionID(pkt);
209 partitionManager->notifyAcquire(partition_id);
210 }
211
212 // Update replacement policy
213 replacementPolicy->reset(blk->replacementData, pkt);
214 }
215
216 void moveBlock(CacheBlk *src_blk, CacheBlk *dest_blk) override;
217
222 virtual void setWayAllocationMax(int ways) override
223 {
224 fatal_if(ways < 1, "Allocation limit must be greater than zero");
225 allocAssoc = ways;
226 }
227
232 virtual int getWayAllocationMax() const override
233 {
234 return allocAssoc;
235 }
236
243 Addr regenerateBlkAddr(const CacheBlk* blk) const override
244 {
245 return indexingPolicy->regenerateAddr({blk->getTag(), false}, blk);
246 }
247
248 bool anyBlk(std::function<bool(CacheBlk &)> visitor) override {
249 for (CacheBlk& blk : blks) {
250 if (visitor(blk)) {
251 return true;
252 }
253 }
254 return false;
255 }
256};
257
258} // namespace gem5
259
260#endif //__MEM_CACHE_TAGS_BASE_SET_ASSOC_HH__
Defines global host-dependent types: Counter, Tick, and (indirectly) {int,uint}{8,...
Definitions of a simple cache block class.
std::vector< CacheBlk > blks
The cache blocks.
void insertBlock(const PacketPtr pkt, CacheBlk *blk) override
Insert the new block into the cache and update replacement data.
const bool sequentialAccess
Whether tags and data are accessed sequentially.
virtual int getWayAllocationMax() const override
Get the way allocation mask limit.
void invalidate(CacheBlk *blk) override
This function updates the tags when a block is invalidated.
BaseSetAssoc(const Params &p)
Construct and initialize this tag store.
virtual ~BaseSetAssoc()
Destructor.
CacheBlk * findVictim(const CacheBlk::KeyType &key, const std::size_t size, std::vector< CacheBlk * > &evict_blks, const uint64_t partition_id=0) override
Find replacement victim based on address.
unsigned allocAssoc
The allocatable associativity of the cache (alloc mask).
void moveBlock(CacheBlk *src_blk, CacheBlk *dest_blk) override
Move a block's metadata to another location decided by the replacement policy.
bool anyBlk(std::function< bool(CacheBlk &)> visitor) override
Find if any of the blocks satisfies a condition.
BaseSetAssocParams Params
Convenience typedef.
CacheBlk * accessBlock(const PacketPtr pkt, Cycles &lat) override
Access block and update replacement data.
replacement_policy::Base * replacementPolicy
Replacement policy.
Addr regenerateBlkAddr(const CacheBlk *blk) const override
Regenerate the block address from the tag and indexing location.
virtual void setWayAllocationMax(int ways) override
Limit the allocation for the cache ways.
void tagsInit() override
Initialize blocks as CacheBlk instances.
partitioning_policy::PartitionManager * partitionManager
Partitioning manager.
Definition base.hh:92
virtual void insertBlock(const PacketPtr pkt, CacheBlk *blk)
Insert the new block into the cache and update stats.
Definition base.cc:101
BaseTags(const Params &p)
Definition base.cc:62
const unsigned size
The size of the cache.
Definition base.hh:81
virtual CacheBlk * findBlock(const CacheBlk::KeyType &key) const
Finds the block in the cache without touching it.
Definition base.cc:82
gem5::BaseTags::BaseTagStats stats
const Cycles lookupLatency
The tag lookup latency of the cache.
Definition base.hh:83
TaggedIndexingPolicy * indexingPolicy
Indexing policy.
Definition base.hh:89
A Basic Cache block.
Definition cache_blk.hh:72
void increaseRefCount()
Get the number of references to this block since insertion.
Definition cache_blk.hh:300
Cycles is a wrapper class for representing cycle counts, i.e.
Definition types.hh:79
bool isSecure() const
Definition packet.hh:836
Addr getAddr() const
Definition packet.hh:807
std::shared_ptr< replacement_policy::ReplacementData > replacementData
Replacement data associated to this entry.
TaggedTypes::KeyType KeyType
virtual Addr getTag() const
Get tag associated to this block.
A common base class of cache replacement policy objects.
Definition base.hh:55
STL vector class.
Definition stl.hh:37
#define fatal_if(cond,...)
Conditional fatal macro that checks the supplied condition and only causes a fatal error if the condi...
Definition logging.hh:268
Declaration of a common base class for cache tagstore objects.
Declaration of a common framework for indexing policies.
Bitfield< 0 > p
Copyright (c) 2024 Arm Limited All rights reserved.
Definition binary32.hh:36
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition types.hh:147
Packet * PacketPtr
Declaration of the Packet class.

Generated on Mon Oct 27 2025 04:13:03 for gem5 by doxygen 1.14.0