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

问题描述 投票:0回答:1

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

  1. 当状态寄存器exl位为1并且出现新的异常时,我还需要处理这个异常吗?如果我必须这样做,我是否应该更新 cp0 寄存器,例如 epc、status、cause 和 badvaddr?
  2. eret指令需要清除cp0状态寄存器的exl位吗?
  3. 我在手册上看到了“同步异常”和“异步中断”。同步和异步是什么意思?
  4. 如何处理软中断比较合适?我的CPU有5个阶段:Ifetch、Decode、Exe、Mem、Wb,我是否应该始终检测cp0状态寄存器来确定何时处理软中断?
exception mips cpu-architecture fpga
1个回答
1
投票

您的问题太广泛了,无法仅用一条评论来回答。从我看来,你需要复习计算机体系结构的基础知识,所以我建议你阅读《圣经》(The Bible A.K.A.)。计算机体系结构 - 定量方法(Hennessy & Patterson)。不管怎样,虽然涉及的事情很多,但这是关于你的问题的总结:

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

  • 同步异常是程序代码由于执行给定指令而生成的异常,必须按顺序处理它们。因此,您可以将生成该异常的原因归咎于指令。根据系统的构建方式,它可以处理异常并恢复正常执行。此类异常包括 TLB 未命中、陷阱、错误指令...
  • 异步异常不是当前执行程序的产物,因此没有任何指令可以责怪,因此系统可以决定何时处理此类异常。此类异常的一个明显例子是中断。它们可以乱序处理。

底线是同步异常必须在发生时进行处理,并且必须丢弃并重新执行以下指令(如果可能)。但是,系统可以在方便的时候处理异步异常,例如一个中断挂起并且存在缓存未命中,那么CPU可以决定现在是服务中断的好时机。

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

您可以选择您喜欢的失效机制,也许通过管道提供额外的一点控制信息会有所帮助:P,但这取决于您。至于何时处理中断也是你的决定,你可以等待,你可以直接服务它......这就是实现之间的区别。

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

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

正如我在一开始所说的,还有更多的事情需要考虑,但我希望这可以解决你的问题。有些概念,如上下文、虚拟内存等……我无法在这里解释,所以请参考我提到的书,因为它是一本非常好的书。一切都在那里解释,这会对你有很大帮助:)

© www.soinside.com 2019 - 2024. All rights reserved.