FPGA-时序分析基础(2)

本文详细介绍了FPGA设计中的时钟约束,包括基本时钟、衍生时钟和非理想时钟约束。通过create_clock和create_generated_clock等TCL命令,阐述了如何定义和约束时钟,以及如何处理时钟延迟、不确定性。还提到了PLL时钟约束的derive_pll_clocks命令,用于自动约束PLL的输出时钟。最后,讨论了输入时钟的源时钟延时和时钟不确定性的处理方法。
摘要由CSDN通过智能技术生成

必需的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)的不确定值。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Martin_MaB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值