关于 Risc-V-Privileged-Spec-v1.7 的 2 个问题

2 Questions about Risc-V-Privileged-Spec-v1.7

  1. 第 16 页,Table3.1: mcpuid中的基域:RV32I RV32E RV64I RV128I

    • 什么是 "RV32E"?
    • 是否有 "E" 扩展名?
  2. ECALL(第 30 页)未提及 pc 的行为。 而 mepc(第 28 页)和 mbadaddr(第 29 页)声称 "mepc will point to the beginning of the instruction"。我认为 ECALL 应该将 mepc 设置为导致指令的末尾,以便 ERET 将转到下一条指令。是吗?

可在此处找到 RV32E(嵌入式)规范草案(通过 isa-dev mailing list):

https://lists.riscv.org/lists/arc/isa-dev/2015-06/msg00022/rv32e.pdf

它是 RV32I,有 16 个而不是 32 个寄存器,并且没有计数器指令。

正如 CliffordVienna 所回答的那样,RV32E ("embedded") 是一个新的基本 ISA,它使用 16 个寄存器并使一些计数器寄存器可选。

推荐实施 RV32E 核心,因为它可能是对核心大小不必要的过度优化,限制了您使用大量 RV*I 代码的能力.但是,如果不需要性能,并且您 真的 需要核心稍微小一点,并且核心没有连接到无论如何都会支配 area/power 的内存层次结构,并且您愿意处理工具链问题……那么也许 RV32E 核心是合适的。

ECALL 被视为异常,并将根据当前权限级别将 PC 重定向到适当的陷阱处理程序。 MEPC 将设置为 ecall 指令的当前 PC。

您可以通过分析 Berkeley RV64G Rocket 处理器 (https://github.com/ucb-bar/rocket/blob/master/src/main/scala/csr.scala), or by looking at the Spike ISA simulator (starting here: https://github.com/riscv/riscv-isa-sim/blob/master/riscv/insns/scall.h) 来验证此行为。 注意:截至 2015 年 6 月 27 日,有关特权规范的代码仍在不断变化。

如果我们看看 Spike 如何处理 eret ("sret": https://github.com/riscv/riscv-isa-sim/blob/master/riscv/insns/sret.h) for example, we have to be a bit careful. The PC is set to "mepc", but it's the trap handler's job to advance the PC by 4. We can see that done, for example, by the proxy kernel in some of the handler functions here (https://github.com/riscv/riscv-pk/blob/master/pk/handlers.c)。