Tomasulo算法中用于无序执行和分支推测的重排序缓冲区有2个指针。
每个ROB条目具有4个字段:指令类型,目标,值和就绪字段。
我已经看到许多资料来源以这种方式进行教学。 ROB条目不需要提交位或繁忙位。
对于大小为N的ROB。
如果TAIL = HEAD,我们怎么知道ROB是满还是空?
通常是一个circular缓冲区(索引环绕);几乎充满的状态不必使HEAD = 0,而只需一个任意位置。
是的,如果您使用HEAD和TAIL读/写索引,则在完全与空之间存在歧义。正如wikipedia article所解释的,解决此问题的一种方法是跟踪可用容量,该容量可以从0..n开始,而不是0..n-1。
考虑CPU,这是一个实现细节,其中如何硬件如何解决;可以安全地假设它正确有效地实现了可以使用其所有条目的循环缓冲区。 (或者不太可能,有效ROB大小比物理ROB大小小1。)
顺便说一句,您的带有HEAD=0
的模型对应于在当前尾部添加指令,但是通过将所有条目向下移动低1个索引而不是移动HEAD
来退出(提交)。在circular缓冲区中,要注意的条件是HEAD = (TAIL-1)%n
或类似的东西。