我正在开发 RISC-V CPU 模拟器并已实现所有指令。问题是我不确定跳跃是否失败。这是我目前的实现,供 BGEU 举个例子:
void CPU::BGEU() {
uint8_t rs1 = instDecoded.registers[0];
uint8_t rs2 = instDecoded.registers[1];
uint32_t inmediate = instDecoded.inmediate;
if (static_cast<uint32_t>(registers[rs1]) >= static_cast<uint32_t>(registers[rs2]))
pc += inmediate;
}
我有另一种称为“时钟”的方法,它执行指令,然后将 4 添加到 PC,但我不知道跳转后是否应该添加 4。
在 RISC-V 架构中,控制传输指令(包括无条件跳转和条件分支)对程序计数器 (PC) 的操作方式与常规指令不同。虽然大多数指令只是将 PC 前进 4 个字节,但控制传输指令会根据特定条件或目标调整 PC。
在这样的操作中,PC应该跳转到特定的目标地址。 示例:
JAL
(跳转和链接)、JALR
(跳转和链接寄存器)
JAL
直接跳转到从当前 PC 派生的计算地址添加到立即偏移量(J 类型编码)。它将下一个顺序指令(PC + 4)的地址存储到寄存器rd中。
target address = PC + immediate offset
JALR
跳转到通过将基址寄存器值 (rs1) 添加到(I 类型编码的)12 位立即偏移量计算出的地址,然后将该结果的最低有效位设置为 0 以与 4 字节边界对齐。与 JAL 类似,它将下一条指令的地址存储在寄存器rd中。
target address = (rs1 + immediate offset) & ~1
示例:
BEQ
(分支相等)、BNE
(分支不等)、BLT[U]
(分支小于或等于,其中添加 U 表示无符号)、BGE[U]
(分支大于或等于,其中 U 是添加未签名))
行为:
current PC + immediate offset
,其中immediate是确定跳转长度的有符号偏移量(B型编码)。PC + 4
以执行下一条顺序指令。用途:CPU 仿真器中的时钟同步操作序列,确保准确计时和控制指令执行周期。
设计实现:每种指令类型都应处理其 PC 调整,以尊重其独特的逻辑要求。这种模块化方法确保了仿真的清晰度并减少了错误,尤其是在 PC 的处理方面。
因此,定义的所有指令都应该单独处理目标地址的计算,而不是统一由时钟方法处理。
因此,总结建议的更正:
PC + 4
)。