握手和反压
首先介绍握手协议 valid-ready握手协议
- valid先发起请求
- ready先发出请求
- 同时发出请求
仔细观察上述3幅时序图,我们了解valid-ready握手机制需要注意三件事:
- valid与ready不可过度依赖,比如valid不可以等待ready到达再拉高,ready也不可以等待valid到达再拉高,他俩彼此可以互相独立发出请求拉高;
- valid拉高时与有效数据同步,时钟要对齐;
- 当数据计算好后,valid可以拉高等待ready拉高,但是每当握手成功之后,数据需要更新,如果此时没有新的有效数据,valid要拉低。
反压:当入口流量大于出口流量,这时候就需要反压,或者,当后级未准备好时,如果本级进行数据传递,那么它就需要反压前级,所以此时前级需要将数据保持不动,直到握手成功才能更新数据。而反压在多级流水线中就变得稍显复杂,原因在于,比如我们采用三级流水设计,如果我们收到后级反压信号,我们理所当然想反压本级输出信号的寄存器,但是如果只反压最后一级寄存器,那么会面临一个问题,就是最后一级寄存器数据会被前两级流水冲毁,导致数据丢失,引出数据安全问题,所以我们此时需要考虑反压设计。
-
不带存储体的反压
也就是后级反压信号对本级模块中所有流水寄存器都进行控制,由于不包含存储体,为了保证数据安全性,后级反压信号可以同时反压本模块中所有流水寄存器。
优点:节省面积资源
缺点:寄存器端口控制复杂
适用情况:流水线深度较大时 -
带存储体的逐级反压
如果流水级数不深,可以在每一需要握手交互模块增加存储体,原理上相当于,如果后级发出反压信号,可以直接对本级流水线数据源头进行反压,其余中间级不需控制,但后级需要包含RAM或FIFO等存储体,可以接收流水,并需设置水线(water line),确定反压时间,防止数据溢出,保证数据安全性。
优点:各级流水寄存器端口控制简单
缺点:需要额外存储体
适用情况:流水线深度较小,每一模块都包含存储体时 -
取消握手
取消握手意味着流水线中的每一级并不会与其下一级进行握手,可能会造成功能错误。因此需要配合重执行、预留大缓存。 -
加入前向旁路缓冲区
这是一种面积换时序的方法,增加一个额外的缓存表项使反向的握手信号时序路径中断,但是前向路径不受影响。蜂鸟E203处理器在设计中采用此方法,有效地解决了多处反压造成的时序瓶颈。
流水线中的冲突
资源冲突
资源复用或者流水线停顿来解决资源冲突。
数据冲突
数据冲突是指不同指令之间的操作数存在着数据相关性的冲突。常见的数据相关性如下:
- WAR(Write-After-Read,先读后写)相关性:后序执行的指令需要写回的结果寄存器索引与前序执行的指令需要读取的源操作数寄存器索引相同造成的数据相关性。后序指令一定不能比与他与WAR相关性的前序指令先执行。
- WAW相关性:后序指令一定不能比与他与WAW相关性的前序指令先执行,否则前序指令在把结果写进寄存器组时就会将其覆盖。
- RAW相关性:后序指令一定不能比与他与RAW相关性的前序指令先执行,否则就会读回错误的源操作数。
很容易理解,其中WAR和WAW都可以通过寄存器命名的形式避免。寄存器重命名可以在Tomasulo算法中通过保留站和ROB(Re-Order Buffer)完成,也可以通过物理引擎。
Tomasulo算法
RAW相关性是不可以通过寄存器重命名的方法去除,只能等待前边指令执行结束。为了尽量减少停顿带来的损失,使用动态调度的方法:
- 采用数据旁路传播技术,尽可能让前序指令的计算结果更快传播给后续相关指令的操作数
- 尽可能让其他无关的指令继续顺利执行
- T算法由于保留站保留了操作数,无法具有很高的深度。
- 最新的高性能处理器普遍采用在每个运算单元前配置乱序发射队列的方式,发射队列只追踪RAW相关性,而并不存放操作数,因此流水线很深的时候。在发射队列中的之林一旦接触相关性之后,再从发射队列中发射出来,读取物理寄存器组,然后发送给运算单元,开始计算。