指令交付、取消、冲刷
流水线中的指令交付不再处于预测执行状态,交付的指令可以真正地在处理器中执行。 与交付相反的一个概念是取消。表示该指令最后需要取消。
为了提高处理器的性能,分支跳转指令可以以一种预测的形式执行,分支跳转指令是否真正需要跳转可能需要在执行阶段之后能够确定。
当处理器流水线需要将没有交付的后续指令全部取消时,就会造成流水线冲刷,就像流水线一样将流水线重新冲刷干净,之后重新开始新的指令。
指令交付常见的策略
交付都按顺序判定,前一条指令完成交付后,才会轮到后一条指令的交付。
影响指令交付的因素:
中断、异常,以及分支预测指令,这些因素都会造成流水线冲刷,即将后续所有指令流都取消。
在有的指令集架构中,还存在着条件码。对于每条指令,只有其条件码满足条件,才会交付。否则取消。只取消自己,不造成流水线冲刷并取消后续所有指令。
可以选择一个周期交付一条指令,或者一个周期交付多条指令。
RISC-V架构特点对于交付的简化
指令没有条件码,因此不需要处理单条指令取消的情形。
所有的运算指令都不会产生异常。大多数指令集架构会规定除以零异常,浮点也会有异常。但RISC-V架构规定这些运算指令一概不产生异常,
只处理:
分支预测指令错误预测 造成的后续指令流取消。
中断和异常造成的后续指令流取消。
分支预测指令的处理
分支预测的为带条件的跳转指令
beq 若两个整数操组数相等 则跳转
bne 若两个整数不相等,则跳转
''''
IFU中对以上带条件的跳转指令均采用静态预测,即结果向后跳转,则预测为跳,向前跳转,则预测为不跳。
这些条件跳转指令需要经过比较运算才能确定 最终是否真的需要跳转,而比较运算需要在执行阶段的ALU完成。
ALU在计算出是否需要跳转的结果之后,发送给交付模块。交付模块则根据预测的结果和真实的结果进行判断,如果预测失败,则进行流水线冲刷。
中断和异常的处理
是指令集架构中重要的一部分。
多周期执行的指令交付
对于单周期执行的指令而言,其交付和写回操作在执行阶段的同一个周期内完成,而对于多周期来说,其交付同样在执行阶段完成,但写回操作则需要在后续的周期内写回。
虽然有长指令也会在写回时产生异常,但是按照RISC-V架构规定这两种异常可以当做异步异常处理。
规定所有其他的常规多周期指令(除法和浮点指令)不会产生任何异常。
将交付安排在执行阶段。