Skip to content

重定序缓冲 Re-Order Buffer (ROB)

在乱序处理器中,ROB 的作用是给指令定序,使得程序正常执行的结果能够被保留下来。按照一条指令的执行流程,ROB 会依次影响指令的派遣、写回、提交流程,同时指令还可能在任何时刻被冲刷。

派遣

在 Dispatch 阶段,指令会被分配一个 ROB 的表项,并将一些需要保存的信息 RobCommitInfo 存入 ROB 中,如指令的重命名信息、类型信息、对应 ftq 指针等。ROB 入队的宽度与重命名的宽度保持一致。

在指令进入 ROB 之后,一些状态位会被更新,如 valid, writebacked, interrupt_safe(出于简化设计的考虑,目前访存指令是否是 MMIO 的信息不会传递到 ROB,他们会在提交前发生访存,因此目前我们简化设计避免访存指令触发中断)等。

写回

指令完成执行后,会通知 ROB 对应的运算操作已经完成,并由 ROB 将 writebacked 标志位置为 true

提交

在每一个时钟周期中,ROB 会依次检查队头的指令是否能够正常提交,并尽量多地将可以提交的指令通过 io.commits 接口进行提交。

针对有异常的指令,它们的提交会被阻塞,并通过 io.exception 接口向外发出异常信息。

取消与回滚

在指令的执行过程中,如果出现分支预测错误、访存违例等情况,该指令及更之后的指令可能会需要被冲刷。在这种情况下,ROB 会通过 io.redirect 端口收到取消信息,并根据取消信息来判断哪一部分指令需要被取消。对于被取消掉的指令,ROB 会利用回滚的机制,通过 io.commits 端口恢复重命名等信息,此时 io.commits.isWalk 会被置为 true