dev*_*123 2 verilog interrupt riscv
我即将用 CLINT 编写我自己的 RV32I 内核。然而,有一些事情对我来说并不完全清楚。至少我在文档中找不到它。以下是特权 isa 规范对 ecall/ebreak 的说明:
ECALL 和 EBREAK 导致接收特权模式的 epc 寄存器被设置为 ECALL 或 EBREAK 指令本身的地址,而不是后续指令的地址。
所以这意味着,为 mret 设置正确的 mepc 是 SW 处理程序的责任。我认为这种行为也适用于所有其他例外。
异步中断呢?硬件是否自动将 mepc 设置为 PC+4?从我在不同软件处理程序中看到的情况来看,似乎是这样,但实际上我在文档中找不到它。
希望有人能指出我正确的文档。
小智 7
非特权 RISC-V 规范的第 1.6 节定义了异常由指令引发,中断由外部事件引发。
当引发(同步)异常时,触发指令无法正常完成。因此,返回地址有两种可能:指令本身或后面的指令。这两种解决方案都有意义。如果它指向指令本身,则更容易确定问题并做出相应的反应。如果指向下一条指令,则从异常处理程序返回时地址无需递增
(异步)中断不同,它们中断独立线程的执行指令流。因此,返回地址只有一个合理的解决方案:尚未完成的第一条指令。因此,当从中断处理程序返回时,执行会在被中断的地方继续。
在此背景下,特权 RISC-V 规范第 3.1.15 节中的简要定义
当陷阱进入 M 模式时,mepc 被写入被中断或遇到异常的指令的虚拟地址。
很清楚:mepc 指向第一个未完成的指令,当引发中断时或指向引发异常的指令。
| 归档时间: |
|
| 查看次数: |
2269 次 |
| 最近记录: |