对于建立时间:
建立时间是指在时钟上升沿,数据在寄存器输入端数据要保持稳定的最小时间。即在时钟上升沿到达之前,数据至少要稳定多长时间。如果数据稳定的时间不满足建立时间,那么打入寄存器的数据就可能不正确,出现亚稳态现象。
以下图为例分析:
在clk1时刻,data1数据打入FF1,通过寄存器本身延迟Tcell和后面的组合逻辑的最大延时,成为data2数据。在clk2时刻,data2数据打入FF2,但是data2数据必须要在clk2时刻之前至少稳定Tsetup时间,这样才不会使打入的输入不正确,使得FF2输出为亚稳态。而clk1到clk2的时间为一个时钟周期,即Tperiod。
所以有上面的不等式:
Tsetup <= Tperiod – Tcell – Tlogic(longest)
这里为什么要用Tlogic(longest),因为这个组合逻辑的时间不是固定的,会根据输入的不同而延时不同,但是延时会介于最小延时和最大延时之间。但是在分析建立时间时,必须要用组合逻辑的最大延时,这样才会保证分析的建立时间是正确的。因为最大延时是电路发生最坏情况下,所会产生的延时。如果最坏情况下,建立时间满足,那整个电路不管在什么情况下,建立时间都会满足。
有了建立时间Tsetup的公式,但是怎么衡量我们的电路建立时间是否满足了。这个时候,就有一个参数来衡量,就是建立时间裕度。
就是图中的第二个公式。
Slack = Tperiod – Tlogic(longest) – Tcell – Tsetup
其实就是将第一个不等式的左边移到右边。如果slack大于0,说明建立时间是满足的,否则建立时间不满足。
以上分析,是认为时钟是没有偏移的。即到达FF1和FF2的时钟是同一时刻的。但是实际电路中,达到FF1和FF2的时钟是不同时的,即存在时钟延时。
如下图:
到达FF2的时钟要比到达FF1的时钟要延迟一个latency。这样分析,就与上面有点不一样的。可以这样考虑,因为clk2比clk1延迟一个latency,那就可以理解clk1到clk2时间比原来的Tperiod多了一个latency。所以公式就变为
Tsetup <= Tperiod + Tlatency – Tcell –Tlogic(longest)
即时钟延迟对建立时间其实是有改善的。因为增加了Tlatency的时间。
这时,那么建立时间裕度的公式就变为了
Slack = Tperiod + Tlatency – Tcell – Tlogic(longest)
如果为正的,说明建立时间时满足的,否则是不满足的。
其实,时钟延迟不一定是正的,也可能是负的。即clk2时钟比clk1时钟先达到。这种情况下,就用uncertainty来表示时钟的偏移。即uncertainty可能是正的,也可能是负的。不过分析的时候,是分析最坏的情况,即uncertainty为负的情况。因为一旦最坏情况下,建立时间是满足的话,那么不管什么情况下,那电路的建立时间是满足的。
如上图所示:
此时认为的Tuncertanity是负值。那就可以这么认为,clk1时钟到clk2时钟延迟一个Tuncertanity,那就可以理解clk1时钟到clk2时钟比原来的Tperiod少了一个Tuncertanity的时间。
那此时建立时间的公式就是:
Tsetup <= Tperiod – Tuncertainty – Tcell – Tlogic(longest)
可以看出,负的时钟延迟对建立时间是有削弱的,因为减少了Tuncertainty的时间。
这时,那么建立时间裕度的公式就变为了
Slack = Tperiod – Tuncertainty– Tcell – Tlogic(longest)
如果为正的,说明建立时间时满足的,否则是不满足的。
以上分析都是分析的是寄存器到寄存器,但是在输入端的时候,只有一个寄存器,此时的建立时间应该怎么分析了。
如上图,只有一个寄存器。
和之前分析的方法是一样的。只不过之前分析的Tcell,寄存器的输出延时换成了Tinput_delay而已。分析方法是一样。
结果就是上面两个公式了。。
了解了,建立时间,接下来就知道怎么去进行时序约束了。