Chapter4-3 Pipelining 流水线数据通路

Posted by LvKouKou on November 22, 2022

4-3 Pipelining 流水线数据通路

==易错点:流水线的时钟周期除了五个阶段中最长的阶段所需时间外,还有CLK-to-Q time 和 setup time==

流水线实现简介

数据通路流水线化

⽬标: 保证(⼏乎) 1.0 的CPI, 同时提⾼时钟速率⽅法: 将处理器转变为⼀个多级流⽔线

  • Instruction Fetch IF: 维护 PC. 每周期取⼀个指令.
  • Register File(RF/ID): 从寄存器组RF中读取操作数.
  • ALU: 执⾏指定的运算.
  • Data Access:存储器访问(I type load store指令需要)
  • Reg Write-Back(WB): 将结果写回到寄存器

R型指令的四级流水线:IF -> ID -> ALU -> WB

Non-Pipelined Execution

image-20221112203402419

注意每种指令所需阶段

Pipelining

通过提⾼指令吞吐率(throughput)改善性能

image-20221113104529332

image-20221113104553854

image-20221113104623147

==N条指令所需的阶段数:5+N-1=4+N==

Pipelining Performance (与多周期比)

多周期数据通路需要知道每种指令的比例,多周期时钟周期选用5个阶段中最长的一个

image-20221113104750391

五级流水线的实现(单周期)

image-20221113110235258

Pipeline registers

image-20221113110340253

Classic 5-Stage RISC Pipeline

image-20221113110619721

image-20221113110803552

Nonuniform Pipelining非均匀流水线

image-20221113110858424

==时钟周期除了五个阶段的时间外,还需要CLK-to-Q Time and Setup Time==

流水线操作说明

操作视角

image-20221113111201144

资源视角

image-20221113111217173

指令流水线: 不是理想化的流水线

image-20221113111742259

image-20221113111913000

NOP阶段即为空阶段,什么都不做,只是为了延迟写操作,使得条指令都是五个状态

五个阶段的操作

Stage 1 Pipelining the Fetch Phase

image-20221113112345579

流水线寄存器IF/ID中数据:

  1. PC+4
  2. 取出的指令

image-20221113112551247

Stage 2: 译码

image-20221113112849567

流水线寄存器ID/EX中数据:

  1. PC+4

  2. A(rs的内容)

  3. B(rt的内容)

  4. imm

  5. 目的寄存器地址(rs和rd的地址,因为还没有译码得出是何种指令,不知道write back的寄存器是rt还是rd)

  6. 控制信号

Stage 3: Execute

image-20221113113237221

在此完成条件分支地址的计算

流水线寄存器EX/MEM中数据:

  1. ALU运算结果
  2. B(rt的内容,sw指令需要)
  3. PC+4+offset(branch需要)
  4. 目的寄存器地址(此时译码完毕,知道是何种指令了,所以这里只存rt和rd中其中一个的地址)
  5. 控制信号

回顾多周期

多周期的PC+4在IF阶段计算,与流水线一样,但是多周期的条件分支跳转地址是在译码阶段ID就完成了,ALU运算阶段只需计算A和B的值,然后决定是否将分支地址写入PC

Stage 4: Memory Operation

  • 内存访问(lw/sw指令) ❒ ALU 结果包含 lw 和 sw的访问地址 ❒ 控制信号包含内存访问的读写信号
  • 写状态值到下⼀级流⽔线寄存器 (Mem/WB) ❒ ALU 结果或内存读取的数据 ❒ ⽬的及寄存器地址及控制信号等

流水线寄存器MEM/WB中数据:

  1. ALU计算结果 or 内存中取出来的值
  2. 目的寄存器地址(rt和rd中一个)
  3. 控制信号。

Stage 5: Write back

  • 结果写⼊寄存器堆 (if required) ❒ 写内存读取数据到⽬的寄存器 (rt)(对于lw 指令) ❒ 写 ALU 结果到⽬的寄存器(rd/rt)(对于运算指令) ❒ 控制信号(寄存器写使能等)

流水线各阶段操作细节

image-20221113114650572

3周期:条件分支branch

4周期:R型,sw

5周期:其他全部

Basic 5 Stage Pipeline

以下的图仍有要修正的地方:目的寄存器地址的来源

image-20221113115140150

lw: Instruction Fetch (IF)

image-20221113135623682

lw: Instruction Decode (ID)

image-20221113135836714

lw:Execution (EX)

image-20221113135922637

lw: Memory (MEM)

image-20221113135940977

修正

image-20221113140012517

对 MIPS 数据通路修正,目的寄存器地址随流⽔线寄存器传送

image-20221113140145675

MIPS Pipeline Datapath Modifications

image-20221113140158077

How many bits wide is each pipeline register?

  • PC – 32 bits

  • IF/ID – 64 bits(PC+IR)

    PC+4和取出的指令,各32位

  • ID/EX – 9(con) + 32x4 + 10 = 147 rs=32,pc=32,off=32(扩展后imm),rt=32,rt-addr=5,rd-addr=5(A、B、PC+4、扩展后imm、rt和rd地址)

  • EX/MEM – 5(con) + 1 + 32x3 + 5 = 107 zero=1,Aluout=32,Braddr=32,rt=32(rt中数据,sw要用),rt/rd-addr=5

  • MEM/WB – 2(con) + 32x2 + 5 = 71 Ldata=32(lw读出的数据),Aluout=32, rt/rdaddr=5

时钟驱动的流水线时空图

image-20221113140725394

(作业中需要画)

Pipelining Example

image-20221113141013077

控制信号

  • 控制信号在RF/ID译码阶段产生————由控制逻辑电路译码生成
  • 控制信号也必须流⽔线化
    • 针对EX阶段的控制信号 ExtOP, ALUSrc等;⼀个时钟周期后⽤到
    • 针对Memory的控制信号 MemWr, Branch;两个周期后⽤到
    • 针对寄存器回写的控制信号 MemToReg, RegWr等; 三个周期后⽤到

(只有这三个阶段有控制信号)

MIPS Pipeline Data and Control Paths

image-20221113141513661

==分支branch地址在MEN阶段解析,在ALU阶段计算==,因为需要branch信号和zero信号与才能判断是否跳转

Control Signal Generation

image-20221113141719363

Control Settings

image-20221113141750427

Control Signals per Stage

image-20221113141816194

Pipeline Control

每个阶段 (IF, ID, EX, MEM, WB)需要控制什么?

  • IF: 取指 、 PC 递增
  • ID: 指令译码和从寄存器堆取操作数/或⽴即数
  • EX: Execution stage
    • RegDst
    • ALUop[1:0]
    • ALUSrc
  • MEM: Memory stage
    • Branch
    • MemRead
    • MemWrite
  • WB: Writeback
    • MemtoReg
    • RegWrite (注意这个信号在ID阶段的寄存器堆)

image-20221113142109886

Datapath with Control

PPT第45页

image-20221113142650771

Stage Control

  • Instruction Fetch: 总是要读取指令存储器和写⼊ 更新的PC,所以在这个流⽔线阶段没有什么特别需要控制
  • ID/RF:与前⼀阶段⼀样, 每个时钟周期都会发⽣相同的事情, 因此⽆需设置选择控制线

前两个周期是所有指令都需要的,所以没有特别需要控制的

  • Execution:设置的信号是 RegDst、 ALUop/Func 和 ALUSrc。 这些信号确定指令的结果是否写⼊位 rt (20-16)(对于load) 或 rd(15-11)(对于 R 格式) 寄存器, 并指定 ALU 操作, 确定 ALU 的第⼆个操作数是寄存器还是符号扩展⽴即数
  • Memory Stage: 这个阶段设置的控制线是Branch、 MemRead和MemWrite。这些信号分别为 BEQ、 LW 和 SW 指令设置
  • WriteBack: 两条控制线分别是 RegWrite 和 MemToReg, 决定写⼊寄存器数据是ALU 结果还是内存值

例子

image-20221113143119834

分析:所需周期数为4+N=4+5=9

image-20221113143412870

Cycle 1

image-20221113143207931

Cycle 2

image-20221113143224731

Cycle 3

image-20221113143239105

Cycle 4

image-20221113143250551

Cycle 5

image-20221113143301799

Cycle 6

image-20221113143313860

Cycle 7

image-20221113143324687

Cycle 8

image-20221113143337938

Cycle 9

image-20221113143350531

流水线存在问题

  1. 结构冒险:试图被两条不同的指令同时使⽤相同的资源
  2. 数据冒险:试图在数据准备好之前使⽤它
  3. 控制冒险:试图尝试在转移条件没确定时以及新的 PC ⽬标地址计算出来之前对程序控制流提前做出决定

image-20221113143623354

Structural Hazard(结构冒险) 现象

image-20221113143825171

image-20221113143842336

Structural Hazard的解决方法

image-20221113143910625

image-20221113143932069

Data Hazards 数据冒险

image-20221113144124132

image-20221113144142104

Register Usage Can Cause Data Hazards

image-20221113144349263

image-20221113144418194

Loads Can Cause Data Hazards

image-20221113144538662

image-20221113144517181

Load delay and data hazard (此时对寄存器操作的阶段ID和WB无前半段写入,后半段读取规定)

image-20221113144635584

Control Hazards控制竞争

image-20221113144831879

branch流水线执行过程和转移分支指令(Branch)引起的“延迟”现象

image-20221113144901623

即本来应该是要跳转到其他指令的,

image-20221113144953343

总结: 流水线的三种冲突/冒险(Hazard) 情况

image-20221113145131723

内容小结

image-20221113145208011

  • 指令的执⾏可以像洗⾐服⼀样, 分为N个步骤, 并⽤流⽔线⽅式进⾏
    • 均衡时指令吞吐率提⾼N倍, 但不能缩短⼀条指令的执⾏时间
    • 流⽔段数以最复杂指令所需步骤数为准(有些指令的某些阶段为空操作) , 每个阶段的宽度以最复杂阶段所需时间为准(尽量调整使各阶段均衡)
  • 以Load指令为准, 分为五个阶段
    • 取指令段(IF) - 取指令、 计算PC+4(IUnit: Instruction Memory、 Adder)
    • 译码/读寄存器(ID/Reg)段 - 指令译码、 读Rs和Rt(寄存器读⼝)
    • 执⾏(EXE)段 - 计算转移⽬标地址、 ALU运算(Extender、 ALU、 Adder)
    • 存储器(MEM)段 - 读或写存储单元(Data Memory)
    • 写寄存器(Wr)段 - ALU结果或从DM读出数据写到寄存器(寄存器写⼝)
  • 流⽔线控制器的实现
    • IF和ID/Reg段不需控制信号控制, 只有EXE、 MEM和Wr需要
    • ID段⽣成所有控制信号, 并随指令的数据同步向后续阶段流动
  • 寄存器和存储器的竞争问题可利⽤时钟信号来解决
  • 流⽔线冒险: 结构冒险、 控制冒险、 数据冒险 (下⼀讲主要介绍解决流⽔线冒险的数据通路如何设计)

例子:单周期和流水线对比

image-20221113145427483

image-20221113145458174

==易错点:流水线的时钟周期除了五个阶段中最长的阶段所需时间外,还又CLK-to-Q time 和 setup time==

image-20221113145507708

image-20221113145530866