4.17 异常处理与流水线
异常类型
在 Y86-64 处理器中,可能发生的异常包括:
- halt 指令:程序主动停机
- 非法指令码 ____ 或功能码:编码无效的指令
- 非法内存地址:访问越界或无效地址
当异常发生时,处理器需要停止当前指令的执行并报告异常。
异常在流水线中的传播
异常的处理比顺序处理器复杂得多,因为流水线中同时有多条指令在执行:
- 异常可能发生在取指、执行或访存阶段
- 异常信息需要随流水线寄存器逐级传递
- 当一条指令产生异常时,后续已取指但尚未执行的指令必须被取消
- 前序指令如果已写回,则保持其效果
在 Y86-64 的流水线实现中,异常状态(stat 信号)跟随指令经历所有流水线阶段。只有到达写回阶段时,才真正触发异常处理。
取消后续指令
当一条指令产生异常时,流水线中在该指令之后的所有指令都必须被取消:
- 将这些指令在流水线寄存器中的控制信号置为气泡(nop)
- 这些指令不会修改寄存器、内存或条件码
暂停 vs 气泡的选择逻辑
流水线控制逻辑需要在三种操作之间选择:
| 操作 | 行为 | 用途 |
|---|---|---|
| 正常 | 流水线寄存器正常更新 | 无冒险 |
| 暂停 | 流水线寄存器保持当前值 | 等待冒险解除 |
| 气泡 | 流水线寄存器置为 nop 编码 | 取消指令、填补空隙 |
暂停和气泡的实现都涉及对流水线寄存器的控制信号进行操作,但效果不同——暂停保持进度,气泡推进但执行空操作。
异常与控制逻辑的交互
异常处理逻辑需要与数据转发、分支预测等控制逻辑协调工作:
- 异常指令在译码/执行阶段时,可能同时有转发操作指向它
- 异常指令在访存阶段时,可能同时有控制冒险需要处理
- 最终规则:写回阶段的异常优先级最高,只有到达写回阶段的异常才被真正报告
相关笔记
链接到
- 上一个知识点:4.16 控制冒险
- 下一个知识点:4.18 处理器性能分析