尊重用户注解的延迟
• 在特殊情况下,例如ICG驱动尚未构建的时钟网格或H树,您可能希望在ICG上标注时钟延迟,并要求工具对此予以认可。
为所有场景中的ICG设置所需的时钟延迟:
1current_scenario si
2set_clock_latency -clock [get_clocks {clkl}] -pin_load -0.5 [get_pins {arch_ICG/CK}]
3set_clock_latency -clock [get_clocks {clkl}] -pin_load 0 [get_pins {arch_ICG/GCLK}]
4current_scenario s2
5set_clock_latency -clock [get_clocks {clkl}] -pin_load -0.25 [get_pins {arch_ICG/CK}]
6set_clock_latency -clock [get_clocks {clkl}] -pin_load 0 [get_pins {arch_ICG/GCLK}]
7#在ICG的时钟引脚上设置dont_estimate_clock_latency属性:
8set_attribute [get_pins {arch_ICG/CK}] dont_estimate_clock_latency true
报告估计的延迟
• 用户指定的时钟门控上的时钟延迟约束(如果有),不会被此功能修改:
相反,该功能在标注估计的时钟延迟时使用set_clock_latency -offset。
• 可以使用write_sdc命令报告延迟偏移量。
自我门控概述
在compile_fusion -to initial_opto
阶段执行
自我门控会在没有时钟门控且没有可识别使能条件的寄存器上插入时钟门控逻辑,如果这样可以降低动态功耗
门控逻辑由一个ICG单元加上适当的组合逻辑组成,用于驱动ICG的使能引脚
使能信号是通过比较寄存器存储的值Q和到达寄存器的新数据D来生成的
共享自我门控条件
通过创建一个组合使能条件,自我门控ICG可以被共享
这同样适用于多比特寄存器
虽然这样可以减少ICG的数量,但是随着共享同一使能信号的寄存器数量增加,使能信号的质量会降低,因为时钟信号更不容易被关闭
何时插入自我门控?
• 为了确保QoR(Quality of Results,结果质量)的提升,自我门控算法会综合考虑时序和功耗因素。
• 如果满足以下条件,候选寄存器将插入自我门控单元:
寄存器的数据引脚有足够的时序余量。
对于具有多个场景的设计,算法会考虑在设置时序中最差情况下的活动场景时序。
电路的内部动态功耗得以减少。
需要切换活动。
对于具有多个场景的设计,算法使用在动态功耗分析中启用的活动场景的平均内部动态功耗。
建议:在PrimePower中进行功耗分析,以确定自我门控的功耗节省是否值得。
通常仅基于SAIF(Switching Activity Interchange Format,开关活动交换格式)来确定自我门控的功耗节省是不够的,因此我们建议您使用基于波形的功耗签核工具如PrimePower进行分析(使用VCD或FSDB输入),以确定插入自我门控是否会带来任何节省。
启用自我门控
若要启用自我门控:
compile.clockgate.self_gating
若要全局控制自我门控选项:
set_self_gating_options-min_bitwidth
(最小位宽,默认为4)和-max_bitwidth
(最大位宽,默认为8)-interaction_with_clock_gating <类型>
默认情况下(none),被工具插入的时钟门控所控制的寄存器将被跳过。
使用`insert`可在已门控的寄存器上插入自我门控。
使用`collapse`来合并自我门控与时钟门控的使能信号。
-tree_type
xor
|or
|nand
|auto
使用`auto`让Fusion Compiler根据被门控寄存器的静态概率自动决定比较器中使用的最佳门类型。
对于-tree_type选项:
当寄存器大部分时间处于状态0时,使用OR门。
当寄存器大部分时间处于状态1时,使用NAND门。
否则,使用传统的XOR自我门控方式。
特定的自我门控设置
要对特定对象控制自我门控:
set_self_gating_objects-include
,-exclude
,-force
,-clear
,-reset
,-tree_type
对象列表示例:
1 set_self_gating_options \
2 -min_bitwidth 3 -max_bitwidth 6 \
3 -interaction_with_clock_gating insert \
4 -tree_type auto
5
6 set_self_gating_objects \
7 -include [get_cells I_A] \
8 -tree_type nand
这段示例首先设置了全局的自我门控选项,包括最小和最大位宽、与时钟门控的交互方式以及门类型自动选择。随后,具体指定了某些对象(在这里是名为I_A的单元)的自我门控设置,强制使用NAND门作为比较器。
Objects can be of type register, hierarchical cell, power domain, or module.
跨层次合并(1/2)
层次化时钟门控试图在保持时钟门控寄存器百分比的同时,最小化时钟门控单元的数量。
合并后的时钟门控单元将放置在一个共同的祖先层次中。
工具寻找具有相同时钟和使能信号的时钟门控单元:
仅遍历缓冲器、反相器和其他时钟门控单元。
时钟门控合并算法会遵守设计约束:
set_clock_gate_transformations
set_boundary_optimization
set_dont_touch
控制时钟门控:使能源
• set_clock_gating_objects 也用于指定是否从以下来源获取使能逻辑:
同步使能连接和/或
反馈循环
• 示例:
1 set_clock_gating_objects -include [get modules m1] \
2 -enable_source prefer_enable_pin
可用的选择有:enable_pin_only(仅使能引脚)、feedback_loop_only(仅反馈循环)、both(默认,两者都)、none(无)、prefer_enable_pin(优先使能引脚)、prefer_feedback_loop(优先反馈循环)。
此设置应用于-force和/or -include选项指定的所有对象(不得使用-clear、-exclude和-reset选项)。
-enable_source none 表示不从指定寄存器的任何特性中推导出使能条件。这些寄存器将要么不被门控,或者如果对它们使用了-force选项,则将由始终使能的时钟门控进行门控。同时使用-enable_source none 和 -include 是错误的配置。
最大时钟门控层数 - 概述
• Fusion Compiler 总是会插入额外一级的时钟门控,这一行为独立于已存在的时钟门控,因此设计中的时钟门控层数可能会增加。
• 新的应用选项 compile.clockgate.max_number_of_levels 允许您设置设计上的最大时钟门控层数。
• 默认值为0(意味着层数不受限制)。
• 当 compile.clockgate.max_number_of_levels 的值小于当前的时钟门控层数时,工具会将现有的使能逻辑与工具推断的使能条件结合,并折叠现有的时钟门控,直到达到最大层数限制。
• 如果无法进行折叠,那么通过移除驱动寄存器的时钟门控(通常是工具插入的时钟门控)来解除该寄存器的门控。
• 所有时钟门控转换均需满足由 set_clock_gate_transformations、set_dont_touch、set_size_only 以及 set_boundary_optimization 命令所设置的约束条件。
• 如果已达到最大层数限制,自我门控不会增加额外的时钟门控层级。
时钟门控延迟
在综合阶段考虑时序问题时,
• 使能逻辑属于数据路径逻辑,需要满足与之相连的时钟门控的建立时间要求。
默认情况下,所有时钟被视为理想时钟,所有时钟门控和寄存器的时钟延迟均为0。
这可能导致插入时钟树后出现时序违规。
一旦时钟树构建完成:
时钟门控处的时钟到达时间 < 寄存器处的时钟到达时间。
• 在综合过程中,您应该考虑CG(时钟门控)的延迟。
按阶段(stage)和扇出(fanout)应用时钟门控延迟
• 您可以使用set_clock_gate_latency命令在时钟门控和寄存器上定义延迟。
• 延迟在compile_fusion阶段会被自动注解。
此注解既适用于用户实例化的时钟门控,也适用于工具插入的时钟门控。
也可以通过apply_clock_gate_latency命令手动进行注解。
CG latency 标注示例:
1set_clock_latency 1.0 [get_clock clk ]
2set_clock_gate_latency -stage 1 -fanout_latency { {1-8 0.2} {9-inf 0.3}}
3set_clock_gate_latency -stage 2 -fanout_latency { {1-inf 0.2 } }
4set_clock_gate_latency -stage 3 -fanout_latency { {1-inf 0.1 }}
越离寄存器越近,stage num 越小;越离clock_root越近,stage num 越大。
1) 在此示例中,使用set_clock_latency为所有寄存器设置了一个时钟延迟值1.0。
2) 然后,对于第一级时钟门控,对其直接或间接扇出少于8个寄存器的,应用0.2的时钟延迟递减。而对于驱动9个或更多寄存器的第一级时钟门控,指定的时钟延迟递减为0.3。
因此,toolcg_a的时钟延迟为0.8,toolcg_b的延迟值为0.7。
3) 对于第二级时钟门控,我们指定一个0.2的时钟延迟递减,因此uicg_2得到的延迟为0.5。
4) 最后,对于第三级时钟门控,我们指定一个0.1的递减。请注意,对于这个例子,我们通过从直接扇出中时钟延迟较小的时钟门控中减去计算得出注解值。
除了使用set_clock_latency之外,您还可以使用以下命令在接收寄存器的时钟引脚上设置延迟:
set_clock_gate_latency -stage 0 -fanout_latency ({1-inf 1.6})
注意,当指定stage 0时,该值是绝对的;对于所有其他阶段,该值是相对的。
如果您在特定时钟引脚上使用set_clock_latency,这将覆盖任何已计算的延迟值。