我是靠谱客的博主 风中皮带,最近开发中收集的这篇文章主要介绍FPGA-时序分析基础(2)必需的SDC约束(Required SDC Constraints)(1),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

时钟约束:

理想时钟约束(Ideal clock constraints)

有两种类型的时钟约束:

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

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

基本时钟约束的tcl语句:

#command
create_clock 
#options
[-name <clock_name>]
-period <time>
[-waveform {<rise_time> <fall_time>}]
[<target>] #指定对哪个位置进行时序约束,一般为输入管脚,用 -getport 进行访问,若不明确指定,则会被认为是虚拟时钟;
[-add] #指定对同一位置有多个时钟约束。
#[] = optional

时序分析器的GUI界面如图:
create_clock_GUI
衍生时钟约束的tcl语句:

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

时序分析器的GUI界面如图:
clock_generated_GUI
Example:
create_example

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界面如图:
derive_pll_GUI
Example:
derive_pll_example

#使用生成时钟命令
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-时序分析基础(2)必需的SDC约束(Required SDC Constraints)(1)的全部内容,希望文章能够帮你解决FPGA-时序分析基础(2)必需的SDC约束(Required SDC Constraints)(1)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部