Verilog RISC-V异常与中断

Verilog RISC-V异常与中断,verilog,interrupt,riscv,Verilog,Interrupt,Riscv,我即将用CLINT编写自己的RV32I内核。然而,有些事情我并不完全清楚。至少我在文件里找不到。 以下是特权isa规范对ecall/ebreak的说明: ECALL和EBREAK导致接收特权模式的epc寄存器设置为ECALL或EBREAK指令本身的地址,而不是以下指令的地址 因此,这意味着,为mret设置正确的mepc是软件处理程序的责任。我假设此行为也适用于所有其他异常 异步中断呢?硬件是否自动将mepc设置为PC+4?从我在不同的软件处理程序中看到的情况来看,似乎是这样的,但实际上我在文档中

我即将用CLINT编写自己的RV32I内核。然而,有些事情我并不完全清楚。至少我在文件里找不到。 以下是特权isa规范对ecall/ebreak的说明:

ECALL和EBREAK导致接收特权模式的epc寄存器设置为ECALL或EBREAK指令本身的地址,而不是以下指令的地址

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

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


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

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

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

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

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

当陷阱进入M模式时,mepc将使用中断或遇到异常的指令的虚拟地址写入


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

这个问题与“c”或“verilog”无关。至少您应该删除这些标记。这个论坛是关于编程的,所以你可能需要在“电气工程”论坛上提问,但它也与电气工程无关。它是关于指令集架构的。我添加了C和Verilog,希望能接触到更多的低级别开发人员,他们可能对这个问题有经验。例如,qemu在C中实现了ISA,很多RV32I内核都是用Verilog编写的,所以在我看来,所选择的标签是绝对足够的。感谢这个伟大的答案!因此,对于不可能中断单个指令的非常简单的risc-v实现,正确的行为是:对于(同步)异常,mepc将设置为触发异常的指令,对于(异步)中断,mepc将设置为PC+4,对吗?如果PC上的指令是在中断处理程序的第一条指令之前执行的最后一条指令,则PC+4是正确的。