第 16 页,表 3.1:mcpuid 中的基本字段:RV32I RV32E RV64I RV128I
ECALL(第 30 页)没有说明 PC 的行为。虽然 mepc(第 28 页)和 mbadaddr(第 29 页)声称“mepc 将指向指令的开头”。我认为 ECALL 应该将 mepc 设置为导致指令的末尾,以便 ERET 转到下一条指令。那正确吗?
正如 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)。
| 归档时间: |
|
| 查看次数: |
677 次 |
| 最近记录: |