我正在通过verilog编写mips32 5级流水线cpu,但我不知道如何处理异常和软中断。我读了几本mips32手册,但仍然有一些疑问。
您的问题太广泛了,无法仅用一条评论来回答。从我看来,你需要复习计算机体系结构的基础知识,所以我建议你阅读《圣经》(The Bible A.K.A.)。计算机体系结构 - 定量方法(Hennessy & Patterson)。不管怎样,虽然涉及的事情很多,但这是关于你的问题的总结:
异常可以分为同步和异步;
底线是同步异常必须在发生时进行处理,并且必须丢弃并重新执行以下指令(如果可能)。但是,系统可以在方便的时候处理异步异常,例如一个中断挂起并且存在缓存未命中,那么CPU可以决定现在是服务中断的好时机。
现在关于您的问题,您需要决定指令何时可见以及您的状态何时更新。 Ofc 你有 5 个阶段,通常情况是指令在 WB 阶段可见,处理此时的异常,IFF WB 的指令导致了异常。然而,您不能只是在该阶段做出反应,因为您的管道中还有 4 条指令必须失效。此外,在指令导致异常的那一刻,它也需要失效(内存也是架构状态,因此如果出现异常则无法对其进行修改)。
您可以选择您喜欢的失效机制,也许通过管道提供额外的一点控制信息会有所帮助:P,但这取决于您。至于何时处理中断也是你的决定,你可以等待,你可以直接服务它......这就是实现之间的区别。
发生异常时你的CPU的执行流程应该是这样的: In 在阶段 m 引起异常,指令在时间上 In 之前,因此阶段 m+1... 必须完成,指令在时间上和 In 之后,因此阶段 m 和 m-1... 必须无效,并且存在不得是这些指令的任何架构变更产品。当 In 变得可见时,您的逻辑必须修改控制寄存器,以便保存上下文,PC 指向将处理异常的服务子例程,并且其余控制寄存器包含有关异常的信息。需要注意的是,如果管道中已经存在异常,则无需再考虑任何异常,因为您需要按顺序提供异常,因此第一个异常将使任何后续异常无效。
处理异常后(子程序大概由操作系统提供),它将执行eret指令,该指令将恢复之前的上下文,清除异常位,然后安全地恢复执行。请注意,根据异常情况,执行将恢复导致该异常的指令(例如 TLB 未命中),或者程序将终止(例如错误指令)。
正如我在一开始所说的,还有更多的事情需要考虑,但我希望这可以解决你的问题。有些概念,如上下文、虚拟内存等……我无法在这里解释,所以请参考我提到的书,因为它是一本非常好的书。一切都在那里解释,这会对你有很大帮助:)