使用set_switching_activity方法的局限性
• 未通过set_switching_activity注解的主要控制输入(如复位、使能)会继承默认的开关活动值。
■ 由于这些输入通常保持静态不变,与其关联逻辑的动态功耗计算可能过于悲观(即估计过高)。
• 工具传播的时序输出引脚的开关活动往往趋向于零切换率。
■ 下游逻辑的动态功耗计算可能过于乐观(即估计过低)。
• infer_switching_activity将为控制信号应用适当的静态值,并为时序输出引脚提供更好的切换率,从而改善上述情况。
infer_switching_activity
识别关键点(Essential Points, EPs)并推断其活动性
• 驱动特殊控制输入(Special Control Inputs, SCIs),如复位和使能的EPs,会被设定为静态(高/低)。
• 不驱动SCIs的EPs则会接受推断出的开关活动。
■ 推断出的开关活动是依据power.default_*应用选项的设置来计算的。
■ 推断出的开关活动将覆盖传播的活动性。
关键点(Essential Points)包括:主要输入;端口的“输入”部分;时序输出(不包括序列ICG单元);三态输出;No-func - 即没有功能描述其行为的输出引脚,如黑盒;No-driver - 即没有驱动源的网络。
特殊控制输入(Special Control Inputs)包括:复位;置位;扫描使能;隔离控制;电源开关控制;ICG使能和保持控制不属于SCI!
对于这些关键点,会应用适当的静态高或低设置,以确保不发生复位、置位、钳位或休眠状态。基于多数端点行为:例如,若由一个EP驱动的8个SCI中有7个是低电平有效的复位引脚,而1个是高电平有效,那么infer_switching_activity将应用切换率为0和静态概率为1,以确保大多数SCI不处于复位状态。
计算默认开关活动所用的三个应用选项是:power.default_static_probability(0.5)、power.default_toggle_rate(0.1)以及power.default_toggle_rate_reference_clock(最快)。计算出的切换率公式为:
tr = default_toggle_rate * fclk
例如,如果设计中最快的时钟周期为4,则频率为1/4=0.25。切换率tr = 0.1 * 0.25 = 0.025。
您可以通过将power.default_toggle_rate_reference_clock设置为related,来使用实际连接到寄存器的时钟,而非设计中的最快时钟。
infer_switching_activity的推荐设置流程如下:
使用create_clock命令定义时钟活动。
对于任何已知所需活动的端口,使用set_switching_activity进行设置。
1 current_scenario func.tt_60c
2 set_switching_activity -toggle_rate 0.02 -static_probability 0.7 [get_ports a]
3 set_switching_activity -toggle_rate 0.06 -static_probability 0.3 [get_ports b]
对所有剩余未注解的关键点(EPs)使用infer_switching_activity。
1 set_scenario_status -dynamic_power true func.tt_60c
2 infer_switching_activity -scenarios func.tt_60c \
3 -sci_based all -apply -output inferred_activity.tcl
其中,-sci_based的可选值有:sci(仅针对特殊控制输入)、non_sci(非特殊控制输入)、all(所有情况)。
infer_switching_activity命令在未指定-apply选项的情况下,不会自动应用推断出的活动。用户可以不带-apply执行该命令,仅审查推断出的活动,或者将推断出的set_switching_activity命令输出到文件中以便单独引用。然而,如果采用后者,活动将以'标注'形式而非'推断'形式应用,且'标注'类型的活动优先级高于'推断'类型。因此,后续执行infer_switching_activity命令将不会改变这些值。SAIF活动也被视为'标注",因此不会被infer_*覆盖重写。
除了infer_switching_activity之外,还有report_essential_points命令,可用于确定设计中特定控制点是由哪个EP负责的。利用这些信息,用户可以帮助决定应将什么样的活动注解到设计中。
下面的例子展示了如何使用该命令找到驱动寄存器复位引脚的关键点。可以看到,reset_n端口驱动了1045个复位引脚,目前具有0.5的概率静态值和0.125的切换率。这个低电平有效的端口通常需要设置为静态值'T'和切换率'0',以确保在功耗分析期间设计不会被复位。
开关活动覆盖率
• 使用report_activity -driver来确保关键点上接近100%的开关活动覆盖率,并按活动类型细分:
• 采用-verbose选项可获得每种活动类型来源的详细分解:
启用总功耗优化
• 要在整个compile_fusion流程中启用总功耗优化,需要以下两个设置:
■ 为直至initial_opto阶段启用总功耗优化:
set_qor_strategy -stage synthesis -metric total_power
♦ 默认情况下,仅执行漏电功耗优化(无法禁用)
■ 为final_place和final_opto阶段启用总功耗优化:
set_app_options -name opt.power.mode -value total
你可以选中仅使能leakage或者dynamic
set_qor_strategy命令用于设置各种优化策略,通过设置流程中启用特定技术的应用选项来实现。当前,该命令用于启用总功耗优化,未来将进一步增强,以支持其他优化标准。
至于直到initial_opto阶段:在具有多个漏电场景的设计中,优化会使用所有漏电场景中最坏情况下的漏电值。如果没有为漏电启用任何场景,优化将使用所有活动场景中的最差漏电值。
总功耗优化包括以下方面:
■ 选择低功耗DesignWare组件
■ 对整个时序路径执行功耗驱动的结构重组
■ 对DesignWare组件实施数据路径门控
■ 特别适用于具有较大乘法器和加法器树结构的设计(大于16位)
■ 不会对关键时序产生影响
数据路径门控会在DesignWare组件内部添加门控逻辑。如果在启用总功耗优化的情况下要禁用数据路径门控,可以使用以下命令:
1set_datapath_gating_options -enable false
多比特 banking
• 将单比特寄存器合并(banking)为多比特寄存器可以导致:
• 因共享晶体管及优化的晶体管级布局而减小面积和功耗
• 总时钟树网络长度、时钟树功耗以及CT缓冲器的数量减少
全自动多比特 banking/取消 banking/重新 banking
WordView架构支持在RTL级直接进行多比特映射
物理banking对物理上相邻的寄存器执行额外的多比特banking
取消 banking支持:
■ 通过移除未使用的比特来节省面积
■ 通过增大尺寸或移动选定比特以获得更好的时序
■ 无需依赖单比特的多比特(退化)单元
对已取消 banking的比特进行重新 banking,保持较高的banking比率
单比特(或退化的)多比特单元是多比特单元的1比特版本。在过去,这些是必需的。但Fusion Compiler不需要这些特殊的多比特寄存器,相反,它可以映射到任何常规的单比特寄存器上。
启用多比特 banking
• 一旦启用,多比特操作将贯穿整个compile_fusion流程。
• 基于RTL总线和考虑布局的多比特映射都兼顾了时序因素。
• 若要指定更多设置,可使用:set_multibit_options命令。
配置多比特 banking 及其报告
set_multibit_optins
exclude: 需要从多比特 banking 中排除的对象列表
exclude_library_cells: 需要排除其实例进行多比特 banking 的库单元列表
stage rtl | physical | all: 指定排除规则是否应用于RTL banking、物理banking或两者皆有
利用multibit.naming.*应用选项来控制命名规范
使用report_multibit命令报告设计中多比特单元的统计信息
利用multibit_width属性来查找多比特寄存器:
1get_cells -filter "multibit_width > 1"
此命令将获取所有宽度大于1的多比特寄存器单元。
使用set_multibit_options时,您还可以指定一个时序余量阈值,低于此阈值的寄存器将不参与多比特 banking:
1set_multibit_options -slack_threshold <n>
Fusion Compiler不支持RTL代码中的infer_multibit和dont_infer_multibit这两个pragma指令。
以下应用选项可用于在banking过程中控制命名方式:
1- `multibit.naming.common_prefix_naming_style`
2- `multibit.naming.compact_hierarchical_name`
3- `multibit.naming.element_separator_style`
4- `multibit.naming.expanded_name_style`
5- `multibit.naming.multiple_name_separator_style`
6- `multibit.naming.name_prefix`
7- `multibit.naming.range_separator_style`
您也可以使用原子命令来进行多比特 banking和取消 banking操作:
Banking(合并多比特):
identify_multibit
该命令识别单比特单元组并创建多比特单元。De-banking(拆分多比特):
split_multibit
该命令将现有的多比特单元拆分为单比特单元。
set_multibit_options设置的选项也受上述原子命令支持。