Chapter 7 Clock Groups: Mastering set_clock_group for Robust Timing Closure
1. 理解时钟组的基本概念在芯片设计中时钟就像城市交通系统的红绿灯协调着各个功能模块的数据流动。当设计变得复杂特别是SoC系统级芯片中集成多个功能模块时往往需要多个时钟协同工作。这些时钟可能来自不同的源具有不同的频率和相位关系就像城市中不同区域可能需要不同的交通信号节奏。时钟组Clock Groups的概念就是为了管理这些复杂关系而生的。想象一下如果不对交通信号进行分组管理整个城市的交通就会陷入混乱。同样地在芯片设计中如果不合理划分时钟组时序分析工具就会对所有时钟路径进行检查导致不必要的优化工作甚至可能掩盖真正的时序问题。我遇到过这样一个案例一个音频处理芯片同时需要处理48kHz的音频数据和1GHz的系统控制信号。如果不将这两个时钟设为异步关系时序工具会徒劳地尝试优化这两个完全不同频域的路径既浪费计算资源又可能忽略真正需要关注的时序路径。2. 时钟关系的分类与识别2.1 同步时钟关系同步时钟就像一对精心编排的舞蹈演员它们的每个动作时钟边沿都有精确的时间对应关系。这类时钟通常来自同一个PLL锁相环或时钟树具有已知的相位关系。在实际项目中我习惯用以下命令创建同步时钟create_clock -name CLK1 -period 10 -waveform {0 5} [get_ports clk1] create_generated_clock -name CLK2 -source [get_ports clk1] -divide_by 2 [get_pins div2/Q]这种情况下CLK2是CLK1的二分频时钟它们之间存在严格的同步关系时序工具会自动分析它们之间的所有可能路径。2.2 异步时钟关系异步时钟则像两个完全独立的交通系统比如地铁信号和地面交通灯它们之间没有固定的时间关联。当两个时钟来自不同的晶振或不同的PLL时通常就是这种关系。我曾经调试过一个项目其中DDR接口时钟和PCIe时钟就是典型的异步关系必须用以下方式明确声明set_clock_groups -asynchronous -group [get_clocks clk_ddr] -group [get_clocks clk_pcie]如果不这样声明时序工具会错误地尝试分析这两个时钟域之间的路径导致不必要的优化和收敛困难。2.3 互斥时钟关系互斥时钟关系又分为逻辑互斥和物理互斥两种这在实际项目中非常常见但容易被误解。逻辑互斥时钟就像同一个十字路口的行人红绿灯和车辆红绿灯——它们同时存在但永远不会同时绿灯。在芯片中这常见于多路选择器的不同输入时钟。我的经验是这种情况下应该这样设置create_clock -name CLKA -period 10 [get_ports clka] create_clock -name CLKB -period 15 [get_ports clkb] set_clock_groups -logically_exclusive -group CLKA -group CLKB物理互斥时钟则像季节性的道路——不同季节开放不同的路线但永远不会同时开放。在芯片测试模式下经常遇到这种情况比如正常模式时钟和测试模式时钟。正确的设置方式是set_clock_groups -physically_exclusive -group [get_clocks func_clk] -group [get_clocks test_clk]3. set_clock_group命令详解3.1 命令语法与选项set_clock_group是时序约束中的瑞士军刀它的完整语法如下set_clock_groups -name group_name \ -group clock_list \ [-logically_exclusive | -physically_exclusive | -asynchronous] \ [-allow_paths] \ [-comment comment_string]在实际项目中我发现-name选项经常被忽视但其实它对于后期维护非常重要。特别是在大型SoC项目中给时钟组起一个有意义的名称如USB_ETH_ASYNC能大大提升约束文件的可读性。三个互斥选项的选择是关键-asynchronous用于完全无关的时钟如不同晶振产生的时钟-logically_exclusive用于设计中选择性使用的时钟如功能模式与低功耗模式时钟-physically_exclusive用于永远不会同时存在的时钟如测试时钟与功能时钟3.2 典型应用场景在最近的一个物联网芯片项目中我们遇到了这样的场景BLE射频时钟32MHz、应用处理器时钟1GHz和传感器hub时钟24MHz需要合理分组。经过分析我们这样设置# BLE时钟与传感器时钟虽然频率接近但来源不同 set_clock_groups -asynchronous -group [get_clocks clk_ble] -group [get_clocks clk_sensor] # 应用处理器有两个可选时钟源 set_clock_groups -logically_exclusive -group [get_clocks clk_pll] -group [get_clocks clk_osc] # 测试时钟与所有功能时钟物理互斥 set_clock_groups -physically_exclusive -group [get_clocks test_clk] -group [get_clocks {clk_ble clk_sensor clk_pll clk_osc}]这种精细的时钟分组使我们的时序收敛时间缩短了约30%因为工具不再浪费时间分析那些实际上不需要考虑的时钟路径。4. 时钟组与信号完整性分析4.1 串扰分析的考量时钟分组不仅影响静态时序分析(STA)还会显著影响信号完整性(SI)分析。当两个时钟被设为异步关系后默认情况下它们之间的串扰分析也会被禁用。这在大多数情况下是正确的但有时我们需要特殊处理。比如在一个高速SerDes接口设计中尽管RX和TX时钟是异步的但它们物理上靠得很近必须考虑串扰影响。这时就需要使用-allow_paths选项set_clock_groups -asynchronous -allow_paths -group [get_clocks clk_rx] -group [get_clocks clk_tx]这个选项告诉工具虽然这两个时钟异步但仍需分析它们之间的串扰效应。我在一个28nm项目中发现忽略这种特殊情况会导致约15%的时序余量估算误差。4.2 时钟组与OCV分析片上变异(OCV)分析也会受到时钟分组的影响。对于同步时钟组工具会考虑时钟树之间的相关性而对于异步时钟组则会采用最保守的变异分析。有次调试一个40nm芯片的保持时间违规时发现正是因为不恰当的时钟分组导致OCV分析过于悲观浪费了大量的优化资源。正确的做法是根据时钟的实际关系选择分组方式。如果是同源的同步时钟应该保持默认关系如果是不同源但频率锁定的时钟如通过mesochronous PLL产生的时钟则需要特殊的约束处理。5. 实战经验与常见陷阱5.1 生成时钟的处理生成时钟Generated Clock的时钟组设置是个常见的坑。我见过不少工程师直接在源时钟上设置时钟组而忽略了生成时钟。正确的做法是在生成时钟上设置组关系create_clock -name CLK -period 10 [get_ports clk] create_generated_clock -name CLK_DIV2 -source [get_ports clk] -divide_by 2 [get_pins div/Q] create_generated_clock -name CLK_DIV4 -source [get_ports clk] -divide_by 4 [get_pins div2/Q] # 错误做法只在源时钟上设置 # set_clock_groups -logically_exclusive -group CLK -group OTHER_CLK # 正确做法包含所有生成时钟 set_clock_groups -logically_exclusive -group [get_clocks {CLK CLK_DIV2 CLK_DIV4}] -group OTHER_CLK5.2 跨时钟域的特殊处理即使正确设置了时钟组跨时钟域(CDC)路径仍需要特别关注。除了set_clock_groups外还应该配合set_false_path或set_max_delay约束。我的常用做法是set_clock_groups -asynchronous -group [get_clocks clk_a] -group [get_clocks clk_b] # 对已知的同步器路径放宽约束 set_max_delay -from [get_clocks clk_a] -to [get_clocks clk_b] 2.0 [get_pins sync_reg*/D]5.3 层次化设计中的时钟组在层次化设计中时钟组的设置需要特别注意作用域。我推荐在顶层统一管理时钟组关系而不是在各个子模块中分散设置。一个实用的技巧是使用-clock_scope选项set_clock_groups -asynchronous -group [get_clocks -include_clock_network clk_a] \ -group [get_clocks -include_clock_network clk_b]这样可以确保时钟组关系贯穿整个设计层次避免因模块隔离导致的约束不完整问题。

相关新闻

最新新闻

日新闻

周新闻

月新闻