学习Synopsys Fusion Compiler FE28:ICG 设置(1)

文摘   2024-10-21 07:01   上海  

控制最小位宽和最大扇出

CG设置
• 使用set_clock_gating_options命令可进行以下控制:

  • 要门控的寄存器最小数量(默认值:3)

  • 时钟门控的最大扇出(默认值:无限制)
    • 示例:

1set_clock_gating_options -minimum_bitwidth 6 -max_fanout 16
2set_clock_gating_options -min 4 -max 32 -objects [get_cells M0/B0] 

• 建议:不要更改默认的最大扇出设置(无限制)——让工具根据时序/最大过渡/最大电容来确定连接的单元。

控制时钟门控:排除项。
使用set_clock_gating_objects命令来定义针对寄存器、分层单元、电源域或模块的时钟门控排除项。

1set_clock_gating_objects -exclude [get_module MID]
2set_clock_gating_objects -include [get_module BOT]
3set_clock_gating_objects -clear [get_cells m1/b1 ]

以下是包含/排除/强制/清除设置的优先级顺序(从高到低):

  • 寄存器叶单元实例的设置

  • 分层实例的设置

  • 该实例电源域的设置

  • 该实例参考设计的设置

  • 该实例分层父级的设置

预存在的时钟门控转换

• Fusion Compiler在综合过程中可以对已实例化的时钟门控执行四种转换(默认全部启用):

  • 分割扇出:被门控的寄存器被分区,并由现有实例的克隆进行门控

  • 取消扇出门控:实例被移除,使能信号重新连接到寄存器上

  • 合并冗余层级:合并背靠背时钟门控(其扇出仅是一个时钟门控单元)的使能信号

  • 合并等效时钟门控:合并具有等效使能条件的时钟门控的扇出,并仅保留一个现有的CG实例
    • 对现有时钟门控实例施加set_dont_touch或set_size_only约束将阻止对该单元的所有时钟门控转换。

使用set_clock_gate_transformations来限制对现有时钟门控所做的操作,例如:

  • 综合期间不允许进行任何转换。
    set_clock_gate_transformations [get_clocks_gates ] false

不允许对第一级时钟门控进行转换,仅允许对第二级时钟门控进行分割和取消门控操作——不允许进行合并冗余层级和合并等效操作。

1set_clock_gate_transformations [get_clock_gates -level 1 ] false
2set_clock_gate_transformations [get_clock_gates -level 2 ] true -collapse_levels false -merge_equival false
3
4set_clock_gating_options -min_bitwidth 6
5set_clock_gate_transformations [get_cells uicg_b* ] true -ungate_fanout false
6set_clock_gate_transformations [get_cells uicg_c* ] false
7report_clock_gating
8report_clock_gating -ungated

乍一看,您可能认为“被门控的寄存器数量”(83.11%)应等于“工具插入的寄存器数量”(19.3%)加上“预先存在的被门控寄存器数量”(82.69%),但实际上并不一定如此。这是因为“工具插入的寄存器数量”可能包含一些预先就存在的已被门控的寄存器,即工具对这些寄存器又添加了一层门控。

• 在CTS之前,默认情况下,ICG的时钟引脚被分配与寄存器时钟引脚相同的延迟

  • 使能逻辑优化将会过于乐观

  • 可能导致CTS后ICG出现时序违规。
    •常见解决方法包括:

  • 在ICG的时钟引脚上应用注解的延迟

  • 在ICG的使能引脚上应用路径约束
    • 这些方法的缺点包括:

  • 耗时且容易出错

  • 应用的值是静态的

  • ICG的布局并未被驱动去改善(增加)ICG时钟引脚的延迟

  • 使能逻辑的优化无法看到由于ICG布局改变而引起的ICG延迟变化

对ICG使能引脚应用正向路径余量(set_path_margin)会根据余量大小减少到达这些使能引脚所需的路径延迟时间。这可能会使得优化过程能够看到并尝试修复违反时序的使能路径。

集成电路时钟门控延迟估计在compile_fusion期间默认开启
• 时钟门控延迟估计被整合进预CTS(时钟树综合)优化流程中

  • 确保通过在必要步骤后更新延迟(例如:

  • 布局

  • 集成多比特 banking

  • 时钟门控优化步骤(合并、分割等)),在整个预CTS流程中时钟门控延迟保持准确

  • 允许更精确地对数据通路以及使能控制寄存器和组合逻辑的有用偏斜进行优化

通过使用此新功能,无需手动应用ICG延迟估计(set_clock_gate_latency)。现在,默认启用了针对最佳ICG使能路径时序QoR(Quality of Results,结果质量)的新推荐方法论。
延迟估计引擎考虑时钟NDR(网络设计规则)和缓冲器/反相器设置,确保与CTS后延迟的最佳相关性。
在布局迭代过程中,每次移动ICG时都会更新时钟门控延迟。
布局器会看到ICG移动的完整效果,并同时考虑数据路径延迟和时钟网络延迟,给出最佳的ICG位置和时序。
为了获得最佳结果,在使用延迟估计的Fusion Compiler中请避免使用以下功能:

  • 试用CTS(Trial CTS)

  • 优化ICG(Optimize ICG)

  • 物理感知时钟门控(PACG),PACG会自动禁用

  • 用户自定义的时钟门控延迟注释
    集成的时钟门控延迟估计会抵消用户在时钟门控单元实例上设置的延迟值(通过set_clock_latency设定),并且忽略set_clock_gate_latency设置。
    移除任何手动延迟估计的替代方案:set_clock_gating_check -setup, set_path_margin -setup
    继续使用相同的时钟门控结构(set_clock_gating_options),如果您之前已经有所设置。
    集成的时钟门控延迟估计会抵消用户通过set_clock_latency在时钟门控单元实例上设置的延迟值,并且忽略在引入CG估计之前使用的set_clock_gate_latency设置。
    移除任何手动延迟估计的替代方案:set_clock_gating_check -setup, set_path_margin -setup。

延迟估计 - 先决条件

• 由于该特性使用CTS设置来进行延迟估计,请在执行compile_fusion/place_opt命令之前设置以下内容:

  • 时钟网络设计规则(set_clock_routing_rules)

  • CTS缓冲器和反相器库单元列表(set_lib_cell_purpose -include cts)
    • 不要使用试用时钟树(trial-clock-tree)或优化ICG(optimize-ICG)特性,它们会禁用ICG延迟估计。

1reset_app_options {
2compile.flow.optimize_icgs 
3compile.flow.trial_clock-tree
4place_opt.flow.optimize_icgs
5place_opt.flow.trial_clock_tree }

注意:如果启用了optimize_icgs或trial_clock_tree,该功能将被关闭;日志中将打印以下警告信息:
Warning:Disabling clock-gate latency aware placement because trial clock tree
construction was enabled. (PLACE-080)

集成的时钟门控延迟估计会抵消用户在时钟门控单元实例上设置的延迟值(通过set_clock_latency设定),并且忽略set_clock_gate_latency设置。
移除任何手动延迟估计的替代方案:set_clock_gating_check -setup, set_path_margin -setup。

在特殊情况下,比如ICG驱动尚未构建的时钟网格或H树,您可能希望在ICG上注解时钟延迟,并通过在ICG时钟引脚上设置以下属性让工具予以认可:dont_estimate_clock_latency。

若要阻止工具针对特定ICG估计时钟延迟,请在所有场景中为ICG设置所需的时钟延迟:

1current_scenario si
2set_clock_latency -clock [get_clocks (clk1)] -pin_load 0.5 [get_pins (arch_ICG/CK)]
3set_clock_latency -clock [get_clocks (clk1)] -pin_load 0 [get_pins (arch_ICG/Y)]
4
5current_scenario s2
6set_clock_latency -clock [get_clocks (clk1)] -pin_load 0.25 [get_pins (arch_ICG/CK)]
7set_clock_latency -clock [get_clocks (clk1)] -pin_load 0 [get_pins (arch_ICG/Y)]

在ICG的时钟引脚上设置dont_estimate_clock_latency属性:

1set_attribute [get_pins (arch_ICG/CK)] dont_estimate_clock_latency true

IC技术圈
致力于建立IC技术知识、IC技术圈内人的联系
 最新文章