gem5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
CacheMemory.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 1999-2012 Mark D. Hill and David A. Wood
3  * Copyright (c) 2013 Advanced Micro Devices, Inc.
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are
8  * met: redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer;
10  * redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution;
13  * neither the name of the copyright holders nor the names of its
14  * contributors may be used to endorse or promote products derived from
15  * this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29 
31 
32 #include "base/intmath.hh"
33 #include "debug/RubyCache.hh"
34 #include "debug/RubyCacheTrace.hh"
35 #include "debug/RubyResourceStalls.hh"
36 #include "debug/RubyStats.hh"
37 #include "mem/protocol/AccessPermission.hh"
40 
41 using namespace std;
42 
43 ostream&
44 operator<<(ostream& out, const CacheMemory& obj)
45 {
46  obj.print(out);
47  out << flush;
48  return out;
49 }
50 
52 RubyCacheParams::create()
53 {
54  return new CacheMemory(this);
55 }
56 
58  : SimObject(p),
59  dataArray(p->dataArrayBanks, p->dataAccessLatency,
60  p->start_index_bit, p->ruby_system),
61  tagArray(p->tagArrayBanks, p->tagAccessLatency,
62  p->start_index_bit, p->ruby_system)
63 {
64  m_cache_size = p->size;
65  m_cache_assoc = p->assoc;
66  m_replacementPolicy_ptr = p->replacement_policy;
68  m_start_index_bit = p->start_index_bit;
69  m_is_instruction_only_cache = p->is_icache;
70  m_resource_stalls = p->resourceStalls;
71  m_block_size = p->block_size; // may be 0 at this point. Updated in init()
72 }
73 
74 void
76 {
77  if (m_block_size == 0) {
79  }
81  assert(m_cache_num_sets > 1);
83  assert(m_cache_num_set_bits > 0);
84 
87 }
88 
90 {
93  for (int i = 0; i < m_cache_num_sets; i++) {
94  for (int j = 0; j < m_cache_assoc; j++) {
95  delete m_cache[i][j];
96  }
97  }
98 }
99 
100 // convert a Address to its location in the cache
101 int64_t
103 {
104  assert(address == makeLineAddress(address));
105  return bitSelect(address, m_start_index_bit,
107 }
108 
109 // Given a cache index: returns the index of the tag in a set.
110 // returns -1 if the tag is not found.
111 int
112 CacheMemory::findTagInSet(int64_t cacheSet, Addr tag) const
113 {
114  assert(tag == makeLineAddress(tag));
115  // search the set for the tags
116  auto it = m_tag_index.find(tag);
117  if (it != m_tag_index.end())
118  if (m_cache[cacheSet][it->second]->m_Permission !=
119  AccessPermission_NotPresent)
120  return it->second;
121  return -1; // Not found
122 }
123 
124 // Given a cache index: returns the index of the tag in a set.
125 // returns -1 if the tag is not found.
126 int
128  Addr tag) const
129 {
130  assert(tag == makeLineAddress(tag));
131  // search the set for the tags
132  auto it = m_tag_index.find(tag);
133  if (it != m_tag_index.end())
134  return it->second;
135  return -1; // Not found
136 }
137 
138 // Given an unique cache block identifier (idx): return the valid address
139 // stored by the cache block. If the block is invalid/notpresent, the
140 // function returns the 0 address
141 Addr
143 {
144  Addr tmp(0);
145 
146  int set = idx / m_cache_assoc;
147  assert(set < m_cache_num_sets);
148 
149  int way = idx - set * m_cache_assoc;
150  assert (way < m_cache_assoc);
151 
152  AbstractCacheEntry* entry = m_cache[set][way];
153  if (entry == NULL ||
154  entry->m_Permission == AccessPermission_Invalid ||
155  entry->m_Permission == AccessPermission_NotPresent) {
156  return tmp;
157  }
158  return entry->m_Address;
159 }
160 
161 bool
162 CacheMemory::tryCacheAccess(Addr address, RubyRequestType type,
163  DataBlock*& data_ptr)
164 {
165  assert(address == makeLineAddress(address));
166  DPRINTF(RubyCache, "address: %#x\n", address);
167  int64_t cacheSet = addressToCacheSet(address);
168  int loc = findTagInSet(cacheSet, address);
169  if (loc != -1) {
170  // Do we even have a tag match?
171  AbstractCacheEntry* entry = m_cache[cacheSet][loc];
172  m_replacementPolicy_ptr->touch(cacheSet, loc, curTick());
173  data_ptr = &(entry->getDataBlk());
174 
175  if (entry->m_Permission == AccessPermission_Read_Write) {
176  return true;
177  }
178  if ((entry->m_Permission == AccessPermission_Read_Only) &&
179  (type == RubyRequestType_LD || type == RubyRequestType_IFETCH)) {
180  return true;
181  }
182  // The line must not be accessible
183  }
184  data_ptr = NULL;
185  return false;
186 }
187 
188 bool
189 CacheMemory::testCacheAccess(Addr address, RubyRequestType type,
190  DataBlock*& data_ptr)
191 {
192  assert(address == makeLineAddress(address));
193  DPRINTF(RubyCache, "address: %#x\n", address);
194  int64_t cacheSet = addressToCacheSet(address);
195  int loc = findTagInSet(cacheSet, address);
196 
197  if (loc != -1) {
198  // Do we even have a tag match?
199  AbstractCacheEntry* entry = m_cache[cacheSet][loc];
200  m_replacementPolicy_ptr->touch(cacheSet, loc, curTick());
201  data_ptr = &(entry->getDataBlk());
202 
203  return m_cache[cacheSet][loc]->m_Permission !=
204  AccessPermission_NotPresent;
205  }
206 
207  data_ptr = NULL;
208  return false;
209 }
210 
211 // tests to see if an address is present in the cache
212 bool
214 {
215  assert(address == makeLineAddress(address));
216  int64_t cacheSet = addressToCacheSet(address);
217  int loc = findTagInSet(cacheSet, address);
218 
219  if (loc == -1) {
220  // We didn't find the tag
221  DPRINTF(RubyCache, "No tag match for address: %#x\n", address);
222  return false;
223  }
224  DPRINTF(RubyCache, "address: %#x found\n", address);
225  return true;
226 }
227 
228 // Returns true if there is:
229 // a) a tag match on this address or there is
230 // b) an unused line in the same cache "way"
231 bool
233 {
234  assert(address == makeLineAddress(address));
235 
236  int64_t cacheSet = addressToCacheSet(address);
237 
238  for (int i = 0; i < m_cache_assoc; i++) {
239  AbstractCacheEntry* entry = m_cache[cacheSet][i];
240  if (entry != NULL) {
241  if (entry->m_Address == address ||
242  entry->m_Permission == AccessPermission_NotPresent) {
243  // Already in the cache or we found an empty entry
244  return true;
245  }
246  } else {
247  return true;
248  }
249  }
250  return false;
251 }
252 
254 CacheMemory::allocate(Addr address, AbstractCacheEntry *entry, bool touch)
255 {
256  assert(address == makeLineAddress(address));
257  assert(!isTagPresent(address));
258  assert(cacheAvail(address));
259  DPRINTF(RubyCache, "address: %#x\n", address);
260 
261  // Find the first open slot
262  int64_t cacheSet = addressToCacheSet(address);
263  std::vector<AbstractCacheEntry*> &set = m_cache[cacheSet];
264  for (int i = 0; i < m_cache_assoc; i++) {
265  if (!set[i] || set[i]->m_Permission == AccessPermission_NotPresent) {
266  if (set[i] && (set[i] != entry)) {
267  warn_once("This protocol contains a cache entry handling bug: "
268  "Entries in the cache should never be NotPresent! If\n"
269  "this entry (%#x) is not tracked elsewhere, it will memory "
270  "leak here. Fix your protocol to eliminate these!",
271  address);
272  }
273  set[i] = entry; // Init entry
274  set[i]->m_Address = address;
275  set[i]->m_Permission = AccessPermission_Invalid;
276  DPRINTF(RubyCache, "Allocate clearing lock for addr: %x\n",
277  address);
278  set[i]->m_locked = -1;
279  m_tag_index[address] = i;
280  entry->setSetIndex(cacheSet);
281  entry->setWayIndex(i);
282 
283  if (touch) {
284  m_replacementPolicy_ptr->touch(cacheSet, i, curTick());
285  }
286 
287  return entry;
288  }
289  }
290  panic("Allocate didn't find an available entry");
291 }
292 
293 void
295 {
296  assert(address == makeLineAddress(address));
297  assert(isTagPresent(address));
298  DPRINTF(RubyCache, "address: %#x\n", address);
299  int64_t cacheSet = addressToCacheSet(address);
300  int loc = findTagInSet(cacheSet, address);
301  if (loc != -1) {
302  delete m_cache[cacheSet][loc];
303  m_cache[cacheSet][loc] = NULL;
304  m_tag_index.erase(address);
305  }
306 }
307 
308 // Returns with the physical address of the conflicting cache line
309 Addr
311 {
312  assert(address == makeLineAddress(address));
313  assert(!cacheAvail(address));
314 
315  int64_t cacheSet = addressToCacheSet(address);
316  return m_cache[cacheSet][m_replacementPolicy_ptr->getVictim(cacheSet)]->
317  m_Address;
318 }
319 
320 // looks an address up in the cache
323 {
324  assert(address == makeLineAddress(address));
325  int64_t cacheSet = addressToCacheSet(address);
326  int loc = findTagInSet(cacheSet, address);
327  if (loc == -1) return NULL;
328  return m_cache[cacheSet][loc];
329 }
330 
331 // looks an address up in the cache
332 const AbstractCacheEntry*
333 CacheMemory::lookup(Addr address) const
334 {
335  assert(address == makeLineAddress(address));
336  int64_t cacheSet = addressToCacheSet(address);
337  int loc = findTagInSet(cacheSet, address);
338  if (loc == -1) return NULL;
339  return m_cache[cacheSet][loc];
340 }
341 
342 // Sets the most recently used bit for a cache block
343 void
345 {
346  int64_t cacheSet = addressToCacheSet(address);
347  int loc = findTagInSet(cacheSet, address);
348 
349  if (loc != -1)
350  m_replacementPolicy_ptr->touch(cacheSet, loc, curTick());
351 }
352 
353 void
355 {
356  uint32_t cacheSet = e->getSetIndex();
357  uint32_t loc = e->getWayIndex();
358  m_replacementPolicy_ptr->touch(cacheSet, loc, curTick());
359 }
360 
361 void
362 CacheMemory::setMRU(Addr address, int occupancy)
363 {
364  int64_t cacheSet = addressToCacheSet(address);
365  int loc = findTagInSet(cacheSet, address);
366 
367  if (loc != -1) {
369  (static_cast<WeightedLRUPolicy*>(m_replacementPolicy_ptr))->
370  touch(cacheSet, loc, curTick(), occupancy);
371  } else {
373  touch(cacheSet, loc, curTick());
374  }
375  }
376 }
377 
378 int
379 CacheMemory::getReplacementWeight(int64_t set, int64_t loc)
380 {
381  assert(set < m_cache_num_sets);
382  assert(loc < m_cache_assoc);
383  int ret = 0;
384  if (m_cache[set][loc] != NULL) {
385  ret = m_cache[set][loc]->getNumValidBlocks();
386  assert(ret >= 0);
387  }
388 
389  return ret;
390 }
391 
392 void
394 {
395  uint64_t warmedUpBlocks = 0;
396  uint64_t totalBlocks M5_VAR_USED = (uint64_t)m_cache_num_sets *
397  (uint64_t)m_cache_assoc;
398 
399  for (int i = 0; i < m_cache_num_sets; i++) {
400  for (int j = 0; j < m_cache_assoc; j++) {
401  if (m_cache[i][j] != NULL) {
402  AccessPermission perm = m_cache[i][j]->m_Permission;
403  RubyRequestType request_type = RubyRequestType_NULL;
404  if (perm == AccessPermission_Read_Only) {
406  request_type = RubyRequestType_IFETCH;
407  } else {
408  request_type = RubyRequestType_LD;
409  }
410  } else if (perm == AccessPermission_Read_Write) {
411  request_type = RubyRequestType_ST;
412  }
413 
414  if (request_type != RubyRequestType_NULL) {
415  tr->addRecord(cntrl, m_cache[i][j]->m_Address,
416  0, request_type,
418  m_cache[i][j]->getDataBlk());
419  warmedUpBlocks++;
420  }
421  }
422  }
423  }
424 
425  DPRINTF(RubyCacheTrace, "%s: %lli blocks of %lli total blocks"
426  "recorded %.2f%% \n", name().c_str(), warmedUpBlocks,
427  totalBlocks, (float(warmedUpBlocks) / float(totalBlocks)) * 100.0);
428 }
429 
430 void
431 CacheMemory::print(ostream& out) const
432 {
433  out << "Cache dump: " << name() << endl;
434  for (int i = 0; i < m_cache_num_sets; i++) {
435  for (int j = 0; j < m_cache_assoc; j++) {
436  if (m_cache[i][j] != NULL) {
437  out << " Index: " << i
438  << " way: " << j
439  << " entry: " << *m_cache[i][j] << endl;
440  } else {
441  out << " Index: " << i
442  << " way: " << j
443  << " entry: NULL" << endl;
444  }
445  }
446  }
447 }
448 
449 void
450 CacheMemory::printData(ostream& out) const
451 {
452  out << "printData() not supported" << endl;
453 }
454 
455 void
456 CacheMemory::setLocked(Addr address, int context)
457 {
458  DPRINTF(RubyCache, "Setting Lock for addr: %#x to %d\n", address, context);
459  assert(address == makeLineAddress(address));
460  int64_t cacheSet = addressToCacheSet(address);
461  int loc = findTagInSet(cacheSet, address);
462  assert(loc != -1);
463  m_cache[cacheSet][loc]->setLocked(context);
464 }
465 
466 void
468 {
469  DPRINTF(RubyCache, "Clear Lock for addr: %#x\n", address);
470  assert(address == makeLineAddress(address));
471  int64_t cacheSet = addressToCacheSet(address);
472  int loc = findTagInSet(cacheSet, address);
473  assert(loc != -1);
474  m_cache[cacheSet][loc]->clearLocked();
475 }
476 
477 bool
478 CacheMemory::isLocked(Addr address, int context)
479 {
480  assert(address == makeLineAddress(address));
481  int64_t cacheSet = addressToCacheSet(address);
482  int loc = findTagInSet(cacheSet, address);
483  assert(loc != -1);
484  DPRINTF(RubyCache, "Testing Lock for addr: %#llx cur %d con %d\n",
485  address, m_cache[cacheSet][loc]->m_locked, context);
486  return m_cache[cacheSet][loc]->isLocked(context);
487 }
488 
489 void
491 {
493 
495  .name(name() + ".demand_hits")
496  .desc("Number of cache demand hits")
497  ;
498 
500  .name(name() + ".demand_misses")
501  .desc("Number of cache demand misses")
502  ;
503 
505  .name(name() + ".demand_accesses")
506  .desc("Number of cache demand accesses")
507  ;
508 
510 
512  .name(name() + ".total_sw_prefetches")
513  .desc("Number of software prefetches")
515  ;
516 
518  .name(name() + ".total_hw_prefetches")
519  .desc("Number of hardware prefetches")
521  ;
522 
524  .name(name() + ".total_prefetches")
525  .desc("Number of prefetches")
527  ;
528 
530 
532  .init(RubyRequestType_NUM)
533  .name(name() + ".access_mode")
535  ;
536  for (int i = 0; i < RubyAccessMode_NUM; i++) {
538  .subname(i, RubyAccessMode_to_string(RubyAccessMode(i)))
540  ;
541  }
542 
544  .name(name() + ".num_data_array_reads")
545  .desc("number of data array reads")
547  ;
548 
550  .name(name() + ".num_data_array_writes")
551  .desc("number of data array writes")
553  ;
554 
556  .name(name() + ".num_tag_array_reads")
557  .desc("number of tag array reads")
559  ;
560 
562  .name(name() + ".num_tag_array_writes")
563  .desc("number of tag array writes")
565  ;
566 
568  .name(name() + ".num_tag_array_stalls")
569  .desc("number of stalls caused by tag array")
571  ;
572 
574  .name(name() + ".num_data_array_stalls")
575  .desc("number of stalls caused by data array")
577  ;
578 }
579 
580 // assumption: SLICC generated files will only call this function
581 // once **all** resources are granted
582 void
583 CacheMemory::recordRequestType(CacheRequestType requestType, Addr addr)
584 {
585  DPRINTF(RubyStats, "Recorded statistic: %s\n",
586  CacheRequestType_to_string(requestType));
587  switch(requestType) {
588  case CacheRequestType_DataArrayRead:
589  if (m_resource_stalls)
592  return;
593  case CacheRequestType_DataArrayWrite:
594  if (m_resource_stalls)
597  return;
598  case CacheRequestType_TagArrayRead:
599  if (m_resource_stalls)
602  return;
603  case CacheRequestType_TagArrayWrite:
604  if (m_resource_stalls)
607  return;
608  default:
609  warn("CacheMemory access_type not found: %s",
610  CacheRequestType_to_string(requestType));
611  }
612 }
613 
614 bool
616 {
617  if (!m_resource_stalls) {
618  return true;
619  }
620 
621  if (res == CacheResourceType_TagArray) {
622  if (tagArray.tryAccess(addressToCacheSet(addr))) return true;
623  else {
624  DPRINTF(RubyResourceStalls,
625  "Tag array stall on addr %#x in set %d\n",
626  addr, addressToCacheSet(addr));
628  return false;
629  }
630  } else if (res == CacheResourceType_DataArray) {
631  if (dataArray.tryAccess(addressToCacheSet(addr))) return true;
632  else {
633  DPRINTF(RubyResourceStalls,
634  "Data array stall on addr %#x in set %d\n",
635  addr, addressToCacheSet(addr));
637  return false;
638  }
639  } else {
640  assert(false);
641  return true;
642  }
643 }
644 
645 bool
646 CacheMemory::isBlockInvalid(int64_t cache_set, int64_t loc)
647 {
648  return (m_cache[cache_set][loc]->m_Permission == AccessPermission_Invalid);
649 }
650 
651 bool
652 CacheMemory::isBlockNotBusy(int64_t cache_set, int64_t loc)
653 {
654  return (m_cache[cache_set][loc]->m_Permission != AccessPermission_Busy);
655 }
Stats::Scalar m_demand_misses
Definition: CacheMemory.hh:132
#define DPRINTF(x,...)
Definition: trace.hh:212
const FlagsType pdf
Print the percent of the total that this entry represents.
Definition: info.hh:51
void setSetIndex(uint32_t s)
void setWayIndex(uint32_t s)
void recordCacheContents(int cntrl, CacheRecorder *tr) const
Definition: CacheMemory.cc:393
BankedArray tagArray
Definition: CacheMemory.hh:179
Stats::Vector m_accessModeType
Definition: CacheMemory.hh:139
Derived & subname(off_type index, const std::string &name)
Set the subfield name for the given index, and marks this stat to print at the end of simulation...
Definition: statistics.hh:358
Addr bitSelect(Addr addr, unsigned int small, unsigned int big)
Definition: Address.cc:34
BankedArray dataArray
Definition: CacheMemory.hh:178
void recordRequestType(CacheRequestType requestType, Addr addr)
Definition: CacheMemory.cc:583
Bitfield< 7 > i
Definition: miscregs.hh:1378
Stats::Formula m_demand_accesses
Definition: CacheMemory.hh:133
uint32_t getSetIndex() const
int findTagInSet(int64_t line, Addr tag) const
Definition: CacheMemory.cc:112
#define panic(...)
Definition: misc.hh:153
int m_cache_num_set_bits
Definition: CacheMemory.hh:183
bool tryAccess(int64_t idx)
Definition: BankedArray.cc:53
virtual DataBlock & getDataBlk()
bool cacheAvail(Addr address) const
Definition: CacheMemory.cc:232
bool m_resource_stalls
Definition: CacheMemory.hh:186
bool isBlockNotBusy(int64_t cache_set, int64_t loc)
Definition: CacheMemory.cc:652
bool testCacheAccess(Addr address, RubyRequestType type, DataBlock *&data_ptr)
Definition: CacheMemory.cc:189
ip6_addr_t addr
Definition: inet.hh:335
RubyCacheParams Params
Definition: CacheMemory.hh:53
Stats::Scalar m_hw_prefetches
Definition: CacheMemory.hh:136
void addRecord(int cntrl, Addr data_addr, Addr pc_addr, RubyRequestType type, Tick time, DataBlock &data)
#define warn_once(...)
Definition: misc.hh:226
void clearLocked(Addr addr)
Definition: CacheMemory.cc:467
bool isLocked(Addr addr, int context)
Definition: CacheMemory.cc:478
Addr getAddressAtIdx(int idx) const
Definition: CacheMemory.cc:142
void regStats()
Register statistics for this object.
Definition: CacheMemory.cc:490
virtual void regStats()
Register statistics for this object.
Definition: sim_object.cc:105
Derived & flags(Flags _flags)
Set the flags and marks this stat to print at the end of simulation.
Definition: statistics.hh:311
Stats::Scalar numTagArrayStalls
Definition: CacheMemory.hh:146
STL vector class.
Definition: stl.hh:40
Derived & init(size_type size)
Set this vector to have the given size.
Definition: statistics.hh:1118
void deallocate(Addr address)
Definition: CacheMemory.cc:294
void init()
init() is called after all C++ SimObjects have been created and all ports are connected.
Definition: CacheMemory.cc:75
#define warn(...)
Definition: misc.hh:219
std::unordered_map< Addr, int > m_tag_index
Definition: CacheMemory.hh:173
Tick curTick()
The current simulated tick.
Definition: core.hh:47
void setMRU(Addr address)
Definition: CacheMemory.cc:344
virtual void touch(int64_t set, int64_t way, Tick time)=0
CacheMemory(const Params *p)
Definition: CacheMemory.cc:57
bool isBlockInvalid(int64_t cache_set, int64_t loc)
Definition: CacheMemory.cc:646
uint32_t getWayIndex() const
Addr cacheProbe(Addr address) const
Definition: CacheMemory.cc:310
bool tryCacheAccess(Addr address, RubyRequestType type, DataBlock *&data_ptr)
Definition: CacheMemory.cc:162
Stats::Scalar m_demand_hits
Definition: CacheMemory.hh:131
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:142
Addr makeLineAddress(Addr addr)
Definition: Address.cc:112
Stats::Scalar numDataArrayWrites
Definition: CacheMemory.hh:142
AbstractReplacementPolicy * m_replacementPolicy_ptr
Definition: CacheMemory.hh:176
const FlagsType total
Print the total.
Definition: info.hh:49
Tick getLastAccess(int64_t set, int64_t way)
bool m_is_instruction_only_cache
Definition: CacheMemory.hh:169
Bitfield< 24 > j
Definition: miscregs.hh:1369
static const int NumArgumentRegs M5_VAR_USED
Definition: process.cc:83
Bitfield< 9 > e
Definition: miscregs.hh:1376
Derived & name(const std::string &name)
Set the name and marks this stat to print at the end of simulation.
Definition: statistics.hh:254
int floorLog2(unsigned x)
Definition: intmath.hh:100
type
Definition: misc.hh:728
virtual const std::string name() const
Definition: sim_object.hh:117
int m_start_index_bit
Definition: CacheMemory.hh:185
int findTagInSetIgnorePermissions(int64_t cacheSet, Addr tag) const
Definition: CacheMemory.cc:127
void reserve(int64_t idx)
Definition: BankedArray.cc:69
void setCache(CacheMemory *pCache)
AbstractCacheEntry * allocate(Addr address, AbstractCacheEntry *new_entry, bool touch)
Definition: CacheMemory.cc:254
Stats::Scalar m_sw_prefetches
Definition: CacheMemory.hh:135
int getReplacementWeight(int64_t set, int64_t loc)
Definition: CacheMemory.cc:379
void setLocked(Addr addr, int context)
Definition: CacheMemory.cc:456
ostream & operator<<(ostream &out, const CacheMemory &obj)
Definition: CacheMemory.cc:44
Stats::Scalar numTagArrayWrites
Definition: CacheMemory.hh:144
void print(std::ostream &out) const
Definition: CacheMemory.cc:431
Stats::Scalar numDataArrayStalls
Definition: CacheMemory.hh:147
Stats::Scalar numDataArrayReads
Definition: CacheMemory.hh:141
Derived & desc(const std::string &_desc)
Set the description and marks this stat to print at the end of simulation.
Definition: statistics.hh:287
void printData(std::ostream &out) const
Definition: CacheMemory.cc:450
Stats::Scalar numTagArrayReads
Definition: CacheMemory.hh:143
int64_t addressToCacheSet(Addr address) const
Definition: CacheMemory.cc:102
AccessPermission m_Permission
Stats::Formula m_prefetches
Definition: CacheMemory.hh:137
const FlagsType nozero
Don't print if this is zero.
Definition: info.hh:57
Bitfield< 0 > p
bool checkResourceAvailable(CacheResourceType res, Addr addr)
Definition: CacheMemory.cc:615
AbstractCacheEntry * lookup(Addr address)
Definition: CacheMemory.cc:322
static uint32_t getBlockSizeBytes()
Definition: RubySystem.hh:74
Abstract superclass for simulation objects.
Definition: sim_object.hh:94
std::vector< std::vector< AbstractCacheEntry * > > m_cache
Definition: CacheMemory.hh:174
bool isTagPresent(Addr address) const
Definition: CacheMemory.cc:213
int m_cache_num_sets
Definition: CacheMemory.hh:182
virtual int64_t getVictim(int64_t set) const =0

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