FPGA中绝大多数电路都是同步时序电路,基本模型为“寄存器+组合逻辑+寄存器”。同步就意味着时序路径上的所有寄存器都是在时钟信号的驱动下步调一致的运行。这就要求时钟信号要在同一时间点到达所有寄存器的时钟端口。为了尽量达到这个目的,在FPGA内部提供了专用的时钟布线资源,但是,即便如此,实际情况时钟信号也不可能在同一时间到达所有的寄存器的时钟端口,这种现象就叫时钟偏移。
时钟偏移反映了时钟信号到达不同寄存器时钟端口之间的时间差异,如下图所示如下图所示:
时钟从远端到达FF1的时间是Tclk1,到达FF2的时间是Tclk2,因此时钟偏移Tskew=Tclk1-Tclk2.如果clk的源端记为0时刻点,那么Tclk1和Tclk2就是发送时钟路径延迟和捕获时钟路径延迟。
时钟偏移可正可负,如上图所示,如果数据流向和时钟方向相同,则偏移为正,否则,时钟偏移为负。
时钟偏移对时序有什么影响呢?这需要从建立时间和保持时间两个方面来分析。先以正向的偏移时钟为例。建立时间裕量分析,如下图所示:
发起沿和捕获沿相差一个时钟周期,正向的时钟偏移对建立收敛是有利的,相当于捕获寄存器的建立时间由Tsu减小到Tsu-Tskew.保持时间的发起沿和捕获沿是同一个时钟沿,保持时间检查时基于建立时间检查的,要求当前发送沿发送的数据不能被前一个捕获沿捕获,下一个发送沿发送的数据不能被当前的捕获沿捕获,由图可以得出结论:正向的时钟偏移不利于保持时间收敛,相当于数据在有效沿到达之后还要稳定保持的时间变长了,由原来的Th变成了Th+Tkew。
结合建立时间裕量表达式和保持时间裕量表达式可知,若Skew为负,则建立时间更加困难,保持时间收敛更加容易。
这就告诉我们在设计初期就要做到系统时钟输入管脚与系统的数据输入管脚要在FPGA的同侧,这样能最大限度的保证时钟前进方向和数据流向是一致的。
哪些因素会导致时钟偏移过大呢?首先是不合理的时钟结构,比如级联的BUFG或者时钟路径上面出现组合逻辑;时钟同时驱动I/O资源和SLICE资源;时钟跨die等都会增大时钟偏移。通常只要超过0.5ns就需要格外关注,时序报告的总结里面会有时钟偏移的具体值,如下图:
那么如何在实战中降低或者避免时钟偏移呢,见下一篇文章,《Vivado进阶-时序分析之如何实战解决时钟偏移来优化时序》。