好的,这是什么?
本页是另一篇帖子的示例部分,解释了 SDC 时序约束中 set_input_delay 和 set_output_delay 的含义。
根据其他帖子,以下示例背后的时序约束(timing constraints)是:
create_clock -name theclk -period 20 [get_ports test_clk] set_output_delay -clock theclk -max 8 [get_ports test_out] set_output_delay -clock theclk -min -3 [get_ports test_out] set_input_delay -clock theclk -max 4 [get_ports test_in] set_input_delay -clock theclk -min 2 [get_ports test_in]
set_input_delay -max (setup)解析
Slack (MET) : 15.664ns (required time - arrival time) Source: test_in (input port clocked by theclk {rise@0.000ns fall@10.000ns period=20.000ns}) Destination: test_samp_reg/D (rising edge-triggered cell FDRE clocked by theclk {rise@0.000ns fall@10.000ns period=20.000ns}) Path Group: theclk Path Type: Setup (Max at Fast Process Corner) Requirement: 20.000ns (theclk rise@20.000ns - theclk rise@0.000ns) Data Path Delay: 2.465ns (logic 0.291ns (11.797%) route 2.175ns (88.203%)) Logic Levels: 1 (IBUF=1) Input Delay: 4.000ns Clock Path Skew: 2.162ns (DCD - SCD + CPR) Destination Clock Delay (DCD): 2.162ns = ( 22.162 - 20.000 ) Source Clock Delay (SCD): 0.000ns Clock Pessimism Removal (CPR): 0.000ns Clock Uncertainty: 0.035ns ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE Total System Jitter (TSJ): 0.071ns Total Input Jitter (TIJ): 0.000ns Discrete Jitter (DJ): 0.000ns Phase Error (PE): 0.000ns Location Delay type Incr(ns) Path(ns) Netlist Resource(s) ------------------------------------------------------------------- ------------------- (clock theclk rise edge) 0.000 0.000 r input delay 4.000 4.000 AE20 0.000 4.000 r test_in (IN) net (fo=0) 0.000 4.000 test_in AE20 IBUF (Prop_ibuf_I_O) 0.291 4.291 r test_in_IBUF_inst/O net (fo=1, routed) 2.175 6.465 test_in_IBUF SLICE_X0Y1 FDRE r test_samp_reg/D ------------------------------------------------------------------- ------------------- (clock theclk rise edge) 20.000 20.000 r AE23 0.000 20.000 r test_clk (IN) net (fo=0) 0.000 20.000 test_clk AE23 IBUF (Prop_ibuf_I_O) 0.077 20.077 r test_clk_IBUF_inst/O net (fo=1, routed) 1.278 21.355 test_clk_IBUF BUFGCTRL_X0Y4 BUFG (Prop_bufg_I_O) 0.026 21.381 r test_clk_IBUF_BUFG_inst/O net (fo=2, routed) 0.781 22.162 test_clk_IBUF_BUFG SLICE_X0Y1 FDRE r test_samp_reg/C clock pessimism 0.000 22.162 clock uncertainty -0.035 22.126 SLICE_X0Y1 FDRE (Setup_fdre_C_D) 0.003 22.129 test_samp_reg ------------------------------------------------------------------- required time 22.129 arrival time -6.465 ------------------------------------------------------------------- slack 15.664
该分析从时间零开始。然后它添加在 max input delay 约束中指定的 4 ns (clock-to-output),并继续该数据路径(data path)。逻辑单元(logic elements)的时延(delays)使用的值是 process、电压和温度的最快组合值。加上 FPGA自己的数据路径时延(data path delay)(2.465 ns),总的数据路径时延为 6.465 ns。
然后计算时钟路径(clock path),从后面的时钟到 20 ns开始。再一次,时延的值是从可能的最快组合中选择的。时钟从输入引脚移动到触发器(flip-flop)(对时钟 network delay(clock network delay)没有补偿,因为不涉及锁相环(PLL))。此计算还考虑了估计的抖动(jitter)(凭借“时钟 uncertainty(clock uncertainty)”)。总而言之,时钟路径结束于 22.129 ns,也就是数据(data)到触发器之后的 15.664 ns 。这是约束(constraint)的 slack。
该分析表明, set_input_delay -max 约束上放置的数量是驱动输入引脚的外部设备的最大 clock-to-output (+ 板的 trace 时延)。之所以得出这个结论,是因为数据路径是以数字作为起始时间。注意上面路径 Type (Path Type)中的“Max”部分。
set_input_delay -min (hold)解析
Min Delay Paths -------------------------------------------------------------------------------------- Slack (VIOLATED) : -0.045ns (arrival time - required time) Source: test_in (input port clocked by theclk {rise@0.000ns fall@10.000ns period=20.000ns}) Destination: test_samp_reg/D (rising edge-triggered cell FDRE clocked by theclk {rise@0.000ns fall@10.000ns period=20.000ns}) Path Group: theclk Path Type: Hold (Min at Slow Process Corner) Requirement: 0.000ns (theclk rise@0.000ns - theclk rise@0.000ns) Data Path Delay: 3.443ns (logic 0.626ns (18.194%) route 2.817ns (81.806%)) Logic Levels: 1 (IBUF=1) Input Delay: 2.000ns Clock Path Skew: 5.351ns (DCD - SCD - CPR) Destination Clock Delay (DCD): 5.351ns Source Clock Delay (SCD): 0.000ns Clock Pessimism Removal (CPR): -0.000ns Clock Uncertainty: 0.035ns ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE Total System Jitter (TSJ): 0.071ns Total Input Jitter (TIJ): 0.000ns Discrete Jitter (DJ): 0.000ns Phase Error (PE): 0.000ns Location Delay type Incr(ns) Path(ns) Netlist Resource(s) ------------------------------------------------------------------- ------------------- (clock theclk rise edge) 0.000 0.000 r input delay 2.000 2.000 AE20 0.000 2.000 r test_in (IN) net (fo=0) 0.000 2.000 test_in AE20 IBUF (Prop_ibuf_I_O) 0.626 2.626 r test_in_IBUF_inst/O net (fo=1, routed) 2.817 5.443 test_in_IBUF SLICE_X0Y1 FDRE r test_samp_reg/D ------------------------------------------------------------------- ------------------- (clock theclk rise edge) 0.000 0.000 r AE23 0.000 0.000 r test_clk (IN) net (fo=0) 0.000 0.000 test_clk AE23 IBUF (Prop_ibuf_I_O) 0.734 0.734 r test_clk_IBUF_inst/O net (fo=1, routed) 2.651 3.385 test_clk_IBUF BUFGCTRL_X0Y4 BUFG (Prop_bufg_I_O) 0.093 3.478 r test_clk_IBUF_BUFG_inst/O net (fo=2, routed) 1.873 5.351 test_clk_IBUF_BUFG SLICE_X0Y1 FDRE r test_samp_reg/C clock pessimism 0.000 5.351 clock uncertainty 0.035 5.387 SLICE_X0Y1 FDRE (Hold_fdre_C_D) 0.101 5.488 test_samp_reg ------------------------------------------------------------------- required time -5.488 arrival time 5.443 ------------------------------------------------------------------- slack -0.045
该分析从时间零开始。然后它添加在 min input delay 约束中指定的 2 ns (clock-to-output),并继续数据路径。逻辑单元的时延使用的值是 process、电压和温度的最慢组合的值。加上 FPGA自己的数据路径时延(3.443 ns),数据路径时延的总和为 5.443 ns。与上面的快速分析相比, FPGA自己的时延更大应该不足为奇。
然后计算时钟路径,现在使用最慢的组合。此计算从 0 ns处的相同时钟边沿(clock edge)开始。毕竟这是 hold 时序的计算,所以问题是触发器的输入上的数据在采样之前是否没有变化。
时钟从输入引脚移动到触发器(对时钟 network delay没有补偿,因为不涉及锁相环)。此计算还考虑了估计的抖动(凭借“时钟 uncertainty”)。请注意,它与 setup的计算值相同,但符号相反。它是相同的抖动,但最坏的情况是相反的方向。
总而言之,时钟路径以 5.488 ns结束,这是 0.045 ns 为时已晚(数据更改为 5.443 ns)。所以约束被违反了, 0.045 ns的 negative slack 。
该分析表明, set_input_delay -min 约束上要安装的数字是驱动输入引脚的外部设备的最小 clock-to-output 。之所以得出这个结论,是因为这个数字是作为数据路径的启动时间。注意上面路径 Type 中的“Min”部分。
令人惊讶的是, 2 ns 的最小 clock-to-output 可能会违反 hold 约束。这不应该掉以轻心——就像任何违反的时序约束一样,如果忽略它可能会导致真正的问题。
这种情况的解决方案是在时钟路径上添加一个锁相环(PLL),将全局 network(global network)的时钟锁定到输入时钟。这实际上意味着提前几纳秒拉动它,这绝对解决了问题。
set_output_delay -max (setup)解析
Slack (MET) : 2.983ns (required time - arrival time) Source: test_out_reg/C (rising edge-triggered cell FDRE clocked by theclk {rise@0.000ns fall@10.000ns period=20.000ns}) Destination: test_out (output port clocked by theclk {rise@0.000ns fall@10.000ns period=20.000ns}) Path Group: theclk Path Type: Max at Slow Process Corner Requirement: 20.000ns (theclk rise@20.000ns - theclk rise@0.000ns) Data Path Delay: 3.631ns (logic 2.583ns (71.152%) route 1.047ns (28.848%)) Logic Levels: 1 (OBUF=1) Output Delay: 8.000ns Clock Path Skew: -5.351ns (DCD - SCD + CPR) Destination Clock Delay (DCD): 0.000ns = ( 20.000 - 20.000 ) Source Clock Delay (SCD): 5.351ns Clock Pessimism Removal (CPR): 0.000ns Clock Uncertainty: 0.035ns ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE Total System Jitter (TSJ): 0.071ns Total Input Jitter (TIJ): 0.000ns Discrete Jitter (DJ): 0.000ns Phase Error (PE): 0.000ns Location Delay type Incr(ns) Path(ns) Netlist Resource(s) ------------------------------------------------------------------- ------------------- (clock theclk rise edge) 0.000 0.000 r AE23 0.000 0.000 r test_clk (IN) net (fo=0) 0.000 0.000 test_clk AE23 IBUF (Prop_ibuf_I_O) 0.734 0.734 r test_clk_IBUF_inst/O net (fo=1, routed) 2.651 3.385 test_clk_IBUF BUFGCTRL_X0Y4 BUFG (Prop_bufg_I_O) 0.093 3.478 r test_clk_IBUF_BUFG_inst/O net (fo=2, routed) 1.873 5.351 test_clk_IBUF_BUFG SLICE_X0Y1 FDRE r test_out_reg/C ------------------------------------------------------------------- ------------------- SLICE_X0Y1 FDRE (Prop_fdre_C_Q) 0.223 5.574 r test_out_reg/Q net (fo=1, routed) 1.047 6.622 test_out_OBUF AK21 OBUF (Prop_obuf_I_O) 2.360 8.982 r test_out_OBUF_inst/O net (fo=0) 0.000 8.982 test_out AK21 r test_out (OUT) ------------------------------------------------------------------- ------------------- (clock theclk rise edge) 20.000 20.000 r clock pessimism 0.000 20.000 clock uncertainty -0.035 19.965 output delay -8.000 11.965 ------------------------------------------------------------------- required time 11.965 arrival time -8.982 ------------------------------------------------------------------- slack 2.983
由于此分析的目的是测量输出时延(output delay),因此它从时钟边沿开始,然后沿着触发器,然后沿着数据路径。总和为时延,结果是 8.982 ns。
请注意,“路径 Type”并不是说它是 setup 的计算(为了避免混淆?),即使它考虑了以下时钟(at 20 ns)(而不是时钟,在 0 ns).
计算以 process、电压和温度的最慢组合进行(回想一下,输入 setup (input setup)计算以最快的组合进行)。时钟路径与时钟路径的分析输入时延(input delay)的 hold 时序非常相似。这是意料之中的,因为这两个计算都是基于慢速 model。
总的时延与后面的时钟在 20 ns的时间相比较,减去 set_output_delay给出的值。减去估计的抖动(在上述情况下为0.035 ns )。
总而言之,数据在 8.982 ns达到稳定的逻辑状态,它必须稳定的时间大约是 12 ns,所以 slack 几乎是 3 ns。
这说明了为什么与 set_output_delay -max 一起使用的编号应该是为外部设备的输入指定的 setup time 。通过计算输出(output)处的总时延与有效数据与后续时钟的时间位置之间的差异来验证此时序约束。这种差异是要达到的目标。这正是 setup time的定义: 数据在下一个时钟之前必须稳定多长时间。
set_output_delay -min (hold)解析
Slack (MET) : 0.791ns (arrival time - required time) Source: test_out_reg/C (rising edge-triggered cell FDRE clocked by theclk {rise@0.000ns fall@10.000ns period=20.000ns}) Destination: test_out (output port clocked by theclk {rise@0.000ns fall@10.000ns period=20.000ns}) Path Group: theclk Path Type: Min at Fast Process Corner Requirement: 0.000ns (theclk rise@0.000ns - theclk rise@0.000ns) Data Path Delay: 1.665ns (logic 1.384ns (83.159%) route 0.280ns (16.841%)) Logic Levels: 1 (OBUF=1) Output Delay: -3.000ns Clock Path Skew: -2.162ns (DCD - SCD - CPR) Destination Clock Delay (DCD): 0.000ns Source Clock Delay (SCD): 2.162ns Clock Pessimism Removal (CPR): -0.000ns Clock Uncertainty: 0.035ns ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE Total System Jitter (TSJ): 0.071ns Total Input Jitter (TIJ): 0.000ns Discrete Jitter (DJ): 0.000ns Phase Error (PE): 0.000ns Location Delay type Incr(ns) Path(ns) Netlist Resource(s) ------------------------------------------------------------------- ------------------- (clock theclk rise edge) 0.000 0.000 r AE23 0.000 0.000 r test_clk (IN) net (fo=0) 0.000 0.000 test_clk AE23 IBUF (Prop_ibuf_I_O) 0.077 0.077 r test_clk_IBUF_inst/O net (fo=1, routed) 1.278 1.355 test_clk_IBUF BUFGCTRL_X0Y4 BUFG (Prop_bufg_I_O) 0.026 1.381 r test_clk_IBUF_BUFG_inst/O net (fo=2, routed) 0.781 2.162 test_clk_IBUF_BUFG SLICE_X0Y1 FDRE r test_out_reg/C ------------------------------------------------------------------- ------------------- SLICE_X0Y1 FDRE (Prop_fdre_C_Q) 0.100 2.262 r test_out_reg/Q net (fo=1, routed) 0.280 2.542 test_out_OBUF AK21 OBUF (Prop_obuf_I_O) 1.284 3.826 r test_out_OBUF_inst/O net (fo=0) 0.000 3.826 test_out AK21 r test_out (OUT) ------------------------------------------------------------------- ------------------- (clock theclk rise edge) 0.000 0.000 r clock pessimism 0.000 0.000 clock uncertainty 0.035 0.035 output delay 3.000 3.035 ------------------------------------------------------------------- required time -3.035 arrival time 3.826 ------------------------------------------------------------------- slack 0.791
此分析类似于 max output 时延,只是它是针对相同的时钟边沿(而不是下一个)计算的。此外,计算是根据 process、电压和温度的最快组合进行的。
与之前类似,时钟路径与输入时延的分析 setup 时序的时钟路径非常相似。这是意料之中的,因为这两个计算都是基于快速 model。
与 set_output_delay -max的计算一样,数据路径继续时钟路径直到输出稳定。这是计算发生在 3.826 ns (注意与慢 model的区别)。
这是在 0 ns上与相同时钟的时间进行比较,减去输出时延。回想一下时序约束中的 min output 时延是负数 (-3 ns),这就是它在计算中显示为正数的原因。
还添加了估计的抖动、 0.035 ns(我不太明白为什么在此计算中使用抖动,因为它在同一个时钟周期(clock cycle)上)。
结论: 数据稳定到 3.826 ns,需要稳定到 3.035 ns。没关系, 0.791 ns 就是 slack。
这说明了为什么与 set_output_delay -min 一起使用的数字是 hold time,它是为外部设备的输入指定的,符号相反。此时序约束通过要求总时延大于此给定数字来验证。换句话说,数据必须在时钟之后的很长时间内保持稳定。这是 hold time的定义。