【FPGA】时序概念

作者:子墨祭,本文转载自:CSDN博客

一、时钟定义

  • Primary Clock
  • Virtual Clock
  • Generated Clock
  • Clock groups
  • 1.1 Primary Clocks
    指输入到逻辑的外时钟,包括管脚输入的时钟、GT产生的时钟(txoutclk和rxoutclk)。

    primary clocks是vivado时序分析工具认为的时钟源点,一定要定义在最初始端。

    primary clocks只能用create_clk命令来定义。

    做时钟约束前,首先就要定义primary clocks,才能继续定义其他时钟和约束。

    case1:(管脚输入)

    create_clock -name devclk -period 10 -waveform{0 5}[get_ports clkin]

    推荐primary时钟定义在pin脚,不要定义在bufg的输出端。

    case2:(gt产生)

    create_clock -name rxclk -period 3.33 [get_pins gt0/RXOUTCLK]

    MMCM产生的几个时钟,称为generated时钟,都以primary时钟rxclk为源头。

    1.2 Generated Clocks
    内部逻辑产生的时钟;包括MMCM、PLL、用户逻辑分频产生的时钟。

    create_clock -name clkin -period 10 [get_ports clkin]

    create_generated_clock -name clk_gen -source[get_pins mmcm0/CLKIN]\

    [get_pins mmcm0/CLKOUT]

    -source指明了它的master clock,只能是pin脚或者mmcm/pll的输出脚,通过寄存器分频时,source的源也可以是寄存器的Q脚

    Rename auto-generated clock

    对于7系列的器件,MMCM可以自动generate clock,用户只需要定义primary clock即可。但是它产生的generated_clock名称都是以mmcm输出的时钟管脚名来命名的,在时钟分析时很不直观。还是上图的例子,mmcm的输出时钟CLKOUT0,那么自动产生的时钟名为clkout0;可以用create_generated_clock命令来重命名,如:
    create_generated_clock -name clk_rx[get_pins mmcm_adv_inst/CLKOUT0]

    上面的命令把clkout0重命名为clk_rx。

    1.3 Virtual Clock
    虚拟时钟通常用于设定对输入和输出的延迟约束,之所以称为“虚拟”,是因为这种时钟在物理上没有与设计中的任何网表对象相连;定义时使用create_clock命令,但无需指定源对象 ,在下列情况需要用到虚拟时钟:

    所有的设计时钟都不是外部器件I/O的参考时钟;

    FPGA的I/O路径与一个内部生成的时钟相关,但是该时钟不能合适地通过对板级时钟计时来生成(如两个周期的比不是整数);

    希望为与I/O延迟约束相关的时钟设定不同的抖动和延迟,但是不希望修改内部时钟的特征 ;

    比如时钟clk_virt的周期为10ns,且不与任何网表对象相连,可以这样定义“create_clock -name clk_virt –period 10”,没有指定objects参数;注意,虚拟时钟必须在使用之前便定义好 ;

    1.4 Clock groups
    时钟组,可以使用set_clock_groups命令建立时钟组,Vivado不会对不同时钟组的时钟之间进行时序分析;但是前提是设计者要确保异步关系都得到了妥善的处理,如采用握手协议。

    如果让vivado在布线时分析两个不必要分析的时钟,会白白增加布线时间。

    比如逻辑由两个时钟clk0和clk1,分别从管脚进入逻辑,clk0和clk1都产生过一些各自的generated clocks,可采用如下命令:
    set_clock_group -name async_clk0_clk1 -asynchronous\

    -group [get_clocks -include_generated_clocks clk0]\

    -group [get_clocks -include_generated_clocks clk1]

    上面的命令将clk0及其generated 时钟群与clk1及其generated时钟群声明为异步时钟组clock_group,vivado将不对着两个时钟组进行异步分析。

    注:set_clock_group的优先级高于set_false_path和set_max_delay。

    又比如,一个MMCM输出了两个时钟clk0和clk1,着两个时钟被连接到一个clk_mux上,然后这个clk_mux的输出作为内部逻辑时钟使用。显而易见,clk0和clk1物理上必然不会同时存在,但vivado 工具默认情况下还是会分析clk0和clk1的interaction,增加布线难度和时间。可以用如下命令:
    set_clock_groups -name exclusive_clk0_clk1 -physically_exclusive -group clk0 -group clk1

    上面的约束增加后,vivado将不再对clk0和clk1的interaction进行分析。

    二、时钟分类
    1. 同步时钟:即两个时钟间有可预知的相对相位,通常它们的时钟树源自网表中的同一个根,且有一个公共周期;
    2. 异步时钟:两个时钟间有无法预知的相对相位。比如两个独立的晶振信号通过两个输入端口进入FPGA中,生成两个时钟。由于两个主时钟没有明确的相位关系,两个生成时钟间便是异步的;
    3. 不可扩展时钟Unexpandable Clocks,是指时序引擎在1000个周期内无法判断两个时钟是否有公共周期。这种情况通常发生在两个时钟周期比是一个特殊的分数,比如一个主时钟通过MMCM生成一个周期为5.125ns的时钟clk1和一个周期为6.666ns的时钟clk2,尽管它们在时钟树的根上有一个确定的相位关系,但是在1000个周期内时钟上升沿无法再次对齐。

    三、I/O delay约束

  • set_input_delay
  • set_output_delay
  • I/O delay约束基于源同步,源同步,是指逻辑和上游芯片的接口信号,都使用同一个板上时钟;

    set_input_delay

    这个约束是告诉vivado,从管脚上看,输入信号和时钟的相位关系。注意set_input_delay的数值,不是指逻辑输入管脚到逻辑内部寄存器的延迟值,而是指,时钟沿到逻辑的时钟管脚时,数据沿的相位关系,具体与对端芯片的Tco强相关。

    下面给出计算方法:

    input delay(max) = Tco(max) + Ddata(max) + Dclk_to_ExtDev(max) - Dclk_to_FPGA(min)

    input delay(min) = Tco(min) + Ddata(min) + Dclk_to_ExtDev(min) - Dclk_to_FPGA(max)

    一般来讲,上面的Tco、Ddata、Dclk_to_ExtDev、Dclk_to_FPGA基本都是固定的,并且Dclk_to_ExtDev、Dclk_to_FPGA差值很小,Ddata的延时在1ns以内,所以input_delay的值关键在于对方芯片的Tco。

    set_output_delay

    output delay(max) = Tsu + Ddata(max) +Dclk_to_FPGA(max) -Dclk_to_ExtDev(min)

    output delay(min) = Ddata(min) - Th +Dclk_to_FPGA(min) -Dclk_to_ExtDev(max)

    四、Timing Exception

  • set_max_delay
  • set_min_delay
  • set_false_path
  • set_multicycle_path
  • 注:上述优先级比周期约束高,但低于set_clock_group。

    set_max_delay

    set_max_delay与et_min_delay这两种约束,一般用于特定的异步路径上,并且这种异步路径又不能不分析,比如异步FIFO的读写地址传递,虽然是格雷码,但也只能保证在一个源时钟周期内只有一条线发送翻转,如果不对源时钟到目的时钟路径进行max_delay的约束,那么很有可能地址从源时钟传递到目的时钟时,其传播路径延时会超过两个源时钟舟曲,特别是源时钟周期很小的情况下。

    又比如说,同一时钟内,当某条路径总是不能满足(即周期跑不过),可以先用set_max_delay将这条关键路径约束起来(它的优先级比周期约束高),这样vivado会优先将这条路径布了,然后再去布其他路径,加大了布线成功的概率:

    set_max_delay [-datapath_only] [-from ] [-to ][-through ]

    set_min_delay [-from ] [-to ][-through ]

    set_false_path

    对某条特定路径,让vivado不去分析,特别是两个异步时钟之间。

    比如:用一个快时钟去采样慢时钟信号的上升沿,只要用快时钟将待采样信号大量拍后,再去取沿,肯定取得到,那么完全可以让vivado不去分析这两个时钟的异步关系,减小布线时间。

    具体命令如下:

    set_false_path -from[get_cells ] -to[get_cells ]

    set_multicycle_path

    当时钟周期很难满足时,如果某条path从功能上看,两个寄存器间延迟并没必要到一个周期内,可以用multicycle来放松约束。(这种情况通常为采样告警灯场合下)

    上图中,寄存器data0_reg实际上每两个时钟周期才翻转一次,当data0_reg到data1_reg的走线成为关键路径时,完全可以用multicycle来放松约束。

    set_multicycle_path 2 -setup -from[get_pins data0_reg/C] -to[get_pins data1_reg/D]

    最新文章

    最新文章