相关阅读
静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm=1001.2014.3001.5482
时钟的延迟可以使用set_clock_latency命令设置,这里的时钟延迟包括源延迟(source latency),即时钟对象到时钟源对象(时钟定义点)的延迟,又叫插入延迟(insertion delay);以及网络延迟(network latency),即时钟源到各触发器时钟引脚的延迟。正如上一篇文章中说的一样静态时序分析:SDC约束命令set_clock_transition详解-CSDN博客,因为时钟树尚未创建,时钟端口的高扇出会导致,任何在时钟路径上的转换时间和延迟的计算都是毫无意义的,网络延迟只是一种预布局阶段(pre-layout)的估计,但注意源延迟在时钟树综合完成后依然会存在。
该指令的BNF范式(有关BNF范式,可以参考以往文章)为:
set_clock_latency
delay object_list [-rise] [-fall] [-min] [-max]
[-source] [-early] [-late] [-dynamic jitter]
[-clock clock_list]
//注:该命令的object_list参数一定要放在delay参数后
延迟值
delay参数指定了时钟延迟值,默认情况下是指网络延迟,当使用了-source选项后指的是源延迟。注意,这个值一般为正,如果为负会出现如下所示的警告。
Warning: Value for <delay> is negative. (UID-450)
对象列表
object_list参数指定了延迟值的作用对象,对于网络延迟,它可以是时钟、端口和引脚;对于源延迟,它可以是时钟以及源对象(即定义了时钟的端口或引脚)。
如果对象是时钟,则源延迟或网络延迟会直接被指定在时钟上;如果对象是端口,则所有经过该端口的时钟会被指定源延迟或网络延迟;如果对象是引脚,则所有经过该引脚的所有时钟会被指定源延迟或网络延迟。
下面对上面的描述进行举例说明,以图1所示的电路为参考。
图1 一个简单的例子
下面的命令创建了两个时钟对象,其中一个时钟clk控制发射触发器,一个时钟CLK控制捕获触发器(有关发射、捕获触发器,可以看以往的文章静态时序分析:建立时间分析-CSDN博客)
create_clock -period 10 [get_port clk]
create_clock -period 20 [get_port CLK]
下面的命令给clk时钟设置了源延迟和网络延迟。
set_clock_latency 0.1 [get_clock clk]
set_clock_latency -source 0.2 [get_clock clk]
可以使用report_clock -skew命令查看时钟(包括其他允许的对象)的延迟情况,如图2所示。
图2 时钟延迟报告
下面的命令继续在端口clk上设置了源延迟和网络延迟,注意这两条命令与之前的区别。
set_clock_latency 0.3 [get_port clk]
set_clock_latency -source 0.4 [get_port clk]
延迟情况如图3所示,可以看到其中有两个clk对象的源延迟和网络延迟,这是因为其中一个clk指的是时钟对象,另一个clk指的是端口对象。
图3 时钟延迟报告
使用report_timing命令给出时序分析报告,如图4所示。
图4 时序分析报告
可以看出,源延迟和网络延迟被叠加后合称为clock network delay,并且使用的是clk端口的延迟0.4源延迟+0.3网络延迟而不是clk时钟的延迟0.2源延迟+0.1网络延迟,这是因为端口的延迟覆盖了时钟的延迟,也可以时钟延迟指定的优先级低于端口指定的延迟。
另外,我们可以看出对于理想时钟,DC并不会直接计算其实际时钟路径上的延迟(如计算U1、U2的延迟),而是直接使用set_clock_latency指定。
指定沿
-rise选项用于指定延迟值作用于上升沿、-fall选项用于指定延迟值作用于下降沿。如果这两个选项都没有指定,延迟同时作用于时钟的上升沿和下降沿(相当于它们同时指定)。
下面的命令更改端口clk的上升沿网络延迟为0.5,保持其下降沿网络延迟为0.3,延迟情况如图5所示。
set_clock_latency 0.5 -rise [get_port clk]
图5 时钟延迟报告
使用report_timing命令给出时序分析报告,如图6所示。
图6 时序分析报告
可以看出,由于本例的触发器是上升沿触发,因此我们的设置起了作用,现在的clock network delay是0.4源延迟+0.5网络延迟。
最大/最小条件
-max选项用于指定延迟值作用于最大条件(建立时间分析),-max选项用于指定延迟值作用于最小条件(保持时间分析)。如果这两个选项都没有指定,延迟同时作用于最大条件和最小条件(相当于它们同时指定)。
下面的命令更改端口clk的上升沿最大网络延迟为0.6,上升沿最小网络延迟为0.7,延迟情况如图7所示。
set_clock_latency 0.6 -rise -max [get_port clk]
set_clock_latency 0.7 -rise -min [get_port clk]
图7 时钟延迟报告
使用report_timing命令分别给出建立时间和保持时间的时序分析报告,如图8和图9所示。
图8 建立时间时序报告
图9 保持时间时序报告
可以看出,建立时间时序分析时,clock network delay是0.4源延迟+0.6网络延迟;而保持时间时序分析时,clock network delay是0.4源延迟+0.7网络延迟。
早/晚延迟
-early选项只能用于指定源延迟(即只能搭配-source使用),用于指定最快(最小源延迟)的源路径; -late选项只能用于指定源延迟(即只能搭配-source使用),用于指定最满(最大源延迟)的源路径。在建立时间分析和保持时间分析中,会对发射时钟和捕获时钟的这点进行考虑,给出最差情况下的分析结果。如果这两个选项都没有指定,源延迟同时作用于最快情况和最慢情况(相当于它们同时指定)。为了与实际情况吻合,-early指定的源延迟应小于-late指定的源延迟。
我们用下面的命令给端口CLK(即捕获时钟)设置一个最快源延迟0.1,一个最慢源延迟0.2,延迟情况如图10所示。
//注意-early和-late选项必须搭配-source使用
set_clock_latency -early -source 0.1 [get_port CLK]
set_clock_latency -late -source 0.2 [get_port CLK]
图10 时钟延迟报告
使用report_timing命令分别给出建立时间和保持时间的时序分析报告,如图11和图12所示。
图11 建立时间时序报告
图12 保持时间时序报告
可以看到,在建立时间分析时,捕获时钟CLK使用了最小源延迟0.1;在保持时间分析时,捕获时钟CLK使用了最大源延迟0.2。这两者都是最坏的情况下的结果。发射时钟clk的不同延迟是因为上节中的-min/-max选项,注意要辨别这两者的差异。这点从时钟延迟报告中也可以看出,-min/-max、-early/-late、-rise/-fall这几组选项是可以任意搭配的。
-source选项的作用,在前面已经进行过说明。-dynamic选项用于模拟时钟延迟的抖动,用得较少。
时钟列表选项
时钟选项-clock用于指定一个列表,因为对象列表中可以有端口和引脚,会出现多个时钟从同一个端口或引脚经过。如果没有使用-clock选项指定,则命令对多个时钟生效;如果指定了-clock选项和时钟列表,则命令只对时钟列表中的时钟生效。
在下面的例子中,我们使用命令在CLK端口又定义了一个时钟CLK1,并令端口CLK的源延迟为0.5,这会使得CLK1和CLK时钟在经过CLK端口时都受到影响,如图13、图14和图15所示。
create_clock -period 30 -add -name CLK1 [get_port CLK]
set_clock_latency -source 0.5 [get_port CLK]
图13 时钟延迟报告
图14 捕获时钟为CLK的时序报告
图15 捕获时钟为CLK1的时序报告
现在我们使用带-clock选项的命令,将CLK端口对CLK1的源延迟影响变成0.6,如图16、图17和图18所示。
set_clock_latency -source 0.6 [get_port CLK] -clock_list CLK1
图16 时钟延迟报告
图17 捕获时钟为CLK的时序报告
图18 捕获时钟为CLK1的时序报告
可以看到,端口CLK对CLK的源延迟影响依然是0.5,但对CLK1的源延迟影响已经变成了0.6。
移除属性
使用remove_clock_latency可以移除时钟延迟属性,注意为了移除源延迟属性,需要加上-source选项。
其他
-dynamic选项用于指定时钟延迟的抖动(jitter),这个选项不常使用,用于指定延迟中,不确定部分的延迟值,对于建立时间分析/保持时间分析,发射时钟/捕获时钟会有不同的情况,以使得最差情况的时序得到分析。