延迟(Latency):使用数据与得出结果之间的时钟周期数;对于流水化的部分,延迟通常为流水线层级数 - 1
启动间隔 / 重复间隔(Initiation/Repeat Interval):向同一功能单元发出两个操作之间必须间隔的周期数
示例:
- 对于 Integer ALU,使用数据和得出结果位于同一个时钟周期,因此 Latency 为 0;对于 Data Memory,得出结果位于使用数据的下一个时钟周期,因此 Latency 为 1
Functional Unit | Latency | Initiation Interval |
---|---|---|
Interger ALU | 0 | 1 |
Data memory(数据载入) | 1 | 1 |
FP add | 3 | 1 |
FP multiply | 6 | 1 |
FP divide | 24 | 25 |
Structural Hazard
**情形一:**由于除法单元没有实现流水化,因此若存在多条除法指令,它们可能竞争除法单元,从而发生结构冒险
**情形二:**由于不同指令的 EXE 阶段用时不同,因此存在多条指令同时进入 MEM 或 WB 阶段的情形,它们竞争数据读写口,从而发生结构冒险
**处理方法一:**跟踪 ID 阶段对写端口的使用,并在一条指令发射之前使其停顿
**处理方法二:**当冒险指令尝试进入 MEM 或 WB 级时,使其停顿
Write After Write Hazard(WAW,写后写)
概括:后发指令试图在前发指令之前完成写回同一个寄存器
**情形:**由于不同指令的 EXE 阶段用时不同,因此各指令不再按它们发射时的顺序进入 WB 阶段,如果两条指令写内存的目标相同,且后发射的指令先进入 WB 阶段,可能导致数据的错误覆写
**处理方法一:**推迟 fld 指令的发射
**处理方法二:**要求 fadd.d 指令不写入内容(zero write control)
Read After Write Hazard(RAW,写后读)
**情形:**同普通流水线的数据冒险,但由于引入浮点单元后,延迟变得更长,所以需要插入的停顿数量更多
**处理方法:**对功能单元进行流水化设计时,为前递添加对应的数据通路,包括以下几种前递情形: EX/MEM,A4/MEM,M7/MEM,DIV/MEM,MEM/WB
ID 阶段的冒险检测与处理
假定处理器在 ID 中进行所有冒险检测,则必须在执行以下三种检查后才能发射指令
分解耗时较长的内存读写阶段,将流水线级数增长至 8 级,从而支持更高的时钟频率