跳到主要内容

ROB、提交与精确状态

ROB(Reorder Buffer)允许执行乱序,但让架构状态看起来仍按程序顺序变化。

ROB 表项关心什么​

源码入口:backend/rob/Rob.scala 与 RobBundles.scala。

  • 指令是否执行完成;
  • 是否产生异常、flush 或重定向;
  • 目的寄存器与旧映射;
  • 与 Load/Store Queue、FTQ 的关联;
  • 提交时需要输出的调试/差分信息。

为什么必须按序提交​

如果年轻指令先永久修改架构状态,而更老指令随后异常,软件看到的状态就不再对应任何合法程序位置。ROB 只允许队头连续、已完成且无阻塞的指令提交。

精确异常​

异常可以早在执行时发现,但通常记录到 ROB,等其成为最老指令再触发 trap。更年轻指令即使已经执行,也必须被取消,确保 trap handler 看到异常指令之前的精确状态。

commit 与 flush​

commit 是状态变得不可撤销的边界;flush 是取消年轻推测状态的控制动作。分支误预测可以在提交前就触发 redirect,而异常通常需要 ROB 维护精确次序。

波形检查表​

ROB enq/deq 指针、队头完成位、commit valid、异常信息、flush/redirect、rename 恢复以及 LSQ 提交许可。

思考题​

Store 为什么通常不能在执行完成时立刻对 Cache 可见?它与 ROB 提交之间必须建立什么关系?