Design Compiler:什么是代价函数(Cost Function)
相关阅读
Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm=1001.2014.3001.5482
简介
在综合过程中,Design Compiler使用代价函数(Cost Function)作为依据判断一步优化是否应该进行。Design Compiler会计算两类代价函数,一类用于设计规则约束(Design Rule Constraint),另一类用于优化约束(Optimization Constraint)。如果某步优化能够降低某项代价函数而不会增加具有更高优先级的代价函数,那么它就是可以接受的。
下表展示了Design Compiler中的代价函数及其默认优先级(从高到低)。
表1 代价函数
类别 | 代价函数 |
设计规则 | connection class |
multiple port net | |
min capacitance | |
max transition | |
max fanout | |
max capacitance | |
cell degradation | |
优化 | max delay |
min delay | |
power | |
area |
综合会在所有代价函数都为0或者无法进一步降低时停止,需要注意的是,代价函数只和违例的部分有关,而与裕量(Slack)无关。
下面将简单介绍各个代价函数的含义。
connection class
连接类别(connection class)用于描述在特定工艺下的连接要求,只有具有相同连接类别的引脚和端口才可以合法连接,在逻辑库中可以使用库引脚属性connection_class指定库引脚的连接类别,端口的连接类别由default_port_connection_class变量(默认为universal,即可以任意连接)或者set_connection_class命令决定。
connection class代价函数的计算公式如下所示。
其中为设计中的引脚/端口数量,当出现非法连接时
为1,否则为0。
使用report_constraint -connection_class命令可以显示connection class代价函数的值。
multiple port net
多端口线网(multiple port net)指的是以下两类线网:一个输入端口连接到输出端口(也就是feedthrough)或多个输出端口互相连接(也就是logically equivalent outputs),如图1所示。
图1 多端口线网
为了表示这类网络,Design Compiler会在门级网表中使用assign语句。然而,后端工具在处理包含assign语句的网表时可能会出现问题。默认情况下,Design Compiler不会在多端口线网插入缓冲器,使用set_fix_multiple_port_nets命令可以开启这个功能。
multiple port net代价函数的计算公式如下所示。
其中为设计中的线网数量,当出现多端口线网时
为连接的输出端口数,否则为0。
使用report_constraint -multiport_net命令可以显示multiple port net代价函数的值。
min capacitance
最小电容(min capacitance)指的是输出引脚/输入端口所需驱动的最小电容,在逻辑库中可以使用库属性default_input_pin_cap或库引脚属性capacitance(优先级高于库属性)指定输入引脚的电容(对于输出端口,可以使用set_load命令指定电容,默认情况下电容为0);使用库引脚属性min_capacitance指定输出引脚的最小需驱动电容(对于输入端口,可以使用set_min_capacitance命令指定最小需驱动电容,默认情况下最小需驱动电容为0)。
min capacitance代价函数的计算公式如下所示。
其中为设计中的线网数量,
为驱动线网的输出引脚/输入端口所需驱动的最小电容减去线网的总电容。
使用report_constraint -min_capacitance命令可以显示min capacitance代价函数的值。
max transition
最大转换时间(max transition)指的是线网能够拥有的最大转换时间(每个线网的转换时间不超过线网连接的所有引脚和端口上设置的最严格的最大转换时间),在逻辑库中可以使用库属性default_max_transition或库引脚属性max_transition(优先级高于库属性)指定库引脚的最大转换时间,(对于输入/输出端口,可以使用set_max_transitione命令指定最大转换时间,默认情况下最大转换时间为无穷大)。
max transition代价函数的计算公式如下所示。
其中为设计中的线网数量,
为线网上的转换时间减去线网连接的所有引脚和端口上设置的最严格的最大转换时间。
使用report_constraint -max_transition命令可以显示max transition代价函数的值。
max fanout
最大扇出负载(max fanout)指的是输出引脚/输入端口所能驱动的最大扇出负载,在逻辑库中可以使用库属性default_fanout_load或库引脚属性fanout_load(优先级高于库属性)指定输入引脚的扇出负载(对于输出端口,可以使用set_fanout_load命令指定扇出负载,默认情况下扇出负载为0);使用库属性default_max_fanout或库引脚属性max_fanout(优先级高于库属性)指定输出引脚的最大扇出负载(对于输入端口,可以使用set_max_fanout命令指定最大扇出负载,默认情况下最大扇出负载为无穷大)。
max fanout代价函数的计算公式如下所示。
其中为设计中的线网数量,
为线网的总扇出负载减去驱动线网的输出引脚/输入端口所能驱动的最大扇出负载。
使用report_constraint -max_fanout命令可以显示max fanout代价函数的值。
max capacitance
最大电容(max capacitance)指的是输出引脚/输入端口所能驱动的最大电容,在逻辑库中可以使用库属性default_input_pin_cap或库引脚属性capacitance(优先级高于库属性)指定输入引脚的电容(对于输出端口,可以使用set_load命令指定电容,默认情况下电容为0);使用库属性default_max_capacitance或库引脚属性max_capacitance(优先级高于库属性)指定输出引脚的最大可驱动电容(对于输入端口,可以使用set_max_capacitance命令指定最大可驱动电容,默认情况下最大可驱动电容为无穷大)。
max capacitance代价函数的计算公式如下所示。
其中为设计中的线网数量,
为线网的总电容减去驱动线网的输出引脚/输入端口所能驱动的最大电容。
使用report_constraint -max_capacitance命令可以显示max capacitance代价函数的值。
cell degradation
单元退化(cell degradation)指的是为避免性能退化,单元所能驱动的最大电容,在逻辑库中可以使用cell_degradation查找表(以输入转换时间作为索引)指定单元退化最大电容(对于输入端口,可以使用set_cell_degradation命令指定单元退化最大电容,默认情况下单元退化最大电容为无穷大)
cell degradation代价函数的计算公式如下所示。
其中为设计中的线网数量,
为线网的总电容减去驱动线网的输出引脚/输入端口所能驱动的单元退化最大电容。
使用report_constraint -cell_degradation命令可以显示cell degradation代价函数的值。
max delay
最大延迟(max delay)是一种优化约束,一般指的是建立时间约束。Design Compiler内置了一个静态时序分析器,用于评估时序约束,它通过分析单元延迟和互连延迟来计算路径延迟,但不会对设计进行仿真。一般使用set_input_delay命令约束in2reg路径,set_output_delay命令约束reg2out路径,create_clock命令约束reg2reg路径,set_max_delay约束异步路径。
max delay的代价函数与时序路径如何分组有关。
Worst Negative Slack Method
默认情况下,Design Compiler使用最差违例法(Worst Negative Slack Method)进行计算,此时使用相同时钟约束终点的时序路径属于同一个时序组(Path Group)(或者可以使用group_path命令手动创建时序组),可以使用report_path_group命令报告当前设计中定义的时序组,每个时序组只有关键路径(Worst Negative Slack, WNS)对代价函数有贡献(当使用group_path命令时使用-weight选项,还可以指定时序组的权重,默认为1),这种方法占用更少的CPU资源,运行时间更短,非常适合用于设计早期的探索阶段。
这种情况下max delay代价函数的计算公式如下所示。
其中为设计中的时序组数量,
为时序组中关键路径的延迟减去最大延迟,
为该时序组的权重。
Critical Range Negative Slack Method
如果设计具有复杂的时钟结构、复杂的时序要求或复杂的约束条件,可以通过group_path命令手动创建时序组并使用-critical_range选项添加临界范围,让Design Compiler考虑到次关键路径的优化。对于每个时序组,只要时序路径的违例在关键路径的某个范围以内,它就会对代价函数有贡献。例如临界范围设置为2.0ns,当前关键路径的延迟为10.0ns,那么Design Compiler会优化所有延迟在8.0到10.0ns之间的路径。
这种情况下max delay代价函数的计算公式如下所示。
其中为设计中的时序组数量,
为时序组中临界范围内的时序路径数量,
为时序组中临界范围内的时序路径延迟减去最大延迟,
为该时序组的权重。
使用report_constraint -max_delay命令可以显示max delay代价函数的值。
min delay
最小延迟(min delay)是一种优化约束,一般指的是保持时间约束。Design Compiler在修复设计规则违例时,也会一并处理最小延迟违例。一般使用set_input_delay命令约束in2reg路径,set_output_delay命令约束reg2out路径,create_clock命令约束reg2reg路径,set_min_delay约束异步路径。
但与最大延迟不同的是,仅设置了以上的约束还不足以让Design Compiler在综合时将最小延迟考虑在内,还需要进行以下设置。
1、使用set_fix_hold命令指定一个时钟,所有以时钟约束终点的时序路径的最小延迟对代价函数有贡献
2、使用set_min_delay约束一条时序路径,且该时序路径终点没有时钟约束或由一个使用set_fix_hold命令指定的时钟约束,该时序路径的最小延迟对代价函数有贡献。
每个时序组中的所有违例的时序路径都对对代价函数有贡献,而不像最大延迟那样是关键路径或临界范围内的时序路径。
min delay代价函数的计算公式如下所示。
其中为设计中的时序组数量,
为最小延迟减去时序组中所有时序路径的延迟,
为该时序组的权重。
使用report_constraint -min_delay命令可以显示min delay代价函数的值。
max power
功耗(power)主要分为静态功耗和动态功耗:静态功耗也就是漏电功耗(leakage power),也就是门电路在处于非活动或静态状态时所消耗的功耗。动态功耗可以分为内部功耗(internal power)或者称为短路功耗(short-circuit power),也就是由于P型和N型晶体管之间的短暂短路所产生的功耗和切换功耗(Switching Power)或者称为电容功耗(capacitance power),也就是驱动单元为其输出端口上的负载电容进行充放电时所消耗的功耗。
对于使用compile_ultra综合命令的DC Ultra、Design Compiler Graphical和Design Compiler NXT,会自动执行漏电功耗优化;对于使用compile综合命令的DC Expert则需要使用set_leakage_optimization命令启用漏电功耗优化。
以前曾经有set_max_leakage_power命令,但现在已被废弃。当漏电功耗优化开启后,最大漏电功耗会被视为0。
也可以执行动态功耗优化,以降低动态功耗而不影响性能。动态功耗优化需要切换活动信息(switching activity),工具通过缩短高切换率线网的连线长度来优化动态功耗。由于动态功耗的节省依赖于切换活动,需要使用read_saif命令加载切换数据,set_dynamic_optimization命令用于启用动态功耗优化。
max power代价函数的计算公式如下所示。
其中为设计总功耗减去最大功耗。
使用report_constraint -max_dynamic_power -max_leakage_power命令可以显示power代价函数的值。
max area
在面积(max area)优化过程中,Design Compiler会尝试最小化设计中的门数/尺寸,同时不降低时序性能。对于使用compile_ultra综合命令的DC Ultra、Design Compiler Graphical和Design Compiler NXT,最大面积会被视为0;对于使用compile综合命令的DC Expert则需要使用set_max_area命令进行最大面积约束。
max area代价函数的计算公式如下所示。
其中为设计面积减去最大面积。
使用report_constraint -max_area命令可以显示max area代价函数的值。
改变代价函数优先级
默认情况下,设计规则约束的优先级高于优化约束,也就是Design Compiler可能会选择引入或使现有优化约束违例更多,以减少设计规则约束违例。
但在一些情况下,用户可能想调整各代价函数的优先级,这可以使用set_cost_priority命令完成。例如以下情况,可能希望将max_delay的优先级提升到高于某些设计规则:
-
某些逻辑库中,唯一较难修复的设计规则违例往往是输入端口过度约束(例如:较大的外部负载)或受dont_touch限制的逻辑。如果将max_delay放在设计规则前面,Design Compiler可以以不影响时序的方式修复这些设计规则违例,例如通过调整另一个模块的驱动器尺寸。
-
编译小模块(例如从大设计中提取的关键区域)时,模块边界可能会出现过度约束。此时,设计规则修复可以推迟到模块并入大设计之后再处理。
若希望将max_delay的优先级提升到所有设计规则之前,可以使用set_cost_priority -delay
命令;若希望按照max_capacitance、max_delay、max_fanout的顺序设定最高优先级,可以使用set_cost_priority "max_capacitance max_delay max_fanout"命令(未在命令中列出的其它代价函数将按原优先级排在所列代价函数后)。