动态功耗优化和ICG插入规则
• 除了标准单元的功耗优化外,动态功耗驱动的布局还通过移动单元来缩短高开关(切换率)活动信号网络,从而减少动态功耗(在initial_place、initial_opto、final_place阶段)。
1set_scenario_status -dynamic_power true slow_ssl25
2read_saif design_sim.saif -scenario slow_ssl25
3# 允许的设置选项:none, low, medium, high
4set_app_options -list { place.coarse.enhanced_low_power_effort medium }
5compile_fusion
这段TCL脚本首先激活了名为slow_ssl25的场景,并启用了动态功耗优化,然后读取了来自仿真得到的designsim.saif文件来应用该场景的开关活动信息。接着,它设置了布局阶段的高级选项,选择了低功耗模式并设定了中等努力程度,最后执行了compile_fusion命令来启动综合布局布线流程,其中包含了动态功耗优化的布局策略。
动态功耗驱动的布局(也称为增强型LPP或eLPP)适用于所有布局阶段。其目的是优化与高切换率信号(非时钟)网络相连的单元布局,以缩短这些网络的长度。缩短高切换率网络可以减少动态功耗,但可能会延长低切换率网络的长度,进而增加功耗和路径延迟。功耗感知布局确保了这种权衡最终导致估计的动态功耗消散净减少,同时不影响建立时间(setup timing)。
Fusion Compiler中的时钟门控
• 基于现有RTL选择/使能的时钟门控插入
■ 在compile_fusion过程中,默认插入ICG(Integrated Clock Gating)。
■ 可识别预先存在的(已实例化的)时钟门控逻辑。
■ 最多插入一级集成时钟门控单元(ICGs)。
• 自门控(Self-gating)
■ 添加XOR-ICG组合,在寄存器的D输入保持不变时关闭时钟。
■ 默认禁用。
■ 默认情况下,不对已有时钟门控的寄存器添加自门控功能。
时钟门控概述
• 时钟门控是一种广泛应用的动态功耗优化技术。
• 当寄存器状态不变时,阻止时钟信号对寄存器及其下游时钟缓冲器进行切换。
• 在执行compile_fusion过程中,默认启用时钟门控插入功能。
现有时钟门控识别与ICG插入
• Fusion Compiler在细化阶段自动识别用户实例化的时钟门控逻辑:
■ 集成时钟门控单元的识别基于库单元属性clock_gating_integrated_cell
进行。
■ 同时也能识别离散的时钟门控逻辑。
■ 自动识别功能不可禁用。
• 无论用户插入了多少级的多级时钟门控,Fusion Compiler都只会额外插入一级ICG(Integrated Clock Gating)单元。
ICG插入过程
• 时钟门控会在细化后的设计中从两个来源搜索使能条件:
直接连接到时序元件同步使能引脚的信号。
存在于从时序元件的"Q"到"D"引脚的反馈回路上的使能条件。
• 分析是在每个寄存器组的局部层次结构上执行的。
■ 在时钟门控插入之前,会自动进行ungrouping(解除分组)和常量传播,这将影响使能条件的提取。
当多比特 banking启用时,寄存器总线会保留在同一时钟门控组内。已实例化的多比特寄存器将不会进行时钟门控。
时钟门控会尝试使用寄存器的完整使能条件,并将具有相同使能条件的寄存器归为一组。对于未能达到最小位宽要求的寄存器,我们会在已形成的时钟门控组中寻找部分使能条件。最后,时钟门控会尝试使用部分共享的使能条件来对剩余的寄存器进行门控。此算法的最小位宽阈值是常规时钟门控所用大小的两倍。
时钟门控使能条件报告
• Fusion Compiler能够报告每个时钟门控的使能条件,
这对于RTL设计者调查时钟门控所使用的使能条件的逻辑项非常有用。
• 使能条件以不变点的布尔表达式形式展示,包括:
■ 时序输出引脚
■ 黑盒输出引脚
■ 层次端口report_clock_gating_enable_condition -object MID/clk_gate_q_reg
报告所有连接到寄存器或另一个时钟门控的时钟门控单元的使能条件。使用布尔方程以乘积之和的形式表示使能条件:'&'代表与操作,'|'代表或操作,'~'代表非操作。在描述使能函数时,可能会用到一些布尔变量所需的参考点(不变点)。这些参考点代表以下内容:
• 寄存器的输出引脚(因为Q和QN引脚被视为两个不同的变量)
• 端口
• 任何顺序单元、黑盒或不受支持单元的输出引脚
• 层次边界
使ICG可用
• ICG插入将遵循set_lib_cell_purpose设置
仅用于时钟树综合目的(cts)的库单元将被工具用于插入的时钟门控
库单元也需要其“dont_touch”属性设为false
排除所有ICGset_lib_cell_purpose [get_lib_cells "lib/ICG * "] -exclude all
包含我们希望用于ICG插入的ICG
1set MYICGS [get_lib_cells "lib/ICG2x lib/ICG4x ..."]
2set_lib_cell_purpose $MYICGS -include cts
3set_dont_touch $MYICGS false
指定集成时钟门控单元样式
• 使用set_clock_gate_style命令来选择用于ICG插入的集成库单元类型
测试点输入:位于锁存器之前、之后或无
观察输出:是或否
• 下例指定了插入的时钟门控必须在内部锁存器的输出端具有测试点,并且提供一个观察输出引脚
set_clock_gate_style -test_point after -observation_output