【Vivado约束学习】 时钟约束

【Vivado约束学习】 时钟约束

1 时钟介绍

在数字设计中,时钟代表从寄存器(register)到寄存器可靠传输数据的时间基准。Xilinx Vivado集成设计环境(IDE)时序引擎使用ClocK特征计算时序路径要求,并通过松弛计算报告设计时序裕度(Slack)。 时钟必须正确定义,以获得最佳的时序路径。以下特性定义了时钟: 1,时钟定义在它的树根的驱动器管脚或端口上,被称为源点。 2,时钟的边沿是由周期和波形特性相结合来描述的。 3,周期以纳秒(ns)为单位,时钟对应于波形重复的时间。 4,波形是时钟周期内上升边沿和下降边沿绝对时间的列表,以纳秒(ns)为单位。列表必须包含偶数的值。第一个值总是相对应的。到第一个上升的边沿。除非另有规定,占空比默认为50%,相移到0ns。 如图1所示,时钟CLK0具有10ns周期、50%占空比和0ns相位。时钟CLK1具有8ns周期、75%占空比(8ns内的高电平时间为6ns)和2ns上升沿相位偏移。

Clk0: period = 10, waveform = {0 5} 
Clk1: period = 8, waveform = {2 8}

图1 时钟波形示例

1.1 传播时钟(Propagated Clocks)

周期和波形属性代表时钟的理想特性。当进入FPGA并通过时钟树传播时,时钟边沿被延迟并受到噪声和硬件行为引起的变化的影响。这些特性称为时钟网络延迟和时钟不确定性。 时钟的不确定性包括: 1,时钟抖动(Clock jitter) 2,相位误差 3,您指定的任何其他不确定性 默认情况下,Vivado IDE始终将时钟视为传播时钟,即非理想时钟,以便提供包括时钟树插入延迟和不确定性的准确松弛值。

1.2专用硬件资源

Xilinx FPGA的专用硬件资源有效支持大量设计时钟。这些时钟通常由电路板上的外部元件产生。它们通常通过输入端口进入设备。 它们也可以由称为时钟修改块的特殊原语生成,例如: 1,MMCM 2,BUFR 3,PLL 它们也可以通过常规单元格(如LUTS和寄存器)进行转换。

2 主时钟(Primary Clocks)

主时钟是通过输入端口或GT收发器输出引脚(例如,恢复时钟)进入设计的板时钟。 主时钟只能由create_clock命令定义。 如图2所示,板时钟通过端口sysclk进入器件,然后在到达路径寄存器之前通过输入缓冲器和时钟缓冲器传播。 1,时钟周期10ns 2,占空比50% 3,没有相位偏移 相应的Xilinx设计约束(XDC):

create_clock -period 10 [get_ports sysclk] 

图2 主时钟

与sysclk类似,板时钟devclk通过端口clkIn进入设备。 1,时钟周期10ns 2,占空比为25% 3,相位偏移90度 对应的XDC:

create_clock -name devclk -period 10 -waveform {2.5 5} [get_ports ClkIn]

如图3所示,展示了一个收发器gt0,它从电路板上的高速链路恢复时钟rxclk。时钟rxclk的周期为3.33 ns,占空比为50%,并被路由到MMCM,MMCM为设计生成多个补偿时钟。 对应的XDC:

create_clock -name sysclk -period 3.33 [get_ports SYS_CLK_clk_p]

图3 GT主时钟

如图4所示,差分缓冲器驱动PLL。在这种情况下,主时钟只能在差分缓冲区的正输入上创建。在缓冲区的每个正/负输入上创建主时钟将导致不切实际的CDC路径。 相应的XDC:

create_clock -name sysclk -period 3.33 [get_ports SYS_CLK_clk_p]

图4 差动缓冲器上的主时钟

3虚拟时钟( Virtual Clocks)

虚拟时钟是指在设计中没有物理连接到任何Netlist元素的时钟。 虚拟时钟是通过create_clock命令定义的,而不指定源对象。 虚拟时钟通常用于在下列情况之一中指定输入和输出延迟约束: 1,外部设备I/O参考时钟不是设计时钟之一。 2,FPGA I / O路径与内部生成的时钟有关,该时钟无法与从中导出的时钟板正确计时。 3,希望只为与I/O延迟约束相关的时钟指定不同的抖动和延迟,而不修改内部时钟特性。 例如,时钟CLK_virt的周期为10 ns,不附加到任何Netlist对象。未指定[]参数。在这种情况下,-name选项是强制性的. 相应的XDC:

create_clock -name clk_virt -period 10

在输入和输出延迟约束使用之前,必须定义虚拟时钟

4 生成时钟(Generated Clocks)

生成的时钟由设计内部的特殊单元(称为时钟修改块(例如,MMCM))或某些用户逻辑驱动。 生成的时钟与主时钟相关联。create_generated_clock命令考虑主时钟的起始点。主时钟可以是主时钟或另一个生成时钟。 生成的时钟属性直接来自其主时钟。必须描述修改电路如何转换主时钟,而不是指定其周期或波形。

4.1 用户定义产生时钟

例1:一个简单的二分频

图5 Generated Clocks

主时钟clkin的周期为10 ns。寄存器REGA将其除以2,驱动其他寄存器时钟引脚。相应的生成时钟称为clkdiv2。 以下是两个同等的制约因素:

create_clock -name clkin -period 10 [get_ports clkin]
# Option 1: master clock source is the primary clock source point
create_generated_clock -name clkdiv2 -source [get_ports clkin] -divide_by 2 \
[get_pins REGA/Q] 
# Option 2: master clock source is the REGA clock pin
create_generated_clock -name clkdiv2 -source [get_pins REGA/C] -divide_by 2 \
[get_pins REGA/Q]

例2:除以2使用-edges选项 以下示例等效于示例1中定义的生成时钟:简单除法2

# waveform specified with -edges instead of -divide_by
create_generated_clock -name clkdiv2 -source [get_pins REGA/C] -edges {1 3 5} \ [get_pins REGA/Q]

例3:使用-edges和-edge_shift选项进行占空比更改和相移 通过使用-edge_shift选项,生成的时钟波形的每个边沿也可以单独移位正值或负值。仅在需要相移时才使用此选项。 -edge_shift选项不能与以下任何内容同时使用: 1,-divide_by 2,-multiply_by 3,-invert

考虑主时钟clkin,周期为10 ns,占空比为50%。它到达单元mmcm0,产生一个占空比为25%的时钟,移动90度。生成的时钟定义指的是主时钟边沿1,2和3.这些边沿分别出现在0ns,5ns和10ns。要获得所需波形,请将第一个和第三个边沿移动2.5ns。

create_clock -name clkin -period 10 [get_ports clkin] 
create_generated_clock -name clkshift -source [get_pins mmcm0/CLKIN] -edges {1 2 3} \ -edge_shift {2.5 0 2.5} [get_pins mmcm0/CLKOUT] 
# First rising edge: 0ns + 2.5ns = 2.5ns
# Falling edge: 5ns + 0ns = 5ns
# Second rising edge: 10ns + 2.5ns = 12.5ns

4.2 自动派生时钟(Automatically Derived Clocks)

自动派生的时钟也称为自动生成的时钟。如果已经定义了相关的主时钟,Vivado IDE会自动为时钟修改模块(CMBs)的输出引脚创建约束。 在Xilinx 7系列器件中,CMBs是: 1,MMCM*/ PLL* 2,BUFR 3, PHASER* 例:以下自动导出的时钟示例是由MMCM生成的时钟。主时钟clkin驱动MMCME2实例clkip / mmcm0的输入CLKIN。自动生成时钟的名称是cpuClk,其定义点是clkip / mmcm0 / CLKOUT。

5 时钟组(Clock Groups)

默认情况下,Vivado IDE会对设计中所有时钟之间的路径进行计时,除非您通过使用时钟组或错误的路径约束来指定。set_clock_groups命令禁用您标识的时钟组之间的时序分析,而不是同一组内的时钟之间的时序分析。与set_false_path约束不同,时钟之间的两个方向都会忽略时序。 可以使用-group选项多次指定多组时钟。如果设计中不存在组中的任何时钟,则该组变空。只有当至少两个组有效且不为空时,set_clock_groups约束才会保持有效。如果只有一个组保持有效且所有其他组都为空,则不应用set_clock_groups约束并生成错误消息。 使用原理图查看器或时钟网络报告可视化时钟树的拓扑,并确定哪些时钟不能一起定时。您还可以使用时钟交互报告来查看两个时钟之间的现有约束,并确定它们是否共享相同的主时钟 - 也就是说,它们具有已知的相位关系 - 或者识别没有共同周期的时钟(不可扩展)。

5.1时钟类别

1)同步时钟(Synchronous Clocks) 当两个时钟的相对相位是可预测的时,它们是同步的。当它们的树源自网表中的同一根,并且它们具有共同的时间段时,通常就是这种情况。 2)异步时钟(Asynchronous Clocks ) 当无法确定它们的相对相位时,两个时钟是异步的。 例如,由电路板上的独立振荡器产生并通过不同输入端口进入FPGA的两个时钟没有已知的相位关系。因此,它们必须被视为异步。如果它们是由电路板上的相同振荡器产生的,那就不是真的。 3)不可扩展时钟(Unexpandable Clocks ) 当定时引擎无法确定超过1000个周期的共同周期时,两个时钟不可扩展。在这种情况下,在时序分析期间使用1000个周期内的最差设置关系,但是时序引擎无法确保这是最悲观的情况。 这是典型的情况下,两个时钟的奇数分数周期比。例如,考虑由共享同一个主时钟的两个MMCM生成的两个时钟clk 0和clk 1: 1,clk0的周期为5.125 ns。 2,Clk1的周期为6.666 ns. 它们的时钟上升沿不会在1000个周期内重新对齐。定时引擎在两个时钟之间的时序路径上使用0.01 ns的建立路径要求。即使两个时钟在其时钟树根处具有已知的相位关系,它们的波形也不允许它们之间的安全时序分析。

5.2异步时钟组(Asynchronous Clock Groups)

异步时钟和不可扩展的时钟无法安全定时。在分析期间,可以使用set_clock_groups命令忽略它们之间的时序路径。 创建异步时钟组 使用-asynchronous选项创建异步组。

set_clock_groups -name async_clk0_clk1 -asynchronous -group {clk0 usrclk itfclk} -group {clk1 gtclkrx gtclktx}

5.3 排他时钟组(Exclusive Clock Groups)

一些设计具有几种需要使用不同时钟的操作模式。时钟之间的选择通常使用诸如BUFGMUX和BUFGCTRL或A LUT的时钟多路复用器来完成。 通过使用set_clock_groups的选项来约束它们: 1,-logically_exclusive 2, -physically_exclusive 例:MMCM实例生成clk0和clk1,它们连接到BUFGMUX实例clkmux。clkmux的输出驱动设计时钟树。 默认情况下,Vivado IDE会分析clk0和clk1之间的路径,即使两个时钟共享同一个时钟树且不能同时存在。 您必须输入以下约束以禁用两个时钟之间的分析:

set_clock_groups -name exclusive_clk0_clk1 -physically_exclusive \
-group clk0 -group clk1

6 时钟延迟、抖动和不确定性(Clock Latency, Jitter, and Uncertainty)

6.1 时钟延迟

在电路板上和FPGA内部传播之后,时钟边沿到达目的地并有一定的延迟。此延迟通常表示为: 1,源延迟(时钟源点之前的延迟,通常在设备外部) 2,网络延迟 对于Xilinx FPGA,主要使用set_clock_latency命令指定器件外部的时钟延迟。

# Minimum source latency value for clock sysClk (for both Slow and Fast corners)
set_clock_latency -source -early 0.2 [get_clocks sysClk] 
# Maximum source latency value for clock sysClk (for both Slow and Fast corners)
set_clock_latency -source -late 0.5 [get_clocks sysClk]

6.2时钟不确定性

1)时钟抖动(Clock Jitter) 对于ASIC器件,时钟抖动通常用时钟不确定性特性表示。但是,对于Xilinx FPGA,抖动属性是可预测的。它们可以由时序分析引擎自动计算,也可以单独指定。 ①输入抖动是连续时钟边沿与标称或理想时钟到达时间的变化之间的差异。输入抖动是绝对值,表示时钟边沿每一侧的变化。 使用set_input_jitter命令分别指定每个主时钟的输入抖动。您不能直接在生成的时钟上指定输入抖动。Vivado IDE定时引擎自动计算生成的时钟从其主时钟继承的抖动。 ②系统抖动是由电源噪声,电路板噪声或系统的任何额外抖动引起的整体抖动。 使用set_system_jitter命令仅为整个设计设置一个值,即所有时钟。 以下命令在通过输入端口clkin传播的主时钟上设置+/- 100 ps抖动:

set_input_jitter [get_clocks -of_objects [get_ports clkin]] 0.1

2)额外的时钟不确定性 使用set_clock_uncertainty命令根据需要为不同的角点,延迟或特定时钟关系定义额外的时钟不确定性。这是从时序角度为设计的一部分添加额外余量的便捷方式。

set_clock_uncertainty 2.0 -from [get_clocks clk1] -to [get_clocks clk2] 
set_clock_uncertainty 1.0 [get_clocks clk1]

本文分享自微信公众号 - FPGA开源工作室(leezym0317)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券