我是靠谱客的博主 风中皮带,最近开发中收集的这篇文章主要介绍FPGA-时序分析基础(2)必需的SDC约束(Required SDC Constraints)(1),觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
必需的SDC约束(Required SDC Constraints)(1)
时钟约束:
理想时钟约束(Ideal clock constraints)
有两种类型的时钟约束:
- 基本时钟:
- 绝对时钟/基准时钟:由器件输入管脚输入的时钟;
- 虚拟时钟:驱动外部器件的时钟,不真正进入fpga内部,为IO时序分析确定正确的发送、锁存沿的相对关系。
- 衍生时钟:(来自fpga内部的基本时钟或其他的衍生时钟,其与时钟源之间必须定义明确的关系)
如:pll的输出时钟就是衍生时钟,它在一定程度上与pll的输入时钟相关。
默认情况下,所有时钟之间都彼此相关,时序分析工具会分析所有跨时钟域信号之间的传递,可以通过约束时序例外来忽略对这些时钟的分析。
基本时钟约束的tcl语句:
#command
create_clock
#options
[-name <clock_name>]
-period <time>
[-waveform {<rise_time> <fall_time>}]
[<target>] #指定对哪个位置进行时序约束,一般为输入管脚,用 -getport 进行访问,若不明确指定,则会被认为是虚拟时钟;
[-add] #指定对同一位置有多个时钟约束。
#[] = optional
时序分析器的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界面如图:
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界面如图:
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)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复