静态流水线-CA

一个简单的MIPS CPU

从MIPS指令集拣选部分代表性的指令,基本特征包括

  • RISC结构;
  • 32位指令及数据;
  • 32个通用寄存器,0号GPR恒为0;
  • 指令格式:

基本指令

静态流水线-CA

主要数据通路

静态流水线-CA

  • 其中,“两读一写”寄存器堆电路结构
    静态流水线-CA

主要控制逻辑

(1)控制信号:
静态流水线-CA
(2)真值表:
静态流水线-CA

(3)控制信号的Verilog描述:
静态流水线-CA

加入控制逻辑的数据通路

静态流水线-CA

加入时序:指令内、指令间

静态流水线-CA

指令流水线

时序改进:

(1)原来时序的三个步骤:指令地址送到PC、取指到IR、计算结果到GPR
静态流水线-CA
(2)合并后的时序
①计算下一条指令的PC和指令执行重叠;
静态流水线-CA
②可以把计算下一拍PC值作为指令执行的一部分(转移指令的运算结果是PC的值)
静态流水线-CA
(3)改进后的时序:
静态流水线-CA

进一步并行:取指与运算

(1)通常情况下:
-第n+1条指令执行时,第n条指令已经执行完,因此第n+1条指令可以用到第n条指令的结果。

(2)例外:
-如果第n+1条指令的取指也要用到第n条指令的结果,则第n+1条指令的取指必须等到第n条指令结束后才能执行。(转移指令常出现)

(3)“延迟槽”解决:
-紧挨着转移指令后面的一条指令不依赖转移条件执行,则可以:
①从转移指令前面放一条指令到后面去
②也可以放一条nop
• 例:把内存中100个整数的值分别加1(左边的程序段R1初始值为400,右边的程序段R1初始值为396)
静态流水线-CA

(4)进一步改进后的时序—转移指令需要延迟槽
静态流水线-CA

进一步改进—划分执行阶段

(1)上述两级流水线:
> 取指和执行
> 执行阶段做的事情较多:
• 译码(包括读取寄存器的值)
• 运算(ALU操作)
• 访存(取数或存数)
• 写回到寄存器
> 时钟周期较长,一拍内必须做完上述四件事情
于是,将执行阶段再细分:分成译码、运算、访存、写回

(2)标准指令流水线—细分后的流水线:
五级流水线:IF, ID, EX, MEM, WB(计算PC在ID阶段)
指令流水线控制及时序:
静态流水线-CA

(3)标准指令流水线:
静态流水线-CA

指令相关和流水线冲突

指令相关

  • 流水线变深了,相关问题更为突出;
  • 在流水线中,如果某指令的某个阶段必须等到它前面另一条指令的某个阶段后才能开始,则这两条指令存在相关;
  • 相关的指令要隔开足够远,否则后面的指令就必须等待;

之前流水线可能存在的相关

静态流水线-CA

指令流水线的相关:(相关引起流水线阻塞)

静态流水线-CA
(1)结构相关–访存引起
> 访存和取指都需要存储器端口
> 例如:Havard结构
静态流水线-CA
(2)数据相关:
1)数据相关的类型—在动态流水线中会有WAR和WAW相关
①. RAW(Read After Write):
-后面指令用到前面指令所写的数据
②. WAW(Write After Write):
-两条指令写同一个单元
-在简单流水线中没有此类相关,因为不会乱序执行
③. WAR(Write After Read):
-后面指令覆盖前面指令所读的单元
-在简单流水线中没有此类相关
2)例子:
静态流水线-CA
3)相关控制:
静态流水线-CA

(3)控制相关:
1)PC相关:
• 转移指令计算的下一条指令地址在EX阶段计算,下一条指令等2拍 ;
• 使用专门的地址运算部件把地址计算提前到译码阶段可以少等一拍;
• 使用一个转移指令延迟槽(delay slot)可以不用等待;
静态流水线-CA
2)转移条件相关:
• 如果在ID阶段执行转移指令时转移指令的源操作数没有准备好还是要等待
静态流水线-CA

3)转移控制相关的流水线:
静态流水线-CA

流水线的前递技术

前递Forwarding技术

解决RAW相关

  • 在执行(EX)阶段的运算结果出来后直接送到后续指令的EX阶段
  • 例子:
    静态流水线-CA

前递情况下的数据相关

  • 取数指令的结果在MEM阶段才有效,后续相关指令需要阻塞一拍
  • 例子:
    静态流水线-CA

ALU Forward控制

(只考虑ALU前递,不包括访存和转移前递)
静态流水线-CA

  • Forwarding的相关处理逻辑(前递技术的三选一选择器的控制):
    把指令的两个源寄存器号:src1D和src2D传递到EX流水级
    以ALU左端的输入即src1D为例(优先级由高到低):
    • 当src1D=destE且执行级操作是LW时,后面流水线暂停,往前面流水线送空操作;
    • 当src1D=destE且执行级操作不是LW时,选择左边通路;
    • 当src1D=destM时,选择右边通路;
    • 当src1D和前面两级的目标寄存器域destE和destM都不相等时,选择中间通路;

通过静态调度解决相关

例子:如下程序段的优化和非优化代码:a = b + c; d = e -f;
静态流水线-CA

流水线和例外

例外(Exception)与流水线

(1)例外原因:
- I/O请求:外部中断
- 指令例外:用户请求例外(系统调用、断点、跟踪调试指令)
- 运算部件:(整数运算溢出、浮点异常)
- 存储管理部件:(访存地址不对齐、用户访问系统空间、TLB失效、缺页、存储保护错(写只读页))
- 保留指令错:未实现指令
- 硬件错
- ……………
(2)例外发生的流水阶段:
- 取指:访存例外
- 译码:保留指令、中断指令如Trap、Syscall
- 执行:整数溢出、浮点异常(如除零)等
- 访存:访存例外
- 其它:外部中断,可能在任何时候发生
(3)例外特征:
- 同步与异步
- 用户请求与系统强制
- 可屏蔽与不可屏蔽
- 指令内与指令间
- 可恢复与结束
(4)综述:
静态流水线-CA
(5)指令内可恢复例外的处理比较困难,条件转移指令的delay slot又增加了例外处理的难度;
(6)精确例外—存储管理和IEEE运算规范的要求
1)定义:
在处理例外时,发生例外指令前面的所有指令都执行完,例外指令后面的所有指令还未执行。
2)做法:
①. 发生例外指令前面的指令继续执行完
②. 后面的指令不能修改机器状态,对运算状态字的修改可能在EX阶段进行
③. 多条指令发生例外
④. 可以把每条指令的例外延迟到WB时再处理
- 对机器状态的修改也在WB阶段进行
- 对状态寄存器的修改从EX阶段延迟到WB阶段
(7)简单流水线的例外处理:
> 任何一级流水发生例外时,在流水线中记录下发生例外的事件,直到WB阶段再处理
> 如果在EX阶段要修改机器状态(如状态寄存器),保存下来直到WB阶段再修改。
> 指令的PC值随指令流水前进到WB阶段例外处理专用
> 外部中断作为IF的例外处理
> 指定一个通用寄存器中(如最后一个)为例外处理时保存PC值专用。
> 当发生例外的指令在WB阶段时:
• 保存该指令的PC(也在WB阶段),有些机器还保存其它状态
• 置PC值为例外处理程序入口地址
(8)例外处理通路:
静态流水线-CA

多功能部件与多拍操作

多功能部件

定点ALU、定点乘法、浮点ALU、浮点乘法、访存

不同功能部件有不同延迟

  • 定点ALU 1拍,定点乘法2拍,浮点ALU 4拍,浮点乘法7拍
  • 访存部件延迟不确定(CACHE不命中、访存总线竞争、动态存储器刷新等原因),每次只能一个操作(内部不流水)

主要数据通路

静态流水线-CA

多功能部件及多拍操作引起的问题

(1)结构相关:
> 访存部件不流水引起多个访存操作的等待
> 结果总线相关:不同功能部件延迟不一致
§ 定点ALU操作的MEM周期就是为了避免结果总线冲突的stall操作
> 例子:
静态流水线-CA
(2)WAW相关:(即使有多个写端口也会阻塞)
> 例子:
静态流水线-CA
(3)WAR相关:(没有,因为读数总是在较早的ID阶段)
(4)RAW相关:(最多)
• 有些操作需要多拍产生结果
• Forwarding技术的作用也很有限
> 例子:
静态流水线-CA
(5)指令乱序结束:
> 例外处理更加困难,例外的发生难以预料
> 在下面的例子中,没有任何相关,因此,ADD.D和SUB.D指令可以比DIV.D先结束。如果在ADD.D结束后DIV.D发生例外,此时无法恢复例外现场。
静态流水线-CA

通过流水线堵塞来保证避免数据冲突

  • 把所有流水线执行阶段指令的目标寄存器号和译码阶段的源寄存器号以及目标寄存器号进行比较,如果发现有寄存器号相等的情况就阻塞译码阶段的指令,这样就可以避免由于数据相关引起冲突
  • 要把译码阶段指令的目标寄存器号也跟前面指令的目标寄存器号进行比较以避免WAW相关导致冲突

结构相关

通过请求和仲裁允许流水线前进。

例外处理

  • 不管指令要执行多少拍,都可以要求所有指令顺序写回,而且所有例外在写回阶段进行统一处理。
  • 有的早期机器不保证精确例外。