相关阅读
静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm=1001.2014.3001.5482
set_load命令用于指定端口(port)或线网(net)的负载电容,该指令的BNF范式(有关BNF范式,可以参考以往文章)为:
set_load
value object_list
[-min][-max]
[-pin_load] [-wire_load]
[-subtract_pin_load]
//注:该命令的objects参数一定要放在value参数后
目录
指定负载值
指定要设置在端口或引脚的负载值。它的单位必须和工艺库中指定的负载单位一致,例如工艺库中使用了皮法,则该参数的单位也为皮法。
指定对象列表
指定一个对象列表,包含端口对象或线网对象,如果有多于一个对象,需要使用引号或大括号包围。
简单使用
以图1所示的电路图为例,首先在输入端口clk定义一个时钟。
create_clock -period 10 [get_port clk]
图1 一个简单的例子
接着在输入端口d、c,输出端口q上分别定义三个输入延迟,参考时钟为clk。
set_input_delay 0.5 -clock clk [get_port d]
set_input_delay 0.5 -clock clk [get_port c]
set_output_delay 0.5 -clock clk [get_port q]
使用下面的命令为设计指定线负载模型。
set_wire_load_model -name tsmc13_wl50 -library typical
下面使用set_load命令在输出端口q指定负载值0.4。
set_load 0.4 [get_port q]
对于端口上设置的负载值,可以使用report_port -verbose命令查看,如图2所示。
图2 端口负载报告
可以看到输出端口q的引脚负载(pin load)为0.4,而线网负载(wire load)为0。(从图2中也能看出,端口默认拥有pin load(max)和wire load(max)属性以及默认值0),这两者的差异在后面会说明。
使用report_net -connections -verbose [get_nets q]命令可以报告线网q相关的信息,如图3所示。
图3 线网q信息报告(最大条件)
需要注意的是,报告中的min和max应该是显示bug,实际上报告的信息都是最大条件(max)下的,如果需要报告最小条件下的信息,需要添加-min选项。图中的wire capacitance指的是线网负载总量,这是累计了端口和线网的线网负载的结果,图中的pin capacitance指的是引脚负载总量,这是累积了端口和引脚的引脚负载的结果。图中的total capacitance指的是负载总量,是线网负载总量加上引脚负载总量的结果。
指定最大、最小条件
对于端口
-max选项用于指定负载值为最大条件(建立时间分析)设置,-min选项用于指定负载值为于最小条件(保持时间分析)设置。如果这两个选项都没有指定,负载值只为最大条件设置(就像是指定了-max选项一样,这与很多命令不同),但在最小条件分析时如果没有指定对应的负载值则会使用最大条件的负载值,就好像同时设置了最大、最小条件那样,这与很多其他命令不一样,许多其他命令在这种情况下会直接使用最小条件时的默认值,例如0。
对于端口而言,-max选项(该选项默认)加-pin_load选项(该选项默认)设置了load属性,-max选项(该选项默认)加-wire_load选项设置了wire_capacitance属性;-min选项加-pin_load选项(该选项默认)设置了min_load属性,-min选项加-wire_load选项设置了min_wire_capacitance属性。
现在出现了一个问题,report_port命令并不能使用-min选项,如何得知端口的最小条件负载情况呢?这时候就需要使用get_attribute命令直接获得端口上的属性,如下所示。
get_attribute [get_port q] load //获取输出端口q上的max_pin_load
0.4 //这符合预期
get_attribute [get_port q] min_load //获取输出端口q上的min_pin_load
//这也符合预期,我们说了当-min、-max都不指定时,默认只设置最大条件的负载值
Warning: Attribute 'min_load' does not exist on port 'q'. (UID-101)
使用report_net -connections -verbose -min [get_nets q]命令可以报告线网q相关的最小条件下的信息,如图4所示。
图4 线网q信息报告(最小条件)
从图4中可以看到,尽管没有设置端口q在最小条件下的负载值,但DC使用了最大条件下的负载值。
下面使用set_load命令在输出端口q明确指定最小条件的负载值0.6。
set_load 0.6 -min [get_port q]
此时使用命令get_attribute [get_port q] min_load可以得到结果0.6,而线网q最小条件下的信息报告如图5所示。
图5 线网q信息报告(最小条件)
对于线网
-max选项用于指定负载值为最大条件(建立时间分析)设置,-min选项用于指定负载值为于最小条件(保持时间分析)设置。如果这两个选项都没有指定,负载值同时为最大条件和最小条件设置(相当于它们同时指定)。如果使用命令时仅指定了-min选项,但此时最大条件情况下的线网负载尚未设置,则命令同时会设置最大条件的线网负载;如果使用命令时仅指定了-max选项,但此时最小条件情况下的线网负载尚未设置,则命令同时会设置最大条件的线网负载。
对于线网而言,-max选项设置了wire_capacitance_max属性,-min选项设置了wire_capacitance_min属性。
如下所示的命令指定了线网q在最小条件下的线网负载(对于线网而言,只能使用命令指定线网负载,而不能指定引脚负载(线网的引脚负载总量是累计得到的);对于端口而言,既能使用命令指定线网负载,也能指定引脚负载)。假设此时尚未指定最大条件的线网负载,则结果如图6、图7所示。
set_load 0.1 -min [get_net q]
图6 线网q信息报告(最小条件)
图7 线网q信息报告(最大条件)
可以看到,命令仅仅使用了-min选项,但最大条件依然被设置了(再次强调,这仅限于某一个条件下的线网负载尚未设置时)。另外从图中的线网负载总量可以看出,直接使用set_load指定线网负载会覆盖使用线负载模型得出的线网负载。
指定引脚、线负载
上面说到,端口可以指定引脚负载和线网负载,这是由-pin_load和-wire_load选项指定的,当两者都不指定时,默认指定引脚负载;当两者都指定时,负载值同时设置为引脚负载和线网负载。
端口上的线网负载会被累加到与端口连接的线网的线网负载总量之中,注意这里在进行端口的线网负载的设置时,"对于端口"小节中红字相关的描述也成立,即如只设置了最大条件下的线网负载,最小条件分析时会使用最大条件下的线网负载。
我们首先使用 reset_design命令复位设计,便于下面的实验。下面使用set_load命令在输出端口q指定引脚负载值0.4,线网负载值0.5,如图8所示。(注意,这里两者都默认只设置了最大条件)
set_load 0.4 -pin_load [get_port q]
set_load 0.5 -wire_load [get_port q]
图8 端口负载报告
接着我们查看线网q在最大条件和最小条件下的负载信息,如图9、图10所示。
图9 线网q信息报告(最小条件)
图10 线网q信息报告(最大条件)
可以看到,尽管我们只设置了端口最大条件下的引脚负载和线网负载,即只设置了端口q的load和wire_capacitance属性,最小条件的引脚负载和线网负载也被累计进线网q的引脚负载总量和线网负载总量了(但注意,此时线网q的wire_capacitance_max和wire_capacitance_min属性尚未设置)。
使用下面的命令设置线网q在最大条件下的线网负载,如图11、图12所示。
set_load 1 [get_net q]
图11 线网q信息报告(最小条件)
图12 线网q信息报告(最大条件)
可以看到,最大、最小条件下线网的线网负载都被累计进线网负载总量了,这正如"对于线网" 小节中说的那样,当wire_capacitance_min属性尚未设置时,如果指定了-max选项设置了wire_capacitance_max属性,则wire_capacitance_min属性也会一起被设置。
-pin_load选项和-wire_load选项只能用于给端口对象指定负载值,这很好理解,因为给线网对象指定的负载值都是指线网负载,这没得选。
指定减去引脚负载
-subtract_pin_load选项指定了在设置线网的线网延迟值时,该线网延迟值会首先先减去线网上的引脚负载总量。例如使用下面的命令,则线网延迟值1在设置前会被减去引脚负载总0.4,如图12所示。
set_load 1 -subtract_pin_load [get_net q]
图12 线网q信息报告(最大、最小条件)
从图中可以看出,线网负载总量为0.5+1-0.4=1.1,这符合预期结果。该选项主要用于避免某些情况下引脚负载被重复指定两次。
移除负载值
如果想要移除之前指定的各种负载,需要使用remove_attribute命令,这时需要使用具体的属性名作为参数,这也是为什么本文解释了各选项分别设置了哪些属性。
下面的命令移除了端口q上的最大条件的引脚负载(这里说是移除属性,实际上laod属性还是会保留,并被设置为0,这与很多其他属性不一样)。
remove_attribute [get_port d] load
写在最后
set_load命令的设置规则较为复杂,需要熟悉线网的线网负载、线网负载总量、引脚负载总量、负载总量与端口的线网负载、引脚负载这几个概念之间的区别与联系。