
1. 什么是Clock Tree Exception在芯片物理设计流程中时钟树综合Clock Tree SynthesisCTS是一个关键环节。Clock Tree Exception时钟树例外指的是在CTS阶段对某些时钟路径或节点进行特殊处理的规则定义。这些例外规则会直接影响时钟树的最终结构和时序特性。作为一名从事物理设计多年的工程师我经常需要处理各种Clock Tree Exception。在实际项目中合理的Exception设置可以显著改善时钟树质量而不当的设置则可能导致严重的时序问题。2. Clock Tree Exception的主要类型2.1 Nonstop Pins非停止引脚Nonstop Pins是指那些虽然连接到时钟网络但不作为时钟树终点sink的引脚。这类引脚通常用于测试或调试目的。在CTS过程中工具会继续通过这些引脚传播时钟信号而不会将它们视为时钟树的终点。注意误将普通寄存器时钟引脚标记为Nonstop会导致时钟树在该点继续延伸造成不必要的时钟延迟和功耗增加。2.2 Exclude Pins排除引脚Exclude Pins是明确要求CTS工具忽略的时钟引脚。这些引脚不会被包含在时钟树综合中工具不会为它们构建任何时钟缓冲器或进行时钟树平衡。实际案例在一个设计中某些模块使用门控时钟clock gating这些模块的时钟引脚通常会被标记为Exclude Pins因为它们将由专门的时钟门控单元驱动。2.3 Float Pins浮动引脚Float Pins允许时钟信号在该引脚处浮动即不强制要求时钟信号必须到达该引脚。CTS工具会根据时序约束自动决定是否要驱动这些引脚。使用场景当某些时钟路径的时序要求较为宽松时可以将其标记为Float Pins以节省功耗和面积。2.4 Stop Pins停止引脚Stop Pins是时钟树的终点标记。CTS工具会在这些引脚处停止时钟树的延伸不再继续向下传播时钟信号。技术细节Stop Pins通常用于定义时钟域的边界。在一个多时钟域设计中正确设置Stop Pins可以防止不同时钟域之间的时钟树相互干扰。2.5 Dont Touch Subtrees不触碰子树Dont Touch Subtrees是指那些已经手动优化或需要保持特定结构的时钟子树。CTS工具会保留这些子树的现有结构不会对其进行重新综合。经验分享对于某些关键时序路径设计者可能已经手动插入了特定的时钟缓冲器结构。将这些子树标记为Dont Touch可以保留这些优化。3. Clock Tree Exception的实际应用3.1 在ICC2中设置Clock Tree Exception以Synopsys ICC2工具为例设置Clock Tree Exception的典型命令如下# 设置Nonstop Pin set_clock_tree_exceptions -non_stop_pins [get_pins u_clkgen/scan_en] # 设置Exclude Pin set_clock_tree_exceptions -exclude_pins [get_pins u_mem/*/CLK] # 设置Stop Pin set_clock_tree_exceptions -stop_pins [get_pins u_pll/CLKOUT] # 设置Float Pin set_clock_tree_exceptions -float_pins [get_pins u_debug/clk_in] # 设置Dont Touch set_clock_tree_exceptions -dont_touch_subtrees [get_cells u_custom_ctrl]3.2 在Innovus中设置Clock Tree Exception对于Cadence Innovus工具对应的命令略有不同# Nonstop Pin setCTSMode -nonStopPin u_clkgen/scan_en # Exclude Pin setCTSMode -excludePin u_mem/*/CLK # Stop Pin setCTSMode -stopPin u_pll/CLKOUT # Float Pin setCTSMode -floatPin u_debug/clk_in # Dont Touch setCTSMode -dontTouchTree u_custom_ctrl4. Clock Tree Exception的验证与调试4.1 例外报告生成在CTS完成后应该生成Clock Tree Exception报告以验证设置是否正确。在ICC2中可以使用以下命令report_clock_tree_exceptions -outfile cts_exceptions.rpt典型的报告内容会列出所有定义的例外及其类型例如Clock Tree Exceptions Report Type Object ----------------------------------------- Nonstop u_clkgen/scan_en Exclude u_mem/ram0/CLK Exclude u_mem/ram1/CLK Stop u_pll/CLKOUT Float u_debug/clk_in Dont Touch u_custom_ctrl4.2 常见问题排查问题1时钟偏移Clock Skew过大可能原因误将某些时钟路径标记为Float或Nonstop导致工具无法正确平衡时钟树。解决方案检查Clock Tree Exception设置确保关键时序路径没有被不恰当地标记为例外。问题2时钟未到达预期终点可能原因意外设置了Stop Pin或Exclude Pin。解决方案使用clock_tree -report命令检查时钟网络覆盖率确认所有需要时钟驱动的单元都被正确包含。问题3时钟树结构不符合预期可能原因Dont Touch设置过于宽泛导致工具无法优化关键路径。解决方案逐步缩小Dont Touch范围仅保护真正需要手动优化的子树。5. 高级应用技巧5.1 动态例外设置在某些复杂设计中可能需要根据设计阶段动态调整Clock Tree Exception。例如# 在早期CTS阶段排除测试时钟 set_clock_tree_exceptions -exclude_pins [get_pins */test_clk] # 在最终CTS阶段移除排除 remove_clock_tree_exceptions -exclude_pins [get_pins */test_clk]5.2 例外与时钟门控的协同时钟门控单元通常需要特殊的Exception处理# 标记门控时钟的使能引脚为Nonstop set_clock_tree_exceptions -non_stop_pins [get_pins */gate_en] # 门控单元的输出通常需要Stop或Exclude set_clock_tree_exceptions -stop_pins [get_pins */gclk_out]5.3 基于场景的例外配置对于多场景multi-mode设计可能需要为不同场景配置不同的Exception# 正常模式 source normal_mode_exceptions.tcl # 测试模式 source test_mode_exceptions.tcl6. 实际项目经验分享在最近的一个7nm项目中我们遇到了一个有趣的Clock Tree Exception问题。设计中有多个电压域其中某些时钟需要跨电压域传播。最初我们将所有跨电压域的时钟缓冲器标记为Dont Touch但这导致了时钟树平衡困难。经过分析我们改为以下策略仅将第一级跨电压域缓冲器标记为Dont Touch将其余跨电压域时钟路径标记为Float设置专门的skew group来处理跨电压域时钟这一调整使得时钟树综合时间减少了30%同时最终时钟偏差改善了15%。另一个经验是关于测试时钟的处理。在一个大型SoC中测试时钟网络非常复杂。我们最初将所有测试相关时钟引脚都标记为Exclude但这导致测试模式下的时钟树质量很差。后来我们采用分层策略顶层测试时钟Nonstop模块级测试时钟Float最末级测试时钟Exclude这种分层处理方法既保证了功能模式下的时钟质量又确保了测试模式下的时钟可控性。