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

时间:2019-03-23 14:30:18

标签: riscv

摘要:RISC-V用户级ISA的权威参考或参考实现是什么?

上下文:RISC-V网站上有“ RISC-V指令集手册”,该手册很好地解释了用户级指令,但没有给出确切的规范。我现在正在尝试构建用户级ISA模拟器,并打算在以后编写FPGA实现,因此确切的行为对我很重要。

参考实现就足够了,但最好应该尽可能地简单-也就是说,我将尽力理解流水线的实现。重要的是要了解指定的ISA,而不是单个CPU实现或编译器实现。

一个显示我的问题的例子是AUIPC指令:散文解释说:“ AUIPC与20位U即时数形成32位偏移,并用零填充最低的12位,并将此偏移添加到pc,然后将结果放入寄存器rd。”我想知道这是指旧PC还是新PC,即AUIPC指令或下一条指令的位置。我看了看“ RISCV Angel”的实现,但这似乎掩盖了(旧)PC的低位部分-不仅仅是立即的-我在规范中找不到任何原因,甚至在规范中也找不到。更改规格的历史记录(因为Angel年龄较大)。现在,我有两个关于AUIPC的问题,而不是答案。许多其他说明也给我带来了类似的问题。

1 个答案:

答案 0 :(得分:3)

您所引用的RISC-V指令集手册是与确定参考最接近的内容。如果其中存在不清楚或不正确的地方,则可以在维护该文档的Github网站上打开问题:https://github.com/riscv/riscv-isa-manual

就AIUPC而言,本手册第9页底部的这句话暗示但未明确说明答案:

  

还有一个用户可见的附加寄存器:程序计数器 pc 保存当前指令的地址。

基于该陈述,我希望AIUPC指令看到并操纵的 pc 值是AIUPC指令本身的地址。

JALR指令的讨论支持这种解释:

  

间接跳转指令JALR(跳转和链接寄存器)使用I型编码。通过将12位带符号的I-immediate加到寄存器 rs1 ,然后将结果的最低有效位设置为零,可以获得目标地址。跳转后的指令地址( pc +4)被写入寄存器 rd

鉴于以下指令的地址表示为 pc +4,因此很显然,在执行JALR期间可见的 pc 值是该指令的地址。 JALR指令本身。

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

  

AUIPC将12个低阶零位添加到20位U即时码,将结果符号扩展为64位,然后将其添加到 pc 并将结果放入寄存器 rd

最新草案说:

  

AUIPC从20位U立即数开始形成32位偏移量,用零填充最低的12位,将该偏移量添加到AUIPC指令的 pc 中,然后放置结果在寄存器 rd 中。