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

Ale*_*ner 3 riscv

  1. 第 16 页,表 3.1:mcpuid 中的基本字段:RV32I RV32E RV64I RV128I

    • 什么是“RV32E”?
    • 有“E”扩展名吗?
  2. ECALL(第 30 页)没有说明 PC 的行为。虽然 mepc(第 28 页)和 mbadaddr(第 29 页)声称“mepc 将指向指令的开头”。我认为 ECALL 应该将 mepc 设置为导致指令的末尾,以便 ERET 转到下一条指令。那正确吗?

Chr*_*ris 5

正如 CliffordVienna 所回答的那样,RV32E(“嵌入式”)是一种新的基础 ISA,它使用 16 个寄存器并使一些计数器寄存器成为可选的。

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

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

您可以通过分析 Berkeley RV64G Rocket 处理器 ( https://github.com/ucb-bar/rocket/blob/master/src/main/scala/csr.scala ) 或查看 Spike ISA 模拟器来验证此行为(从这里开始: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),我们必须有点小心。PC 设置为“mepc”,但将 PC 提前 4 是陷阱处理程序的工作。我们可以看到,例如,通过此处的某些处理程序函数中的代理内核(https://github.com /riscv/riscv-pk/blob/master/pk/handlers.c)。