我现在正在尝试实现基于 RV32I ISA 的管道 CPU。
我的 CPU 具有用于数据危害的重命名算法和用于控制危害的分支预测。
这是我用于重命名算法和分支预测的示例代码:
addi x1, x0, 25
addi x2, x0, 50
bne x1, x2, LABLE
addi x1, x0, 200
addi x2, x0, 300
LABLE:
addi x1, x1, 1
addi x2, x2, 1
让我解释一下我的 CPU。
在第 1 行,“addi x1, x0, 25”,x1 的标签是 15。
在第 2 行,“addi x2, x0, 50”,x2 的标签是 14。
在第 3 行,“bne x1, x2, LABLE”,不采用预测结果。因此,执行第 4 行的指令。
在第 4 行,“addi x1, x0, 200”,x1 的标签为 13。(此指令不应在 true follow 中执行)
在第 5 行,“addi x2, x0, 300”,x2 的标签为 12。(此指令不应在 true follow 中执行)
在第 6 行和第 7 行,这些指令需要读取 x1、x2,而真正的标签是 15、14,但在这种情况下,读取的标签是 13、12。所以 CPU 出错了。
那么,当“bne”在执行阶段完成时,如何将 x1 和 x2 标签恢复为 15、14 ?
我应该参考哪些书籍或资料来解决这个问题?