单周期指令运行动态

graph LR A[Instruction Fetch] --> B[Instruction Decode] B --> C[Execution] C --> D[MEM] D --> E[Write Back]

单周期时空图

流水线docker密码 流水线mips_时钟周期

设耗时最长的操作时间为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]

多周期时空图

流水线docker密码 流水线mips_取指_02


不同的指令按照状态图来运行,有多少个状态就分配多少个时钟周期,避免了单周期中某些快的指令需要等待的缺点

流水线架构

流水线docker密码 流水线mips_取指_03


将一条指令分成5段,每段各自功能部件执行的时间不同,例如取指时访问主存相对较慢,取5段当中最长的时间作为每段需要的时间。各段完全并发,每一段都可以分开处理不同的指令。

IF

ID

EX

MEM

WB

IF

ID

EX

MEM

WB

IF

ID

EX

MEM

WB

图中蓝色长条形是流水接口部件。其本质是一系列同步的寄存器,锁存前段加工完成的数据。通过流水接口传递与指令相关的数据、控制、反馈信息。后段对数据的加工处理依赖于前段接口传递过来的信息

流水线数据和信号传递

流水线docker密码 流水线mips_时钟周期_04


IF / ID:

  • 设置PC值寄存器的目的:在执行分支指令是需要用到PC的值,如果不在取指时一并取出,则取指后PC的自动改变,到执行时再取出的PC值是错误的

单周期控制器根据IR的内容生成所有的控制信号,在后续阶段使用,需要向后传递

流水线时空图

流水线docker密码 流水线mips_流水线docker密码_05

流水线冒险 pipeline hazard

资源冒险 resource hazard

也称结构冒险 structural hazard

两条或多条已进入流水线的指令需要使用相同资源。此时这些指令必须串行执行,而不是并行执行。

  • 争用主存:IF取指,ID取操作数
  • 争用ALU:计算PC、分支地址、运算操作

解决方法:增加主存访存端口,或采用哈佛结构,增加ALU

分支冒险 branch hazard

也称控制冒险 control hazard

流水线docker密码 流水线mips_时钟周期_06


由转移指令引起,当分支指令进入Ex阶段时,如果需要跳转,则控制IF段进行分支跳转,提前取出的指令作废,流水线清空,流水线发生中断

数据冒险 data hazard

流水线docker密码 流水线mips_流水线docker密码_07

指令操作数依赖于前一条指令的执行结果,流水线停顿直到数据写回

有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