时钟不确定度(uncertainty)

可以通过set_clock_uncertainty约束来定义时钟周期的时序不确定度(uncertainty)。该约束用于建模可能影响有效时钟周期的各种因素,主要包括:

  1. 时钟抖动(jitter)
  2. 制造偏差(foundry margin)
  3. 工具差异(signoff margin)等

    要注意的是:

    • 时钟抖动仅影响建立时间检查
    • 保持时间检查不受时钟抖动影响,因为其数据捕获沿和发起沿使用同一时钟边沿

    set_clock_uncertainty  
        uncertainty [object_list] 
        //下面两行选项必须成对出现,每条命令最多一对
        //****************************************************************************
        [-from from_clock | -rise_from rise_from_clock | -fall_from fall_from_clock]
        [-to to_clock | -rise_to rise_to_clock | -fall_to fall_to_clock]
        //****************************************************************************
        [-setup] [-hold]
        //注:该命令的uncertainty参数一定要放在object_list参数前(如有)       

    object_list:

     如果对象是时钟,则不确定度会直接被指定在时钟上;如果对象是端口,则所有经过该端口的时钟会被指定时钟不确定度;如果对象是引脚,则所有经过该引脚的所有时钟会被指定时钟不确定度。注意这三者是可以相互覆盖的,即如果如果一个时钟的时钟不确定度为0.5,但其定义在一个时钟不确定度为0.4端口上,则最终到达触发器的时钟引脚的时钟不确定度则为0.4;如果触发器的时钟引脚定义了一个0.3的时钟不确定度,则不论其他定义如何,这个触发器的时钟不确定度一定是0.3。

            如果指定的对象是一个组合逻辑叶单元的引脚,则该引脚所属的叶单元会被设置size only属性,确保其不会在综合过程中被优化掉(需要注意的是,此时的size_only属性是隐式设置的,这与使用set_size_only命令显式设置不同,无法使用report_attribute命令或get_attribute命令直接查看,而只能使用report_cell命令或report_size_only命令间接查看,隐式size_only属性的优先级高于显式size_only属性),使用list_size_only_types命令可以列出叶单元被设置size_only属性的原因(显式或隐式)。

            下面是一些简单的使用示例。

    #直接将时钟不确定度定义在时钟上
    set_clock_uncertainty 0.2 [get_clocks clk1]
     
    #将时钟不确定度定义在时钟端口上
    set_clock_uncertainty 0.3 [get_ports clk1]
     
    #将时钟不确定度定义在时钟引脚上
    set_clock_uncertainty 0.4 [get_pins t_reg/CK]

            在定义了时钟不确定度后,我们可以使用report_clock -skew命令查看所有定义了的时钟不确定度,如图1所示。 

            可以从图中看出,定义了三个对象的时钟不确定度,t_reg/CK可以很明显看出是一个触发器的时钟引脚,而为什么会有两个clk1对象呢?其实答案很简单,这是两个同名的对象,但是其中一个是时钟本身,另一个是时钟端口。 

    时钟不确定度

             考虑两个触发器组成的简单结构,其中第一个触发器即发射触发器由clk1时钟控制,第二个触发器即捕获触发器由clk2时钟控制,有关发射触发器和捕获触发器的内容,可以看以往的文章静态时序分析:建立时间分析-CSDN博客,具体电路结构如图2所示。

      现在我们只研究从t_reg的时钟端到data_out_reg的数据输入端的时序路径。首先使用下面的命令在两个时钟端口上分别创建两个时钟对象。

    create_clock -period 10 -waveform {5 10} [get_ports clk1]
    create_clock -period 10 -waveform {5 10} [get_ports clk2] 
    
    set_clock_uncertainty 0.1 [get_clocks clk1]
    set_clock_uncertainty 0.5 [get_clocks clk2]

    最后我们使用report_timing命令给出建立时间时序报告,如图3所示。

            从图3中可以看出,只有捕获时钟的时钟不确定度会影响相应的时序路径而发射时钟的时钟不确定度则不会。捕获时钟clk2的时钟不确定度体现在了clock uncertainty这一项中,导致data  required time减少了0.5,也就导致了最后的裕度(slack)减少了0.5

    在不同设计阶段,uncertainty包含的内容有所不同:

    • 时钟树综合前:工具默认时钟延迟为理想状态,uncertainty需包含时钟偏斜(skew)的影响
    • 时钟树综合后:时钟延迟设置为传播(propagated)模式,工具可计算实际时钟延迟,此时uncertainty不再包含skew

    如下图所示波形,可以这么定义不确定度,因为hold不考虑jitter影响,所以-hold后面的参数比-setup后面的参数小。

    • set_clock_uncertainty -setup 0.2 [get_clocks CLK_CONFIG]
    • set_clock_uncertainty -hold 0.05 [get_clocks CLK_CONFIG]

    如下图所示两个不同时钟域SYS_CLK和CFG_CLK之间的路径。将100ps用作建立时间检查的不确定度,将50ps用作保持时间检查的不确定度,可以这么设置:

    • set_clock_uncertainty -from SYS_CLK -to CFG_CLK -hold 0.05
    • set_clock_uncertainty -from SYS_CLK -to CFG_CLK -setup 0.1

    Logo

    有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

    更多推荐