1.建立时间和保持时间概念
建立时间(setup time):触发器在时钟沿到来之前,其数据的输入端的数据必须保持不变的时间。
保持时间(hold time)触发器在时钟沿到来之后,其数据输入端的数据必须保持不变的时间。
2.静态时序分析
对建立时间和保持时间的静态分析主要参考以下电路模型。
电路模型由发起寄存器(rega)、组合逻辑、捕获寄存器(regb)及其中间的走线组成。其中Tsu表示捕获寄存器建立时间要求,Th表示捕获寄存器保持时间要求。源时钟clk到达rega的时钟端口时,会有一定的延迟,从而形成Tclka。同理,时钟延迟到达regb的时钟端口,形成Tclkb。Tco为有效数据出现在发起寄存器Q端口所需时间。Tcomb为数据延迟,包括组合逻辑延迟和走线延迟。
数据保持稳定传输的关键在于建立时间和保持时间需要满足最低指标要求,因此为了表述建立时间和保持时间是否满足要求,引入时间裕量的概念。
时间裕量包括建立时间裕量和保持时间裕量(setup slack和hold slack)。从字面上理解,所谓“裕量”即富余的、多出的。什么意思呢?即保持最低要求的建立时间或保持时间所多出的时间,那么“裕量”越多就意味着时序约束越宽松。如果Times Slack > 0 , 则电路能够正常被采样,否则出现违例。
根据电路模型可以画出静态时序图如下:
建立时间Setup Time公式:Tclka + Tco + Tdata + Tsetupslack + Tsu = Tcycle + Tclkb ,即Tsetupslack = Tcycle + (Tclkb-Tclka) - Tsu - Tco - Tdata
保持时间Hold Time公式:Tclka + Tco + Tdata = Tclkb +Th + Tholdslack,即Tholdslack = Tco + Tdata - (Tclkb - Tclka) - Th.
数据稳定传输要求(Tsetup slack >0 )&&(Tholdslack>0)。
数据传输分为1、2、3三种情况。1:当延迟时间大于T-Tsu时,Data在建立时间区域内才到达regb,所以不满足建立时间要求,这就是说数据来的**“太晚了”;2:当Data延迟了很小一段时间(<Th),Data在保持时间内就变化了,所以不满足保持时间,这就是说数据来的“太早了”**。3:当Data延迟了Th,Data则满足建立时间要求又刚好满足保持时间要求,这就是说数据来的“正巧”。
综上所述,数据的最大延迟是T-Tsu,最小延迟是Th。
解决方案
1.Setup Time Violation的解决方案
如果出现了Setup Time Violation,也就是说Tsetupslack为负数了,那么可以考虑:
1)增大时钟周期Tcycle,即降低时钟频率
2)减小 D->Q的传输延迟Tco,即更换更快的器件,使用更先进的器件库
3) 减小 Tcomb,即减小组合逻辑延时,主要是关键路径的处理。包括插入寄存器使其流水、重定时等。
4)增大时钟歪斜Tskew=Tclkb-Tclka。如果时钟歪斜 Tskew 为正,对setup是有利的,对hold是有害。
一般工程中选用第三种解决方案解决实际问题。
2.Hold Time Violation的解决方案
如果出现了Hold Time Violation,也就是说Tholdslack为负数了,那么可以考虑:
1)增加 Tcomb 延迟,增大数据的延迟具体表现为插入 Buffer,Xilinx 还提到可以插入 LUT1 增加延迟等方式来修复;
2)增大 Tcomb,即增大组合逻辑延时,主要是关键路径的处理。可以增加Buffer,或者后端布局布线拉长布线以增加延时。
3)减小时钟歪斜Tskew=Tclkb-Tclka。如果时钟歪斜 Tskew 为正,对setup是有利的,对hold是有害。
一般解决方案是在逻辑中加BUFF来解决保持时间不满足的情况。
时序约束
除此之外,解决建立时间保持时间的问题还涉及到时序约束,在同步时钟以及异步时钟之间有着不同的时序约束方案,详情可以参考另一篇博文https://blog.csdn.net/weixin_42370509/article/details/133280206?spm=1001.2014.3001.5501