第 16 页,表 3.1:mcpuid 中的基本字段:RV32I RV32E RV64I RV128I
- 什么是“RV32E”?
- 是否有“E”扩展名?
ECALL(第 30 页)没有说明电脑的行为。虽然 mepc(第 28 页)和 mbadaddr(第 29 页)声称“mepc 将指向指令的开头”。我认为 ECALL 应该将 mepc 设置为导致指令的末尾,以便 ERET 转到下一条指令。那正确吗?
2 回答
正如 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 )。
可以在此处找到 RV32E(嵌入式)规范的草案(通过isa-dev 邮件列表):
https://lists.riscv.org/lists/arc/isa-dev/2015-06/msg00022/rv32e.pdf
它是 RV32I,有 16 个而不是 32 个寄存器,并且没有计数器指令。