FPGA设计之时序约束(一)——基准及派生时钟

本文针对Intel FPGA。
本文按照时钟的产生顺序介绍了在FPGA时序约束时,.sdc文件常用的约束命令。实际操作中,我们使用timing Analyzer的GUI界面很容易产生这些命令,因此无需死记硬背这些语法。本文的目的是帮助大家了解这些语法,方便在后期修改SDC或查错。

Create Clock

创建基准时钟。告诉Timing Analyzer本工程输入的时钟频率。基准时钟是输入到FPGA中的原始输入时钟。与PLLs输出的时钟不同,基准时钟一般是由片外晶振或者时钟分配板产生的,对于涉及到级联的系统也有可能是数据收发器送来的时钟。定义基准时钟的意义是:可以让其他生成时钟和时序约束都以该基准时钟为参照。

  • 命令格式:
create_clock -name {local_clk_i} -period 20.000 -waveform { 0.000 10.000 } [get_ports {local_clk_i}]
  • 解析:
    name 这是一个可选项,若设置则时序报告以此名称来汇报,若无则默认和get_ports内容一样
    period 为时钟周期
    waveform 约束时钟上升和下降沿位置,也就是占空比约束
    get_ports 为顶层文件声明的端口名称,对应晶振的引脚

Create Generated Clock

创建PLL/经分频器产生的派生时钟。

  • 命令格式:
//模板
create_generated_clock [-h | -help] [-long_help] [-add] [-divide_by  ] [-duty_cycle  ] [-edge_shift  ] [-edges  ] [-invert] [-master_clock  ] [-multiply_by  ] [-name  ] [-offset 
  • 解析:
    name 派生时钟的名称,推荐设置成可读性高的名称,不必和自动产生的一样
    source 只是声明接入时钟源的PLL pin,不知道该源是多少频率
    duty_cycle 占空比
    multiply_by 乘法因子
    divide_by 除法因子
    master_clock 指真正驱动该派生时钟的时钟信号源,根据这一时钟源的频率,通过上面的计算因子求得源时钟
    edges 指定master_clock的时钟边沿,[首上升沿 首下降沿 次上升沿]
    targets 最终产生的派生时钟,若是PLL派生的时钟则使用get_pins

注意:调用create_generated_clock命令以在pll的输出时钟上生成衍生时钟时,create_generated_clock的源是pll的输入时钟引脚,在调用该命令之前,我们必须手动的为pll生成(create_clock)一个作为其输入时钟的基础时钟,如果我们未定义这个输入时钟(master_clock),或者HDL描述的连线关系和SDC文件不符合。那么报告中就不会有pll的输出时钟,分析仪会给出警告:

Warning (332087): The master clock for this clock assignment could not be derived.  Clock: tdc_aid_pll_1_inst|altpll_component|auto_generated|pll1|clk[0] was not created.
Warning (332034): Specified master clock: global_clk_i not found on or feeding the specified source node: tdc_aid_pll_1_inst|altpll_component|auto_generated|pll1|inclk[0]

这种情况下相当于没有对派生时钟进行约束,很可能会导致时序问题。

Derive_pll_clocks

这个命令会自动创建PLL输出的相关时钟约束。利用Timing Analyzer的GUI界面选择derive_pll_clocks,run,write到,sdc文件。然后编译,在Timing Analyzer里查看生效后时钟信息。

 derive_pll_clocks的命令格式为:
 derive_pll_clocks  [-create_base_clocks] [-use_tan_name]
  • 解析:
    [-create_base_clocks]自动为pll生成输入时钟
    [-use_tan_name],在默认的情况下,时钟名为系统命名格式的名字

可以将drive_pll_clocks命令放在工程的sdc中,以使得derive_pll_clocks命令能自动的检测pll的任何变化,当使用derive_pll_clocks命令,将自动对pll进行约束。但SDC文件中并不会产生相关的派生时钟约束命令。

用derive_pll_clocks命令创建PLL相关的时钟很是方便,但不好的地方就是,时钟的命名太过复杂,我们在添加与此时钟相关的时序约束时,就必须用这种名字很长的时钟,容易出错,且可读性也差。所以建议还是采用create_generated_clock命令来创建PLL的时钟。

参考链接
1.士兵突击时序分析系列

你可能感兴趣的:(时钟与时序)