9. ROB

Reorder Buffer

Tomasulo算法的核心元件,存储正在乱序执行中的指令。

9.1. 指令发射

ROB需要从Dispatcher获知指令的内容以及依赖关系(ROB本身不计算指令的依赖关系)。 同时,ROB允许Dispatcher查询自己的内容以提供给RS。

一种可能的情况是指令不需要FU(例如不需要重发射的情形,或者指令本身会导致异常):此时应当正确设置ROB中的ValueReady和RenameBuffer中的Cached项。

9.2. CDB

ROB需要从保留站接收计算结果,并且填入到ROB的表项中,同时记录ROB计算已经结束。 特别地,对于Branch和Jump指令,计算单元会返回分支预测是否错误以及新的PC。

9.3. PNR (Point of No Return)

绝大多数指令在提交之前是无害的,但是有一些指令除外:

  • 对I/O区域的读操作以及原子操作。
  • 对CSR的写操作和“原子操作”会提前被完成。

我们规定,这些操作在提交时不能触发中断。

9.4. 指令提交

不同的指令会带来不同的指令提交行为,指令提交可能会触发异常、中断,或者分支预测失败等。

  • Branch指令待提交时,需要判断分支地址与预测结果是否一致;若不一致,需要清空ROB并跳转到正确地址。
  • Jump指令待提交时,需要判断跳转地址与预测结果时候一致;若不一致,需要清空ROB并跳转到正确地址。
  • 浮点指令待提交时,需要将浮点异常写入浮点异常CSR。
  • 发生异常的指令需要抛出异常。
  • 没有越过PNR的指令提交时可以触发一个中断。
  • store指令需要在DCache/IO Buffer就绪后才能提交,并且会写入DCache或者写入IO Buffer。
  • fence.I指令提交时,需要写回DCache。
  • sfence.vma提交时,需要写回DCache并清空部分TLB。

警告

所有的Fence都尚未实现:使用缓存一致性协议代替Cache写回操作以提高效率?

  • Load指令待提交时,需要检查Load Speculation是否正确;不正确的话,向外发送重发射开始信号,并从下个周期开始重发射流程。

9.5. 重发射

警告

读取预测和重发射尚未被实现。

ROB负责指令重发射的调度。当ROB发现即将提交的Load Speculation失败时,下一周期开始ROB会进入重发射状态。

  • ROB会自Load指令开始,将指令发射给Dispatcher。
    假如某条指令不需要重新发射(和Load没有数据依赖关系),那么其ROB表项(除了Mask)不会发生变化;否则,其ROB表项会在重发射时被重置。
  • 对于不需要重新发射的指令,ROB会发出信号阻止RS接受指令,同时会阻止LQ/SQ清空原有数据。