UG 903 vivado 约束指导手册 下载本文

vivado

约束指导手册

时序分析

时序路径

时序路径由设计中instance之间的连接决定。在数字设计中,时序路径由一对时序元件(sequential elements)形成,这对时序元件由一个或二个不同的时钟控制。

普通时序路径

在任何设计中最普通的时序路径有以下4种: 1 输入端口到内部时序单元路径

2从时序单元到时序单元之间的内部路径 3 从内部时序单元到输出端口之间的路径 4 输入端口到输出端口之间的路径 输入端口到内部时序单元之间路径

在从输入端口到内部时序单元之间的路径上传输的数据: . 通过管脚时钟送出器件

. 经过一个称为输入延时的延时到达器件端口(SDC 定义)

. 在到达由目标时钟(destination clock)锁定的时序单元之前须通过器件内部逻辑 从时序单元到时序单元的内部路径

在从时序单元到时序单元的内部路径上传输的数据:

. 由时序单元发送到器件内部,而此时序单元由源时钟(source clock)驱动 . 在到达由目标时钟驱动的时序单元之前,须经过一些内部逻辑 内部时序单元到外部端口路径

在从内部时序单元到外部端口路径上的数据:

. 由时序单元发送到器件内部,而此时序单元由源时钟(source clock)驱动 . 在到达外部端口之前,须经过一些内部逻辑

. 在经过一段称为输出延时的额外延时之后被端口时钟捕获(SDC definition)

输入端口到输出端口路径

在从输入端口直接到输出端口的路径上,数据:

. 不需要在器件内部锁存(latch),直接从输入端口到输出端口。他们通常被称为In-to-out数据路径。

端口时钟可以是虚拟时钟也可以是设计时钟 路径举例

图3-1 描述了上面所有的路径,在此例图中,设计时钟CLK0可被用作端口时钟,这样既可以约束DIN延时也可以约束DOUT延时。

时钟路径部分

每一个时钟路径由三个部分组成: . 源时钟路径 . 数据路径 . 目标时钟路径 源时钟路径

源时钟路径是由源时钟从它的源点(典型的是输入端口)到发送时序单元的时钟引脚之间的路径。对于从输入端口起始的时序路径来说,就不存在源时钟路径。 数据路径

对内部电路,数据路径是发送时序单元和捕捉时序单元之间的路径

发送时序单元的有效时钟管脚称为路径起始点 捕捉时序单元的数据输入管脚称为路径结束点

对于输入端口路径,数据路径起始于输入端口。输入端口是路径的起始点。 对于输出端口路径,数据路径结束语输出端口。输出端口是路径的结束点。 目标时钟路径

目标时钟路径是由目标时钟从其源点(典型的是输入端口)到捕捉时序单元的时钟管脚之间的路径。

对于结束于输出端口的时序路径,就没有目标时钟路径。 图3-2显示了3段典型的时序路径

Setup和Hold分析

Vivado IDE 分析时序并且在时序路径终点时候报告时序裕量。时序裕量是指在时序路径终点数据要求时间和抵达时间的差异。如果裕量为正,从时序的角度考虑此路径是有效的。 Setup 检查

为了计算数据所需的setup 时间,时序引擎:

1. 决定源时钟和目的时钟之间的普通周期。如果没有被发现,为分析考虑多达1000个时钟

周期。 2. 检查覆盖普通周期上的起始点和终点所有上升和下降沿。

3. 在任何两个有效(active)沿之间的最小正差值delta。这个delta被称为setup分析的时序路

径要求。 Setup 路径要求示例

假象2个寄存器之间的一条路径,这些寄存器由其相应时钟上升沿触发。这条路径有效的时钟沿只有上升沿。时钟定义如下: . clk0 周期6 ns . clk1周期4ns

图3-3显示有2个单独的源和目的时钟沿有资格受到setup分析:setup(1)和setup(2): 源时钟发送沿时间:0ns + 1*T(clk0) = 6ns 目的时钟抓取沿时间:0ns + 2*(clk1) = 8ns

Setup Path Requirement = 抓取沿时间 – 发送沿时间 = 2ns 在计算路径要求时候,需要考虑2个重要的点:

1. 时钟沿是理想的,那就是说,时钟树插入延迟不在考虑之内

2. 默认时钟在0时间点是phase-aligned,除非他们的波形定义引进了phase-shift。异步时钟

相位关系未知。时序引擎在分析其间路径时候会考虑默认值。关于异步时钟的更多内容看一下部分。 Setup 分析数据要求时间

Setup分析数据要求时间是指为了让目的单元能安全的采样数据,数据必须在这个时间点之前稳定。这个值基于: . 目的时钟采样沿时间 . 目地时钟延时

. 源时钟和目的时钟的不确定性

. 目的单元setup 时间 Setup 分析的数据抵达时间

Setup分析的数据抵达时间,是指由源时钟发送的数据在路径终点的稳定时候所需要的时间。它的值基于: . 源时钟发送沿时间 . 源时钟延时 . 数据路径延时

数据路径延时包括所有从起点到终点的单元(cell)和线(net)延时。

在时序报告中,Vivado 将setup时序考虑为数据路径的一部分。相应的,数据到达和要求时间的公式为:

Setup裕量是指要求时间和实际抵达时间的差值:

在 输入数据引脚寄存器上Setup 裕量为负值,说明寄存器有可能锁存到未知的值跳转到错误状态。 Hold 检查

Hold裕量的计算与setup 裕量计算直接相关。当setup分析证明了在最悲观的情况下数据可以被安全捕捉,hold分析确保了:

. 同样的数据不可能被前面目地时钟沿错误的抓取

. 下一个源时钟沿发送的数据不能被用来分析setup的目的数据沿抓取

因此,为了找到hold分析的时序路径,时序引擎考虑了所有为setup分析的源和目的时钟沿结合的可能。

对每一种可能的组合,时序引擎:

. 检查发送沿和减去一个目的时钟周期的抓取沿之间的差值 . 检查了加上一个源时钟周期的发送沿和抓取沿之间的差值 . 只保留时间差值最大的发送沿和抓取沿 hold路径要求示例

采用page33中setup路径要求示例中的时钟。对于setup分析那仅有2个可能的时钟沿组合:

那么相应的hold要求如下:

从上面可以看出最大的要求时间是0ns,这正好与源时钟和目的时钟第一次上升沿相吻合。 Hold 路径要求示例,page36 显示了setup 检查沿和他们相关的hold检查。

此例中,最终的hold要求时间不是来源于最紧的setup要求。这是因为所有可能的setup沿都会被考虑在内,是为了找到最又挑战性的hold要求。

正如在setup分析中,数据要求时间和数据抵达时间是基于以下条件计算的: . 源时钟发送沿时间 . 目的时钟抓取沿时间 . 源和目的时钟延时 . 时钟不确定性 . 数据延时

. 目的寄存器hold 时间

Hold 裕量是要求时间和抵达时间的差值

正的时序裕量意味着即使在最悲观的情况下数据也不会被错误的时钟沿抓取。而负的hold裕量说明抓取的数据错误,而且寄存器可能进入不稳定状态。 矫正(recovery)和移除(removal)分析

矫正和移除时序检查与setup和hold检查相似,区别就是它们应用于异步数据管脚例如set或者clear。

对于异步复位的寄存器:

. 矫正时间是异步reset信号为了锁定新数据已经切换到它的无效状态之后 ,到下一个有效时钟沿之间的最小时间。

. 移除时间是在异步复位信号安全切换到其无效状态之前,到第一个有效时钟沿之后的最小时间。 下面的等式描述了这两种分析的slack是如何计算的 Recovery check

下面的等式描述了下面如何计算:

Removal check

正如setup和hold检查,一个负的recovery裕量和removal裕量说明寄存器可能进入亚稳态,并且将未知的电子层带入设计中。 定义时钟 时钟

数字设计中,时钟提供了从寄存器到寄存器之间可靠的传输数据的时间参考。Vivado IDE 时序引擎用时钟特征来: . 计算时钟路径要求

. 以裕量计算的方式报告设计时序裕量 更多信息,参考 时序分析这章

为了得到最精确的最大的时序路径覆盖,时钟必须合理的定义。可以用下面的特征定义时钟: . 源时钟是指定义在时钟驱动引脚或者时钟树跟端口的时钟

. 时钟沿可以由周期和波形特性的组合描述 . 周期是ns级的,与描述的波形的时间周期相匹配

. 时钟波形是在时钟周期里,在数ns内时钟上升沿和下降沿绝对时间的列表

列表必须包含偶数个值。第一个值一般与第一个上升沿吻合,除非另外指定,默认的时钟占空比是50%相位是0ns。

如图4-1所示,clk0周期10ns,占空比50%,相位0ns。Clk1周期8ns,占空比75%,相位2ns。 Clk0: period = 10, waveform = {0 5} Clk1: period =8 , waveform={2 8}

传播(propagated clock)时钟

周期和波形特征体现了时钟的理想特征。当时钟进入FPGA器件并且经过时钟树传播时候,时钟沿会有延时而且会随着噪声和硬件特性而改变。这些特点被称为时钟网络延时(latency)和时钟不确定(uncertainty)。 时钟不确定性包含下面内容: . clock jitter . phase error

. 任何额外指定的不确定

Vivado会默认的将时钟作为传播时钟,这意味着,这是非理想的时钟。这么做是为了提供包含时钟树插入延时和不确定性的裕量的值。 特定硬件资源

Xilinx FPGA器件的特定硬件资源能有效支持大量设计时钟。这些时钟通常是由其它器件产生,以输入接口的方式提供给设计。

它们也能由时钟配置模块产生,这些时钟配置模块包括: . MMCM . PLL . BUFR

它们还可以由LUT和register之类的常规单元改变。 以下部分介绍了如何基于原始时钟来最好的定义它 主时钟

主时钟是板上产生的输入设计的时钟,可以通过以下途径输入: . 输入端口

. gigabit transceiver 输出管脚(例如,recovered clock) 主时钟只能由create_clock命令定义。

主时钟必须连接到网表对象(netlist object)。网表对象代表了设计中时钟树上所有下行时钟时钟沿产生的点。换句话说,当Vivado计算slack等式中时钟延时和不确定性时候,主时钟源点定义了0时间。

必须最先定义主时钟,这样其它的时钟约束才能有参考依据。 主时钟示例

如图4-2所示,板级时钟通过sysclk端口进入FPGA,然后在抵达路径寄存器之前经过input buffer和clock buffer。 . 周期是10ns . 占空比为50% . 没有相位移动

相应的XDC语法为:

与sysclk类似,板级时钟devclk通过ClkIn端口进入FPGA . 周期10ns . 占空比25% . 相移90度 相应的XDC语法为:

图4-3显示了tasnseiver gt0,是从板上高速链接收回的时钟rxclk。时钟rxclk周期3.33ns,占空比50%而且布线通过MMCM,这样可以为设计产生补偿时钟。

当在GT0输出驱动管脚上定义rxclk时候,所有由MMCM驱动的时钟都有个共同的源点,就是gt0/RXOUTCLK。用合理的时钟延时和不确定值计算它们之间路径的裕量。

虚拟时钟

虚拟时钟是设计中没有在物理上连接到任何网表单元的时钟。 虚拟时钟由create_clock命令定义而不需要指定任何源对象。 以下情况中虚拟时钟可以用来指定输入和输出延时约束 . FPGA I/O的外部参考时钟不作为设计时钟

. FPGA I/O路径与内部产生的时钟有关,而这些I/O路径不能被板级时钟所约束

. 在不修改内部时钟特性的前提下只为时钟相关的I/O延时约束指定不同的jitter和latency。 例如,时钟clk_virt周期10ns,没有连接到任何网表对象。在此例中,-name选项是强制的,[]没有指定。

虚拟时钟在其被输入和输出延时约束使用之前定义。

生成时钟(generated clock) 有2种生成时钟: . 用户定义的生成时钟 . 自动衍生时钟(derived clock) 关于生成时钟

生成时钟是指由MMCM或用户逻辑驱动内部逻辑的时钟。 生成时钟与master 时钟相关联,master时钟可以是: . 主时钟 . 其它生成时钟

生成时钟的特性直接来源于它们的master时钟。必须描述如何变化的电路如何改变master时钟,而不是指定它的周期和波形。 Master时钟和生成时钟的关系可以是: . 简单的分频 . 简单的倍频

. 在一个MMCM或PLL中既有简单的分频也有简单的倍频

生成时钟也可以是其master时钟带有相移或波形反向的简单复制。

用户定义的生成时钟 用户定义的生成时钟是:

. 用create_generated_clock命令定义 . 连接到网表对象,优先连到时钟树根引脚

用-source选项指定master时钟。这标明了master时钟传播经过的管脚或端口。通常用master时钟的源点或生成时钟源单元的输入时钟引脚。 示例1:简单2分频

主时钟clkin时钟周期10ns。寄存器REGA将其2分频给其它寄存器管脚,其相应的生成时钟为clkdiv2。

以下是3个等效的约束:

例2:用-edge选项来2分频

可以选择不用-divide_by选项,而是用-edge选项来直接描述基于master时钟沿产生的时钟波形。幅角是Master 时钟沿指示的列表,该列表用来定义生成时钟沿的位置,以时钟上升沿开始。 下面的例子等效于在例1中定义的的生成时钟。

例3: 用-edge和-edge_shift选项来改变占空比和相移

生成时钟波形的每个沿都可以独立的用 –edge_shift选项来用一个绝对值移位。只有需要相移的时候才用这此选项。

-edge_shift不能和以下选项一起使用: . –divide_by . –multiply_by . invert

考虑一个master 时钟clkin周期10ns,占空比50%。它到达CMB单元产生时钟占空比25%,相移90度。

例4: 同时使用-divide_by和-multiply_by

Vivado允许同时指定-divide_by和-multiply_by。这是对标准SDC的延伸。这 在手动定义由MMCM或PLL产生的时钟时候非常方便。尽管Xilinx推荐由时序引擎自动创造这些约束。 对于更多的信息,查看自动生成时钟 考虑CMB是master 时钟clkin乘以4/3:

如果在MMCM或PLL输出产生一个衍生时钟,必须验证波形定义符合MMCM或PLL的配置。 自动派生时钟

自动派生时钟也成为自动生成时钟。假如相关的master时钟已经定义了,他们约束是在CMB模块的输出引脚由VIVADO自动定义的。CMB模块包括MMCM,PLL或BUFR原语。

如果用户定义的时钟(主时钟或生成时钟)同时也在网表对象上定义了,那么在同一个源点自动生成时钟是无法建立的。自动生成时钟的名称是基于直接连接到源点的网线的名称的。 自动派生时钟示例 由MMCM产生的时钟

Master时钟clkin驱动了输入CLKIN0和MMCME2例子mmcm_i。自动产生时钟的名称是cpuclk并且它定义的点是mmcm_i/CLKOUT0。 本地网线名

如果CMB示例位于设计结构之中,本地网线名不带源单元名的名字)用于产生生成时钟名称。 例如,对一个称为aa/bb/usrclk的层次网线 . 源单元名aa/bb . 产生的时钟名是usrclk 名称冲突

为了防止2个生成时钟名冲突,Vivado增加了独特的结尾来区分它们,例如: . usrclk , usrclk1, usrclk2 …… 时钟组

Vivado 默认所有时钟都是有关联的,除非你通过增加组约束另外指定。Set_clock_groups命令禁止对标识的时钟组之间进行时序分析。

同步时钟

两个时钟当他们相关的相位可以预测时,那么它们就是同步的。这是因为他们的时钟树在网表中是起源是同一个根。

例如,一个衍生时钟和它的master时钟就是同步的,因为他们传播通过同一网表源到达衍生时钟源点。 异步时钟组

当两个时钟之间的相位关系是不可预测时候,那么它们就是异步的。例如两个时钟由外部不同的晶振产生通过不同的管脚送入FPGA,那么它们就是异步时钟。

大部分情况下,主时钟可以被当作异步时钟。当与它们相应的生成时钟有关时,它们可以形成异步时钟组。 异步时钟组示例

. 在输入端口上定义主时钟clk0,通过MMCM产生时钟usrclk和itfclk。

. 第二个主时钟是clk1,其定义在GTP instance输出管脚上的recovered 时钟,它通过第二个MMCM产生gtclkrx和getclktx。 创造异步时钟组

用-asynchronous选项来创造异步时钟组

动态找回衍生时钟名称

如果不能预知衍生时钟名,用get_clocks-include_generated_clocks来动态找回他们。这是SDC标准的延伸。

以前的例子可以像下面这么些:

专用时钟组

有些设计有些选择模式要求时钟不同的时钟。这些时钟间的选择通常用: . 时钟倍频如BUFGMUX和BUFGCTRL . LUT

使用Vivado,在同一个时钟树上同时可以存在几个时钟,这便于同时报道所有操作模型,但是在硬件上这是不可能的。

有些时钟被称为专用时钟。可以用set_clock_groups来约束他们: . –logically_exclusive . —physically_exclusive 专用时钟组示例

一个MMCM产生clk0和clk1,这个连接到BUFGMUX 元件clkmux上。Clkmux输出驱动这些设计时钟树。

默认的,vivado分析clk0和clk1之间的路径,尽管既有分享同一时钟树的时钟也有不能同时存在的时钟。

必须输入下面的约束来阻止分析两个时钟:

时钟latency,jitter,unc` ertainty

除了定义时钟波形,还必须指定与环境相关的可预见的和随机的变化。 Clock latency

在电路板上传播到达FPGA内部之后,时钟沿抵达目地带有一定的延时。这个延时典型的可以表达为:

. 源延时(在时钟源点之前延时,通常在FPGA外部) . 网络延时

由时钟网络延时引入的时钟延时(也称为插入延时)是要么: . 自动建立(pre-route 设计) . 精确计算(post-route 设计)

在标准的SDC工具中Set_propagated_clock命令触发了传播延时计算。Vivado中此命令是非必须的,因为这是vivado中默认的: . 所有时钟都被认为是传输时钟

. 衍生时钟的延时包括它源主时钟的插入延时加上自身的网络延时 对于Xilinx FPGA,用set_clock_latency命令来指定FPGA外部的时钟延时。 Set_clock_latency示例

时钟jitter和时钟uncertainty

对于ASIC器件,时钟jitter通常与时钟uncertainty特征同时出现。然而,对于xilinx FPGA,jitter的特性是可预测的。它们可由时序分析引擎自动计算或分开指定。 输入Jitter

输入jitter 是考虑到从正常的或理想的时钟抵达时间,两个连续的时钟沿之间的差值。

用set_input_jitter命令来为每一个时钟独立指定输入jitter。输入jitter不是从master时钟发送到其衍生时钟。结果,必须手动指定输入jitter,即使是衍生时钟。 系统jitter

系统jitter是全面的jitter,由于: . 电源噪声 . 电路板噪声

. 任何系统的额外jitter

用set_system_jitter命令来为整个设计即所有时钟指定一个唯一值。 额外的时钟uncertainty

用set_clock_uncertainty命令来为不同的角落,延时,或所需的特定时钟关系定义额外的时钟不确定性。从时序角度来看,这是为部分设计增加额外裕量的一个便捷的方法。 I/O延时

为了确定外部时序内容在设计中的精确模型,必须给出输入和输出端口的时序信息。因为vivado只识别FPGA器件内部的时序。在FPGA外部必须用下面命令来指定延时值: . set_input_delay . set_outpu_delay 输入延时

Set_input_delay命令指定了输入接口上的输入路径延时,此输入端口与设计接口上的时钟沿相关。当考虑到应用板,此延时代表了下面的相位差别:

a. 数据通过外部芯片传输到FPGA的输入端口 b. 相关参考板级时钟

因此,输入延时值可正可负,取决于FPGA接口的时钟和数据相位关系。 用输入延时选项

尽管-clock 选项是在SDC标准中可选的,但是在vivado中是必需的。相关时钟可以是设计时钟也可以是虚拟时钟。

输入延时命令选项有: . 最小和最大延时命令选项 . 时钟下降输入延时命令选项 . 增加延时输入命令选项 最小和最大延时命令选项

-min和-max选项为下面指定不同的值: . 最小延时分析(hold/removal) . 最大延时分析(setup/recovery)

如果都没有用到,输入延时值既适用于min也适用于max。 时钟下降输入延时命令选项

-clock_fall选项指定了应用于时序路径的输入延时约束,这个时序路径与相关时钟的下降沿有关。如果没有此选项,Vivado只默认时钟的上升沿。

不要将-clock_fall选项与-rise和-fall选项混淆。这些选项指的是数据沿而不是时钟沿。 Add Delay 输入延时命令选项

如果出现以下情况必须使用-add_delay选项: . 存在最大(或最小)延时约束

. 你想指定第二个最大(或最小)输出延时约束

此选项普遍应用于约束与多于一个的时钟沿相关的输入端口,例如,DDR接口

可将输入延时约束只应用于输入或双向端口,不包括时钟输入端口,这是自动忽略的。不能将输入延时约束应用于内部引脚。 示例1

此例定义了一个与以前定义的时钟sysclk相关的输入延时

示例2

此例定义了与以前定义的虚拟时钟相关的输入延时约束

示例3

此例定义了与sysclk相关的最小和最大分析的输入延时约束

示例4

此例指定了与DDR时钟相关的输入延时约束

此例定义创造了从FPGA外部时钟clk_ddr上升和下降沿发送的数据到FPGA内部FF上升和下降沿所触发的数据。 输出延时

Set_output_delay命令在设计接口指定了与时钟沿相关的输出端口的输出路径延时 考虑应用的板子,此延时代表了下面的相位差别:

a. 数据从FPGA输出管脚输出,通过电路板到另一个器件 b. 相关的参考电路板时钟

输出延时的值可在正可负,取决于FPGA外部的时钟和数据的相位。 使用输出延时选项

尽管-clock选项在SDC标准中是可选的,但是在Vivado中是必选的。 相关时钟既可以是设计时钟也可以是虚拟时钟

输出延时命令选项包括: . Min和Max输出延时命令选项 . Clock Fall 输出延时命令选项 . Add Delay 输出延时命令选项 Min和Max输出延时命令选项

-Min和-Max为最小延时分析(hold/removal)和最大延时分析(setup/recovery)指定了不同的值。如果两个选项都没使用,那么输入延时值自动采用这两个选项。 Clock Fall 输出延时命令选项

-clock_fall选项指定了应用于由关联时钟下降沿抓取的时序路径的输出延时约束。没有此选项,Vivado默认只有相关时钟的上升沿。

不要将-clock_fall选项与-rise和-fall相混淆。这两个选项是指数据沿,而不是时钟沿。 Add Delay输出延时命令选项

出现以下情况必须使用-add_delay选项:

1. 存在最大输出延时约束 2. 想指定第二个最大输出延时约束

同样对最小输出延时约束也成立。此选项普遍应用于与多个时钟沿相关的输入端口约束,例如,DDR接口的上升和下降沿。

例一

此例定义了一个与之前sysclk相关的output delay,此sysclk与min和max分析都相关

例二

此例定义了一个与以前定义的虚拟是时钟相关的输出延时

例子三