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