【问题标题】:RISC-V user level reference or reference implementationRISC-V 用户级参考或参考实现
【发布时间】:2019-03-23 14:30:18
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: riscv


    【解决方案1】:

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

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

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

    基于该陈述,我认为 AIUPC 指令看到和操作的 pc 值是 AIUPC 指令本身的地址。

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

    间接跳转指令JALR(跳转和链接寄存器)使用I型编码。目标地址是通过将 12 位有符号 I-立即数添加到寄存器 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中。

    【讨论】:

    • 这对我来说似乎难以置信,因为 ISA 已经被用作多个编译器和多个实现之间的合同,有些甚至在硅片中。如果对这些问题存在分歧,这是不可能的,并且硅实现者不会将他的(昂贵的)工作建立在猜测指令的作用上。 OTOH,如果硅实现者查看编译器输出,则存在将编译器错误解释为规范属性的风险。
    • 我同意实施者,尤其是硬件实施者,猜测或不同意是没有意义的。据推测,他们会在继续之前寻求并获得澄清。这些澄清可能尚未纳入手册。对于从事该项目的人来说,一份文档似乎很清楚,但对其他人来说却是模棱两可的,这已经不是第一次了。如果您发现歧义,那么您可以尝试在github.com/riscv/riscv-isa-manual/issues 处打开问题。那里的团队似乎反应迅速。
    • 我同意手册/官方规范应包含这些答案,因此无论实施者是否使用其他来源,我都会在那里开票。
    • 正如您所说,规范团队已迅速添加了说明,因此我会认为您的回答是我问题的“正确”回答。
    猜你喜欢
    • 2012-07-09
    • 1970-01-01
    • 2010-10-01
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    相关资源
    最近更新 更多