缓存标记值

时间:2013-09-17 02:35:17

标签: caching system computer-architecture

参考以下链接中的缓存问题: link

问题是:使用下面的一系列地址,显示具有单字块,4字节字和16字总大小的双向组关联缓存的命中和未命中以及最终缓存内容。假设更换FIFO。

0,4,64,0,128,32,12,96,128,64

我的问题是:为什么标签值设置为字地址/ 8?

感谢。

1 个答案:

答案 0 :(得分:1)

简短说明 - 如果缓存总共包含16个字(= 64字节缓存,非常小:),并且它的2路组关联,那么您有8个由地址直接映射的集合。您不需要将设置位作为标记的一部分,因为您已经使用它们映射到正确的集合。

假设访问粒度是1个字节,那么你的地址有2个LSB位映射到一个块(4个字节)内,你需要在访问缓存时忽略这些,因为你正在读取整个块(然后,存储器单元将使用这2位根据读取大小和对齐方式为您提供块内的确切字节。所以word address = real_address / 4

现在,由于您有8组,因此使用接下来的3位映射到正确的集合。

+--------------------------------------+----------------------+-------------------+
|          Tag (bits 5 and above)      |     Set (bits 2,3,4) | Offset (bits 0,1) |
+--------------------------------------+----------------------+-------------------+

也就是说,addr 0x0将映射到set 0,addr 0x4(word addr 0x1)将始终位于set no。 1,不管是什么。 set 2有addr 0x8(word addr 0x2),set 3有addr 0xC(word addr 0x3),...等等,直到set 7用于addr 0x1C(word addr 0x7)。

下一个地址将简单地换行 - 地址0x20(字addr 0x8)将检查位2..4并看到它们被归零,因此将再次映射到设置0,依此类推。此时标记用于区分地址0x0,addr 0x20,addr 0x10000或映射到那里的任何其他地址(addr%0x20 == 0或word_addr%8 == 0)。由于你不关心这里的线内偏移,并且当你决定访问一个给定的集合时已经知道设置位,唯一缺少需要存储的东西(当然除了数据)是设置位之上的位 - 这是确定给定集中的线标识所需的(并且足够),并且知道查找是命中还是未命中。这些位是addr / 0x20(或addr>> 5),或word_addr / 8(= word_addr>> 3)

请注意,这意味着单独的标记不足以识别行addr,您需要标记和设置位来重建它。