文章目录

  • 8.1 建立时间检查(Setup Timing Check)
  • 8.1.1 触发器到触发器路径(Flip-flop to Flip-flop Path)
  • 8.1.2 输入到寄存器路径(Input to Flip-flop Path)
  • 8.1.3 触发器到输出路径(Flip-flop to Output Path)
  • 8.1.4 输入到输出路径(Input to Output Path)
  • 8.1.5 频率直方图(Frequency Histogram)
  • 8.2 保持时间检查(Hold Timing Check)
  • 8.2.1 触发器到触发器路径(Flip-flop to Flip-flop Path)
  • 8.2.2 输入到触发器路径(Input to Flip-flop Path)
  • 8.2.3 触发器到输出路径(Flip-flop to Output Path)
  • 8.2.4 输入到输出路径(Input to Output Path)
  • 知乎翻译圣经

本章节将介绍静态时序分析所执行的一部分检查,这些检查旨在详尽地验证待分析设计的时序。

  • 两项主要的检查是建立时间和保持时间检查。一旦在触发器的时钟引脚上定义了时钟,便会自动推断出该触发器的建立时间和保持时间检查。时序检查通常会在多个条件下执行,包括最差情况的慢速条件和最佳情况的快速条件。通常,最差情况的慢速条件对于建立时间检查很关键,而最佳情况的快速条件对于保持时间检查很关键(尽管也可以在最差情况的慢速条件下执行保持时间检查)。
  • 本章节中的示例假定网络延迟为零,这样做是为了简化说明,并且不会更改所介绍的概念。


8.1 建立时间检查(Setup Timing Check)

建立时间检查会验证触发器时钟和数据引脚之间的时序关系,从而满足建立时间要求。换句话说,建立时间检查会确保在触发器输入时钟之前,数据在触发器的输入端可用。在时钟的有效沿到达触发器之前,数据应在一定时间内保持稳定,即触发器建立时间,该要求将确保数据可靠地被捕获到触发器中。图8-1展示了典型触发器的建立时间要求,建立时间检查将验证触发器的建立时间要求。



机器学习时序异常检测 时序检查_STA


通常,有一个发起触发器(用于发起数据的触发器)和捕获触发器(用于捕获数据的触发器),这个捕获触发器的建立时间要求必须满足。建立时间检查将验证从发起触发器到捕获触发器的最长(最大)路径,这两个触发器的时钟可以相同也可以不同。建立时间检查是从发起触发器中时钟的第一个有效沿到捕获触发器中时钟后面最接近的那个有效沿。建立时间检查将确保上一个时钟周期发起的数据准备好在一个周期后被捕获

现在研究一个简单示例,如图8-2所示,其中发起触发器和捕获触发器具有相同的时钟。时钟机器学习时序异常检测 时序检查_静态时序分析_02的第一个上升沿在机器学习时序异常检测 时序检查_Timing Check_03时间后出现在发起触发器的时钟引脚上,由该时钟沿发起的数据出现在触发器机器学习时序异常检测 时序检查_Path_04机器学习时序异常检测 时序检查_Timing Check_05引脚的所需时间为机器学习时序异常检测 时序检查_STA_06。时钟机器学习时序异常检测 时序检查_静态时序分析_02的第二个上升沿(通常在一个周期后检查建立时间)出现在捕获触发器机器学习时序异常检测 时序检查_Path_04的时钟引脚上的时间为机器学习时序异常检测 时序检查_静态时序分析_09。这两个时间之差必须大于触发器机器学习时序异常检测 时序检查_Path_04的建立时间要求,以确保触发器机器学习时序异常检测 时序检查_Path_04可靠地捕获数据。



机器学习时序异常检测 时序检查_Path_12


建立时间检查可以数学表达为:

机器学习时序异常检测 时序检查_机器学习时序异常检测_13

(机器学习时序异常检测 时序检查_机器学习时序异常检测_14) 建立时间检查的要求也即是:机器学习时序异常检测 时序检查_Timing Check_15

(机器学习时序异常检测 时序检查_机器学习时序异常检测_16) (上面不对。因为机器学习时序异常检测 时序检查_STA_17是要求,而不是实际时间,应该是机器学习时序异常检测 时序检查_Timing Check_18要小于机器学习时序异常检测 时序检查_机器学习时序异常检测_19才能满足建立时间约束,而最晚到达时间机器学习时序异常检测 时序检查_机器学习时序异常检测_20能够满足上述条件,则全部能够满足,所以总是使用最慢工艺角/max来进行检查。而裕量则是机器学习时序异常检测 时序检查_STA_21,且根据以上分析,在进行优化时多对机器学习时序异常检测 时序检查_静态时序分析_22也就是组合逻辑部分进行delay的优化,使其变小一些。

其中机器学习时序异常检测 时序检查_Timing Check_03是发起触发器机器学习时序异常检测 时序检查_静态时序分析_24的时钟树延迟,机器学习时序异常检测 时序检查_STA_25是组合逻辑数据路径的延迟,机器学习时序异常检测 时序检查_Timing Check_26是时钟周期,机器学习时序异常检测 时序检查_Path_27是捕获触发器机器学习时序异常检测 时序检查_Path_04的时钟树延迟。

换句话说,数据到达捕获触发器机器学习时序异常检测 时序检查_Timing Check_05引脚所花费的总时间必须小于时钟传输到捕获触发器所花费的时间加上时钟周期再减去建立时间要求。

由于建立时间检查受到-max的约束(对数据路径时延设定上限),因此建立时间检查始终使用最长或最大的时序路径。出于同样的原因,通常在延迟最大的慢工艺角(slow corner)下执行建立时间检查。


8.1.1 触发器到触发器路径(Flip-flop to Flip-flop Path)

这里有一个建立时间检查的报告:



机器学习时序异常检测 时序检查_Timing Check_30


该报告中显示发起触发器(由Startpoint指定)的实例名称为机器学习时序异常检测 时序检查_静态时序分析_24,由时钟机器学习时序异常检测 时序检查_静态时序分析_02的上升沿触发。捕获触发器(由Endpoint指定)为机器学习时序异常检测 时序检查_Path_04,也由时钟机器学习时序异常检测 时序检查_静态时序分析_02的上升沿触发。路径组(Path Group)显示它属于路径组机器学习时序异常检测 时序检查_静态时序分析_02。如上一章所述,设计中的所有路径都基于捕获触发器的时钟归类为路径组。路径类型(Path Type)显示此报告中的延迟均为最大路径延迟,表明这是建立时间检查。这是因为建立时间检查对应于通过逻辑的最大(或最长路径)延迟。注意,保持时间检查对应于通过逻辑的最小(或最短路径)延迟

Incr列显示了指定端口或引脚的单元或网络延迟增量,Path列显示了数据实际到达和需要到达的路径累积延迟,这是用于此示例的时钟约束:

create_clock -name CLKM -period 10 -waveform {0 5} \
	[get_ports CLKM]
set_clock_uncertainty -setup 0.3 [all_clocks]
set_clock_transition -rise 0.2 [all_clocks]
set_clock_transition -fall 0.15 [all_clocks]

数据发起路径需要机器学习时序异常检测 时序检查_机器学习时序异常检测_36的延迟才能到达触发器机器学习时序异常检测 时序检查_Path_04机器学习时序异常检测 时序检查_Timing Check_05引脚,这是捕获触发器输入端的到达时间。捕获边沿(建立时间检查时为一个周期)为机器学习时序异常检测 时序检查_静态时序分析_39,为此时钟指定了机器学习时序异常检测 时序检查_静态时序分析_40的时钟不确定度(clock uncertainty),因此,有效时钟周期由于不确定度而减少了机器学习时序异常检测 时序检查_静态时序分析_40。时钟不确定度包括由于时钟源抖动引起的周期变化以及用于分析的任何其它时序裕量。从总的捕获路径中还要减去触发器的建立时间机器学习时序异常检测 时序检查_Timing Check_42(library setup time),得出数据需要到达的时间为机器学习时序异常检测 时序检查_STA_43。由于数据实际到达时间为机器学习时序异常检测 时序检查_机器学习时序异常检测_36,因此在此时序路径上有机器学习时序异常检测 时序检查_Timing Check_45的正裕量(slack)。请注意,所需到达时间和实际到达时间之差可能看起来是机器学习时序异常检测 时序检查_静态时序分析_46,但是实际值是出现在报告中的机器学习时序异常检测 时序检查_Timing Check_45。之所以存在差异,是因为报表仅显示小数点后两位数字,而内部计算和存储的值比所报告的精度更高。

时序报告中的时钟网络延迟(clock network delay)是什么?为什么将其标记为理想(ideal)?时序报告中的这一行表明时钟树被认为是理想的,时钟路径中的任何缓冲器(buffer)都假定为零延迟。一旦构建了时钟树,就可以将时钟网络标记为“已传播”(propagated),从而使得时钟路径显示实际延迟值,如下一个示例时序报告中所示:机器学习时序异常检测 时序检查_STA_48延迟是发起时钟上的时钟网络延迟,而机器学习时序异常检测 时序检查_Path_49延迟是捕获触发器上的时钟网络延迟。



机器学习时序异常检测 时序检查_Timing Check_50


时序路径报告中可以选择包含扩展的时钟路径,即带有明确显示的时钟树。以下是一个例子:



机器学习时序异常检测 时序检查_STA_51


机器学习时序异常检测 时序检查_STA_52


注意到出现在上面路径报告中的时钟缓冲器机器学习时序异常检测 时序检查_STA_53机器学习时序异常检测 时序检查_Path_54,提供了时钟树延迟是如何计算得到的。

如何计算第一个时钟单元机器学习时序异常检测 时序检查_静态时序分析_55的延迟呢?如前几章所述,单元延迟是根据单元的输入过渡时间和输出电容来计算的。因此,问题是在时钟树的第一个单元的输入处指定了多大的过渡时间,可以使用set_input_transition命令明确指定第一个时钟单元输入引脚上的过渡时间(或压摆)。

set_input_transition -rise 0.3 [get_ports CLKM]
set_input_transition -fall 0.45 [get_ports CLKM]

在上述的set_input_transition命令中,我们将输入上升过渡时间指定为了机器学习时序异常检测 时序检查_静态时序分析_40,将下降过渡时间指定为机器学习时序异常检测 时序检查_Path_57。在没有该命令约束的情况下,将在时钟树的源端假设存在理想的压摆,这意味着上升和下降过渡时间均为机器学习时序异常检测 时序检查_Timing Check_58

时序报告中的rf字符表示时钟或数据信号的上升沿(和下降沿)。上一个时序路径报告中显示了一条从机器学习时序异常检测 时序检查_STA_59的下降沿开始到机器学习时序异常检测 时序检查_静态时序分析_60的上升沿结束的路径。由于机器学习时序异常检测 时序检查_静态时序分析_60可以为机器学习时序异常检测 时序检查_Path_62机器学习时序异常检测 时序检查_STA_63,因此也可以有一条路径在机器学习时序异常检测 时序检查_静态时序分析_60的下降沿结束。以下就是这样一条路径:



机器学习时序异常检测 时序检查_STA_65


机器学习时序异常检测 时序检查_STA_66


注意,触发器时钟引脚的边沿(称为有效边沿)保持不变。它只能是上升或下降有效沿,具体取决于触发器是由上升沿触发的还是由下降沿触发的。

什么是时钟源延迟(clock source latency)? 这也被称为插入延迟(insertion delay),是时钟从其源端传播到待分析设计的时钟定义点所花费的时间,如图8-3所示,这对应于设计之外的时钟树延迟。例如,如果该设计是较大模块的一部分,则时钟源延迟是指直到待分析设计时钟引脚为止的时钟树延迟。可以使用set_clock_latency命令明确指定此延迟。



机器学习时序异常检测 时序检查_静态时序分析_67


set_clock_latency -source -rise 0.7 [get_clocks CLKM]
set_clock_latency -source -fall 0.65 [get_clocks CLKM]

在没有上述命令的情况下,将假定延迟为机器学习时序异常检测 时序检查_Path_62,这是早期路径报告中使用的假设。请注意,源延迟不会影响设计内部的路径,并且它们具有相同的发起时钟和捕获时钟,这是因为发起时钟路径和捕获时钟路径都会加上一段相同的延迟。但是,这种延迟确实会影响经过待分析设计输入和输出的时序路径。

如果没有-source选项,则set_clock_latency命令将定义时钟网络延迟,这是从机器学习时序异常检测 时序检查_静态时序分析_69中时钟定义点到触发器的时钟引脚的延迟。时钟网络延迟用于在建立时钟树之前(即在时钟树综合之前)对通过时钟路径的延迟进行建模。一旦建立了时钟树并标记为了“已传播”(propagated),便会忽略此时钟网络延迟约束。set_clock_latency命令也可用于对从主时钟到其衍生时钟的延迟进行建模,如7.3节所述。当时钟生成逻辑不是设计的一部分时,该命令也可用于建模片外时钟延迟。


8.1.2 输入到寄存器路径(Input to Flip-flop Path)

以下是一个从输入端口到寄存器的路径时序报告。图8-4展示了与输入路径有关的原理图和时钟波形。



机器学习时序异常检测 时序检查_Path_70


机器学习时序异常检测 时序检查_Timing Check_71


首先注意到input port clocked by VIRTUAL_CLKM。如7.9节中所讨论的,该时钟可视为驱动设计的输入端口机器学习时序异常检测 时序检查_静态时序分析_72的设计外的虚拟触发器。这个虚拟触发器的时钟是机器学习时序异常检测 时序检查_STA_73。此外,从该虚拟触发器的时钟引脚到输入端口机器学习时序异常检测 时序检查_静态时序分析_72的最大时延指定为机器学习时序异常检测 时序检查_Path_75(在报告中以input external delay出现)。这些参数的设置均使用如下机器学习时序异常检测 时序检查_机器学习时序异常检测_76命令进行:

create_clock -name VIRTUAL_CLKM -period 10 -waveform {0 5}
set_input_delay -clock VIRTUAL_CLKM \
	-max 2.55 [get_ports INA]

请注意,虚拟时钟机器学习时序异常检测 时序检查_STA_73的定义没有与设计中任何引脚相关,这是因为它是在设计之外定义的(它是虚拟的)。输入延迟约束set_input_delay指定了相对于虚拟时钟的延迟。



机器学习时序异常检测 时序检查_机器学习时序异常检测_78


输入路径从端口机器学习时序异常检测 时序检查_静态时序分析_72开始,如何计算连接到端口机器学习时序异常检测 时序检查_静态时序分析_72的第一个单元机器学习时序异常检测 时序检查_Timing Check_81的延迟呢?一种方法是指定输入端口机器学习时序异常检测 时序检查_静态时序分析_72的驱动单元,该驱动单元用于确定驱动强度,从而确定端口机器学习时序异常检测 时序检查_静态时序分析_72上的压摆,然后用于计算单元机器学习时序异常检测 时序检查_Timing Check_81的延迟。在输入端口机器学习时序异常检测 时序检查_静态时序分析_72上没有任何压摆约束的情况下,将假定端口上的过渡是理想的,即过渡时间为机器学习时序异常检测 时序检查_Timing Check_58

set_driving_cell -lib_cell BUFF \
	-library lib013lwc [get_ports INA]

图8-4还展示了如何进行建立时间检查。数据必须到达机器学习时序异常检测 时序检查_机器学习时序异常检测_87的时间为机器学习时序异常检测 时序检查_Timing Check_88,但是数据实际到达的时间为机器学习时序异常检测 时序检查_STA_89,因此该报告显示该路径的正裕量为机器学习时序异常检测 时序检查_静态时序分析_90

具有实际时钟的输入路径(Input Path with Actual Clock)

输入到达时间也可以与实际时钟对应,并不必须与虚拟时钟对应。实际时钟的例子有设计内部引脚的时钟,或输入端口。图8-5描绘了端口机器学习时序异常检测 时序检查_机器学习时序异常检测_91的输入约束指定为与输入端口时钟机器学习时序异常检测 时序检查_静态时序分析_92相关的例子。该约束指定为:

set_input_delay -clock CLKP -max 4.3 [get_ports CIN]



机器学习时序异常检测 时序检查_STA_93


机器学习时序异常检测 时序检查_Timing Check_94


机器学习时序异常检测 时序检查_机器学习时序异常检测_95


注意到startpoint和预想的输入端口延迟参考时钟一样指定为机器学习时序异常检测 时序检查_静态时序分析_92


8.1.3 触发器到输出路径(Flip-flop to Output Path)

与先前描述的输入端口约束类似,输出端口可对应约束于一个虚拟时钟,或一个设计内部时钟,或一个输出时钟端口,或一个输出时钟端口。这里有一个示例展示了输出引脚机器学习时序异常检测 时序检查_机器学习时序异常检测_97对用约束于一个虚拟时钟。输出约束如下:

set_output_delay -clock VIRTUAL_CLKP \
	-max 5.1 [get_ports ROUT]
set_load 0.02 [get_ports ROUT]

为了正确确定连接输出端口的最后一个单元的时延,需要指定输出端口上的负载。输入负载由set_load命令指定。注意机器学习时序异常检测 时序检查_机器学习时序异常检测_97端口可能本身具有机器学习时序异常检测 时序检查_静态时序分析_69内部的负载且set_load指定提供额外的机器学习时序异常检测 时序检查_静态时序分析_69外部的负载。若是set_load指定缺失,则假定外部负载值为机器学习时序异常检测 时序检查_Path_62(这是不现实的,该设计很可能会用于其他设计当中)。图8-6展示了通向具有虚拟时钟的虚拟触发器的时序路径。



机器学习时序异常检测 时序检查_静态时序分析_102


以下是通过该输出端口的时序路径报告:



机器学习时序异常检测 时序检查_Timing Check_103


机器学习时序异常检测 时序检查_Timing Check_104


机器学习时序异常检测 时序检查_STA_105


注意到输出时延以output external delay指明且表现为虚拟触发器所需的建立时间。


8.1.4 输入到输出路径(Input to Output Path)

设计中可以有一条从输入端口到输出端口的组合逻辑路径。该路径可被约束和时序分析就像之前输入和输出路径那样。图8-7展示了一个这样路径的实例。虚拟时钟用来指定输入和输出端口的约束。



机器学习时序异常检测 时序检查_机器学习时序异常检测_106


这里是输入和输出时延的设定:

set_input_delay -clock VIRTUAL_CLKM \
	-max 3.6 [get_ports INB]
set_output_delay -clock VIRTUAL_CLKM \
	-max 5.8 [get_ports POUT]

下面是从输入机器学习时序异常检测 时序检查_静态时序分析_107到输出机器学习时序异常检测 时序检查_机器学习时序异常检测_108的组合逻辑路径的时序报告。注意到如果存在任何的内部时钟延迟,对于路径时序报告没有任何影响。



机器学习时序异常检测 时序检查_Timing Check_109


机器学习时序异常检测 时序检查_STA_110


机器学习时序异常检测 时序检查_Timing Check_111



8.1.5 频率直方图(Frequency Histogram)

如果要画一个建立时间裕量和典型设计中路径数目的频率直方图,多半会像图8-8中所展示的那样。依赖于设计的状态,是否有过优化,机器学习时序异常检测 时序检查_Path_62裕量线若是没优化则会右移,反之则会左移。对于一个没有违例的设计,即没有路径具有负裕量,整个曲线将在机器学习时序异常检测 时序检查_Path_62裕量线的右侧。



机器学习时序异常检测 时序检查_机器学习时序异常检测_114


下面是一个由静态时序分析工具所生成的文本形式的直方图。

{-INF 375 0}
{375 380 237}
{380 385 425}
{385 390 1557}
{390 395 1668}
{395 400 1559}
{400 405 1244}
{405 410 1079}
{410 415 941}
{415 420 431}
{420 425 404}
{425 430 1}
{430 +INF 0}

前两列表明了裕量的范围,第三列所指是在该裕量范围中的路径数,例如,在裕量为机器学习时序异常检测 时序检查_机器学习时序异常检测_115范围内存在941条路径。该直方图表示该设计没有违例路径,也即所有的路径的裕量均为正,且最关键的路径的正裕量处于机器学习时序异常检测 时序检查_Path_116范围。

难以满足时序要求的设计其直方图的驼峰更加偏左,也即是许多路径的裕量靠近机器学习时序异常检测 时序检查_Path_62。通过看频率直方图可作的另一个观察是设计通过进一步优化实现机器学习时序异常检测 时序检查_Path_62裕量的能力,也即满足时序的困难程度。如果违例路径的数量很少且负裕量不大,设计相对更容易满足所需时序。然而,若是违例路径数量过大且负裕量的幅度也大,意味着若想将设计满足所需时序则费时费力。



8.2 保持时间检查(Hold Timing Check)

保持时间检查确保触发器改变中的输出值不会传递至捕获触发器并在捕获触发器有机会捕获其原始值前重写(overwrite)。该检查基于触发器的保持时间要求,触发器的保持时间要求规定在时钟的有效沿之后的指定时间段内,被锁存的数据应保持稳定。图8-9给出了典型触发器的保持时间要求。



机器学习时序异常检测 时序检查_Path_119


就像建立时间检查一样,是在发起触发器(发起数据的触发器)和捕获触发器(捕获数据的触发器以及必须满足其保持时间要求的触发器)之间进行保持时间检查的。这两个触发器的时钟可以相同也可以不同,保持时间检查从发起触发器时钟的一个有效沿到捕获触发器中相同的时钟沿。因此,保持时间检查与时钟周期无关,保持时间检查会在捕获触发器时钟的每个有效沿上执行

来看一个简单的示例,如图8-10,其中发起触发器和捕获触发器的时钟相同。



机器学习时序异常检测 时序检查_Path_120


考虑时钟机器学习时序异常检测 时序检查_静态时序分析_02的第二个上升沿。由时钟的上升沿发起的数据到达捕获触发器机器学习时序异常检测 时序检查_Path_04机器学习时序异常检测 时序检查_Timing Check_05引脚花费时间为机器学习时序异常检测 时序检查_STA_06。同样的时钟边沿花费机器学习时序异常检测 时序检查_Path_27到达捕获触发器的时钟引脚。目的就是在下一个时钟周期由捕获触发器捕获来自发起触发器的数据。如果数据在同一个时钟周期被捕获,捕获触发器所期望的数据(来自上一个时钟周期)被改写。保持时间检查确保捕获触发器所期望的数据不会被改写。保持时间检查验证数据到达时间和捕获寄存器的时钟到达时间差是不是大于捕获触发器的保持时间,进而触发器之前的数据不会重写且在触发器中可靠捕获。

保持时间检查可以数学表达为:
机器学习时序异常检测 时序检查_STA_126
保持时间裕量的计算公式为:
机器学习时序异常检测 时序检查_静态时序分析_127

其中机器学习时序异常检测 时序检查_Timing Check_03是发起触发器的时钟树延迟,机器学习时序异常检测 时序检查_STA_25是组合逻辑数据路径中的延迟,机器学习时序异常检测 时序检查_Path_27是捕获触发器的时钟树延迟。换句话说,由时钟边沿发起的数据到达捕获触发器机器学习时序异常检测 时序检查_Path_131引脚所需的总时间必须大于时钟同一边沿到达捕获触发器所需的时间加上保持时间。这样可以确保机器学习时序异常检测 时序检查_静态时序分析_60保持稳定状态,直到触发器的时钟引脚机器学习时序异常检测 时序检查_静态时序分析_133时钟上升沿之后的保持时间为止。

保持时间检查对于数据引脚到捕获触发器的路径施加了下限或min限制;需要确定到捕获触发器机器学习时序异常检测 时序检查_Path_131引脚的最快路径。这意味着保持时间检查总是使用最短路径。因此,保持时间检查典型运行在快速工艺角上。和建立时间检查一样,优化时是对机器学习时序异常检测 时序检查_静态时序分析_22进行优化,使组合逻辑部分的电路的时延更长一些,使其满足保持时间要求。

即使设计中只有一个时钟,发起和捕获触发器的到达时间由于时钟树可以大相径庭。为了确保数据的可靠捕获,捕获触发器的时钟沿必须在数据可改变前到达。保持时间检查可以确保(如图8-11所示):

  • 当前数据发起时钟沿(Setup launch edge)的下一个(subsequent)时钟沿发起的数据不被当前数据捕获时钟沿(Setup receiving edge)所捕获;
  • 当前数据发起时钟沿发起的数据不被当前数据捕获时钟沿的前一个捕获时钟沿(Preceding receiving edge)所捕获;

当发起和捕获时钟同属于一个时钟域时两个保持时间检查是相同的。然而,当发起和捕获时钟频率不同或在不同的时钟域,以上两种情形可能会映射到不同的约束。在这种情况下,得到的是最坏保持时间检查。图8-11展示了这两种检查的图例。



机器学习时序异常检测 时序检查_静态时序分析_136


机器学习时序异常检测 时序检查_静态时序分析_24是发起触发器,机器学习时序异常检测 时序检查_Path_04是捕获触发器。建立时间检查介于数据发起时钟沿(Setup launch edge)和数据捕获时钟沿(Setup receiving edge)之间。下一个数据发起时钟沿(Subsequent launch edge)不能传播数据过快导致数据捕获时钟沿(Setup receiving edge)没有时间去可靠捕获数据。此外,数据发起时钟沿(Setup launch edge)也不能够传播数据太快导致前一数据捕获时钟沿(Preceding receiving edge)没有机会捕获其应当捕获的数据。在上述情况中,最坏保持时间对应的是最严格的(most restrictive)保持时间检查。

稍后将在8.3节和8.8节中分别讨论更通用的时钟,例如用于多周期路径(multicycle paths)和多频率路径(multi-frequency paths)的时钟。讨论内容将涵盖建立时间检查和保持时间检查之间的关系,尤其是如何从建立时间检查中推断出保持时间检查。虽然建立时间违例会导致设计的工作频率降低,但保持时间违例会“杀死”(kill)设计,即设计在任何频率下都无法运行。因此,了解保持时间检查并解决任何违例行为非常重要。


8.2.1 触发器到触发器路径(Flip-flop to Flip-flop Path)

这部分基于图8-2中的图例来讲解从触发器到触发器的保持路径。以下是来自8.1节进行建立时间检查的路径的保持时间检查的时序分析报告。



机器学习时序异常检测 时序检查_STA_139


机器学习时序异常检测 时序检查_Path_140


注意到Path Type(路径类型)字段描述为min表明所使用的是最短路径的单元时延值也即对应的是保持时间检查。library hold time(库保持时间)字段指定了触发器机器学习时序异常检测 时序检查_Path_04的保持时间设置(正如3.4节:建立时间和保持时间检查里的负值所述触发器的保持时间也可为负)。注意捕获和接收时序是在时钟机器学习时序异常检测 时序检查_静态时序分析_02的上升沿(触发器的有效沿)上计算的。时序报告表明对于触发器机器学习时序异常检测 时序检查_Path_04而言,在保证前面数据可被安全捕获的情况下新数据的最早到达时间为机器学习时序异常检测 时序检查_STA_144。相较下新数据的实际到达时间为机器学习时序异常检测 时序检查_静态时序分析_145,报告中显示正的保持时间裕量(hold slack)机器学习时序异常检测 时序检查_机器学习时序异常检测_146

图8-12展示了发起和捕获触发器的时钟时序,以及捕获触发器数据信号最早可到达时间和实际到达时间。鉴于数据到达时间相较于规定时间晚一些(对于保持时间是最早允许时间),保持时间条件满足。



机器学习时序异常检测 时序检查_Timing Check_147


保持时间裕量计算(Hold Slack Calculation)

一个有趣的点在于建立时间和保持时间时序报告中的裕量计算的差异。在建立时间时序报告中,会计算到达时间和规定时间(最晚到达时间)且裕量计算公式为机器学习时序异常检测 时序检查_机器学习时序异常检测_148。但是在保持时间时序报告中,当我们计算裕量时,负值转换为正(表示满足约束),正值转为负(意味着不满足约束),也即计算公式为机器学习时序异常检测 时序检查_STA_149


8.2.2 输入到触发器路径(Input to Flip-flop Path)

接下来描述的是从输入端口开始的保持时间检查。以图8-4为例。输入端口的最小时延使用一个虚拟时钟来指定:

set_input_delay -clock VIRTUAL_CLKM \
	-min 1.1 [get_ports INA]

以下是保持时间时序报告。



机器学习时序异常检测 时序检查_STA_150


机器学习时序异常检测 时序检查_Timing Check_151


set_input_delay命令表现为报告中的input external delay。保持时间检查在时间机器学习时序异常检测 时序检查_Path_62VIRTUAL_CLKM的上升沿和CLKM的上升沿间。数据被触发器机器学习时序异常检测 时序检查_Timing Check_153捕获且不违例的规定到达时间是机器学习时序异常检测 时序检查_静态时序分析_154,这表明数据应在机器学习时序异常检测 时序检查_静态时序分析_154之后到达。实际数据在机器学习时序异常检测 时序检查_Timing Check_156到达,所以是正裕量机器学习时序异常检测 时序检查_STA_157


8.2.3 触发器到输出路径(Flip-flop to Output Path)

以下是对于输出端口的保持时间检查。如图8-6所示。输出端口配置为:

set_output_delay -clock VIRTUAL_CLKP \
	-min 2.5 [get_ports ROUT]

输出时延指定是相对于一个虚拟时钟的。这里是保持时间报告:



机器学习时序异常检测 时序检查_STA_158


注意到out external delay中的值对应于set_output_delay所设置的值。

具有实际时钟的触发器到输出路径

这里有一个至输出端口的路径保持时间时序检查报告。如图8-13所示。输出最小时延是相对于实际时钟指定的。



机器学习时序异常检测 时序检查_Timing Check_159


set_output_delay -clock CLKP -min 3.5 [get_ports QOUT]
set_load 0.55 [get_ports QOUT]

以下是保持时间时序报告:



机器学习时序异常检测 时序检查_静态时序分析_160


保持时间检查是在时钟机器学习时序异常检测 时序检查_静态时序分析_92的上升沿(触发器的有效沿)进行的。以上报告表明触发器到输出端口的保持时间有机器学习时序异常检测 时序检查_机器学习时序异常检测_162的正裕量。


8.2.4 输入到输出路径(Input to Output Path)

以下是输入到输出路径的保持时间检查,如图8-7所示。端口的约束为:

set_load -pin_load 0.15 [get_ports POUT]
set_output_delay -clock VIRTUAL_CLKM \
	-min 3.2 [get_ports POUT]
set_input_delay -clock VIRTUAL_CLKM \
	-min 1.8 [get_ports INB]
set_input_transition 0.8 [get_ports INB]



机器学习时序异常检测 时序检查_机器学习时序异常检测_163


输入端口和输出端口上的延迟约束是相对于虚拟时钟指定的,因此,保持时间检查是在该虚拟时钟的上升沿(有效沿)处执行的。