SDC命令详解:使用set_clock_latency命令进行约束

📅 2026/8/27 18:36:07
SDC命令详解:使用set_clock_latency命令进行约束
相关阅读SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482目录延迟值对象列表/集合指定沿最大、最小条件早、晚延迟时钟列表选项移除属性其他Multicorner-Multimode支持注意事项时钟的延迟可以使用set_clock_latency命令设置这里的时钟延迟包括源延迟(source latency)即时钟对象到时钟源对象时钟定义点的延迟又叫插入延迟(insertion delay)以及网络延迟(network latency)即时钟源到各触发器时钟引脚的延迟。正如上一篇文章中说的一样SDC命令详解使用set_clock_transition命令进行约束因为时钟树尚未创建时钟端口的高扇出会导致任何在时钟路径上的转换时间和延迟的计算都是毫无意义的网络延迟只是一种预布局阶段(pre-layout)的估计但注意源延迟在时钟树综合完成后依然会存在。如果想要移除时钟延迟使用remove_clock_latency命令。本文针对Design Compiler但该命令同样存在于PrimeTime、IC Compiler等工具中它们大致相同略有差别。set_clock_latency命令的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参数指定了延迟值的作用对象对于网络延迟它可以是时钟、端口和引脚对于源延迟它可以是时钟以及源对象即定义了时钟的端口或引脚。对于列表而言如果有多于一个对象需要使用引号或大括号包围对使用集合无效关于列表和集合的区别可以参考下面的博客。SDC命令详解使用集合(Collection)而不是字符串(String)/列表(List)作为命令参数https://chenzhang.blog.csdn.net/article/details/147144571如果对象是时钟则源延迟或网络延迟会直接被指定在时钟上如果对象是端口则所有经过该端口的时钟会被指定源延迟或网络延迟如果对象是引脚则所有经过该引脚的所有时钟会被指定源延迟或网络延迟。如果指定的对象是一个组合逻辑叶单元的引脚则该引脚所属的叶单元会被设置size only属性确保其不会在综合过程中被优化掉需要注意的是此时的size_only属性是隐式设置的这与使用set_size_only命令显式设置不同无法使用report_attribute命令或get_attribute命令直接查看也无法使用查询命令的-filter选项过滤而只能使用report_cell命令或report_size_only命令间接查看隐式size_only属性的优先级高于显式size_only属性使用list_size_only_types命令可以列出叶单元被设置size_only属性的原因显式或隐式。下面对上面的描述进行举例说明以图1所示的电路为参考。图1 一个简单的例子下面的命令创建了两个时钟对象其中一个时钟clk1控制发射触发器一个时钟clk2控制捕获触发器有关发射、捕获触发器可以看以往的文章静态时序分析建立时间分析-CSDN博客。create_clock -period 10 [get_ports clk1] create_clock -period 20 [get_ports clk2]下面的命令给时钟clk1设置了源延迟和网络延迟。set_clock_latency 0.1 [get_clocks clk1] set_clock_latency -source 0.2 [get_clocks clk1]可以使用report_clock -skew命令查看时钟包括其他允许的对象的延迟情况如图2所示。图2 时钟延迟报告下面的命令继续在clk1端口上设置了源延迟和网络延迟注意这两条命令与之前的区别。set_clock_latency 0.3 [get_ports clk1] set_clock_latency -source 0.4 [get_ports clk1]延迟情况如图3所示可以看到其中有两个clk对象的源延迟和网络延迟这是因为其中一个clk1指的是时钟对象另一个clk1指的是端口对象。图3时钟延迟报告使用report_timing命令给出时序分析报告如图4所示。图4 时序分析报告可以看出源延迟和网络延迟被叠加后合称为clock network delay并且使用的是clk1端口的延迟0.4源延迟0.3网络延迟而不是时钟clk1的延迟0.2源延迟0.1网络延迟这是因为端口的延迟覆盖了时钟的延迟也可以时钟延迟指定的优先级低于端口指定的延迟。另外我们可以看出对于理想时钟DC并不会直接计算其实际时钟路径上的延迟如计算两个与门的延迟而是直接使用set_clock_latency指定。指定沿-rise选项用于指定延迟值作用于上升沿、-fall选项用于指定延迟值作用于下降沿如果设置在时钟及其源对象上需要考虑时钟在时钟路径上传播时可能因为单元的单调性出现翻转即以到达触发器时钟引脚的时钟信号上升沿为准。如果这两个选项都没有指定延迟同时作用于上升沿和下降沿。下面的命令更改clk1端口的上升沿网络延迟为0.5保持其下降沿网络延迟为0.3延迟情况如图5所示。set_clock_latency 0.5 -rise [get_ports clk1]图5时钟延迟报告使用report_timing命令给出时序分析报告如图6所示。图6 时序分析报告可以看出由于本例的触发器是上升沿触发因此我们的设置起了作用现在的clock network delay是0.4源延迟0.5网络延迟。最大、最小条件-max选项用于指定延迟值作用于最大延迟分析一般情况下如果不开启on_chip_variation这指的是建立时间检查-min选项用于指定延迟值作用于最小延迟分析一般情况下如果不开启on_chip_variation这指的是保持时间检查。如果这两个选项都没有指定延迟同时作用于最大延迟和最小延迟分析相当于它们同时指定。下面的命令更改clk1端口的上升沿最大网络延迟为0.6上升沿最小网络延迟为0.7延迟情况如图7所示。set_clock_latency 0.6 -rise -max [get_ports clk1] set_clock_latency 0.7 -rise -min [get_ports clk1]图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选项指定的源延迟。需要注意的是即使该功能看起来像是on_chip_variation模式的效果即对发射路径和捕获路径使用不同的设置但实际上这并不依赖分析模式的选择即在Design Compiler的bc_wc模式或PrimeTime的single模式也生效。我们用下面的命令给端口clk2即捕获时钟设置一个最快源延迟0.1一个最慢源延迟0.2延迟情况如图10所示。//注意-early和-late选项必须搭配-source使用 set_clock_latency -early -source 0.1 [get_ports clk2] set_clock_latency -late -source 0.2 [get_ports clk2]图10 时钟延迟报告使用report_timing命令分别给出建立时间和保持时间的时序分析报告如图11和图12所示。图11 建立时间时序报告图12 保持时间时序报告可以看到在建立时间分析时捕获时钟clk2使用了最小源延迟0.1在保持时间分析时捕获时钟clk2使用了最大源延迟0.2。这两者都是最坏的情况下的结果。发射时钟clk1的不同延迟是因为上节中的-min/-max选项注意要辨别这两者的差异。这点从时钟延迟报告中也可以看出-min/-max、-early/-late、-rise/-fall这几组选项是可以任意搭配的。时钟列表选项时钟选项-clock用于指定一个列表因为对象列表中可以有端口和引脚会出现多个时钟从同一个端口或引脚经过。如果没有使用-clock选项指定则命令对多个时钟生效如果指定了-clock选项和时钟列表则命令只对时钟列表中的时钟生效。在下面的例子中我们使用命令在clk2端口又定义了一个时钟CLK2并令clk2端口的源延迟为0.5这会使得时钟clk2和CLK2在经过clk2端口时都受到影响如图13、图14和图15所示。create_clock -period 30 -add -name CLK2 [get_ports clk2] set_clock_latency -source 0.5 [get_ports clk2]图13 时钟延迟报告图14 捕获时钟为clk2的时序报告图15 捕获时钟为CLK2的时序报告现在我们使用带-clock选项的命令将clk2端口对时钟CLK2的源延迟影响变成0.6如图16、图17和图18所示。set_clock_latency -source 0.6 [get_ports clk2] -clock [get_clocks CLK2]图16 时钟延迟报告图17 捕获时钟为clk2的时序报告图18 捕获时钟为CLK2的时序报告可以看到clk2端口对时钟clk2的源延迟影响依然是0.5但对时钟CLK2的源延迟影响已经变成了0.6。移除属性使用remove_clock_latency可以移除时钟延迟属性注意为了移除源延迟属性需要加上-source选项。其他-dynamic选项用于指定时钟延迟的抖动(jitter)这个选项不常使用用于指定延迟中不确定部分的延迟值对于建立时间分析/保持时间分析发射时钟/捕获时钟会有不同的情况以使得最差情况的时序得到分析。Multicorner-Multimode支持该命令仅对当前场景生效换句话说只能在当前场景设置时钟的延迟。关于场景的更多介绍可以参考下面的博客。Design Compiler多工艺角和多工作模式(Multicorner-Multimode, MCMM)https://blog.csdn.net/weixin_45791458/article/details/149578771?ops_request_misc%257B%2522request%255Fid%2522%253A%2522e3267dcc7cc26380435f53994dc8b9b8%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257Drequest_ide3267dcc7cc26380435f53994dc8b9b8biz_id0utm_mediumdistribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-149578771-null-null.nonecaseutm_termMCMMspm1018.2226.3001.4450注意事项正如文章开头所说的set_clock_latency命令只能模拟时钟树综合前的理想时钟的网络延迟一旦时钟树综合完成理想时钟会被转化为传播时钟此时传播时钟的有关网络延迟相关的属性会被直接删除而不是失效DC将使用真实时钟路径上网路延迟进行分析这也代表着它会忽略所有端口和引脚上定义的时钟延迟。