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