单周期指令运行动态
graph LR A[Instruction Fetch] --> B[Instruction Decode] B --> C[Execution] C --> D[MEM] D --> E[Write Back]
单周期时空图
设耗时最长的操作时间为T,则时钟周期 = 5T
执行n条指令需要5nT时间
多周期指令运行动态
指令 | 时钟周期 |
lw | 5个 |
graph LR A[IF] --> B[ID] B --> C[Ex] C --> D[MEM] D --> E[WB]
graph LR A[IF] --> B[ID] B --> C[Ex]
graph LR A[IF] --> B[ID] B --> C[Ex] C --> D[WB]
graph LR A[IF] --> B[ID] B --> C[Ex]
多周期时空图
不同的指令按照状态图来运行,有多少个状态就分配多少个时钟周期,避免了单周期中某些快的指令需要等待的缺点
流水线架构
将一条指令分成5段,每段各自功能部件执行的时间不同,例如取指时访问主存相对较慢,取5段当中最长的时间作为每段需要的时间。各段完全并发,每一段都可以分开处理不同的指令。
IF | ID | EX | MEM | WB | ||
IF | ID | EX | MEM | WB | ||
IF | ID | EX | MEM | WB | ||
图中蓝色长条形是流水接口部件。其本质是一系列同步的寄存器,锁存前段加工完成的数据。通过流水接口传递与指令相关的数据、控制、反馈信息。后段对数据的加工处理依赖于前段接口传递过来的信息 |
流水线数据和信号传递
IF / ID:
- 设置PC值寄存器的目的:在执行分支指令是需要用到PC的值,如果不在取指时一并取出,则取指后PC的自动改变,到执行时再取出的PC值是错误的
单周期控制器根据IR的内容生成所有的控制信号,在后续阶段使用,需要向后传递
流水线时空图
流水线冒险 pipeline hazard
资源冒险 resource hazard
也称结构冒险 structural hazard
两条或多条已进入流水线的指令需要使用相同资源。此时这些指令必须串行执行,而不是并行执行。
- 争用主存:IF取指,ID取操作数
- 争用ALU:计算PC、分支地址、运算操作
解决方法:增加主存访存端口,或采用哈佛结构,增加ALU
分支冒险 branch hazard
也称控制冒险 control hazard
由转移指令引起,当分支指令进入Ex阶段时,如果需要跳转,则控制IF段进行分支跳转,提前取出的指令作废,流水线清空,流水线发生中断
数据冒险 data hazard
指令操作数依赖于前一条指令的执行结果,流水线停顿直到数据写回
有3种类型的数据冒险:
- 写后读 Read After Write:在写操作完成前读
- 读后写 Write After Read:在读操作完成前写
- 写后写 Write After Write:两条指令要改写同一个位置
add $s1,$s2,$s3
add $s4,$s1,$s5
IF | ID | Ex | WB(写R1) | |
IF | ID(读R1取操作数) | EX | WB |