目录
1.基础理论
时钟通过CLK PIN管脚输入,到达第一个寄存器的时钟端口经历的时延为Tclk1,到达第二个寄存器的线上时延为Tclk2。第一个寄存器从时钟进入时钟端口驱动寄存器到寄存器输出数据的延时为Tco,Tco为寄存器内部的时延。数据从第一个寄存器Q端口输出,经历Tdata延时到达第二个寄存器的数据输入端。Tdata可能包含路径上的延时以及引入的组合逻辑电路导致的延时。
时序图如下图所示:
图中,紫色区域为Tsu需要的时间,蓝色的区域为富余的建立时间(Tsu slack)。
(1)如果由于Tdata时间较长,使得Tsu slack为0,但Reg2的D输入口数据仍然比下个时钟上升沿提前Tsu时间到达,则Reg2 寄存器仍然能稳定的采集到输入数据“1”,如下图所示。
(2) 如果由于组合逻辑过于复杂使得Tdata时间过长,使得Tsu slack为负值,Reg2的D输入口数据比下个时钟上升沿提前到达的时间不足Tsu时长,则Reg2 寄存器不能稳定的采集到输入数据“1”,而是个亚稳态,如下图所示。
(3)时序计算公式
Tsu_slack = Tcycle + Tclk2 - Tsu - (Tclk1 + Tco + Tdata);
其中Tcycle为CLK一个时钟周期的时间。
最高时钟频率:Fmax=1/(Tcycle-Tsu_slack)
例:如果已知Tcycle为10ns(即工作时钟100MHz)、Tclk1为3ns、Tclk2为2ns、Tdata为3ns、Tsu为0.5ns、Tco为1ns,则求Tcu_slack为多少?并计算该电路最高能工作的时钟频率是多少?
答:通过套用上面的公式可得
Tsu_slack = 10 + 2 - 0.5 - (3 + 1 + 3) = 4.5 ns
如果想计算该电路最高能工作的时钟频率,则可以将Tsu_slack设为0,反求下Tcycle:
Tcycle = 0 - 2 + 0.5 + (3 + 1 + 3) = 5.5 ns (即181.8 MHz)
Fmax=1/(10-4.5)=181.MHz
2.建立时间
vivado工程实例很简单,工程的电路原理框图如下图所示:
电路功能为:在rx_data_valid信号拉高的情况下,对输入的数据总线rx_data_bus数据做了两次加法,最后通过tx_data_bus管脚输出。大家可以自行下载vivado工程,具体下载方法见文章末尾。
我们对该工程进行管脚约束和时钟约束,如下图所示:
图中时钟约束的含义是告诉vivado工具,rx_clk时钟的时钟频率为100MHz。vivado软件只有在知道工作时钟频率后,才能正确的布局布线以满足该电路工作的时序要求。
-> 先选择“Open Implemented Design”,打开布局布线后的工程;
-> 选择“Timing”选项卡,并展开“Intra-Clock Paths”;
由于我们的工程只有rx_clk时钟域,因此我们只用展开“rx_clk”时序报告,查看“Setup”报告(建立时间报告)。
如果工程复杂,路径过多,该窗口默认显示的路径并不全,如果没有找到我们想查看的路径,我们可以选择菜单上的“Reports -> Timing -> Report Timing Summary”
修改Maximum number of paths per clock or path_group至100(根据自己需要),点击“OK”按钮。
分析时序报告
比如图中的路径“Path7”,第一列的“Slack”指的是建立时间的松紧程度。该值为正值代表该路径的布线满足时序要求。“Levels”为1,代表数据路径上的组合逻辑为1级,“High Fanout”代表该路径的扇出为4。
双击路径“Path7”可以打开更详尽的时序报告,如下图所示。
① Source Clock Path
我们先来查看源时钟路径,图中用各个颜色表示了每行延时的具体含义。
根据上篇文章的学习可知,以上的延时总和为源时钟的路径延时,对应建立时间计算公式的Tclk1,即Tclk1 = 1.868ns。
我们也可以通过综合出 来的电路图来更直观的查看这些路径延时的由来,打开“SYNTHESIS -> Open Synthesized Design -> Schematic”。
图中用对应每行时序报告注释的颜色标出了对应延时路径的具体位置。
② Data Path
我们再来看数据路径时间。数据路径时间相对简单,主要由寄存器“buf_data_reg[0]”的内部延时Tco、走线的路径延时以及组合逻辑引入的延时组成。图中用不同颜色的注释已经标注出来。
走线的路径延时 + 组合逻辑引入的延时即为数据延时Tdata。同样的,我们通过在综合出来的电路图上,用每行时序报告注释的颜色标出了对应延时路径的具体位置。
图中buf_data_reg[0]的Q端口输出分别连至4个绿色框标出的器件,因此该路径的扇出为4。由于该数据路径上,从第一个寄存器到达第二个寄存器之间只经过了1个LUT器件,因此路径上的组合逻辑为1级。
③ Destination Clock Path
最后我们来看目的时钟路径。图中用各个颜色表示了每行延时的具体含义。
表中除掉蓝色的标注,其它所有颜色标注的延时总和为Tclk2。
表中还有“clock pessimism”时钟悲观值和“clock uncertainty”时钟抖动值,这些值的具体由来不在本文中做详述。表中最后一项FDCE(Setup_CFF_SLICEM_C_D)为寄存器“tx_data_bus_reg”寄存器需要的建立时间值(Tsu)。
同样的,我们通过在综合出来的电路图上,用每行时序报告注释的颜色标出了对应延时路径的具体位置。
建立时间的余量= 数据要求到达的时间 - 实际到达的时间
Setup Slack = Tcycle + Tclk2 - Tsu - ( Tclk1 + Tco + Tdata)
这样我们通过公式最终可计算出建立时间的slack值:
slack = Tcycle + Tclk2 - Tsu - (Tclk1 + Tco + Tdata)
= 10 + 1.806 - 0.025 – (1.868 + 0.078 + 0.332) = 9.553ns
或者:slack = 11.831-2.278=9.553ns
和时序报告计算出来的值吻合
3.保持时间
保持时间余量 = 数据实际到达时间 - 要求到达时间
Th_slack = Tcycle + Tclk1 + Tco + Tdata - Tcycle - Tclk2 - Th;
其中Tcycle为CLK一个时钟周期的时间。
例:如果已知Tcycle为10ns(即工作时钟100MHz)、Tclk1为3ns、Tclk2为2ns、Tdata为3ns、Th为0.5ns、Tco为1ns,则求Th_slack为多少?
答:通过套用上面的公式可得
Th_slack = 10 + 3 + 1 + 3 - 10 - 2 - 0.5 = 4.5 ns