gem5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
base_set_assoc.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012-2014 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  * Authors: Erik Hallnor
41  */
42 
49 
50 #include <string>
51 
52 #include "base/intmath.hh"
53 #include "sim/core.hh"
54 
55 using namespace std;
56 
58  :BaseTags(p), assoc(p->assoc), allocAssoc(p->assoc),
59  numSets(p->size / (p->block_size * p->assoc)),
60  sequentialAccess(p->sequential_access)
61 {
62  // Check parameters
63  if (blkSize < 4 || !isPowerOf2(blkSize)) {
64  fatal("Block size must be at least 4 and a power of 2");
65  }
66  if (numSets <= 0 || !isPowerOf2(numSets)) {
67  fatal("# of sets must be non-zero and a power of 2");
68  }
69  if (assoc <= 0) {
70  fatal("associativity must be greater than zero");
71  }
72 
74  setMask = numSets - 1;
78 
79  sets = new SetType[numSets];
80  blks = new BlkType[numSets * assoc];
81  // allocate data storage in one big chunk
83  dataBlks = new uint8_t[numBlocks * blkSize];
84 
85  unsigned blkIndex = 0; // index into blks array
86  for (unsigned i = 0; i < numSets; ++i) {
87  sets[i].assoc = assoc;
88 
89  sets[i].blks = new BlkType*[assoc];
90 
91  // link in the data blocks
92  for (unsigned j = 0; j < assoc; ++j) {
93  // locate next cache block
94  BlkType *blk = &blks[blkIndex];
95  blk->data = &dataBlks[blkSize*blkIndex];
96  ++blkIndex;
97 
98  // invalidate new cache block
99  blk->invalidate();
100 
101  //EGH Fix Me : do we need to initialize blk?
102 
103  // Setting the tag to j is just to prevent long chains in the hash
104  // table; won't matter because the block is invalid
105  blk->tag = j;
106  blk->whenReady = 0;
107  blk->isTouched = false;
108  sets[i].blks[j]=blk;
109  blk->set = i;
110  blk->way = j;
111  }
112  }
113 }
114 
116 {
117  delete [] dataBlks;
118  delete [] blks;
119  delete [] sets;
120 }
121 
122 CacheBlk*
123 BaseSetAssoc::findBlock(Addr addr, bool is_secure) const
124 {
125  Addr tag = extractTag(addr);
126  unsigned set = extractSet(addr);
127  BlkType *blk = sets[set].findBlk(tag, is_secure);
128  return blk;
129 }
130 
131 CacheBlk*
132 BaseSetAssoc::findBlockBySetAndWay(int set, int way) const
133 {
134  return sets[set].blks[way];
135 }
136 
137 std::string
139  std::string cache_state;
140  for (unsigned i = 0; i < numSets; ++i) {
141  // link in the data blocks
142  for (unsigned j = 0; j < assoc; ++j) {
143  BlkType *blk = sets[i].blks[j];
144  if (blk->isValid())
145  cache_state += csprintf("\tset: %d block: %d %s\n", i, j,
146  blk->print());
147  }
148  }
149  if (cache_state.empty())
150  cache_state = "no valid tags\n";
151  return cache_state;
152 }
153 
154 void
156 {
157  for (unsigned i = 0; i < numSets*assoc; ++i) {
158  if (blks[i].isValid()) {
159  totalRefs += blks[i].refCount;
160  ++sampledRefs;
161  }
162  }
163 }
164 
165 void
167 {
168  for (unsigned i = 0; i < ContextSwitchTaskId::NumTaskId; ++i) {
169  occupanciesTaskId[i] = 0;
170  for (unsigned j = 0; j < 5; ++j) {
171  ageTaskId[i][j] = 0;
172  }
173  }
174 
175  for (unsigned i = 0; i < numSets * assoc; ++i) {
176  if (blks[i].isValid()) {
177  assert(blks[i].task_id < ContextSwitchTaskId::NumTaskId);
179  assert(blks[i].tickInserted <= curTick());
180  Tick age = curTick() - blks[i].tickInserted;
181 
182  int age_index;
183  if (age / SimClock::Int::us < 10) { // <10us
184  age_index = 0;
185  } else if (age / SimClock::Int::us < 100) { // <100us
186  age_index = 1;
187  } else if (age / SimClock::Int::ms < 1) { // <1ms
188  age_index = 2;
189  } else if (age / SimClock::Int::ms < 10) { // <10ms
190  age_index = 3;
191  } else
192  age_index = 4; // >10ms
193 
194  ageTaskId[blks[i].task_id][age_index]++;
195  }
196  }
197 }
Stats::Scalar sampledRefs
The number of reference counts sampled.
Definition: base.hh:115
Tick us
microsecond
Definition: core.cc:65
Tick whenReady
Which curTick() will this block be accessable.
Definition: blk.hh:103
Bitfield< 7 > i
Definition: miscregs.hh:1378
Addr tag
Data block tag value.
Definition: blk.hh:86
CacheBlk * findBlockBySetAndWay(int set, int way) const override
Find the cache block given set and way.
int assoc
The associativity of this set.
Definition: cacheset.hh:61
Stats::Scalar totalRefs
The total number of references to a block before it is replaced.
Definition: base.hh:108
ip6_addr_t addr
Definition: inet.hh:335
BlkType * blks
The cache blocks.
Stats::Vector occupanciesTaskId
Occupancy of each context/cpu using the cache.
Definition: base.hh:133
An associative set of cache blocks.
Definition: cacheset.hh:57
Blktype * findBlk(Addr tag, bool is_secure, int &way_id) const
Find a block matching the tag in this set.
Definition: cacheset.hh:92
unsigned refCount
Number of references to this block since it was brought in.
Definition: blk.hh:115
Blktype ** blks
Cache blocks in this set, maintained in LRU order 0 = MRU.
Definition: cacheset.hh:64
int way
Definition: blk.hh:109
BaseTagsParams Params
Definition: base.hh:151
Tick curTick()
The current simulated tick.
Definition: core.hh:47
A Basic Cache block.
Definition: blk.hh:79
BaseSetAssoc(const Params *p)
Construct and initialize this tag store.
unsigned numBlocks
the number of blocks in the cache
Definition: base.hh:94
std::string csprintf(const char *format, const Args &...args)
Definition: cprintf.hh:161
int tagShift
The amount to shift the address to get the tag.
std::string print() const override
Print all tags used.
uint64_t Tick
Tick count type.
Definition: types.hh:63
void computeStats() override
Called prior to dumping stats to compute task occupancy.
#define fatal(...)
Definition: misc.hh:163
bool isPowerOf2(const T &n)
Definition: intmath.hh:73
SetType * sets
The cache sets.
const unsigned blkSize
The block size of the cache.
Definition: base.hh:69
void invalidate()
Invalidate the block and clear all state.
Definition: blk.hh:211
Stats::Vector2d ageTaskId
Occupancy of each context/cpu using the cache.
Definition: base.hh:136
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:142
uint8_t * dataBlks
The data blocks, 1 per cache block.
const unsigned numSets
The number of sets in the cache.
Bitfield< 24 > j
Definition: miscregs.hh:1369
Tick ms
millisecond
Definition: core.cc:64
bool isTouched
whether this block has been touched
Definition: blk.hh:112
int setShift
The amount to shift the address to get the set.
Declaration of a base set associative tag store.
int floorLog2(unsigned x)
Definition: intmath.hh:100
int size()
Definition: pagetable.hh:146
std::string print() const
Pretty-print a tag, and interpret state bits to readable form including mapping to a MOESI state...
Definition: blk.hh:286
Addr extractTag(Addr addr) const override
Generate the tag from the given address.
int extractSet(Addr addr) const override
Calculate the set index from the address.
void cleanupRefs() override
Called at end of simulation to complete average block reference stats.
const unsigned assoc
The associativity of the cache.
uint32_t task_id
Task Id associated with this block.
Definition: blk.hh:83
int set
The set and way this block belongs to.
Definition: blk.hh:109
int warmupBound
The number of tags that need to be touched to meet the warmup percentage.
Definition: base.hh:89
bool isValid() const
Checks that a block is valid.
Definition: blk.hh:203
CacheBlk * findBlock(Addr addr, bool is_secure) const override
Finds the given address in the cache, do not update replacement data.
virtual ~BaseSetAssoc()
Destructor.
Bitfield< 0 > p
A common base class of Cache tagstore objects.
Definition: base.hh:65
uint8_t * data
Contains a copy of the data in this block for easy access.
Definition: blk.hh:94
unsigned setMask
Mask out all bits that aren't part of the set index.

Generated on Fri Jun 9 2017 13:03:48 for gem5 by doxygen 1.8.6