在数字芯片设计流程中,时钟树综合(Clock Tree Synthesis, CTS)是决定时序收敛和功耗表现的关键环节。作为后端工程师,我们常常面临这样的困境:明明按照标准流程完成了CTS设置,但最终的时钟网络却出现不可预测的skew偏差或过渡时间超标。本文将基于Synopsys ICC II工具,通过一个完整的虚拟时钟"CLK"案例,拆解CTS设置中的核心配置项与常见陷阱。
时钟网络的优化始于对时钟源和终点的明确定义。在ICC II中,时钟源由create_clock定义,而终点则是寄存器或宏单元的时钟引脚。但实际项目中,90%的CTS问题源于平衡点(balance points)配置不当。
默认情况下,寄存器的时钟端(CK pin)和宏单元的时钟端会被工具自动识别为隐式sink pin(implicit sink pin),这些点会自动参与时钟偏差优化。而像时序器件的非时钟端、三态器件的使能端等则被归类为隐式ignore pin,工具不会对这些点进行平衡优化。
对于宏单元内部的时钟网络,我们需要显式指定平衡点:
tcl复制# 为IP核的时钟引脚设置平衡点
set_clock_balance_points -balance_points [get_pins IP/IP_clk]
# 针对特定工艺角(corner)添加延迟约束
set_clock_balance_points -corner ss125c -delay 0.15 -late \
-balance_points IP/IP_CLK
当需要将特定时钟引脚分组优化时,create_clock_skew_group命令就派上用场。例如,我们希望将两个触发器的时钟端作为一个组来优化:
tcl复制create_clock_skew_group -mode TEST \
-object {FF1/CLK FF2/CLK}
注意:skew group的优化目标与其主时钟保持一致,无法单独设置独立的目标值。
非默认布线规则(Non-Default Routing, NDR)是提升时钟网络稳定性的重要手段。合理的NDR设置可以降低串扰(crosstalk)和电迁移(EM)风险。
典型的时钟NDR规则包含线宽和间距的加倍设置:
tcl复制create_routing_rule 2xS_2xW_CLK_RULE \
-widths {M1 0.11 M2 0.11 M3 0.14} \
-spacing {M1 0.4 M2 0.4 M3 0.48} \
-cuts {VIA3 {Vrect 1}}
时钟布线通常限制在特定金属层以降低寄生参数:
tcl复制set_clock_routing_rule -rule 2xS_2xW_CLK_rule \
-min_routing_layer M4 \
-max_routing_layer M5
关键点:虽然优先使用高层金属(M4/M5),但连接到标准单元pin的M1-M3仍需遵守NDR规则,只是约束相对宽松。
默认情况下,ICC II会为每个时钟域设置0ns的skew和latency目标,这在实际项目中往往需要调整。
tcl复制# 清除默认设置
remove_clock_tree_options -all -target_skew -target_latency
# 设置全局skew目标(所有corner生效)
set_clock_tree_options -target_skew 0.2 -corner [all_corners]
# 为特定时钟设置latency目标
set_clock_tree_options -target_latency 1.2 \
-clocks [get_clocks "CLK1 CLK2"]
对于多时钟域设计,inter-clock balance能显著改善时序:
tcl复制# 手动创建平衡组
create_clock_balance_group -name grp1 \
-object [get_clocks "CLK1 CLK2"]
# 或让工具自动识别需要平衡的组
derive_clock_balance_constraints -slack_less_than -0.3
tcl复制# 选择特定类型的单元用于CTS
set cts_libcells [get_lib_cells \
"*/INVX*_LVT */BUFX*_LVT AO CG FF..."]
# 设置单元用途并解除dont_touch属性
set_lib_cell_purpose -include cts $cts_libcells
set_dont_touch $cts_libcells false
tcl复制# 设置时钟路径专用的transition约束
set_max_transition 0.2 -clock_path \
-scenarios "S1 S2" \
[get_clocks SYS_CLK]
# 调整uncertainty值避免过度悲观
set_clock_uncertainty -scenarios S1 -setup 0.1 CLK1
完整的CTS设置验证包含多个维度:
tcl复制# 检查端口约束
report_port -verbose [get_ports *clk]
# 查看所有时钟设置
report_clock_settings -type all
# 验证skew group配置
report_clock_balance_groups
# 检查NDR规则应用情况
report_clock_routing_rules
在28nm以下工艺中,时钟网络的寄生参数对时序影响尤为显著。某次项目调试中发现,由于未对M6层设置适当的NDR规则,导致时钟网络在高温角(125C)出现transition违规。通过增加以下配置解决了问题:
tcl复制create_routing_rule CLK_NDR_M6 \
-widths {M6 0.28} \
-spacing {M6 0.28} \
-shield_net VDD
set_clock_routing_rule -rule CLK_NDR_M6 \
-nets [get_nets -hier *CLK*]