9. ROB¶
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清空原有数据。