相关阅读
静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm=1001.2014.3001.5482
当使用set_ideal_network命令将当前设计中的一组端口或引脚标记为理想网络源后,理想属性会沿着组合逻辑进行传播,理想网络中的线网和单元的延迟默认为0,可以通过set_ideal_latency命令指定理想网络的延迟(设置了理想网络对象的ideal_latency_max_rise、ideal_latency_max_fall、ideal_latency_max_rise、ideal_latency_max_rise属性)。如果想要移除理想延迟,使用remove_ideal_latency命令。
建议在阅读本文前,先在下面的博客学习set_ideal_network命令。
静态时序分析:SDC约束命令set_ideal_network详解https://chenzhang.blog.csdn.net/article/details/146082417?spm=1001.2014.3001.5502 本文针对Design Compiler,但该命令同样存在于PrimeTime、IC Compiler等工具中,它们大致相同,略有差别。set_ideal_latency命令的BNF范式(有关BNF范式,可以参考以往文章)为:
set_ideal_latencydelayobject_list[-rise | -fall][-min | -max]//注:该命令的object_list参数一定要放在delay参数后
指定理想延迟值
指定一个理想的延迟值。它的单位必须和工艺库中指定的负载单位一致,例如工艺库中使用了纳秒,则该参数的单位也为纳秒。
指定理想网络对象
指定一个理想网络对象列表,包含端口对象、线网对象或叶单元的引脚对象(不可以是层次单元的引脚),如果有多于一个对象,需要使用引号或大括号包围。如果延迟值设置的对象不属于理想网络,则设置无效。如果列表中包含线网对象,理想延迟将添加在驱动该线网的端口/引脚上。
指定上升、下降沿
-rise选项用于指定延迟值作用于上升沿、-fall选项用于指定延迟值作用于下降沿。如果这两个选项都没有指定,延迟同时作用于上升沿和下降沿,它们不能同时使用。
指定最大、最小条件
-max选项用于指定延迟值作用于最大延迟分析(一般情况下,如果不开启on_chip_variation,这指的是建立时间检查),-min选项用于指定延迟值作用于最小延迟分析(一般情况下,如果不开启on_chip_variation,这指的是保持时间检查)。如果这两个选项都没有指定,延迟同时作用于最大延迟和最小延迟分析,它们不能同时使用。
理想网络延迟的影响
理想网络延迟代表了从理想网络源到理想网络终点的延迟,具体参考理想属性的传播规则,所有包含理想网络源的时序路径都会考虑这个延迟并将其记录在对应的Incr列旁用符号^标注。
多个理想网络延迟可以叠加,这发生在时序路径中定义了多个延迟的情况。
简单使用
下面以图1为例说明set_ideal_latency命令的使用。
图1 简单的例子
首先使用create_clock命令以clk端口为源对象创建一个周期为10的时钟。
create_clock -period 10 [get_port clk]
接着使用set_input_delay命令在输入端口a、b、c上添加输入延迟,参考时钟为clk,此时经过端口a的时序报告如图2所示(注意,该时序报告使用了-input_pins选项来显示输入引脚)。
set_input_delay 0.5 {a b c} -clock [get_clock clk]
图1 建立时间时序报告
然后使用set_ideal_network命令设置端口a为理想网络源,根据理想属性的传播规则,线网a变成了理想线网,此时经过端口a的时序报告如图2所示,其中唯一的不同是线网a的延迟变成了0。
set_ideal_network [get_port a]
图2 建立时间时序报告
需要注意的是,此时只有端口a、线网a和引脚u1/A被标记为理想,但理想属性不会穿过单元u1,因为其另一个输入引脚不是理想的。
我们可以分别使用下面三个命令,将理想延迟设置在端口a、线网a或引脚u1/A上,相应的时序报告如图3、4、5所示。
set_ideal_latency 0.5 [get_port a]
图3 建立时间时序报告
set_ideal_latency 0.5 [get_net a]
图4 建立时间时序报告
set_ideal_latency 0.5 [get_pin u1/A]
图5 建立时间时序报告
从上面三个图中可以看出啊,除了理想线网,其他延迟值都是设置在指定的理想网络对象上,出现在该对象的Incr列中,并且使用^进行标记。
需要注意的是,通过端口b的时序路径并不会包含任何理想对象,因此不含有任何理想延迟。但如果在引脚u1/Y上设置理想延迟呢,是否会出现叠加情况?这是错误的,因为此时引脚u1/Y并不是理想对象,一种方法是使单元u1的所有输入引脚都为理想引脚,这样u1单元就成为理想单元,其输出引脚也就成为理想引脚了,这可以通过将端口b设置为理想网络源来完成。此时经过端口a的时序报告如图6所示。
set_ideal_network [get_port b]
set_ideal_latency 0.6 [get_pin u1/Y]
图6 建立时间时序报告
从图6中可以看出,引脚u1/A到引脚u1/Y的单元延迟此时已经不是之前的0.1567221,而是理想延迟0.6,并且两个理想延迟叠加了。
如果我不将端口b设置为理想网络源,也可以直接设置引脚u1/Y为理想网络源,但此时经过端口a的时序报告如图7所示,这可能会令人疑惑。
set_ideal_network [get_pin u1/Y]
set_ideal_latency 0.6 [get_pin u1/Y]
图7 建立时间时序报告
引脚u1/A到引脚u1/Y的单元延迟似乎并不是设置的理想延迟0.6,而是奇怪的0.6217709,这是因为单元u1此时并不是理想单元,所以其单元延迟不为0,而是真实延迟叠加理想延迟。
这也说明上一种方法中的单元延迟为0.6应该看作是0+0.6,其中0是理想单元的延迟,而0.6是理想延迟,而因为理想延迟恰好设置在引脚u1/Y上,所以进行了累加,读者可以尝试将理想延迟设置在u2/A上,看看此时引脚u1/A到引脚u1/Y的单元延迟是否为0。
回到正题,如果这么说,那此时的单元延迟应该为之前的0.1567221加上0.6才对,这还是对不上。其实这是因为此时线网and_out为理想线网,其电容为0导致与之前电容不为0得到的单元延迟不同,可以使用report_delay_calculation命令查看单元延迟的计算方法,如图8所示。
图8 单元延迟计算