关于verilog:RISC-V异常与中断

RISC-V exceptions vs interrupts

我即将使用 CLINT 编写我自己的 RV32I 内核。但是,有些事情对我来说并不完全清楚。至少我在文档中找不到它。
这是特权 isa 规范对 ecall/ebreak 的说明:

ECALL and EBREAK cause the receiving privilege modea€?s epc register to be set to the address of the ECALL or EBREAK instruction itself, not the address of the following instruction.

这意味着,为 mret 设置正确的 mepc 是 SW 处理程序的责任。我认为这种行为也适用于所有其他异常。

异步中断呢?硬件是否自动将 mepc 设置为 PC 4?从我在不同的 SW 处理程序中看到的情况来看,它似乎是这样的,但我实际上在文档中找不到它。

希望有人能指出正确的文档。


非特权 RISC-V 规范的 1.6 节定义异常由指令引发,中断由外部事件引发。

当引发(同步)异常时,触发指令无法正常完成。因此,返回地址有两种可能性:指令本身或下一条指令。两种解决方案都有意义。如果它指向指令本身,则更容易确定问题并做出相应反应。如果它指向下一条指令,则从异常处理程序返回时地址不需要递增

(异步)中断不同,它们中断了独立线程的执行指令流。因此,返回地址只有一个合理的解决方案:第一条尚未完成的指令。因此,当从中断处理程序返回时,执行会在中断处继续执行。

在此背景下,特权RISC-V规范第3.1.15节中的简要定义

When a trap is taken into M-mode, mepc is written with the virtual address of the instruction that was interrupted or that encountered the exception.

很清楚:当引发中断时,mepc 指向第一个未完成的指令或引发异常的指令。