优化时钟网络之时钟偏移
Note:文章内容以Xilinx 7系列FPGA进行讲解
1、基本介绍
所谓时钟偏移(Clock Skew),是指在同步时序电路中,同一个时钟信号到达各个寄存器时钟端口的时间不一致的现象。如下图所示:
时钟从源端到达寄存器FF1的时间点为Tclk1,到达寄存器FF2的时间点为Tclk2,因此时间偏移为Tclk2与Tclk1的差。若clk源端记为零时刻点,那么Tclk1和Tclk2分别对应发送时钟路径延迟和捕获时钟路径延迟。
时钟偏移可正可负。通常,若数据流向与时钟前进方向相同,则时钟偏移为正;若数据流向与时钟前进方向相反,则时钟偏移为负,如下图所示:
2、对时序的影响
从建立时间裕量和保持时间裕量两个角度进行分析,下面先以正向的时钟偏移为例。
(1)建立时间裕量分析,如下图所示:
发起沿和捕获沿相差一个时钟周期。由图中建立时间裕量表达式可以得知:正向的时钟偏移对建立时间收敛是有利的,因为其增加了建立时间裕量,也相当于捕获寄存器的建立时间由Tsu减小至Tsu-Tskew。
(2)保持时间裕量分析,如下图所示:
保持时间检查的发起沿和捕获沿为同一时钟沿(保持时间检查是基于建立时间检查的,要求当前发送沿发送的数据不能被前一个捕获沿捕获;下一个发送沿发送的数据不能被当前捕获沿捕获)。由图中保持时间裕量表达式可以得知:正向的时间偏移不利于保持时间收敛,因为其导致保持时间裕量减小,也相当于数据在有效沿到达之后还要稳定保持的时间变长了,由原来的Th变为Th+Tskew。这显然不利于保持时间收敛。
结合建立时间裕量表达式和保持时间裕量表达式可知,若Tskew为负,则建立时间收敛更加困难,保持时间收敛更加容易。
3、导致时钟偏移过大的因素
(1)不合理的时钟结构(如级联的BUFG或时钟路径上出现组合逻辑)
(2)时钟同时驱动I/O资源和SLICE中的资源
(3)时钟跨die(在多die芯片中)
通常,如果时钟偏移超过0.5ns,就要格外关注。一般在时序报告的总结部分会显示时钟偏移的具体数值,如下图所示:
但是该数值未必是对应时钟最糟糕的时钟偏移情形,具体的数值我们也可以通过相关Tcl命令获得。
4、降低时钟偏移的方法
(1)移除时钟路径上多余的时钟缓冲器
之所以会出现多余的时钟缓冲器,是因为设计中出现了级联时钟缓冲器,如下图所示:
对于BUFGCE级联的情形可优化为BUFGCE并联,但更好的方法是移除不必要的BUFGCE 。不过目前Vivado已经相当智能,在opt_design阶段可自动移除时钟路径上多余的缓冲器。
(2)合并并联的时钟缓冲器为单一的时钟缓冲器
并联时钟缓冲器常见的情形是两个并联的BUFGCE,一个使能端恒接高电平,另一个使能端受其他信号控制,如下图所示:
此时,可将这两个BUFGCE合并,将原本的使能信号连接到寄存器的使能端。
(3) 移除时钟路径上的组合逻辑
一旦时钟路径上出现了组合逻辑,就意味着时钟布线采用了“常规布线资源+专用时钟布线资源”的组合形式,从而显著增大时钟延迟并使得时钟偏移无法被预测。同时,相比专用时钟布线资源,常规布线资源对噪声更加敏感,这使得时钟质量显著下降。时钟路径上出现组合逻辑的常见场景是工程师试图通过组合逻辑的形式实现门控时钟的功能,以节省能耗。此时,可将组合逻辑从时钟路径上移除,将其输出连接到寄存器的时钟使能端口。如下图所示:
(4)避免使用约束CLOCK_DEDICATED_ROUTE=FALSE
CLOCK_DEDICATED_ROUTE=FALSE意味着时钟布线采用了“常规布线资源+专用时钟布线资源”的组合形式,和在时钟路径上使用组合逻辑类似,也会很大程度上增大时钟偏移,如下图所示:
在上图中,右侧使用了专用时钟布线资源,而左侧没有使用。之所以Vivado会要求设置此约束,是因为设计中的某个时钟网线不是由全局时钟缓冲器驱动的,而是直接由时钟网络的某部分驱动的,例如MMCM/PLL的时钟输出端口或输入缓冲器IBUF的输出端口,相关约束命令如下图所示:
一个典型的设计失误是时钟信号未从全局时钟管脚进入FPGA,而从通用输入端口进入FPGA。此时,只能添加此约束,否则在布局布线阶段会报错。(这种设计失误一般是硬件设计问题)
(5)当设计中出现并联的MMCM/PLL时,应合理设置CLOCK_DEDICATED_ROUTE的值
当设计中出现了一个BUFGCE输出驱动两个MMCM或PLL时,如下图所示:
此时,应根据三者的位置合理设置CLOCK_DEDICATED_ROUTE约束,以保证时钟布线仅使用专用时钟布线资源。
情形一:BUFGCE和两个MMCM或PLL位于同列相邻的时钟区域
此时,应将CLOCK_DEDICATED_ROUTE设置为SAM_CMT_COLUMN(针对UltraScale/UltraScale+ FPGA)或BACKBONE(针对7系列FPGA),同时,最好固定两个MMCM或PLL的位置(通过属性LOC实现),相关约束命令如下图所示:
情形二:BUFGCE和两个MMCM位于不同列但相邻的时钟区域
此时,应将CLOCK_DEDICATED_ROUTE设置为ANY_CMT_COLUMN(针对UltraScale/UltraScale+ FPGA)或FALSE(针对7系列FPGA),同时,最好固定两个MMCM或PLL的位置(通过属性LOC实现),相关约束命令如下图所示:
(6)避免使用区域时钟缓冲器(如BUFIO、BUFR或BUFH)驱动分散在不同时钟区域内的逻辑(该方法只针对7系列FPGA)
使用7系列FPGA中的区域时钟缓冲器时要格外小心。首先,要明确区域时钟缓冲器的作用域。例如,BUFR只能驱动其所在时钟区域内的逻辑资源。其次,要评估设计中区域时钟缓冲器负载的个数,以保证这些负载可以被放置在一个时钟区域内。最后,添加合理的位置约束,保证区域时钟缓冲器与其负载在同一个时钟区域内。这可通过手工布局(画PBLOCK)的方式实现。
(7)避免关键路径穿越SLR或输入输出列
如果时序违例的根本原因在于时钟偏移过大,那么首先检查该路径是否跨die(穿越多个SLR)或是否穿过输入/输出列。若是,则可采用手工布局的方式将关键路径封闭在同一个SLR内或避免其穿过输入/输出列。
~End~