相关阅读
SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm=1001.2014.3001.5482
目录
set_load命令用于指定端口(port)或线网(net)的负载电容。如果想要移除负载电容,使用remove_attribute命令。
本文针对Design Compiler,但该命令同样存在于PrimeTime、IC Compiler等工具中,它们大致相同,略有差别。
set_load命令的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_ports clk]
图1 一个简单的例子
接着在输入端口d、c,输出端口q上分别定义三个输入延迟,参考时钟为clk。
set_input_delay 0.5 -clock clk [get_ports d]
set_input_delay 0.5 -clock clk [get_ports c]
set_output_delay 0.5 -clock clk [get_ports q]
使用下面的命令为设计指定线负载模型。
set_wire_load_model -name tsmc090_wl50 -library fast
下面使用set_load命令在输出端口q指定负载值0.4。
set_load 0.4 [get_ports q]
对于端口上设置的负载值,可以使用report_port -verbose命令查看,如图2所示。
图2 端口负载报告
可以看到输出端口q的引脚负载(pin load)为0.4,而线网负载(wire load)为0(从图2中也能看出,它们的默认值是0),这两者的差异在后面会说明。
使用report_net -connections -verbose [get_nets q]命令可以报告线网q相关的信息,如图3所示。
图3 线网q信息报告(最大延迟)
需要注意的是,报告中的min和max应该是显示bug,实际上报告的信息都是最大延迟(max)下的,如果需要报告最小延迟下的信息,需要添加-min选项。图中的wire capacitance指的是线网负载总量,这是累计了端口、引脚和线网的线网负载的结果,图中的pin capacitance指的是引脚负载总量,这是累积了端口和引脚的引脚负载的结果(无法直接设置)。图中的total capacitance指的是负载总量,是线网负载总量加上引脚负载总量的结果,使用total_capacitance_max和total_capacitance_min属性保存。
指定最大、最小条件
对于端口
-max选项用于指定负载值为最大延迟分析(一般情况下,如果不开启on_chip_variation,这指的是建立时间检查)设置,-min选项用于指定负载值为于最小延迟分析(一般情况下,如果不开启on_chip_variation,这指的是保持时间检查)设置。如果这两个选项都没有指定,负载值只为最大延迟设置(就像是指定了-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_ports q] load //获取输出端口q上的max_pin_load
0.4 //这符合预期
get_attribute [get_ports 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_ports q]
此时使用命令get_attribute [get_ports q] min_load可以得到结果0.6,而线网q最小延迟下的信息报告如图5所示。
图5 线网q信息报告(最小延迟)
对于线网
-max选项用于指定负载值为最大延迟分析(一般情况下,如果不开启on_chip_variation,这指的是建立时间检查)设置,-min选项用于指定负载值为于最小延迟分析(一般情况下,如果不开启on_chip_variation,这指的是保持时间检查)设置。如果这两个选项都没有指定,负载值同时为最大延迟和最小延迟分析(相当于它们同时指定)。如果使用命令时仅指定了-min选项,但此时最大延迟情况下的线网负载尚未设置,则命令同时会设置最大延迟的线网负载;如果使用命令时仅指定了-max选项,但此时最小延迟情况下的线网负载尚未设置,则命令同时会设置最大延迟的线网负载。
对于线网而言,-max选项设置了load属性和wire_capacitance_max属性,-min选项设置了min_load属性和wire_capacitance_min属性。
如下所示的命令指定了线网q在最小延迟下的线网负载,对于线网而言,只能使用命令指定线网负载,而不能指定引脚负载(线网的引脚负载总量是累计得到的);对于端口而言,既能使用命令指定线网负载,也能指定引脚负载。假设此时尚未指定最大延迟的线网负载,则结果如图6、图7所示。
set_load 0.1 -min [get_nets q]
图6 线网q信息报告(最小延迟)
图7 线网q信息报告(最大延迟)
可以看到,命令仅仅使用了-min选项,但最大延迟依然被设置了(再次强调,这仅限于某一个条件下的线网负载尚未设置时)。另外从图中的线网负载总量可以看出,直接使用set_load指定线网负载会覆盖使用线负载模型得出的线网负载。
指定引脚、线负载
上面说到,端口可以指定引脚负载和线网负载,这是由-pin_load和-wire_load选项指定的,当两者都不指定时,默认指定引脚负载;当两者都指定时,负载值同时设置为引脚负载和线网负载。
端口上的线网负载会被累加到与端口连接的线网的线网负载总量之中,注意这里在进行端口的线网负载的设置时,“对于端口”小节中红字相关的描述也成立,即如只设置了最大延迟下的线网负载,最小延迟分析时会使用最大延迟下的线网负载。
我们首先使用reset_design命令复位设计,便于下面的实验。下面使用set_load命令在输出端口q指定引脚负载值0.4,线网负载值0.5,如图8所示。(注意,这里两者都默认只设置了最大延迟)
reset_design
set_load -pin_load -max 0.4 [get_ports q]
set_load -wire_load -max 0.5 [get_ports q]
图8 端口负载报告
接着我们查看线网q在最大延迟和最小延迟下的负载信息,如图9、图10所示。
图9 线网q信息报告(最小延迟)
图10 线网q信息报告(最大延迟)
可以看到,尽管我们只设置了端口最大延迟下的引脚负载和线网负载,即只设置了端口q的load和wire_capacitance属性,最小延迟的引脚负载和线网负载也被累计进线网q的引脚负载总量和线网负载总量了(此时线网q的相应属性尚未设置)。
使用下面的命令设置线网q在最大延迟下的线网负载,如图11、图12所示。
set_load 1 [get_nets q]
图11 线网q信息报告(最小延迟)
图12 线网q信息报告(最大延迟)
可以看到,最大、最小延迟下线网的线网负载都被累计进线网负载总量了,这正如“对于线网” 小节中说的那样,当min_load属性和wire_capacitance_min属性尚未设置时,如果指定了-max选项设置了load属性和wire_capacitance_max属性,则min_load属性和wire_capacitance_min属性也会一起被设置。
-pin_load选项和-wire_load选项只能用于给端口对象指定负载值,这很好理解,因为给线网对象指定的负载值都是指线网负载,这没得选。
指定减去引脚负载
-subtract_pin_load选项指定了在设置线网的线网负载时,该线网负载会首先先减去线网上的引脚负载总量。例如使用下面的命令,则线网负载1在设置前会被减去引脚负载总量0.4,如图12所示。
set_load 1 -subtract_pin_load [get_nets q]
图12 线网q信息报告(最大、最小延迟)
从图中可以看出,线网负载总量为1-0.4+0.5+0.4=1.5,这符合预期结果。该选项主要用于避免某些情况下引脚负载被重复指定两次。
移除负载值
如果想要移除之前指定的各种负载,需要使用remove_attribute命令,这时需要使用具体的属性名作为参数,这也是为什么本文解释了各选项分别设置了哪些属性。
下面的命令移除了端口q上的最大延迟的引脚负载(这里说是移除属性,实际上laod属性还是会保留,并被设置为0,这与很多其他属性不一样)。
remove_attribute [get_ports d] load
写在最后
set_load命令的设置规则较为复杂,需要熟悉线网的线网负载、线网负载总量、引脚负载总量、负载总量与端口的线网负载、引脚负载这几个概念之间的区别与联系。