gem5  v22.1.0.0
base_set_assoc.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012-2014,2017 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 
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"
56 #include "mem/cache/base.hh"
57 #include "mem/cache/cache_blk.hh"
60 #include "mem/cache/tags/base.hh"
62 #include "mem/packet.hh"
63 #include "params/BaseSetAssoc.hh"
64 
65 namespace gem5
66 {
67 
75 class 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.
135  if (sequentialAccess) {
136  if (blk != nullptr) {
137  stats.dataAccesses += 1;
138  }
139  } else {
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
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 
168  CacheBlk* findVictim(Addr addr, const bool is_secure,
169  const std::size_t size,
170  std::vector<CacheBlk*>& evict_blks) override
171  {
172  // Get possible entries to be victimized
173  const std::vector<ReplaceableEntry*> entries =
175 
176  // Choose replacement victim from replacement candidates
177  CacheBlk* victim = static_cast<CacheBlk*>(replacementPolicy->getVictim(
178  entries));
179 
180  // There is only one eviction for this replacement
181  evict_blks.push_back(victim);
182 
183  return victim;
184  }
185 
192  void insertBlock(const PacketPtr pkt, CacheBlk *blk) override
193  {
194  // Insert block
195  BaseTags::insertBlock(pkt, blk);
196 
197  // Increment tag counter
198  stats.tagsInUse++;
199 
200  // Update replacement policy
202  }
203 
204  void moveBlock(CacheBlk *src_blk, CacheBlk *dest_blk) override;
205 
210  virtual void setWayAllocationMax(int ways) override
211  {
212  fatal_if(ways < 1, "Allocation limit must be greater than zero");
213  allocAssoc = ways;
214  }
215 
220  virtual int getWayAllocationMax() const override
221  {
222  return allocAssoc;
223  }
224 
231  Addr regenerateBlkAddr(const CacheBlk* blk) const override
232  {
233  return indexingPolicy->regenerateAddr(blk->getTag(), blk);
234  }
235 
236  void forEachBlk(std::function<void(CacheBlk &)> visitor) override {
237  for (CacheBlk& blk : blks) {
238  visitor(blk);
239  }
240  }
241 
242  bool anyBlk(std::function<bool(CacheBlk &)> visitor) override {
243  for (CacheBlk& blk : blks) {
244  if (visitor(blk)) {
245  return true;
246  }
247  }
248  return false;
249  }
250 };
251 
252 } // namespace gem5
253 
254 #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.
virtual std::vector< ReplaceableEntry * > getPossibleEntries(const Addr addr) const =0
Find all possible entries for insertion and replacement of an address.
virtual Addr regenerateAddr(const Addr tag, const ReplaceableEntry *entry) const =0
Regenerate an entry's address from its tag and assigned indexing bits.
A basic cache tag store.
CacheBlk * findVictim(Addr addr, const bool is_secure, const std::size_t size, std::vector< CacheBlk * > &evict_blks) override
Find replacement victim based on address.
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.
void forEachBlk(std::function< void(CacheBlk &)> visitor) override
Visit each block in the tags and apply a visitor.
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.
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.
CacheBlk * accessBlock(const PacketPtr pkt, Cycles &lat) override
Access block and update replacement data.
bool anyBlk(std::function< bool(CacheBlk &)> visitor) override
Find if any of the blocks satisfies a condition.
BaseSetAssocParams Params
Convenience typedef.
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.
A common base class of Cache tagstore objects.
Definition: base.hh:74
virtual void insertBlock(const PacketPtr pkt, CacheBlk *blk)
Insert the new block into the cache and update stats.
Definition: base.cc:102
virtual CacheBlk * findBlock(Addr addr, bool is_secure) const
Finds the block in the cache without touching it.
Definition: base.cc:80
const unsigned size
The size of the cache.
Definition: base.hh:81
gem5::BaseTags::BaseTagStats stats
BaseIndexingPolicy * indexingPolicy
Indexing policy.
Definition: base.hh:89
BaseTagsParams Params
Definition: base.hh:161
const Cycles lookupLatency
The tag lookup latency of the cache.
Definition: base.hh:83
A Basic Cache block.
Definition: cache_blk.hh:71
void increaseRefCount()
Get the number of references to this block since insertion.
Definition: cache_blk.hh:294
Cycles is a wrapper class for representing cycle counts, i.e.
Definition: types.hh:79
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Definition: packet.hh:294
bool isSecure() const
Definition: packet.hh:834
Addr getAddr() const
Definition: packet.hh:805
std::shared_ptr< replacement_policy::ReplacementData > replacementData
Replacement data associated to this entry.
virtual Addr getTag() const
Get tag associated to this block.
Definition: tagged_entry.hh:71
A common base class of cache replacement policy objects.
Definition: base.hh:56
virtual ReplaceableEntry * getVictim(const ReplacementCandidates &candidates) const =0
Find replacement victim among candidates.
virtual void reset(const std::shared_ptr< ReplacementData > &replacement_data, const PacketPtr pkt)
Reset replacement data.
Definition: base.hh:90
virtual void touch(const std::shared_ptr< ReplacementData > &replacement_data, const PacketPtr pkt)
Update replacement data.
Definition: base.hh:76
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:226
Declares a basic cache interface BaseCache.
Declaration of a common base class for cache tagstore objects.
Declaration of a common framework for indexing policies.
Bitfield< 54 > p
Definition: pagetable.hh:70
Bitfield< 3 > addr
Definition: types.hh:84
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:147
Declaration of the Packet class.
statistics::Scalar tagAccesses
Number of tags consulted over all accesses.
Definition: base.hh:155
statistics::Scalar dataAccesses
Number of data blocks consulted over all accesses.
Definition: base.hh:157
statistics::Average tagsInUse
Per tick average of the number of tags that hold valid data.
Definition: base.hh:118

Generated on Wed Dec 21 2022 10:22:36 for gem5 by doxygen 1.9.1