Design Compiler:什么是代价函数(Cost Function)? 相关阅读Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482简介在综合过程中Design Compiler使用代价函数(Cost Function)作为依据判断一步优化是否应该进行。Design Compiler会计算两类代价函数一类用于设计规则约束(Design Rule Constraint)另一类用于优化约束(Optimization Constraint)。如果某步优化能够降低某项代价函数而不会增加具有更高优先级的代价函数那么它就是可以接受的。下表展示了Design Compiler中的代价函数及其默认优先级从高到低。表1 代价函数类别代价函数设计规则connection classmultiple port netmin capacitancemax transitionmax fanoutmax capacitancecell degradation优化max delaymin delaypowerarea综合会在所有代价函数都为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产生LBDB-172警告或库引脚属性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)也就是驱动单元为其输出端口上的负载电容进行充放电时所消耗的功耗。对于DC Ultra、Design Compiler Graphical和Design Compiler NXTcompile_ultra命令会自动执行漏电功耗优化leakage_power_opto属性会自动被设置为true对于DC Expert则需要使用set_leakage_optimization命令启用漏电功耗优化以前曾经有set_max_leakage_power命令可以设置最大漏电功耗但现在已被废弃当漏电功耗优化开启后最大漏电功耗会被视为0。也可以执行动态功耗优化以降低动态功耗而不影响性能。动态功耗优化需要切换活动信息(switching activity)工具通过缩短高切换率线网的连线长度来优化动态功耗。对于非拓扑模式需要使用set_dynamic_optimization命令启用动态功耗优化。对于拓扑模式在Design Compiler Graphical中可以使用set_dynamic_optimization命令结合2014版本引入的power_low_power_placement变量默认值为false进行动态功耗优化布局综合时需要使用-spg选项在Design Compiler NXT中可以设置2019版本引入的compile_enable_total_power_optimization变量为true默认值为false使用set_dynamic_optimization命令会自动设置该变量为true进行总功耗优化综合时需要使用-spg选项。多工艺角和多工作模式不支持set_leakage_optimization和set_dynamic_optimization命令需要转而使用set_scenario_options命令进行设置对于拓扑模式的Design Compiler NXT需要额外的set_scenario_options命令。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命令未在命令中列出的其它代价函数将按原优先级排在所列代价函数后。