FPGA-时序分析基础(2)

必需的SDC约束(Required SDC Constraints)(1)

时钟约束:

理想时钟约束(Ideal clock constraints)

有两种类型的时钟约束:

  1. 基本时钟:
  • 绝对时钟/基准时钟:由器件输入管脚输入的时钟;
  • 虚拟时钟:驱动外部器件的时钟,不真正进入fpga内部,为IO时序分析确定正确的发送、锁存沿的相对关系。
  1. 衍生时钟:(来自fpga内部的基本时钟或其他的衍生时钟,其与时钟源之间必须定义明确的关系)
    如:pll的输出时钟就是衍生时钟,它在一定程度上与pll的输入时钟相关。

默认情况下,所有时钟之间都彼此相关,时序分析工具会分析所有跨时钟域信号之间的传递,可以通过约束时序例外来忽略对这些时钟的分析。

基本时钟约束的tcl语句:

#command
create_clock 
#options
[-name ]
-period 

时序分析器的GUI界面如图:
FPGA-时序分析基础(2)_第1张图片
衍生时钟约束的tcl语句:

#command
create_generated_clock
#options
[-name ]
-source  #指定源时钟的位置,与衍生时钟的位置越近越好。如:PLL的输出时钟的源时钟定义为PLL的输入时钟;
[-master_clock ] #如果因为 -add 选项使源时钟位置存在多个时钟,可以通过该命令来指定用户需要定义的源时钟;
[-divide_by ]
[-multiply_by ]
[-duty_cycle ]
[-invert]
[-phase ]
[-edges ]
[-edge_shift ] #指定衍生时钟与源时钟之间的关系。
[]
[-add]

时序分析器的GUI界面如图:
FPGA-时序分析基础(2)_第2张图片
Example:
FPGA-时序分析基础(2)_第3张图片

create_clock -period 10 [get_ports clk_in] #锁存时钟

create_clock -period 10 -name clk_in_virt #发送时钟

create_generated_clock -name clk_div -source \ [get_pins inst|clk] -divide_by 2 [get_pins inst|q]

一般可以在定义基本时钟后,定义一个与其相对应的虚拟时钟,虚拟时钟的属性可以与基本时钟相同,也可以不同,主要取决于fpga驱动外部器件的时钟。这样约束基本时钟,可以使时序分析器自动约束fpga内部到IO的不确定时间。

PLL的时钟约束:derive PLL clocks
使用这一命令,在约束好PLL的输入时钟的前提下,时序分析器可以自动约束PLL的衍生时钟,即便在设计中PLL的参数有变化,其相应的衍生时钟约束也会自动更新。
具体的tcl语句:

#command
derive_pll_clocks

[-create_base_clocks] #在未指定pll的输入时钟的情况下,可以使用该选项,时序分析器会根据pll的参数设置来自动创建一个输入时钟

write_sdc -expand #可以使用该命令来将 derive_pll_clocks 命令使用标准的 create_clock 和 create_generated_clock 命令来描述

时序分析器的GUI界面如图:
FPGA-时序分析基础(2)_第4张图片
Example:
FPGA-时序分析基础(2)_第5张图片

#使用生成时钟命令
create_clock -period 10.0 [get_ports in_clk]

create_generated_clock -name c100 \ #c0输出时钟
    -source [get_pins {inst|altpll_component|pll|inclk[0]}] \ #源时钟
    -divide_by 1 \ #1分频
    [get_pins {inst|altpll_component|pll|clk[0]}] #目标管脚

create_generated_clock -name c200 \ #c1输出时钟
    -source [get_pins {inst|altpll_component|pll|inclk[0]}] \ 
    -multiply_by 2 \ #2倍频
    [get_pins {inst|altpll_component|pll|clk[1]}]

create_generated_clock -name c200_shift \ #c2输出时钟
    -source [get_pins {inst|altpll_component|pll|inclk[0]}] \ 
    -multiply_by 2 \ #2倍频
    [get_pins {inst|altpll_component|pll|clk[2]}]

#使用derive命令
create_clock -period 10.0 [get_ports in_clk]

derive_pll_clocks

#或者简单的:
derive_pll_clocks \ 
    -create_based_clocks #使用该命令,pll的输出时钟名字会被命名为目标管脚名称,无法定制
#可添加如下命令来修改输出时钟的名称
    #write_sdc -expand -name

以上,为理想状态下的时序约束,并未考虑到fpga外部输入的时钟的延时(latency)、抖动(jitter)、偏移(skew)及其他各方面因素。

非理想时钟约束(Non-ideal clock constraints)

三种特殊的时钟约束:

  • set_clock_latency 定义了输入时钟上的源时钟延时,指电路板上的相关延时,会使输入时钟比预期到的早或者晚。如:反馈时钟延时,一般输出时钟经过一定延时后若需要输入回到fpga中,则需要约束这一时钟延时。
  • derive_clock_uncertainty 可以自动为时钟添加不确定值,包括对建立时间和保持时间的不确定值,以及作用在虚拟时钟上时,会添加对IO的不确定值,建议在设计中对所有时钟添加derive_clock_uncertainty 命令。
  • derive_clock_uncertainty 可以自动为时钟添加不确定值,包括对建立时间和保持时间的不确定值,以及作用在虚拟时钟上时,会添加对IO的不确定值,建议在设计中对所有时钟添加derive_clock_uncertainty 命令。
  • set_clock_uncertainty 可以手动添加时钟不确定值,包括建立时间/保持时间不确定值,以及时钟的抖动(jitter)、保护带(guard band)、偏移(skew)的不确定值。

你可能感兴趣的:(fpga)