Exception mips 5级流水线cpu如何处理异常和软中断?

Exception mips 5级流水线cpu如何处理异常和软中断?,exception,mips,verilog,cpu,fpga,Exception,Mips,Verilog,Cpu,Fpga,我正在用verilog编写一个mips32 5级流水线cpu,但我不知道如何处理异常和软中断。我已经读了好几本mips32手册,但我仍然有一些问题 当状态寄存器exl位为1且发生新异常时,是否仍需要处理此异常?如果我必须这样做,我是否应该更新cp0寄存器,如epc、status、cause和badvaddr eret指令是否需要清除cp0状态寄存器的exl位 我在手册中看到了“同步异常”和“异步中断”。同步和异步意味着什么 如何处理软中断更合适?我的cpu有5个阶段:Ifetch、Decode、

我正在用verilog编写一个mips32 5级流水线cpu,但我不知道如何处理异常和软中断。我已经读了好几本mips32手册,但我仍然有一些问题

  • 当状态寄存器exl位为1且发生新异常时,是否仍需要处理此异常?如果我必须这样做,我是否应该更新cp0寄存器,如epc、status、cause和badvaddr
  • eret指令是否需要清除cp0状态寄存器的exl位
  • 我在手册中看到了“同步异常”和“异步中断”。同步和异步意味着什么
  • 如何处理软中断更合适?我的cpu有5个阶段:Ifetch、Decode、Exe、Mem、Wb,我是否应该始终检测cp0状态寄存器以确定何时处理软中断? 谢谢
    你的问题太广泛,一句话也回答不了。据我所知,你需要修改计算机架构的基础知识,因此我建议你阅读圣经A.K.A.计算机架构-定量方法(Hennessy&Patterson)。无论如何,尽管涉及到很多事情,但这是关于您的问题的总结:

    异常可以分为同步异常和异步异常

    • 同步异常是由于执行给定指令而由程序代码生成的异常,必须按顺序处理。因此,您可以将生成该异常的原因归咎于指令。根据系统的构建方式,它可以处理异常并恢复正常执行。这类异常包括TLB未命中、陷阱、错误指令
    • 异步异常不是当前正在执行的程序的产物,因此,没有可归咎于的指令,因此系统可以决定何时处理此类异常。这类异常的一个明显例子是中断。它们可以被无序处理
    底线是,无论何时发生同步异常,都必须对其进行处理,并且必须丢弃并重新执行以下指令(如果可能)。但是,只要系统方便,就可以处理异步异常,例如,中断被挂起且缓存未命中,然后cpu可以决定这是服务中断的好时机

    现在,关于您的问题,您需要决定指令何时可见以及状态何时更新。Ofc您有5个阶段,通常情况下,当WB阶段的指令导致异常时,在WB阶段处理异常的指令是可见的。然而,您不能仅仅在那个阶段做出反应,因为您的管道中还有4条指令必须失效。此外,在指令导致异常的那一刻,它也需要失效(内存也是体系结构状态,因此在出现异常时无法修改)

    您可以选择您喜欢的失效机制,可能通过管道添加一个额外的位作为控制信息:p,但这取决于您。至于何时处理中断,这也是你的决定,你可以等待,你可以直接为它服务。。。这就是实现之间的区别所在

    发生异常时CPU中的执行流应如下所示: In在阶段m导致异常,指令在时间上早于In,因此阶段m+1。。。必须完成,说明应在时间和阶段m和m-1中遵循。。。必须失效,并且这些说明中不得有任何架构更改产品。当In变为可见时,您的逻辑必须修改控制寄存器,以便保存上下文,PC指向将处理异常的服务子例程,其余控制寄存器包含有关异常的信息。重要的是要注意,如果管道中已经存在异常,那么将不再考虑任何异常,因为您需要按顺序提供异常,因此第一个异常将使以下任何异常无效

    在处理异常(子例程可能由操作系统提供)后,它将执行eret指令,该指令将恢复以前的上下文,清除异常位,执行将安全恢复。请注意,根据异常情况,将使用导致该异常的指令(例如TLB未命中)继续执行,或终止程序(例如错误指令)

    正如我在开始时所说的,还有更多的事情需要考虑,但我希望这能稍微解决你的问题。有上下文、虚拟内存等概念。。。我不能在这里解释,所以请参考我提到的那本书,因为这是一本非常好的书。这里已经解释了所有的事情,这将对您有很大帮助:)