Vivado时序分析概念setup time, hold time
reference
What is Setup and hold time in an FPGA?
Propagation delay in an FPGA or ASIC?
另外ug906的第五章介绍了时序分析的基础。最一开始介绍的就是timing path的概念,进而引出了时序分析的两个关键分析点setup slack analysis和hold slack analysis。
作为基础,本文的reference当中提到了setup time和hold time的概念:
setup time: Setup time is the amount of time required for the input to a Flip-Flop to be stable before a clock edge.
hold time: Hold time is the minimum amount of time required for the input to a Flip-Flop to be stable after a clock edge.
这里(t_{su})就是setup time,(t_h)就是那个hold time。setup time和hold time对于一个触发器来说是固定的参数。也就是说要完成一次正常的数据锁存,数据必须要在setup time和hold time的时候保持稳定。这里的setup time和hold time都是相对于输入来说的,一个触发器的输入来说的,也就是说上一个触发器的输出要在当前分析的触发器的时钟设置边沿前/后(setup/hold)保持稳定的时间。
在实际的电路当中一个触发器的运行周期必须满足:
这其中的(t_{co})是指一个触发器从接收时钟边沿开始到该触发器产生数据输出的时间间隔,如果两个相同的触发器级联,从上一级触发器的时钟边沿(launch edge)开始考虑,最小的时钟周期应该等于上一级的(t_{co})加上上一级与该级之间的传输时延(t_{comp}),再加上该级的(t_{su})。
这里只有(t_{comp})(传输延时)是可变的,与具体的电路结构设计有关。传输的延时越短,FPGA可运行的时钟速率就越高。
再来看xilinx当中的Setup/Recovery Relationship的概念。Xilinx说:
The setup check is performed only on the most pessimistic setup relationship between two clocks.
-ug906(v2016.4)P153
因为(dst的setup time)setup time是固定的,所以只要能保证在收发脉冲上升沿时间差值最短的时候保证没有问题,那么实际运行应该就不会出现问题。所以检查的是required_time - arrival_time。
即
Data Required Time(hold) =
capture edge time
+destination clock path delay
-clock uncertainty
-setup time
Data Arrival Time(hold) =
launch edge time
+source clock path delay
+datapath delay
省略了(t_{co})
Slack(setup) =
Data Required Time-Data Arrival Time
结合陈小硕的文章,可以看出setup slack实际上评估的是针对两级级联的触发器,下一级接收到的数据能否安全的设置。
在接收端dst的hold time也是固定的,如果在hold时间还没结束的时候下个数据就被推过来了。在当前传输的数据就有可能被覆盖掉。所以hold check检查的是arrival_time - required_time。
Data Required Time(hold) =
capture edge time
+destination clock path delay
-clock uncertainty
+hold time
Data Arrival Time(hold) =
launch edge time
+source clock path delay
+datapath delay
Slack(hold) =
Data Arrival Time-Data Required Time
本来hold分许也叫作Min delay analysis,可以这样理解如果把setup Slack的计算公式当做是一种标准型,那么我们就希望Min delay这个值负的越多越好。当然这里实际是反过来了,取了个相反数,那就是越大越好。
结合Xilinx给的公式结合陈小硕这个图来看我们能得到什么。
Slack(setup) = Tclkdiff - Tcomp - Tsetup - Tskew;
稳定条件(Tcomp包含Tco)也就是:
Tclkdiff始终未reg2的捕获时钟边沿与当前一个reg1的捕获时钟边沿时刻之差,顺序不可颠倒。
如果不考虑skew的影响的话,可得下式
Tclk >= Tcomp + Tsetup - Tclkdiff
如果是单个时钟的话可以以Tclk表示整个周期时长,而以Tclkdiff表示周期时长的模值(不满一个周期的多余部分)
Slack(hold) = - Tclkdiff +Tcomp - Thold + Tskew;
稳定条件(Tcomp包含Tco,而且这里的Tclkdiff可为负值,因为Tclkdiff始终未reg2的捕获时钟边沿与后一个reg1的捕获时钟边沿时刻之差,顺序不可颠倒)也就是
Tcomp >= Thold + Tclkdiff - Tskew
如果不考虑skew的影响的话,可得下式
Tcomp >= Thold + Tclkdiff
这里的Tclkdiff是指同一主时钟边沿下,后级与前级的触发器上边沿出现的时间差。Tskew是指时钟沿抖动相对理想位置的偏移。这与csdn这个文章给出的稳定性结果比较相近。
参见ug902 p153的两个解释setup和hold的例子。
最后给出一道例子作为分享:
若fclk1 = 2MHz,fclk2 = 3MHz,而且两时钟同相,DFF的保持时间thd = 2ns,建立时间tsu=4ns,Q1的tco = 1ns,请问tcomp必须满足什么条件才能保证电路正常工作?
这里根据上面推导出的等式:
Tcomp (le) t_mindiff - tsetup - tco
= 1000ns/6 - 4ns - 1ns
= 161.667ns (S2)
Tcomp (ge) thold + (0ns) - tco
= 2ns - 1ns
= 1ns (H1)
因而Tcomp应该满足上述条件