重新排序缓冲区:指针值已满时?

时间:2019-11-29 01:23:30

标签: buffer cpu-architecture microprocessors circular-buffer

Tomasulo算法中用于无序执行和分支推测的重排序缓冲区有2个指针。

  • 头指针:指向最早的指令。这将是下一个 要执行的指令。
  • 尾指针:指向将最新指令添加到的位置。

每个ROB条目都有4个字段:指令类型,目标,值和就绪字段。

我已经看到许多消息源以这种方式进行教导。 ROB条目不需要提交位或忙位。

对于大小为N的ROB。

  • 如果ROB为空或刷新,则TAIL = HEAD。
  • 如果ROB有一个空闲插槽且HEAD = 0,则TAIL = N-1。
  • 如果ROB已满且HEAD = 0,则TAIL =?

如果TAIL = HEAD,我们怎么知道ROB是满还是空?

1 个答案:

答案 0 :(得分:1)

通常它是一个圆形缓冲区(索引环绕);几乎充满的状态不必使HEAD = 0,而只需一个任意位置。

是的,如果您使用HEAD和TAIL读/写索引,则在完全与空之间存在歧义。正如wikipedia article所解释的,一种解决方法是跟踪可用容量,该容量可以从0..n开始,而不是0..n-1。

对于CPU而言,这是一个实现细节,而硬件如何解决它并不重要。可以肯定地说,它正确有效地实现了可以使用其所有条目的循环缓冲区。 (或者不太可能,有效ROB的大小要比物理ROB的大小小1。)


顺便说一句,带有HEAD=0的模型对应于在当前尾部添加指令,但是通过将所有条目向下降低1个索引而不是移动HEAD来退出(提交)。在 circular 缓冲区中,要注意的条件是HEAD = (TAIL-1)%n或类似的东西。