-1

在 CI 中,我试图将一个整数地址值分成标记位和具有 4 个集合的直接映射缓存中的集合索引位。我这样做是为了比较正确缓存集中的行中的正确标签。这里以地址参数为例:

  • 设置索引位数 s=2
  • 偏移位数 b=3
  • 地址位数 m=8

在我的示例中,地址整数是 40 -- int address = 40。

  • 二进制的 40 是 00101000
  • 设置索引应为 01 = 1
  • 标签应该是 001 = 1

取而代之的是标签,我得到 2 并且集索引是 8,这一定是错误的,因为我的缓存中只有 4 集。

这是我的做法,我对地址进行位掩码以获取标签,这些位是设置索引左侧的位,直到 m=8 位。并且设置的索引位于标记位和偏移位之间,即8位序列中间的01。

  • int tag = ((地址 & ~0 << (s + b)) >> 4)
  • int set = (address & (~(~0 << s) << b))

我知道我一定是错的,但我越是尝试写一个面具,我就越感到困惑,我一定是忘记了什么。我至少认为我得到了正确的标签,因为左边的位应该比中间的位更容易。任何建议或帮助将不胜感激,非常感谢!

4

1 回答 1

1

这些方程式将为您工作:

tag = (address >> 5) & 0x7;
set = (address >> 3) & 0x3;

如果要使用变量sbm

tag = (address >> (m-b))   & ((1u << b)-1);
set = (address >> (m-b-s)) & ((1u << s)-1);

一般来说,如果你想提取N从 bit 开始的位i

bits = (value >> i) & ((1u << N)-1);
于 2014-11-14T04:09:40.620 回答