在RISC-V架构中,跳转指令(条件或JAL/JALR)是否会像其余指令一样将PC增加4?

问题描述 投票:0回答:1

我正在开发 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。

cpu-architecture riscv
1个回答
0
投票

控制传输指令

在 RISC-V 架构中,控制传输指令(包括无条件跳转和条件分支)对程序计数器 (PC) 的操作方式与常规指令不同。虽然大多数指令只是将 PC 前进 4 个字节,但控制传输指令会根据特定条件或目标调整 PC。

1.无条件跳跃

在这样的操作中,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

2.条件分支

示例:

BEQ
(分支相等)、
BNE
(分支不等)、
BLT[U]
(分支小于或等于,其中添加 U 表示无符号)、
BGE[U]
(分支大于或等于,其中 U 是添加未签名))

行为:

  • 如果满足条件,则PC设置为
    current PC + immediate offset
    ,其中immediate是确定跳转长度的有符号偏移量(B型编码)。
  • 如果不满足条件,则PC前进4,即
    PC + 4
    以执行下一条顺序指令。

时钟

用途:CPU 仿真器中的时钟同步操作序列,确保准确计时和控制指令执行周期。

设计实现:每种指令类型都应处理其 PC 调整,以尊重其独特的逻辑要求。这种模块化方法确保了仿真的清晰度并减少了错误,尤其是在 PC 的处理方面。

因此,定义的所有指令都应该单独处理目标地址的计算,而不是统一由时钟方法处理。

结论

因此,总结建议的更正:

  • 直接在每条指令的方法中实现用于 PC 调整的单独逻辑。时钟方法不应自动递增PC;相反,让每条指令根据其操作逻辑来管理 PC。
  • 如果分支条件为真,则通过将PC调整为“当前PC +立即数”来计算分支目标,其中立即数是指令格式的解码偏移量。如果分支条件为假,则 PC 应该简单地前进到下一条指令 (
    PC + 4
    )。
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.