4.17 异常处理与流水线

异常类型

在 Y86-64 处理器中,可能发生的异常包括:

  • halt 指令:程序主动停机
  • 非法指令码 ____ 或功能码:编码无效的指令
  • 非法内存地址:访问越界或无效地址

当异常发生时,处理器需要停止当前指令的执行并报告异常。

异常在流水线中的传播

异常的处理比顺序处理器复杂得多,因为流水线中同时有多条指令在执行:

  1. 异常可能发生在取指、执行或访存阶段
  2. 异常信息需要随流水线寄存器逐级传递
  3. 当一条指令产生异常时,后续已取指但尚未执行的指令必须被取消
  4. 前序指令如果已写回,则保持其效果

在 Y86-64 的流水线实现中,异常状态(stat 信号)跟随指令经历所有流水线阶段。只有到达写回阶段时,才真正触发异常处理。

取消后续指令

当一条指令产生异常时,流水线中在该指令之后的所有指令都必须被取消:

  • 将这些指令在流水线寄存器中的控制信号置为气泡(nop)
  • 这些指令不会修改寄存器、内存或条件码

暂停 vs 气泡的选择逻辑

流水线控制逻辑需要在三种操作之间选择:

操作行为用途
正常流水线寄存器正常更新无冒险
暂停流水线寄存器保持当前值等待冒险解除
气泡流水线寄存器置为 nop 编码取消指令、填补空隙

暂停和气泡的实现都涉及对流水线寄存器的控制信号进行操作,但效果不同——暂停保持进度,气泡推进但执行空操作。

异常与控制逻辑的交互

异常处理逻辑需要与数据转发、分支预测等控制逻辑协调工作

  • 异常指令在译码/执行阶段时,可能同时有转发操作指向它
  • 异常指令在访存阶段时,可能同时有控制冒险需要处理
  • 最终规则:写回阶段的异常优先级最高,只有到达写回阶段的异常才被真正报告

相关笔记

链接到