相关阅读
目录
set_max_capacitance命令用于设置最大可驱动电容(设置了对象的max_capacitance属性),这是一种设计规则约束(Design Rule Constraint),Design Compiler在综合的门级优化阶段会尝试确保每个输入端口/输出引脚驱动的电容总和(包括引脚电容和互连电容)不超过设置的最大可驱动电容(优先级高于优化约束(Optimization Constraint),即可能以时序违例为代价修复设计规则违例)。
在逻辑库中可以使用库属性default_input_pin_cap或库引脚属性capacitance(优先级高于库属性)指定输入引脚的电容(对于输出端口,可以使用set_load命令指定电容,默认情况下电容为0);使用库属性default_max_capacitance或库引脚属性max_capacitance(优先级高于库属性)指定输出引脚的最大可驱动电容(对于输入端口,可以使用set_max_capacitance命令指定最大可驱动电容,默认情况下最大可驱动电容无穷大)。需要注意的是,set_max_capacitance命令只能比库属性或库引脚属性更严格,如果设置的值更宽松(更大)则会被忽略。如果想要移除最大可驱动电容,使用remove_attribute命令。
本文针对Design Compiler,但该命令同样存在于PrimeTime、IC Compiler等工具中,它们大致相同,略有差别。set_max_capacitance命令的BNF范式(有关BNF范式,可以参考以往文章)为:
set_max_capacitance
capacitance_value
[-data_path] [-clock_path]
object_list
//注:该命令的object_list参数一定要放在capacitance_value参数后
指定最大可驱动电容值
capacitance_value是一个非负的电容值,代表了需要设置在对象上的最大可驱动电容,它的单位要与工艺库中指定的电容单位一致。
指定数据路径
-data_path选项用于指定当对象列表中包含时钟对象时,最大可驱动电容只会影响该时钟发射的数据路径中的输出引脚,默认情况下,如果对象列表中包含时钟对象会产生以下警告并同时影响数据路径和时钟路径。
Warning: set_max_capacitance has been applied on clock objects without specifying -clock_path. Constraint will be considered by both clock network pins and data pins launched by that clock. (OPT-1031)
指定时钟路径
-clock_path选项用于指定当对象列表中包含时钟对象时,最大可驱动电容只会影响该时钟发射的时钟路径中的输出引脚,默认情况下,如果对象列表中包含时钟对象会产生以下警告并同时影响数据路径和时钟路径。
Warning: set_max_capacitance has been applied on clock objects without specifying -clock_path. Constraint will be considered by both clock network pins and data pins launched by that clock. (OPT-1031)
指定对象列表/集合
指定一个列表/集合,包含时钟对象、输入端口对象或设计对象(影响设计中的所有输入端口和单元输出引脚),需要注意的是,无法直接指定某个单元引脚的最大可驱动电容。对于列表而言,如果有多于一个对象,需要使用引号或大括号包围(对使用集合无效),关于列表和集合的区别,可以参考下面的博客。
简单使用
以图1所示的电路图为例,逻辑库中使用库属性default_input_pin_cap定义了电容为0.001,而库单元CLKBUFX1的输入引脚定义了库引脚属性capacitance为0.001682(优先级更高);逻辑库中使用库属性default_max_capacitance定义了最大可驱动电容为0.05,而库单元CLKBUFX1的输出引脚定义了库引脚属性max_capacitance为0.054755(优先级更高)。
图1 简单的例子
可以使用report_net [get_nets b]命令查看线网b上的总电容(假设互连电容为0,且如果不使用set_load命令,输出端口b的电容为0),如图2所示。
图2 线网b的总电容
可以从图2中看出,线网b的总电容满足了库引脚属性的约束,也可以使用report_constraint -max_capacitance命令查看此时设计的整体约束情况,如图3所示。
图3 最大可驱动电容约束(满足)
下面使用set_max_capacitance命令设置设计的最大可驱动电容为0.001,此时对于输入端口a和单元输出引脚来说,其需要满足的最大可驱动电容变成了0.001。
dc_shell> set_max_capacitance 0.001 [current_design]
此时的整体约束情况,如图4所示,可以看出此时出现设计规则违例,代价函数的值此时恰好为0.00168-0.001+0.00168-0.001=0.00136。
图4 最大可驱动电容约束(违例)
写在最后
1、如果同时在时钟对象、输入端口对象和设计对象上设置了最大可驱动电容,Design Compiler在计算时会选择最严格的最大可驱动电容。
2、在Design Compiler计算是否满足最大可驱动电容时,只会选择最大条件下线网的总电容而不会考虑最小条件下线网的总电容。