61 if (attributeName ==
"description")
62 return "A generic memory cache component.";
73 if (!ss.str().empty())
76 if (m_size >= (1 << 30))
77 ss << (m_size >> 30) <<
" GB";
78 else if (m_size >= (1 << 20))
79 ss << (m_size >> 20) <<
" MB";
80 else if (m_size >= (1 << 10))
81 ss << (m_size >> 10) <<
" KB";
83 ss << m_size <<
" bytes";
85 ss << m_size <<
" byte";
87 if (m_associativity == 0)
88 ss <<
", fully associative, ";
89 else if (m_associativity == 1)
90 ss <<
", direct-mapped, ";
92 ss <<
", " << m_associativity <<
"-way, ";
94 if (m_lineSize >= (1 << 30))
95 ss << (m_lineSize >> 30) <<
" GB";
96 else if (m_lineSize >= (1 << 20))
97 ss << (m_lineSize >> 20) <<
" MB";
98 else if (m_lineSize >= (1 << 10))
99 ss << (m_lineSize >> 10) <<
" KB";
100 else if (m_lineSize != 1)
101 ss << m_lineSize <<
" bytes";
103 ss << m_lineSize <<
" byte";
119 names.push_back(
"dump");
128 if (methodName ==
"dump")
137 const vector<string>& arguments)
139 if (methodName ==
"dump") {
140 uint64_t vaddr = m_lastDumpAddr;
142 if (arguments.size() > 1) {
147 if (arguments.size() == 1) {
153 ss.flags(std::ios::hex);
157 const int nRows = 16;
158 for (
int i=0; i<nRows; i++) {
159 const size_t len = 16;
160 unsigned char data[len];
164 ss.flags(std::ios::hex);
166 if (vaddr > 0xffffffff)
171 ss << std::setfill(
'0') << vaddr;
174 for (k=0; k<len; ++k) {
181 for (k=0; k<len; ++k) {
185 ss << std::setw(2) << std::setfill(
'0');
194 for (k=0; k<len; ++k) {
212 m_lastDumpAddr = vaddr;
231 m_addressSelect = address;
233 uint64_t blockNr = address >> m_blockSizeShift;
235 if (blockNr+1 > m_memoryBlocks.size())
236 m_selectedHostMemoryBlock = NULL;
238 m_selectedHostMemoryBlock = m_memoryBlocks[blockNr];
240 m_selectedOffsetWithinBlock = address & (m_blockSize-1);
248 if (m_selectedHostMemoryBlock == NULL)
251 data = (((uint8_t*)m_selectedHostMemoryBlock)
252 [m_selectedOffsetWithinBlock]);
263 assert((m_addressSelect & 1) == 0);
265 if (m_selectedHostMemoryBlock == NULL)
268 data = (((uint16_t*)m_selectedHostMemoryBlock)
269 [m_selectedOffsetWithinBlock >> 1]);
285 assert((m_addressSelect & 3) == 0);
287 if (m_selectedHostMemoryBlock == NULL)
290 data = (((uint32_t*)m_selectedHostMemoryBlock)
291 [m_selectedOffsetWithinBlock >> 2]);
307 assert((m_addressSelect & 7) == 0);
309 if (m_selectedHostMemoryBlock == NULL)
312 data = (((uint64_t*)m_selectedHostMemoryBlock)
313 [m_selectedOffsetWithinBlock >> 3]);
329 if (m_writeProtected)
332 if (m_selectedHostMemoryBlock == NULL)
333 m_selectedHostMemoryBlock = AllocateBlock();
335 (((uint8_t*)m_selectedHostMemoryBlock)
336 [m_selectedOffsetWithinBlock]) =
data;
347 assert((m_addressSelect & 1) == 0);
349 if (m_writeProtected)
352 if (m_selectedHostMemoryBlock == NULL)
353 m_selectedHostMemoryBlock = AllocateBlock();
361 (((uint16_t*)m_selectedHostMemoryBlock)
362 [m_selectedOffsetWithinBlock >> 1]) = d;
373 assert((m_addressSelect & 3) == 0);
375 if (m_writeProtected)
378 if (m_selectedHostMemoryBlock == NULL)
379 m_selectedHostMemoryBlock = AllocateBlock();
387 (((uint32_t*)m_selectedHostMemoryBlock)
388 [m_selectedOffsetWithinBlock >> 2]) = d;
399 assert((m_addressSelect & 7) == 0);
401 if (m_writeProtected)
404 if (m_selectedHostMemoryBlock == NULL)
405 m_selectedHostMemoryBlock = AllocateBlock();
413 (((uint64_t*)m_selectedHostMemoryBlock)
414 [m_selectedOffsetWithinBlock >> 3]) = d;
429 static void Test_CacheComponent_AddressDataBus()
435 "AddressDataBus interface", bus != NULL);
440 UNITTEST(Test_CacheComponent_AddressDataBus);