【发布时间】:2020-04-27 07:38:15
【问题描述】:
加载和存储指令对编码的要求相同:两个寄存器和一个 12 位立即数。然而,存储指令(sb、sh、sw)有一种专用格式,称为 S-type,而加载指令使用与 addi 指令相同的 I-type 格式。
我不明白为什么 load 和 stores 不共享指令格式,但 store 有一个专用的指令格式只为自己(S-type)。
【问题讨论】:
标签: riscv
加载和存储指令对编码的要求相同:两个寄存器和一个 12 位立即数。然而,存储指令(sb、sh、sw)有一种专用格式,称为 S-type,而加载指令使用与 addi 指令相同的 I-type 格式。
我不明白为什么 load 和 stores 不共享指令格式,但 store 有一个专用的指令格式只为自己(S-type)。
【问题讨论】:
标签: riscv
我相信这两种格式不同以简化解码。查看 I 和 S 指令的格式,您会看到:
I: | imm[11:0] | rs1 | funct3 | rd | opcode |
S: | imm[11:5] | rs2 | rs1 | funct3 | imm[4:0] | opcode |
Load 的rd 与需要rd 的所有其他指令在指令的位位置相同(I、R、U 和 UJ 格式都将rd 放在同一个位置)。相反,Store 指令没有目标寄存器,而是有一个地址寄存器和一个我们正在存储其值的寄存器,因此rd 所需的位被用作立即编码的一部分。
如果您自己尝试实现 RISC-V(在 FPGA、Logisim 或您选择的任何方式中),您会发现rd 总是在同一个地方是多么方便。
总结一下为什么 S 指令有一种独特的格式:它们是唯一一种指令,在像 RISC-V 这样的load/store 架构中,不修改寄存器的内容。其余的指令做修改一个寄存器,所以需要一个rd。
【讨论】: