[X]关闭
 专注集成电路FPGA应用生态推广
 微信公众号
扫码关注
米联客uisrc 首页 技术类 随心笔记 查看内容
5

米联客(MSXBO)基于VIVADO FPGA时序笔记之I/O约束(三)

摘要: 1.1概述I/O约束主要是关于设置IO delay的延迟,以便让VIVADO IDE工具可以知道延迟参数去优化布局布线的路径,当布局布线后的路径无法满足设置的IO delay要求时,就会报告时序错误。对于满足时序要求的设计,就是建立 ...

.1概述

I/O约束主要是关于设置IO delay的延迟,以便让VIVADO IDE工具可以知道延迟参数去优化布局布线的路径,当布局布线后的路径无法满足设置的IO delay要求时,就会报告时序错误。对于满足时序要求的设计,就是建立时间(Setup)和保持时间(Hold)都要满足要求。所以正确设置,时序约束,也会提高VIVADO IDE的编译速度,错误的时序约束可能会导致VIVADO IDE穷尽一些办法无法完成布局布线,而导致编译时间太长。另外请注意,程序能够正确运行,取决于正确的代码设计和正确的时序约束,而不是依靠时序报告,时序报告只是代表告知VIVADO IDE编译器的时序条件,在布局布线后满足要求。

本文主要参考了官方文档“ug903-vivado-using-constraints.pdf”和” ug906-vivado-design-analysis.pdf”,结合官方文档,2篇内容里面的重点内容,整理成学习笔记。

 

1.2 Setup/Hold 时序分析

上图是一个的典型时序路径示意图,时序分析需要注意以下3条路径:

1)、源时钟路径

2)、数据路径

3)、目的时钟路径

         在进行时序分析之前,需要了解时序分析的一些基本概念,如时钟抖动、时钟偏斜(Tskew)、建立时间(Tsu)、保持时间(Thd)等。时序分析也就是分析每一个触发器(寄存器)是否满足建立时间/保持时间,而时序的设计的实质就是满足每一个触发器的建立时间/保持时间的要求。

        

1.2.1时钟抖动

  时钟信号边沿变化的不确定时间称为时钟抖动,一般情况下的时序分析是不考虑时钟抖动,如果考虑时钟抖动,则建立时间应该是Tsu+T1,保持时间应该是Thd+T2。

1.2.2时钟偏斜

  时钟的分析起点是源寄存器(RegA),终点是目标寄存器(RegB)。时钟在图中的结构中传输也会有延迟,时钟信号从时钟源传输到源寄存器的延时为TsrcClk,传输到目标寄存器的延时为TdestClk。时钟网络的延时为TsrcClk与TdestClk之差,即Tskew=TdestClk-TsrcClk。

1.2.3 建立时间和保持时间

建立时间(Setup Time):在capture上升沿到来之前,数据需要保持稳定不变的时间,如果建立时间不满足,数据不能在capture沿打入触发器;

保持时间(Hold Time):在capture上升沿到来后,数据需要保持不变的时间,如果保持时间不够,数据同样不能打入触发器。


 

1.2.4发送沿和捕获沿

  (1)发送沿(Launch Edge):发送数据对应的时钟沿,是时序分析的起点;

  (2)捕获沿(Capture Edge):捕获数据对应的时钟沿,是时序分析的终点,相对于launch Edge通常为一个时钟周期,但不绝对,如多周期。

1.2.5时序裕度Slack(Setup)

Data Arrival Time(setup)

Data Arrival Time(setup) = launch edge +TsrcClk + TcKo + Tdata 

如上图所示,Data Arrival Time为从源时钟的Launch edge开始,经过Tsrcclk延迟、Tcko延迟、Tdata数据延迟的总和;

Data Required Time (Setup) = capture edge + TdestClk -Tsu

Data Required Time(建立时间要求):为能让数据打入寄存器,数据准备好的最晚时间点。所以从Clock Arrival Time 减去Tsu ,即为Data Required Time (setup)。

 

Slack(setup)= Data Required Time (Setup)- Data Arrival Time(Setup)

          = capture edge + TdestClk -Tsu –(launch edge +TsrcClk + TcKo + Tdata )

为了更直观的得到结果,假设时钟延迟TdestClk= TsrcClk,launch edge时刻为0时刻,capture edge时刻为周期T时刻。重新整理公式后得到:

Slack(setup)= Data Required Time (Setup)- Data Arrival Time(Setup)

          = T-Tsu-Tcko-Tdata

Slack(setup)为正表示时序满足要求,通过计算公式也再次证明,如果Tcko和Tdata延迟变大,建立时间Slack (setup)裕度越小,反之越大。

1.2.6时序裕度Stack(Hold)

Data Arrival Time = launch edge +TsrcClk + TcKo + Tdata 

如下图所示,Data Arrival Time为从源时钟的Next Launch edge开始,经过Tsrcclk延迟、Tcko延迟、Tdata数据延迟的总和,这里分析的时候一定注意,是Next Launch edge开始的

 

Data Required Time (hold)= capture edge + TdestClk+Thd 

Data Required Time (保持时间要求)为能让数据打入寄存器,数据至少要保持到的时间点,是capture edge、TdestClk和Thd的总和。在Next Launch edge下一个数据打出来前,当前数据需要保持的时间。

 

Slack(hold)的计算:

Slack(hold)= Data Arrival Time(hold) -Data Required Time (hold)

          = launch edge +TsrcClk + TcKo + Tdata -(capture edge + TdestClk+Thd)

为了简化分析,假设时钟的延迟TsrcClk=TdestClk,另外capture edge 和 Next Launch edge是同一个上升沿,重新计算公式:

Slack(hold)= Data Required Time (Setup)- Data Arrival Time(hold)

          = launch edge +TsrcClk + TcKo + Tdata -(capture edge + TdestClk+Thd)

                     = TcKo + Tdata - Thd

Slack(hold)为正表示时序满足要求,通过计算公式也再次证明,如果Tcko和Tdata延迟变大,建立时间Stack (hold)裕度越大,反之越小。

 

1.3Input Delay类型和约束

从系统级设计方式来讲可分为系统同步和源同步两种,但是他们的约束结果都是一样的,选取那种方法可以根据习惯和方便性选择,下面我们分别介绍这两种方法。

 

1.3.1 Input Delay系统同步输入(System Synchronous)

以FPGA 做接收侧来举例,上游器件仅仅传递数据信号到 FPGA 中,时钟信号则完全依靠系统板级来同步。采用这种方式需要考虑板级时钟的延迟、时钟的skew、数据的延迟三重因素,使用起来相对来说比较麻烦,设计的速度无法达到最大,大部分情况仅应用于SDR 方式。

 

下面的例子中,涉及到tco延迟参数的和tcko是一致的,请注意。

1)、SDR上升沿同步输入(SDR Rising Edge System Synchronous Inputs)

对系统同步接口做 Input 约束相对容易,只需要考虑上游器件的 Tcko 和数据在板级的延时即可。下图是一个 SDR 上升沿采样系统同步接口的 Input 约束示例。

计算公式如下:

set_input_delay -clock $input_clock -max [expr $tco_max + $trce_dly_max] [get_ports $input_ports];

set_input_delay -clock $input_clock -min [expr $tco_min + $trce_dly_min] [get_ports $input_ports];

 

举例:

时钟周期:T=10ns

触发器最小延迟:Tco(mini)=1ns

触发器最大延迟:Tco(max)=2ns

走线最小延迟:Ttrace(mini)=0.3ns

走线最大延迟:Ttrace(max)=0.4ns

输入延迟的input delay时序约束如下:

Create_clock –name sysclk –period 10 [get_ports clk]

Set_input_delay –clock sysclk –max 2.4 [get_ports din]

Set_input_delay –clock sysclk –min 1.3 [get_ports din]

 

2)、SDR 下降沿同步输入(SDR Falling Edge System Synchronous Inputs)

计算公式:

set_input_delay -clock $input_clock -max [expr $tco_max + $trce_dly_max] [get_ports $input_ports] -clock_fall;

set_input_delay -clock $input_clock -min [expr $tco_min + $trce_dly_min] [get_ports $input_ports] -clock_fall;

举例:

时钟周期:T=10ns

触发器最小延迟:Tco(mini)=1.5ns

触发器最大延迟:Tco(max)=2ns

走线最小延迟:Ttrace(mini)=0.3ns

走线最大延迟:Ttrace(max)=0.4ns

输入延迟的input delay时序约束如下:

Create_clock –name sysclk –period 10 [get_ports clk]

Set_input_delay –clock sysclk –max 2.4 [get_ports din] -clock_fall;

Set_input_delay –clock sysclk –min 1.8 [get_ports din] -clock_fall;

 

3)、DDR系统同步输入(DDR System Synchronous Inputs)

计算公式如下:

# Input Delay Constraint

set_input_delay -clock $input_clock -max [expr $trco_max + $trce_dly_max] [get_ports $input_ports];

set_input_delay -clock $input_clock -min [expr $trco_min + $trce_dly_min] [get_ports $input_ports];

set_input_delay -clock $input_clock -max [expr $tfco_max + $trce_dly_max] [get_ports $input_ports] -clock_fall -add_delay;

set_input_delay -clock $input_clock -min [expr $tfco_min + $trce_dly_min] [get_ports $input_ports] -clock_fall -add_delay;

 

举例:

时钟周期:T=10ns

上升沿触发器最大延迟:Trco(mini)=1ns

上升沿触发器最小延迟:Trco(max)=2ns

下降沿触发器最大延迟:Trco(mini)=1.5ns

下降沿触发器最小延迟:Trco(max)=2ns

走线最小延迟:Ttrace(mini)=0.3ns

走线最大延迟:Ttrace(max)=0.4ns

输入延迟的input delay时序约束如下:

Create_clock –name sysclk –period 10 [get_ports clk]

Set_input_delay –clock sysclk –max 2.4 [get_ports din]

Set_input_delay –clock sysclk –min 1.3 [get_ports din]

Set_input_delay –clock sysclk –max 2.4 [get_ports din] -clock_fall;

Set_input_delay –clock sysclk –min 1.8 [get_ports din] -clock_fall;

 

1.3.2 Input源同步接口(Source Synchronous Interface)

   源同步方式是告知Thd 和Tsu的时间参数,然后FPGA时序设计上根据这两个参数设置约束条件,和系统同步方式相比,采用源同步的方式,可以让时序约束更加简化,但是要求采用源同步的器件具备在发送端就能把数据同步,并且提供Thd 和Tsu的时间参数。

数据的传输方式包括了SDR、DDR、中心对齐(Center Aligned)和边沿对齐(Edge Aligned)等多种方式。

至于采用系统同步还是源同步的方式根据实际情况而定,如果接口给出的是Tcko延迟那么就用系统同步方便,如果接口给出的是Thd和Tsu那就是系统同步方便。不论以何种方式来设置 Input 约束,作用是一样,时序报告的结果也应该是一致的。

1)、SDR源同步中心对齐上升沿(Center-Aligned Rising Edge Source Synchronous Inputs)

上图中的dv_bre代表了上游发送器件上升沿前的有效数据窗口和上升沿后的有效数据窗口。

计算公式:

set_input_delay -clock $input_clock -max [expr $input_clock_period - $dv_bre] [get_ports $input_ports];

set_input_delay -clock $input_clock -min $dv_are                        [get_ports $input_ports];

可以看到-max为时钟周期减去dv_bre;-min为dv_are

针对上图所示中心对齐源同步 SDR 接口时序,分别按照两种方式来约束,需要的已知条件和计算方式虽然不同,但却可以得到完全一样的结果。

以系统同步模式举例:

系统周期:T=10ns

触发器最小延迟:Tco(mini)=1.5ns

触发器最大延迟:Tco(max)=2ns

走线最小延迟:Ttrace(mini)=0.3ns

走线最大延迟:Ttrace(max)=0.4ns

Set_input_delay –clock sysclk –max 2.4 [get_ports din]

Set_input_delay –clock sysclk –min 1.3 [get_ports din]

 

以源同步模式举例:

系统周期:T=10ns

dv_dre = 7.6ns

dv_are = 1.3ns

Set_input_delay –clock sysclk –max 2.4 [get_ports din]

Set_input_delay –clock sysclk –min 1.3 [get_ports din]

可以看到以系统同步和源同步的方式效果是一样的,源同步的方式由于上游器件可以确保数据的同步,一般器件厂商会在datasheet里面给出这些阐述的,而参数很可能会以最小建立时间。

 

dv_dre其实就是我们所说的最小建立时间 Tsu-min

dv_are 其实就是我们所说的最小保持时间 Thd-min

满足最小建立,最小保持时间,数据才能被正确采样。

 

2)、SDR源同步中心对齐下降沿(Center-Aligned Rising Edge Source Synchronous Inputs)

 

计算公式如下:

set_input_delay -clock $input_clock -max [expr $input_clock_period - $dv_bfe] [get_ports $input_ports] -clock_fall;

set_input_delay -clock $input_clock -min $dv_afe                         [get_ports $input_ports] -clock_fall;

源中心对齐下降沿和上升沿没什么差异,不在举例说明。

 

3)、Input源同步DDR 中心对齐约束(Center-Aligned Falling Edge Source Synchronous Inputs)

计算公式如下:

set_input_delay -clock $input_clock -max [expr $input_clock_period/2 - $dv_bfe] [get_ports $input_ports];

set_input_delay -clock $input_clock -min $dv_are                          [get_ports $input_ports];

set_input_delay -clock $input_clock -max [expr $input_clock_period/2 - $dv_bre] [get_ports $input_ports] -clock_fall -add_delay;

set_input_delay -clock $input_clock -min $dv_afe                          [get_ports $input_ports] -clock_fall -add_delay;

 

DDR方式下数据数据的发送沿又是采样沿。实际的采样周期是时钟周期的一半;上升沿采样的数据(Rise Data)的 -max 是采样周期减去这个数据的发送沿(下降沿)之前的数据有效窗口值 dv_bfe,而对应的-min 就应该是上升沿之后的数据有效窗口值dv_are ;同理,下降沿采样的数据(Fall Data)的 -max 应该是采样周期减去这个数据的发送沿(上升沿)之前的数据有效窗口值 dv_bre,而对应的-min 就应该是下降沿之后的数据有效窗口值 dv_afe 。

举例:

T= 10ns, dv_bre = 2ns , dv_are= 2ns , dv_bfe = 2.5ns , dv_afe= 2ns

 

Create_clock –name  sysclk –period      10  [get_ports clk]

set_input_delay -clock sysclk  –max    7.5            [get_ports din]

set_input_delay -clock sysclk  –min    2    [get_ports din]

set_input_delay -clock sysclk  –max    8   [get_ports din] -clock_fall -add_delay

set_input_delay -clock sysclk  –min    2    [get_ports din] -clock_fall -add_delay

4)、input源同步使用MMCM/PLL SDR上升沿对齐(Rising Edge Source Synchronous Inputs Using MMCM/PLL)

公式如下:

set_input_delay -clock $input_clock -max $skew_are  [get_ports $input_ports];

set_input_delay -clock $input_clock -min -$skew_bre [get_ports $input_ports];

举例:

T= 10ns, skew_bre = 2ns , dv_are= 3ns

Create_clock –name  sysclk –period      10  [get_ports clk]

set_input_delay -clock sysclk -max 3  [get_ports din];

set_input_delay -clock sysclk -min -2  [get_ports din];

发送端经过MMCM/PLL调整后,数据早于时钟1个周期并且边沿对齐,所以在采样沿之前的数据延迟为负数,代表数据早于采样沿,而采样沿之后的数据为正代表数据晚于采样沿。

 

5)、input源同步使用MMCM/PLL SDR下降沿(Falling Edge Source Synchronous Inputs Using MMCM/PLL)

计算公式:

set_input_delay -clock $input_clock -max $skew_afe  [get_ports $input_ports] -clock_fall;

set_input_delay -clock $input_clock -min -$skew_bfe [get_ports $input_ports] -clock_fall;

下降沿的计算和上升沿一样,所以不在重复举例。

 

6)、input源同步使用MMCM/PLL DDR边沿对齐

计算公式:

set_input_delay -clock $input_clock -max $skew_are      [get_ports $input_ports];

set_input_delay -clock $input_clock -min -$skew_bre      [get_ports $input_ports];

set_input_delay -clock $input_clock -max $skew_afe      [get_ports $input_ports] -clock_fall -add_delay;

set_input_delay -clock $input_clock -min -$skew_bfe      [get_ports $input_ports] -clock_fall -add_delay;

 

举例:T= 10ns, skew_bre = 2ns , dv_are= 3ns ,skew_bfe = 2.5ns , dv_are= 2ns

Create_clock –name  sysclk  –period   10             [get_ports sysclk]

set_input_delay -clock sysclk  -max 3                    [get_ports din];

set_input_delay -clock sysclk  -min -2         [get_ports din];

set_input_delay -clock sysclk  -max 2          [get_ports din] -clock_fall -add_delay;

set_input_delay -clock sysclk  -min -2.5        [get_ports din] -clock_fall -add_delay;

 

上升沿的 -max 是上升沿之后的数据 skew (skew_are ),对应的-min 就应该是负的上升沿之前的数据 skew (skew_bre );

下降沿的 -max 是下降沿之后的数据 skew (skew_afe ),对应的-min 就应该是负的下降沿之前的数据 skew (skew_bfe )。

负值并不代表延时真的为负,而是跟数据相对于时钟沿的方向有关。请一定牢记 set_input_delay 中 -max/-min 的定义,即时钟采样沿到达之后最大与最小的数据有效窗口(set_output_delay 中 -max/-min 的定义与之正好相反,)。由于jitter和skew 的存在,最差情况下,数据有效窗口在到达时钟采样沿之前就已经结束,所以会有负数出现在-min 之后。

大家会有个疑问,采用边沿对齐的方式,这样FPGA不是无法正确采集到数据了吗?对,如果直接采样肯定没法正确采集数据,所以我们一般会用到MMCM/PLL对数据进行相位调整,把边沿对齐变成中心对齐。

另外,在经过 MMCM/PLL 相移后的采样时钟跟同步接口输入的时钟之间需要做set_false_path 的约束(如下述例子)而把那些伪路径从时序报告中剔除,这里不再详述。如我们的纯FPGA的以太网UDP协议中有这样一段约束。

 

set_false_path -fall_from $tx_clk -rise_to [get_clocks phy_tx_clk] –setup

set_false_path -rise_from $tx_clk -fall_to [get_clocks phy_tx_clk] –setup

set_false_path -fall_from $tx_clk -fall_to [get_clocks phy_tx_clk] –hold

set_false_path -rise_from $tx_clk -rise_to [get_clocks phy_tx_clk] -hold

1.4 output 接口类型和约束

         和input IO时序约束类似,Output IO约束是考虑下游device的时序模型。另外在源同步接口中,需要使用set_generated_clock 先定义送出的随路时钟。和input时序分析类似,output 约束也系统同步和源同步时序分析,其中源同步时序又可以采取Setup/Hold Based Method 和Skew Based Method,我们下面会对这些方法做介绍。

 

1.4.1 output系统同步接口(System Synchronous Outputs)

         

如上图所示,对于output delay FPGA变成了上游设备,而Device变成了下游设备,需要根据Device的时序参数设置正确的时序约束,告知VIVADO IDE。现在下游设备不是FPGA了,而是device了,大家要把视角切换过来,否作下面介绍的时序约束会有理解错误的。

1)、output系统同步SDR接口上升沿对齐(Rising Edge System Synchronous Outputs

对于系统同步接口,和input类似,计算公式:

set_output_delay -clock $destination_clock -max [expr $trce_dly_max + $tsu] [get_ports $output_ports];

set_output_delay -clock $destination_clock -min [expr $trce_dly_min - $thd] [get_ports $output_ports];

即:

-max 为最大走线延迟(trce_dly_max)+建立时间(Tsu)

-mini 为最小走线延迟(trce_dly_min)-保持时间(Ttd)  -mini为负值代表数据在采样延后

举例:

时钟周期:T=10ns

下游Device建立时间:Tsu =1ns

下游Device保持时间:Thd=2ns

走线最小延迟:Ttrace(mini)=0.3ns

走线最大延迟:Ttrace(max)=0.4ns

输入延迟的input delay时序约束如下:

Create_clock –name sysclk –period 10 [get_ports clk]

#以下定义了一个虚拟时钟

Create_clock –name virtual_clk –period 10

Set_output_delay –clock virtual_clk –max 2.4 [get_ports dout]

Set_output_delay –clock virtual_clk –min -0.7 [get_ports dout]

         这里我定义了一个虚拟时钟,虚拟时钟和FPGA的发送时钟同频同相位,有利于简化时钟的分析。当然如果这个时钟是和FPGA的发送时钟是同一个时钟,我们也可以用发送时钟作为参考的。

从output delay 约束分析开始,如果非特别说明下游设备就是指的Device外设

 

2)、output系统同步SDR接口下降沿对齐(#Falling Edge System Synchronous Outputs

计算公式:

set_output_delay -clock $destination_clock -max [expr $trce_dly_max + $tsu] [get_ports $output_ports] -clock_fall;

set_output_delay -clock $destination_clock -min [expr $trce_dly_min - $thd] [get_ports $output_ports] -clock_fall;

由于下降沿和上升沿一样的计算只是多了-clock_fall命令,我们这里不再举例说明。

 

3)、output系统同步DDR接口

计算公式:

set_output_delay -clock $destination_clock -max [expr $trce_dly_max + $tsu_r] [get_ports $output_ports] ;

set_output_delay -clock $destination_clock -min [expr $trce_dly_min - $thd_r] [get_ports $output_ports] ;

set_output_delay -clock $destination_clock -max [expr $trce_dly_max + $tsu_f] [get_ports $output_ports] -clock_fall -add_delay;

set_output_delay -clock $destination_clock -min [expr $trce_dly_min - $thd_f] [get_ports $output_ports] -clock_fall -add_delay;

DDR 计算需要分别对上升沿和下降沿同时计算。

大部分情况下,更加推荐源源同步的方法,源同步的方法只要知道下游期间的Tsu和Thd就可以。

举例:

时钟周期:T=10ns

下游Devcie上升沿建立时间:Tsu_r =1ns

下游Device上升沿保持时间:Thd_r =2ns

下游Devcie下降沿建立时间:Tsu_f =1.5ns

下游Device下降沿保持时间:Thd_f =2.5ns

走线最小延迟:Ttrace(mini)=0.3ns

走线最大延迟:Ttrace(max)=0.4ns

输入延迟的input delay时序约束如下:

Create_clock –name sysclk –period 10 [get_ports clk]

#以下定义了一个虚拟时钟和下游device的时钟同频同相

Create_clock –name sysclk –period 10 [get_ports clk]

Create_clock –name virtual_clk –period 10

set_output_delay -clock virtual_clk –max 1.4 [get_ports dout] ;

set_output_delay -clock virtual_clk -min -1.7 [get_ports dout] ;

set_output_delay -clock virtual_clk -max 1.5 [get_ports dout] -clock_fall -add_delay;

set_output_delay -clock virtual_clk -min -2.2 [get_ports dout] -clock_fall -add_delay;

 

1.4.2 output源同步接口(Source Synchronous Outputs)

1)、Setup/Hold方法-SDR接口上升沿(SDR-Rising Edge Source Synchronous Outputs)

 

计算公式如下:

set_output_delay -clock $fwclk -max [expr $trce_dly_max + $tsu] [get_ports $output_ports];

set_output_delay -clock $fwclk -min [expr $trce_dly_min - $thd] [get_ports $output_ports];

举例:

时钟周期:T=10ns

下游Device建立时间:Tsu =1ns

下游Device保持时间:Thd=2ns

走线最小延迟:Ttrace(mini)=0.3ns

走线最大延迟:Ttrace(max)=0.4ns

输入延迟的input delay时序约束如下:

Create_clock –name sysclk –period 10 [get_ports clk]

Create_clock –name virtual_clk –period 10

Set_output_delay –clock virtual_clk –max 2.4 [get_ports dout]

Set_output_delay –clock virtual_clk –min -0.7 [get_ports dout]

 

2)、Setup/Hold方法-SDR接口下降沿(SDR-Falling Edge Source Synchronous Outputs)

计算公式如下:

set_output_delay -clock $fwclk -max [expr $trce_dly_max + $tsu] [get_ports $output_ports] -clock_fall;

set_output_delay -clock $fwclk -min [expr $trce_dly_min - $thd] [get_ports $output_ports] -clock_fall;

由于下降沿和上升沿一样的计算只是多了-clock_fall命令,我们这里不再举例说明。

 

3)、Setup/Hold方法-DDR接口上升沿(Setup/Hold-DDR Rising Edge Source Synchronous Outputs)

 

计算公式如下:

set_output_delay -clock $fwclk -max [expr $trce_dly_max + $tsu_r]           [get_ports $output_ports];

set_output_delay -clock $fwclk -min [expr $trce_dly_min - $thd_r]   [get_ports $output_ports];

set_output_delay -clock $fwclk -max [expr $trce_dly_max + $tsu_f]           [get_ports $output_ports] -clock_fall -add_delay;

set_output_delay -clock $fwclk -min [expr $trce_dly_min - $thd_f]   [get_ports $output_ports] -clock_fall -add_delay;

举例:

时钟周期:T=10ns

下游Devcie上升沿建立时间:Tsu_r =1ns

下游Device上升沿保持时间:Thd_r =2ns

下游Devcie下降沿建立时间:Tsu_f =1.5ns

下游Device下降沿保持时间:Thd_f =2.5ns

走线最小延迟:Ttrace(mini)=0.3ns

走线最大延迟:Ttrace(max)=0.4ns

输入延迟的input delay时序约束如下:

Create_clock –name sysclk –period 10 [get_ports clk]

#以下定义了一个虚拟时钟和下游device的时钟同频同相

Create_clock –name sysclk –period 10 [get_ports clk]

Create_clock –name virtual_clk –period 10

set_output_delay -clock virtual_clk –max 1.4 [get_ports dout] ;

set_output_delay -clock virtual_clk -min -1.7 [get_ports dout] ;

set_output_delay -clock virtual_clk -max 1.5 [get_ports dout] -clock_fall -add_delay;

set_output_delay -clock virtual_clk -min -2.2 [get_ports dout] -clock_fall -add_delay;

 

4)、Max Skew-SDR接口上升沿(Max Skew-SDR-Rising Edge Source Synchronous Outputs)

计算公式如下:

set_output_delay -clock $fwclk -max [expr $fwclk_period - $are_skew] [get_ports $output_ports];

set_output_delay -clock $fwclk -min $bre_skew                   [get_ports $output_ports];

举例:

时钟周期:T=10ns

bre_skew=4ns

are_skew=3ns

output delay时序约束如下:

Create_clock –name sysclk –period 10 [get_ports clk]

Create_clock –name virtual_clk –period 10

Set_output_delay –clock virtual_clk –max 7 [get_ports dout]

Set_output_delay –clock virtual_clk –min 4 [get_ports dout]

 

5)、Max Skew-SDR接口上升沿(Max Skew-SDR-Rising Edge Source Synchronous Outputs)

计算公式:

set_output_delay -clock $fwclk -max [expr $fwclk_period - $afe_skew] [get_ports $output_ports] -clock_fall;

set_output_delay -clock $fwclk -min $bfe_skew                   [get_ports $output_ports] -clock_fall;

和上升沿模式类似不再举例

 

6)、Max Skew-DDR接口(Max Skew-DDR- Source Synchronous Outputs)

计算公式如下:

set_output_delay -clock $fwclk -max [expr $fwclk_period/2 - $afe_skew] [get_ports $output_ports];

set_output_delay -clock $fwclk -min $bre_skew                     [get_ports $output_ports];

set_output_delay -clock $fwclk -max [expr $fwclk_period/2 - $are_skew] [get_ports $output_ports] -clock_fall -add_delay;

set_output_delay -clock $fwclk -min $bfe_skew                     [get_ports $output_ports] -clock_fall -add_delay;

举例:

bre_skew=1.1ns,are_skew=1.5ns

bfe_skew=1ns ,afe_skew=1.8ns

 

Create_clock –name sysclk –period 10 [get_ports clk]

Create_clock –name virtual_clk –period 10

set_output_delay -clock virtual_clk -max 2.2          [get_ports dout];

set_output_delay -clock virtual_clk -min 1.1           [get_ports dout];

set_output_delay -clock virtual_clk -max 3.9            [get_ports dout] -clock_fall -add_delay;

set_output_delay -clock virtual_clk -min 1        [get_ports dout] -clock_fall -add_delay;

 

1.5 VIVADO IDE提供的时序模板

         到目前位置,我们时序约束讲解的主线除了官方的ug903和ug906外,还有VIVADO IDE也提供了时序模板方便我们在编写代码的时候查阅时序约束规则。如果我们对时序约束规则公式有不清楚的可以在VIVADO IDE下很容易的查阅到。

2

路过

雷人

握手

鲜花

鸡蛋

刚表态过的朋友 (2 人)

说点什么...

已有5条评论

最新评论...

I'mpossible2020-4-1 16:28引用

感谢分享

DBG2020-3-26 18:29引用

学习

云海2020-3-9 17:35引用

不错

拼46942019-12-2 17:33引用

谢谢

su3752@qq.com2019-10-29 10:40引用

写的不错,够用了

查看全部评论(5)

本文作者
2019-10-26 00:19
  • 6
    粉丝
  • 5193
    阅读
  • 5
    回复

关注米联客

扫描关注,了解最新资讯

联系人:汤经理
电话:0519-80699907
EMAIL:270682667@qq.com
地址:常州溧阳市天目云谷3号楼北楼201B
相关分类
热门评论
排行榜

关注我们|扫描二维码

米联客微信公众号

米联客天猫旗舰店

客服服务热线:

0519-80699907

常州-总部:常州溧阳市中关村吴潭渡路雅创高科智造谷10-1幢楼

南京-分部:南京市栖霞区仙林大道181号5幢1821室

邮编:213300 Email:tjy@uisrc.com

Copyright   ©2020-2026 内容版权归©UISRC.COM    ( 苏ICP备19046771号-2 )