ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

数字IC后端CTS实战:Skew Group配置与优化策略详解

数字IC后端CTS实战:Skew Group配置与优化策略详解 1. 时钟树综合到底在解决什么问题时钟树综合Clock Tree SynthesisCTS是数字IC后端实现流程里最考验工程师判断力的环节之一。前端设计把RTL综合成门级网表之后几万甚至几百万个触发器就像一座城市里散落的住户时钟信号就是送到每家每户的自来水。CTS要干的事情就是铺设一套管道网络让每一户打开水龙头的时候水压、水流到达的时间尽可能一致同时管道本身还不能太粗太占地方、不能太费水。这个比喻里藏着CTS的三个核心矛盾偏差Skew要小、延迟Latency要短、面积和功耗要省。三者互相拉扯你压Skew往往要加缓冲器加缓冲器就涨面积和功耗你省面积用细管子延迟和偏差又控制不住。所以CTS从来不是“跑个命令等结果”的活而是一场带着约束的权衡博弈。而Skew Group就是这场博弈里最关键的“分组规则”。它决定了工具把哪些触发器当成“必须对齐的一家人”哪些可以“各过各的”。分组分得好工具知道该往哪儿使劲分得不好要么过度约束导致面积爆炸要么约束太松导致时序收不干净。我见过太多项目CTS阶段Skew Group随手一设结果到STA阶段发现跨时钟域路径一堆违例回头返工白白烧掉两三天机器时间。这篇文章适合谁看如果你正在做数字IC后端实现对CTS的流程有基本概念但总在Skew和面积之间反复横跳或者你是前端设计工程师想搞清楚自己写的时钟结构到了后端会被怎么处理再或者你在准备数字IC设计面试被问到“CTS怎么优化”“Skew Group怎么配”这类问题——那这篇内容应该能给你一些能直接上手的东西。下面我会从整体思路、Skew Group的配置细节、CTS引擎的优化策略、到实际排查问题的经验一层层拆开讲。所有参数和命令基于业界主流实现工具如Innovus、ICC2的通用实践具体语法以你手上的工具版本为准但背后的逻辑是通的。2. 整体设计思路与Skew Group的分组逻辑2.1 为什么不能把所有触发器塞进一个Skew Group新手最容易犯的错就是觉得“Skew越小越好那我全局设一个最紧的Skew目标不就完了”。理论上没错但实际跑下来你会发现工具根本做不出来或者做出来了面积翻倍、功耗飙升甚至因为缓冲器太多导致布线拥塞最后DRC都过不了。原因在于芯片里的时钟域天然就是分层的。一个典型的SoC里可能有核心CPU时钟频率最高对Skew最敏感总线时钟频率中等Skew要求相对宽松外设时钟频率低Skew容忍度大还有一些异步时钟域彼此之间根本不需要对齐如果你把这些全部塞进一个Skew Group工具会试图用同一套缓冲器策略去满足最紧的那个要求结果就是低频域被“过度设计”白白浪费面积和功耗。更糟糕的是不同时钟域之间可能存在物理上的距离强行对齐会导致长线绕路延迟反而更大。所以Skew Group的本质是按时钟域和时序要求做分层约束。同一组内的触发器工具会尽力把它们的时钟到达时间差控制在设定范围内不同组之间工具只保证各自的Skew不关心组间的偏差。2.2 Skew Group的划分依据划分Skew Group时我通常按以下几个维度来考虑第一时钟域归属。这是最基础的划分。同一个时钟源驱动的触发器如果它们之间有大量的同步路径那它们就应该在同一个Skew Group里。因为同步路径的时序收敛依赖于时钟到达时间的可预测性Skew越小时序余量越大。第二频率等级。高频域和低频域要分开。比如CPU核跑2GHz总线跑500MHz这两个域的Skew要求完全不同。高频域可能需要50ps以内的Skew低频域200ps就够用了。分开设目标工具才能有的放矢。第三物理位置。如果两个时钟域在版图上离得很远强行放在一个Skew Group里会导致工具为了对齐它们而拉很长的时钟线延迟和功耗都不划算。这种情况下即使它们频率相同也可以考虑分开各自控制Skew。第四特殊时序要求。比如一些接口模块可能有源同步时钟或者需要和外部器件对齐的时钟这些通常需要单独设Skew Group甚至需要设成不同的Latency目标。提示Skew Group不是越多越好。每增加一个组工具就需要额外维护一套时钟树结构组太多会导致时钟树碎片化反而增加缓冲器数量和布线难度。一般一个中等规模的模块3到5个Skew Group是比较合理的。2.3 Skew目标值的确定方法设Skew目标不能拍脑袋。我一般用这个公式来估算Skew目标 ≤ 时钟周期 × 10% ~ 15%比如2GHz时钟周期500psSkew目标可以设在50ps到75ps之间。但这只是起点实际还要看时序余量。如果STA阶段发现建立时间余量很紧张那Skew目标就要收紧如果余量充裕可以适当放宽来省面积。另一个参考是工艺节点。先进工艺如7nm、5nm的线延迟占比更高Skew控制更难目标值要适当放宽成熟工艺如28nm、40nm线延迟相对小可以设得更紧。还有一个经验值是看触发器数量。如果一个Skew Group里有超过10万个触发器Skew控制会非常困难这时候要么拆分分组要么放宽目标。我一般建议单个Skew Group的触发器数量控制在5万以内超过这个数就要考虑按物理区域再细分。3. Skew Group配置的实操细节与参数解析3.1 工具中的Skew Group定义方式在Innovus里Skew Group通常通过create_ccopt_clock_tree和create_ccopt_skew_group来定义。ICC2里则是create_clock_tree和set_clock_tree_options配合create_skew_group。虽然命令不同但核心参数是类似的。一个典型的配置流程是这样的# Innovus 示例 create_ccopt_clock_tree -name core_clk_tree -source core_clk create_ccopt_skew_group -name core_sg -clock_tree core_clk_tree \ -sources {core_clk} \ -target_skew 50ps create_ccopt_clock_tree -name bus_clk_tree -source bus_clk create_ccopt_skew_group -name bus_sg -clock_tree bus_clk_tree \ -sources {bus_clk} \ -target_skew 150ps这里有几个关键点-sources参数指定了这个Skew Group的时钟源。注意一个时钟树可以有多个源比如多路选择器后的时钟但一个Skew Group通常只对应一个源。如果时钟结构里有MUX需要根据MUX的选择信号来划分Skew Group。**-target_skew**是目标Skew值。工具会尽力满足但不保证一定能做到。实际跑完后要看报告如果达不到要么放宽目标要么调整布局。**-target_latency**是另一个重要参数。它指定了时钟从源到触发器的目标延迟。这个值影响的是时钟树的整体深度。设得太小工具会拼命加缓冲器来缩短延迟面积涨设得太大时钟树太深功耗高且容易受工艺偏差影响。一般设成和Skew目标同一量级或者根据时钟源到触发器的物理距离来估算。3.2 Skew Group的边界处理Skew Group的边界是个容易被忽略的细节。所谓边界就是不同Skew Group之间的触发器如果有路径相连这些路径的时序怎么算。举个例子CPU域和总线域之间有一个异步FIFOFIFO的写指针在CPU域读指针在总线域。这两个域各自有Skew Group但FIFO内部的同步逻辑需要跨域。这时候如果两个Skew Group的Latency差太多跨域路径的时序就会很紧张。处理方法有两种一是设Latency约束。让两个Skew Group的Latency尽量接近这样跨域路径的时钟到达时间差就小。可以在配置时指定-target_latency为相近的值。二是用set_clock_groups做例外。如果两个域确实是异步的那就在STA里设成异步时钟组CTS阶段不用管它们之间的Skew。但要注意异步时钟组只适用于真正的异步逻辑如果两个域之间有同步路径设成异步会导致时序漏检。注意Skew Group的边界处理一定要和前端设计确认清楚。哪些域是同步的哪些是异步的哪些有握手逻辑这些信息决定了CTS阶段要不要做跨域对齐。我见过因为没确认清楚把同步域当异步处理结果芯片回来功能异常的案例。3.3 多源时钟树的Skew Group配置现代SoC里时钟结构往往很复杂一个时钟树可能有多个源。比如一个时钟经过MUX后可以选择来自PLL或者来自测试时钟。这种情况下Skew Group的配置要分情况如果MUX的选择是静态的比如测试模式下选测试时钟功能模式下选PLL那可以按模式分别建Skew Group。功能模式一个组测试模式一个组工具在CTS时会根据模式来优化。如果MUX的选择是动态的比如时钟切换那就要小心了。动态切换意味着两个源可能同时活跃这时候Skew Group要覆盖所有可能的源工具需要保证在任意源活跃时都能满足Skew。配置方式是在-sources里列出所有可能的源create_ccopt_skew_group -name mux_sg -clock_tree mux_tree \ -sources {pll_clk test_clk} \ -target_skew 80ps但这样做的代价是工具要同时考虑两个源的平衡优化难度更大。如果两个源的频率差异很大可能还需要分别设不同的Skew目标这时候就要用工具的高级特性比如条件Skew Group。3.4 Skew Group与Useful Skew的配合Useful Skew是CTS里一个非常重要的优化手段。它的核心思想是不是所有触发器的时钟都必须同时到达有些触发器可以故意提前或延后到达来换取时序余量。比如一条路径的建立时间很紧张如果我把目的触发器的时钟延后一点建立时间余量就大了但延后太多又会影响保持时间。Useful Skew就是在这个窗口里找最优解。Skew Group和Useful Skew的关系是Skew Group定义了Skew的全局目标Useful Skew在局部做微调。如果Skew Group设得太紧Useful Skew的空间就小设得太松Useful Skew可以发挥更大作用但全局Skew可能失控。我的经验是Skew Group的目标可以设得比理论值稍松一点给Useful Skew留出10%到20%的调整空间。比如理论Skew目标是50ps那Skew Group可以设60ps让工具在局部用Useful Skew去优化关键路径。在Innovus里Useful Skew通过set_ccopt_property -useful_skew true来开启ICC2里是set_clock_tree_options -useful_skew。开启后工具会自动在时序关键路径上做时钟调整。4. CTS引擎的优化策略与核心参数调优4.1 CTS引擎的工作原理CTS引擎的核心任务是在给定的布局和约束下构建一棵时钟树使得所有触发器的时钟到达时间满足Skew和Latency要求。它的工作流程大致分三步第一步聚类Clustering。工具会根据触发器的物理位置和时钟域归属把它们分成若干簇。每个簇内的触发器会共享一段时钟路径这样可以减少缓冲器数量。聚类的质量直接影响后续的缓冲器插入和布线。第二步缓冲器插入Buffer Insertion。工具在时钟路径上插入缓冲器来驱动负载、控制延迟。缓冲器的数量、类型、位置都是优化变量。工具会根据负载电容、线长、目标延迟来计算需要多少级缓冲器。第三步布线Routing。时钟树通常需要特殊布线比如双倍线宽、双倍间距来减少串扰和偏差。工具会在布线阶段继续调整缓冲器位置以满足Skew目标。这三步不是严格顺序的而是迭代进行的。工具会在每一步后评估Skew和Latency如果不满足就回到上一步调整。4.2 关键参数调优从Skew目标到缓冲器策略CTS引擎的参数很多但真正影响结果的就那么几个。我按重要性排序Skew目标Target Skew。前面已经讲过这里补充一点Skew目标不是设了就能达到的。如果布局太差触发器分布太散工具再怎么插缓冲器也做不到很小的Skew。所以CTS之前一定要确保布局合理触发器不要扎堆也不要太散。缓冲器列表Buffer List。工具需要知道可以用哪些缓冲器来建时钟树。这个列表通常由库提供但你可以指定优先使用哪些。我的经验是优先用驱动能力中等的缓冲器不要一上来就用最大的准备几种不同驱动能力的缓冲器让工具根据负载选择避免使用驱动能力太小的缓冲器否则级数太多延迟大布线层约束Routing Layer。时钟树通常走高层金属因为高层金属线宽大、电阻小、延迟低。但高层金属资源有限如果时钟树太复杂可能会和信号线抢资源。一般建议时钟树走次高层留最高层给电源和关键信号。屏蔽策略Shielding。时钟线容易受串扰影响导致Skew变大。屏蔽是通过在时钟线两侧走地线来隔离干扰。屏蔽会占用布线资源但能显著改善Skew。对于高频时钟屏蔽几乎是必须的。延迟目标Target Latency。这个值影响时钟树的深度。设得太小工具会加很多缓冲器来缩短延迟面积和功耗都涨设得太大时钟树太深受工艺偏差影响大。一般设成时钟源到最远触发器的物理距离对应的延迟再加20%余量。4.3 多模式多角度的CTS优化现代芯片要在多个PVT条件下工作CTS也要考虑多模式多角度MMMC。这意味着Skew Group的配置要在所有模式下都成立。比如一个时钟在功能模式下跑2GHz在测试模式下跑100MHz。功能模式下Skew目标50ps测试模式下可以放宽到500ps。如果只按功能模式设Skew Group测试模式下工具可能会过度优化浪费面积。处理方法是按模式分别设Skew Group或者用工具的条件约束功能。在Innovus里可以用set_ccopt_property -mode来指定模式ICC2里可以用set_clock_tree_options -mode。另一个问题是OCVOn-Chip Variation。先进工艺下同一芯片不同位置的工艺参数会有偏差导致时钟延迟不一致。CTS时要留出OCV余量通常是在Skew目标上再加10%到20%的derate。4.4 CTS与布局的协同优化CTS不是孤立的步骤它和布局Placement是强耦合的。布局阶段如果能把触发器摆得合理CTS会轻松很多。我通常会在布局阶段做这几件事第一时钟域感知布局。让同一个时钟域的触发器尽量聚在一起减少时钟树的跨度。工具通常有-clock_domain_aware之类的选项。第二高扇出网络预布线。时钟源到主要分支点的路径可以在布局阶段就预布好减少CTS阶段的不确定性。第三物理约束。对时钟源、关键分支点加位置约束让工具在指定区域建时钟树。这些操作在Innovus里可以通过place_opt的选项来实现ICC2里是place_opt配合set_placement_options。具体参数要看工具版本但思路是一样的让布局为CTS创造好条件而不是等CTS去收拾烂摊子。5. 常见问题与排查技巧实录5.1 Skew降不下来怎么办这是CTS阶段最常见的问题。你设了50ps的Skew目标跑完一看报告实际Skew 120ps。这时候不要急着调参数先按这个顺序排查第一步看布局。用工具的可视化功能把时钟树和触发器显示出来。如果触发器分布很散或者时钟树绕了很远那Skew大是必然的。解决办法是回到布局阶段加时钟域约束让触发器聚拢。第二步看缓冲器。检查时钟树上的缓冲器级数和驱动能力。如果级数太多延迟累积大Skew难控制如果驱动能力不够带不动负载延迟也大。调整缓冲器列表增加中等驱动能力的缓冲器。第三步看布线。时钟线如果走了低层金属电阻大延迟大且不一致。检查时钟树的布线层确保走高层。如果高层资源不够考虑加屏蔽或调整布线策略。第四步看串扰。如果时钟线和信号线并行很长串扰会导致延迟变化。加屏蔽或者增大间距。第五步看OCV。如果以上都正常但Skew还是大可能是OCV derate设得太保守。检查derate值适当放宽。实操心得Skew降不下来80%的情况是布局问题。我一般会在CTS之前先跑一次快速CTS看看Skew的大致水平如果偏差太大就先回去改布局而不是在CTS参数上死磕。5.2 时钟树面积和功耗超标Skew控制好了但面积和功耗超了这也是常见问题。原因通常是缓冲器太多或者太大。优化方向一放宽Skew目标。如果时序余量允许把Skew目标从50ps放宽到80ps缓冲器数量可能减少30%。优化方向二调整缓冲器列表。去掉大驱动缓冲器强制工具用中等驱动能力的。代价是级数可能增加但总面积可能更小。优化方向三优化聚类。让工具把更多触发器聚在一起共享时钟路径。这需要布局配合触发器越集中聚类效果越好。优化方向四关掉不必要的Useful Skew。Useful Skew会引入额外的缓冲器来调整延迟如果时序不紧张可以关掉。优化方向五检查是否有冗余缓冲器。有时候工具会在同一条路径上插多个缓冲器手动删掉一些不影响Skew的。5.3 跨时钟域路径时序违例CTS跑完STA发现跨时钟域路径有违例。这通常是Skew Group边界没处理好。排查步骤确认两个域是同步还是异步。如果是异步检查STA里有没有设set_clock_groups -asynchronous。如果是同步检查两个Skew Group的Latency差。如果差太大跨域路径的时钟到达时间差就大时序紧张。调整Latency目标让两个组的Latency接近。如果还是不行考虑在跨域路径上加pipeline寄存器或者调整前端逻辑。常见问题速查表问题现象可能原因排查方法解决措施Skew降不下来布局太散可视化检查触发器分布加时钟域约束重新布局Skew降不下来缓冲器级数太多检查时钟树报告调整缓冲器列表Skew降不下来布线层太低检查时钟线布线层约束走高层金属面积功耗超标Skew目标太紧检查时序余量放宽Skew目标面积功耗超标缓冲器太大检查缓冲器使用报告限制大驱动缓冲器跨域路径违例Latency差太大比较两个组的Latency调整Latency目标跨域路径违例异步域没设例外检查STA约束设set_clock_groups时钟树绕线太长触发器分布远检查布局调整布局或拆分Skew Group5.4 CTS后时序不收敛的返工策略如果CTS跑完STA发现大量违例不要急着重新跑CTS。先分析违例的类型和分布如果是建立时间违例集中在某几个路径可能是Useful Skew没调好或者这几个路径的逻辑太深。可以尝试局部调整时钟延迟或者让前端优化逻辑。如果是保持时间违例通常是时钟太偏了。检查Skew Group的Latency设置确保没有过度偏斜。如果是跨域违例按5.3的方法处理。如果违例遍布全局那可能是Skew Group的划分有问题或者布局太差。这时候需要回到布局阶段重新规划。我个人的经验是CTS返工的成本很高一次CTS跑几个小时甚至一天返工两三次一周就没了。所以CTS之前一定要把布局和约束做扎实宁可多花时间在准备阶段也不要反复跑CTS。5.5 独家避坑技巧技巧一CTS之前先跑一次“干跑”。不插缓冲器只评估时钟树的拓扑和Skew潜力。如果干跑的Skew就很大那插了缓冲器也好不到哪去先改布局。技巧二用脚本自动化检查。写个脚本CTS跑完后自动提取Skew、Latency、缓冲器数量、面积、功耗和上一次对比。这样能快速发现异常。技巧三保留中间结果。CTS的每个阶段聚类后、缓冲器插入后、布线后都保存数据库。如果最后结果不好可以回到中间阶段调整不用从头跑。技巧四和前端保持沟通。很多CTS问题其实是前端时钟结构不合理导致的。比如时钟MUX太多、时钟分频逻辑太复杂这些都会增加CTS难度。早点让前端知道他们可以在RTL阶段优化。技巧五关注时钟树的物理合理性。不要只看Skew数字还要看时钟树的形状。如果时钟树绕来绕去即使Skew达标也可能有可靠性风险。理想的时钟树应该是从源到叶节点呈树状发散路径清晰。6. 从实战案例看Skew Group配置的取舍6.1 一个高频CPU模块的CTS配置之前做过一个CPU核的CTS频率2.5GHz触发器大约8万个。初始配置是全局一个Skew Group目标Skew 40ps。跑完发现Skew 90ps面积超标20%。分析后发现CPU核里其实有两个主要区域运算单元和缓存单元。运算单元频率高、路径短缓存单元频率稍低、路径长。把它们放在一个Skew Group里工具为了照顾运算单元的紧Skew在缓存单元也插了大量缓冲器。调整方案拆成两个Skew Group。运算单元目标Skew 40ps缓存单元目标Skew 80ps。同时调整布局让两个区域的触发器各自聚拢。重新跑CTS后Skew达标面积反而降了15%。这个案例说明Skew Group的粒度要匹配设计的物理和逻辑结构。一刀切往往不是最优解。6.2 多时钟域SoC的Latency平衡另一个案例是一个多时钟域SoC有CPU域、GPU域、总线域、外设域四个主要时钟域。初始配置各域独立Skew GroupLatency各自设。结果STA发现CPU和总线之间的跨域路径大量违例。原因是CPU域的Latency设得小为了性能总线域的Latency设得大两者差了好几百皮秒。跨域路径的时钟到达时间差太大时序收不回来。解决方案把CPU和总线的Latency目标调成相近的值牺牲一点CPU的延迟换取跨域时序的改善。同时在外设域和总线域之间加握手逻辑让它们可以异步处理。调整后跨域违例减少了90%。这个案例的教训是Skew Group不是孤立的跨域路径的时序需要全局考虑。6.3 低功耗设计的CTS策略低功耗芯片的CTS有额外挑战。时钟树是功耗大户能占到动态功耗的30%到40%。所以低功耗设计里CTS要特别关注功耗优化。策略一时钟门控Clock Gating。在不需要时钟的时候关掉时钟树的一部分。CTS时要确保门控单元的时钟延迟和普通触发器一致否则Skew会变大。策略二多阈值电压Multi-Vt。时钟树上的缓冲器可以用高阈值电压器件来降低漏电但高Vt器件延迟大要平衡。策略三时钟树分层。把时钟树分成主干和分支主干用低Vt、大驱动分支用高Vt、小驱动。这样既保证性能又省功耗。这些策略在CTS工具里通常有对应选项比如Innovus的-power_awareICC2的-low_power。开启后工具会自动做功耗优化但效果取决于约束设得是否合理。7. 写在最后的一些个人体会CTS这个环节工具能帮你做很多事但工具不知道你的设计意图。Skew Group怎么分、目标怎么设、Latency怎么平衡这些决策需要工程师对设计有深入理解。我见过太多人把CTS当成黑盒跑完看报告Skew达标就收工结果到STA阶段一堆问题。我的习惯是CTS之前一定花时间做三件事看时钟结构图、确认跨域关系、评估布局质量。这三件事做好了CTS参数就是顺水推舟做不好调参数就是拆东墙补西墙。另外CTS的报告要仔细看不能只看Skew数字。缓冲器数量、级数、布线层、时钟树形状这些信息都能告诉你工具到底干了什么。如果发现异常比如某条路径上插了十几个缓冲器那肯定有问题要追查原因。最后分享一个小技巧CTS跑完后用工具的命令导出时钟树的SPICE网表做一次快速SPICE仿真看看实际延迟和Skew。工具的报告是基于估算模型的SPICE仿真更准确。如果两者差太多说明估算模型不准需要调整工具的参数或者检查工艺库。这个领域没有银弹每个项目都有自己的坑。多跑、多看、多总结慢慢就有感觉了。
返回列表