MIPS五级流水线:
1 取指。取指是将指令从存储器中读取出来的过程。
2 译码。指令译码是将从存储器中取出的指令进行翻译的过程。经过译码得到指令需要的操作数寄存器索引,可以通过索引从通用寄存器中将操作数读出。
3 执行。指令译码后所需要进行的计算类型已得知,并且从通用寄存器中读取出了所需的操作数,需要执行指令。执行指令是对指令进行真正运算。ALU算术逻辑单元
4 访存。 存储器访问指令往往是指令集最重要的指令类型之一。访存是指存储器访问指令将数据从存储器读出,或者写入存储器。
5 写回。 写回是指将指令执行结果写回通用寄存器的过程。如果指令是普通运算指令,结果来自执行指令阶段的计算结果,如果指令是存储器读指令,结果来自访存阶段从存储器中读取出来的数据。
流水线与状态机
流水线在本质上理解为以面积换性能,以空间换时间。五级流水线,增加了五组寄存器,每一级流水线内部都有各自的组合逻辑数据通路,但提高了数据吞吐量。状态机可以理解为以性能换面积,以时间换空间。 如果用状态机来完成,需要多个时钟周期才能完成一条指令的所有操作,每个时钟周期对应状态机一个状态。使用状态机可以省去流水线上的寄存器开销,还可以复用组合逻辑数据通路。
流水线的深度
每一级流水线都由寄存器组成,更多的流水线要消耗更多的寄存器,占用更多的芯片面积。
由于每一级流水线都需要握手,流水线最后一级的反压信号可能回一直串扰到最前一级,造成严重的时序问题,因此需要高级的技巧来解决此类反压时序问题。
根据应用背景做合理的选择。
流水线中的乱序
握手和反压
当入口流量大于出口流量,这时候就需要反压,或者,当后级未准备好时,如果本级进行数据传递,那么它就需要反压前级,所以此时前级需要将数据保持不动,直到握手成功才能更新数据。
而反压在多级流水线中就变得稍显复杂,原因在于,比如我们采用三级流水设计,如果我们收到后级反压信号,我们理所当然想反压本级输出信号的寄存器,但是如果只反压最后一级寄存器,那么会面临一个问题,就是最后一级寄存器数据会被前两级流水冲毁,导致数据丢失,引出数据安全问题,所以我们此时需要考虑反压设计。
信号从输入端到A,经过模块A处理后,再送入到B模块进行处理。为了防止B错误读取A中的数据,A与B之间添加了信号Valid,只有当Valid信号为真时,A输出的数据才是有效数据,同时,为了防止B出现问题,A与B之间还加入了一个引脚Ready,B拉高该电平时,表明当前B模块可以接收、处理信号。只有当A送给B的信号有效(Valid为真),B此时做好的准备可以接收A的数据了(Ready为真),此时,数据才被顺利的送入B中,这个过程就叫做‘握手’。
如果B没能及时的处理完A送达的数据,就会将Ready拉低,提醒A模块不要再传输数据了。此时A模块接收到B的指令,为了不让数据丢失,在B模块读取当前数据前,A模块不会更新自己输出的Data内容。由于A目前不能更新输出值,因此需要告诉A的上级模块停止数据传输,因此A模块也会拉低自己的Ready输出信号,提醒上一级暂停数据的传输。这种当后面的模块未能及时处理上级模块的输入数据时,通过一个Ready信号告诉自己前面的模块暂停数据传输的方法被称之为‘反压’。
流水线中的反压
若流水线越深,由于每一级都需要握手,流水线最后一级反压信号可能会一直串扰到最前一级造成严重的反压时序问题。
解决方法:
1 取消握手。可以杜绝反压的发生,使时序表现非常好。这种要配合重执行、预留大缓存这种机制。
2 加入乒乓缓冲区。 面积换时序。使用乒乓缓冲区替代普通一级流水线,就可以使得此级流水线向上一级流水线的握手接收信号仅关注乒乓缓冲区是否有一个以上的空的表项,而无须将下一级的握手接收信号串扰至上一级。
3 加入前向旁路缓冲区。 面积换时序,旁路缓冲区仅有一个表项,由于增加一个额外的缓存表项可以使后向的握手信号时序路径中断,但是前向路径不受影响,广泛用于握手接口。 蜂鸟E203使用该方法解决反压造成的时序瓶颈。
处理器中的冲突
1 流水线中的资源冲突,
最常见的是运算单元冲突,如除法器需要多个时钟周期才能完成运算,因此在前一个除法指令完成运算之前,新的除法指令如果需要除法器,则存在资源冲突。资源冲突可以通过复用硬件资源或者流水线停顿并等待硬件资源的方法解决。
2 流水线中的数据冲突
数据冲突指不同指令的操作数存在着数据相关性的冲突。
WAR 先读后写相关性,
WAW 先写后写相关性 , 会造成覆盖问题。 后序指令一定不能比和它有WAW相关性的前序指令先执行。
RAW 先写后读
解决数据冲突的常见方法:
WAW 和WAR 可以通过寄存器重命名的方法,将相关性去掉。寄存器重命名技术。
RAW为真数据相关性。 因为不能通过寄存器重命名方法将相关性去除,一旦产生相关性,后序的指令一定要使用和它有RAW数据相关性的前序指令执行完成的结果。从而造成数据的停顿。 为了尽可能减少流水线停顿带来的性能损失,要使用动态调度的方法。
动态调度方法:
1 采用数据旁路传输
2 尽可能让后序指令在等待过程中不阻塞流水线,而让其他无关的指令继续顺利执行。
3 最新的高性能处理器采用每个运算单元前配置乱序发射队列的方法,发射队列可以追踪RAW的相关性,而不存放操作数。
蜂鸟E203处理器的流水线
第一级为取指,IFU取值单元完成。
译码(EXU执行单元完成),执行(EXU完成) ,写回(由WB寄存器组完成),均处于一个时钟周期,位于流水线第二级。
而访存(LSU完成)阶段处于EXU之后的第三级流水线,但是LSU的结果仍然需要通过WB寄存器组模块写回通用寄存器。
严格来讲是个变长的流水线。
由于主体是位于第一级取指和第二级执行和写回,因此E203定义为二级流水线。
流水线的冲突
蜂鸟E203冲突,资源冲突和数据冲突主要在EXU中解决。