RISC-V 用户级参考或参考实现

RISC-V user level reference or reference implementation

总结:RISC-V 用户级 ISA 的最终参考或参考实现是什么?

上下文:RISC-V 网站有 "The RISC-V Instruction Set Manual" 很好地解释了用户级指令,但没有给出确切的规范。我现在正在尝试构建一个用户级 ISA 模拟器,并打算稍后编写一个 FPGA 实现,所以确切的行为对我来说很重要。

参考实现就足够了,但最好尽可能简单——即我会尝试理解流水线实现,只是作为最后的手段。 重要的是了解指定的 ISA,而不是了解单个 CPU 实现或编译器实现。

显示我的问题的一个例子是 AUIPC 指令:散文解释说 "AUIPC forms a 32-bit offset from the 20-bit U-immediate, filling in the lowest 12 bits with zeros, adds this offset to the pc, then places the result in register rd." 我想知道这是指旧 PC 还是新 PC,即 AUIPC 指令的位置或下一个操作说明。我查看了 "RISCV Angel" 实现,但这似乎掩盖了(旧)PC 的低位——不仅仅是直接的——我在规范中找不到任何理由,甚至在规范的变更历史(因为 Angel 有点旧)。我现在没有答案,而是有两个关于 AUIPC 的问题。许多其他指令对我提出了类似的问题。

AFAICT 您引用的 RISC-V 指令集手册是最接近权威参考的东西。如果那里有不清楚或不正确的地方,那么您可以在维护该文档的 Github 站点上提出问题:https://github.com/riscv/riscv-isa-manual

就AIUPC而言,当前手册第9页底部的这句话暗示了答案,但没有明确说明:

There is one additional user-visible register: the program counter pc holds the address of the current instruction.

根据该声明,我希望 AIUPC 指令看到和操作的 pc 值是 AIUPC 指令本身的地址。

JALR 指令的讨论支持此解释:

The indirect jump instruction JALR (jump and link register) uses the I-type encoding. The target address is obtained by adding the 12-bit signed I-immediate to the register rs1, then setting the least-signicant bit of the result to zero. The address of the instruction following the jump (pc+4) is written to register rd.

鉴于以下指令的地址表示为pc+4,显然pc值在JALR的执行是JALR指令本身的地址。

手册的最新草稿(位于 https://github.com/riscv/riscv-isa-manual/releases/download/draft-20190321-ba17106/riscv-spec.pdf)使情况更加清晰。代替当前手册中的这个:

AUIPC appends 12 low-order zero bits to the 20-bit U-immediate, sign-extends the result to 64 bits, then adds it to the pc and places the result in register rd.

最新草案说:

AUIPC forms a 32-bit offset from the 20-bit U-immediate, filling in the lowest 12 bits with zeros, adds this offset to the pc of the AUIPC instruction, then places the result in register rd.