尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

数字后端CTS实战:时钟信号关键属性与Innovus时钟树综合优化

数字后端CTS实战:时钟信号关键属性与Innovus时钟树综合优化 1. 从“时钟”说起为什么数字后端绕不开这个信号做数字后端的人十有八九第一道坎就卡在时钟树综合CTS上。我当年也是这样在Innovus里跑完布局看着一大堆没接线的时钟网络脑子里全是问号时钟不就是个周期信号吗直接拉根线不就行了直到被项目里连续几次时序违例教育之后我才意识到时钟信号在数字后端里的地位几乎决定了整个芯片能不能按时收敛。先说清楚一个基本定位数字后端里的时钟树综合是把逻辑综合阶段理想的时钟网络变成物理上真实可实现的时钟缓冲器树。综合工具在RTL阶段默认时钟是零延迟、零偏斜的但真实硅片上时钟信号从时钟源到达每个触发器的时间不可能完全一致也不可能瞬间到达。CTS要做的就是插入一串缓冲器把这棵“扇出巨大、长度超长”的时钟网络调整到满足时序、功耗和面积要求的状态。这篇笔记聚焦的是时钟信号本身。因为CTS的一切策略、约束、优化手段归根结底都围绕时钟信号的几个物理特性展开。我见过不少工程师把CTS当黑盒跑完命令看结果出了violation就头疼。但如果你真正理解了时钟信号的延迟、偏斜、抖动、压摆这些概念CTS就变成了一道有解的优化题而不是玄学。这篇文章适合两类人一是刚接触数字IC后端、准备做或正在做第一个项目的新人你需要建立对时钟信号的系统认知二是已经跑过CTS但经常被时序问题困住的工程师你会在这篇文章里找到不少排查思路和实操细节。我会结合自己在Innovus环境下的项目经验从信号属性讲到CTS实现再讲到问题排查尽量把“为什么”和“怎么做”一起讲透。2. CTS设计与时钟信号的关键属性拆解2.1 时钟信号的四大指标延迟、偏斜、抖动与压摆要把CTS做明白先得把时钟信号的几个核心指标刻在脑子里。这些指标之间互相牵扯很多CTS策略表面上是调结构本质都是在跟这几个参数博弈。首先是时钟延迟Clock Latency也叫插入延迟指时钟信号从时钟源到某个触发器时钟端的传播时间包括源延迟和网络延迟两部分。源延迟是时钟信号在芯片外部或PLL内部的时间网络延迟就是CTS要控制的树干和树枝部分的传播时间。每个触发器都有各自的时钟延迟CTS的目标不是让这个值小而是让所有触发器之间的差值可控。其次是时钟偏斜Clock Skew这是CTS最核心的优化对象。它等于同一时钟域内不同触发器时钟端到达时间之差的最大值。偏斜影响时序的方式很微妙如果时钟晚到目标触发器对setup是有利的但对hold是不利的反过来时钟早到则对hold有利、对setup不利。这也是为什么CTS阶段既要控制全局偏斜又要允许甚至利用局部偏斜来修时序。我做过一个项目一组寄存器的hold违例怎么修都修不干净最后通过在CTS阶段给这些寄存器人为制造几十皮秒的正偏斜才解决这就是偏斜的双刃剑特性。第三是时钟抖动Jitter它描述的是时钟周期在时间轴上的波动主要由PLL、电源噪声和片内耦合引起。抖动直接吃掉时序裕量设计者算setup时要把抖动预留出来因为时钟沿可能提前或延后到达分析工具不会帮你“选中”最坏情况只会按你约束的值来算。第四是压摆Slew也就是时钟信号上升沿和下降沿的陡峭程度。压摆过慢会导致触发器无法准确判断翻转点还会增加功耗甚至产生错误逻辑。CTS工具一般会设置max_transition约束在时钟树上插入足够驱动力的缓冲器来修压摆。这四个指标不是孤立的。缓冲器级数增加延迟和偏斜会变大但压摆和驱动能力会变好想要低抖动就得把时钟网络做得更干净但这通常意味着更大的面积和功耗。所谓CTS策略本质上就是在这几个指标之间做工程取舍。2.2 理想时钟与真实时钟的差距CTS存在的根本原因逻辑综合阶段工具眼里只有理想时钟上升沿准时到达每个触发器时钟网络零延迟、零偏斜不需要关心时钟走线。这是为了把前端工程师从物理实现细节里解放出来专注功能和逻辑。但你一旦进入后端就要面对物理世界的残酷现实。时钟信号从PLL输出到芯片最远的触发器可能要经过好几毫米甚至更长的走线经过好几级缓冲器经过不同的金属层经过不同的温度梯度区域。这些都会造成到达时间不一致。如果不加任何处理直接接上时钟源你会发现同一个时钟沿在不同触发器的到达时间能差出几百皮秒甚至纳秒级这在GHz级的设计里根本没法用。CTS就是在这个差距上架起一座桥。它通过插入缓冲器网络让时钟信号以尽量一致的时间到达所有触发器同时控制延迟和压摆。注意“尽量”这个词因为完全零偏斜在物理上不可能也不必要工程师的目标是把偏斜控制在一个对时序影响可接受的范围内。我经常跟团队里新人打一个比方理想时钟像军训时教官喊的口号所有人同时听到同时反应真实时钟像山谷里的回声离声源近的人先听到远的人后听到。CTS就是派一批传令兵站在不同位置接力喊话让后排的人也能和前排几乎同时听到。传令兵布置得好不好直接决定这支队伍能不能整齐行动。2.3 时钟域的划分与时钟树的结构形态一个复杂芯片里通常不只有一个时钟。CPU有核心时钟、总线时钟、外设时钟还有分频、门控之后产生的新时钟。这些时钟可能来自同一个PLL也可能来自多个PLL频率、相位各不相同。CTS前必须做时钟域划分。同一个时钟域内的触发器它们的时钟延迟才需要严格对齐不同时钟域之间如果有数据交互需要做的不是对齐时钟延迟而是保证跨域路径满足setup和hold要求通常靠同步器或FIFO来实现。时钟树的结构形态我见过几种典型的最朴素的是链式结构一个缓冲器驱动下一个适合窄而长的走线实际项目中更常见的是网状结构高层走线先送到芯片的不同区域每个区域再用局部树分配到触发器。Innovus里做CTS时工具会自动根据时钟网络的几何分布选择结构但工程师也可以在时钟树规格CTS Spec里指定某些特殊网络用H树或X树来平衡偏斜。H树是个经典方案每条分支等长理论上可以让所有叶节点延迟一致。但它只适合规则布局现代芯片里触发器分布极不均匀H树反而会造成大量绕线浪费。所以更多时候工具采用“分区平衡局部优化”的混合策略这也是Innovus时钟树综合引擎比较强的地方。2.4 时钟门控与时钟复用信号的处理除了普通的时钟信号设计里还有一类必须特殊对待的门控时钟Clock Gating。为了省功耗工程师会在时钟路径上插与门或锁存器让时钟在不需要时停止翻转。CTS处理门控时钟时有个麻烦门控单元的时钟端和数据端都是时钟相关路径单元的插入位置不同会导致门控前后的时钟延迟不平衡。Innovus里处理门控时钟关键是要正确设置门控单元的约束并检查门控单元使能信号的时序确保它不影响时钟沿的稳定性。我踩过的一个坑是门控时钟在CTS后偏斜正常但因为门控单元使能信号的压摆太差导致时钟沿在门控处出现毛刺下游触发器被误导通功能仿真怎么都对不上。后来给门控使能信号加了一组max_transition约束问题才解决。时钟复用信号也一样比如可测试性设计里的扫描时钟和功能时钟它们在不同的工作模式下切换。CTS时要保证两种模式下的时钟树都有合理的偏斜不然测试模式下时序好、功能模式下违例或者反过来最终还要回头改CTS浪费大量时间。3. 核心细节解析与工具实操要点3.1 从SDC约束到CTS Spec输入准备的关键步骤在Innovus里跑CTS第一件事不是敲命令而是确认输入的约束文件质量。SDC文件里的时钟定义直接影响CTS的走向时钟周期错了、时钟组没设全、生成时钟Generated Clock来源没写对后面的CTS跑得再漂亮也是白搭。我的标准检查清单是这样先看create_clock定义的主时钟时钟源是端口还是引脚周期和波形是否正确再看create_generated_clock定义的分频时钟或门控时钟确认源时钟Master Clock指定无误、分频系数正确然后看时钟组set_clock_groups异步时钟域之间有没有声明asynchronous或logically_exclusive这决定了工具会不会把不同时钟域的偏斜对齐如果该设的没设工具会傻乎乎地去对齐那些无关时钟白白增加缓冲器数量和功耗。CTS Spec则是ICC或Innovus里CTS配置的载体。Innovus用create_clock_tree_spec命令生成默认spec然后工程师在spec里进行定制。需要在spec里设定的内容包括目标偏斜和插入延迟、NDR规则双倍宽度、双倍间距、最大扇出、最大压摆、缓冲器类型列表、inverter优先还是buffer优先等。这里特别说一个细节spec里的目标偏斜不要拍脑袋定。0.1ns是常见值但如果你做的是一个高频模块比如2GHz的核心逻辑0.1ns可能就占了周期的20%根本不可能实现。更合理的做法是先看布局后的预估偏斜再留出优化空间。我一般会把初始目标设到理论可行值的1.2到1.5倍给工具优化留余地跑完看结果再逐步收紧。3.2 约束与规则配置设置合理的max_fanout与max_transition时钟树的缓冲器驱动能力不是越大越好。驱动能力大的buffer本身输入电容也大前一级要驱动它反而更吃力扇出太大的net压摆会变差离得远的触发器可能收到一个慢慢悠悠的时钟沿。Innovus里面设置max_fanout有两种方式一种是通过SDC的set_max_fanout约束作用于整个设计或特定时钟网络另一种是在CTS spec里用set_ccopt_property来设置特定时钟树的扇出上限。我实践下来把时钟网络的最大扇出控制在20到40之间比较合适具体要看标准单元库里缓冲器的驱动力和触发器的输入电容。max_transition的设置要更谨慎。时钟树上的transition要求比数据路径严格得多通常控制在rise/fall的10%到20%的时钟周期以内。比如1GHz的时钟周期1nsmax_transition目标设到80ps到150ps比较合理。设太紧工具会插入大量buffer来修压摆功耗面积一起上去设太松触发器采样点偏移大会导致严重的时序不确定性。我分享一个经验在CTS初期不要同时把偏斜、延迟、transition全部设到极限。工具会在约束空间里找解约束太死反而得不到稳定结果。先把transition和扇出约束设到一个中等水平跑一版看偏斜分布再决定要不要收紧。3.3 Innovus中CTS全流程命令与参数解析在Innovus环境里CTS的初级流程并不复杂。下面这套命令是我在项目里的标准做法每一步都能看到结果方便回溯。# 1. 读入设计、约束和库文件后先做布局 place_opt # 2. 生成默认CTS spec create_clock_tree_spec -file cts.spec # 3. 编辑spec用文本编辑器打开修改或在Innovus里用GUI修改 # 主要修改点target skew, max transition, buffer list, NDR规则 edit_clock_tree_spec -file cts_modified.spec # 4. 运行CTS clock_opt_design # 5. 检查时钟树结果 report_clock_tree -detail report_clock_timing -type skew report_constraints -path_type full -max_violation -no_design_problem # 6. 顺手修一下CTS后出现的DRV和hold违例 opt_design -post_cts # 7. 写出CTS后的网表做形式验证或后续布线 saveNetlist post_cts.v需要注意Innovus的CTS引擎分传统模式Cts和CCoptClock Concurrent Optimization模式。CCopt是较新的引擎核心特点是时钟树综合和时序优化并发执行能够在构建时钟树的同时优化数据路径的延迟效果比传统模式好不少。新项目我建议直接使用CCopt模式老项目如果切引擎成本高再考虑传统模式。CCopt模式下Innovus的时序收敛策略更强调时钟路径和数据路径的协同优化。比如某条数据路径setup很紧张CCopt会尝试让目标触发器的时钟晚到一点为数据到达多留出裕量而不是整个时钟域统一降低偏斜。这种“偏斜利用”机制用得好能让时序收敛效率大幅提升。3.4 跨时钟域与多时钟域的CTS策略处理多时钟域时核心要点是区分时钟之间的“关系”。异步时钟域之间不需要偏斜对齐这在时钟约束里已经声明过CTS工具就不会跨域共享缓冲器而相关时钟域如同源时钟的分频之间就得仔细考虑时钟树是否共享主干。Innovus里对相关时钟域的处理方式是“公共时钟路径”Common Clock Path。同源的分频时钟天然共享一部分主干时钟树这是好事因为共享路径上的延迟偏差会被共同抵消最终对偏斜的影响只来自分支部分。CTS工具会尽量让共享部分更长这样可以减少偏斜。我在做多时钟设计时会专门检查同源时钟之间是否生成了足够的公共路径方法是用report_clock_tree看CTS后的时钟路径延迟报告对比不同时钟的latency来源。跨时钟域交互还有一个容易被忽略的点时钟域交叉路径的时序约束。两个异步时钟域之间如果通过两级同步器交互同步器的第一级触发器的输入路径相当于异步信号不需要做时序约束但第二级触发器的输入路径必须约束。CTS阶段的时序优化只处理有约束的路径约束不全会导致工具忽略这些路径出现完美时钟树下的隐藏时序风险。3.5 从项目视角看时钟树的迭代优化时钟树综合从来不是一锤子买卖。大多数项目里CTS、布线、时序分析之间会形成多轮迭代。我刚工作的时候总觉得CTS跑完就大功告成了后来发现布线阶段经常因为绕线拥堵导致时钟树延期或者因为金属层分配问题时序分析时发现某些路径的延迟和CTS报告差距很大。迭代优化的第一原则是保持变更可控。每次修改CTS spec只动一个变量比如只改buffer类型或只改目标skew记录前后数据对比。如果同时改了好几个变量出了问题根本没法定位。第二原则是别急着全程重跑。CTS后如果只出现局部违例可以用ECO方式局部修而不是整个CTS重来。Innovus的ecoCTS功能可以针对指定时钟树局部调整代价小、速度快。我用过一次一个只影响几十个触发器的skew问题用ecoCTS五分钟搞定如果重跑整套CTS加验证至少得花半天。迭代期的数据记录也重要。我习惯把每轮CTS的skew、latency、DRV数量、功耗和面积变化记在一个表格里这样做优化时能直接看到趋势不至于凭感觉调参。4. 实操过程与核心环节实现4.1 时钟树综合前的checklist检查在真正动手跑CTS之前我会过一遍自己的checklist虽然啰嗦但能省掉后面大量返工时间。这里直接分享给各位库文件与design确认时序库文件包含时钟树综合需要的所有缓冲器和反相器单元有的库为了追求面积把buffer种类砍得太少CTS工具没有足够的单元可选结果自然不会好。SDC时钟约束所有时钟都已定义生成时钟的来源正确时钟组声明完整。布局质量布局阶段的拥塞预估congestion map是否在合理范围内如果布局区域拥塞严重CTS的缓冲器可能插不进去。电源网络电源网络规划IR drop是否满足要求电源电压波动过大会加重时钟抖动问题。初始DRV布局后的DRVmax transition、max capacitance需要提前修干净否则CTS会把这些违例进一步放大。我见过最典型的反面案例是新人拿到一个别人转交的旧设计不检查SDC直接跑CTS结果生成了几百条violation后来排查发现约束文件跟网表版本不匹配几个关键时钟根本没定义。花了大半天时间最后只是重新搞定约束而已。4.2 分步骤跑通一套CTS并在Innovus里查看结果假设你已经完成布局打开了Innovus界面下面演示一套完整的CTS执行与验证流程。第一步检查时钟网络信息。用下面命令列出所有时钟网络确认时钟定义与设计意图一致report_clocks第二步创建CTS spec。工具会为当前设计生成符合默认配置的spec文件默认配置可能不是最优但作为起点足够create_clock_tree_spec -file cts.spec然后打开cts.spec文件重点修改几个sectionset_ccopt_property target_skew -clock [all_clocks] 0.15 set_ccopt_property target_max_trans -clock [all_clocks] 0.15 set_ccopt_property buffer_cells -list {BUFD1 BUFD2 BUFD4} set_ccopt_property inverter_cells -list {INVD1 INVD2 INVD4} set_ccopt_property delay_corner -library_corner...这里有一个细节工具默认会用反相器对inverter pair来做时钟树。原因很简单反相器本身的输入电容小、驱动能力强而且inverter pair在PVT变化下的延迟特性更对称对抖动和偏斜的控制优于buffer。所以除非有特殊原因我不建议把inverter从列表里删掉。第三步运行CTSclock_opt_design第四步查看结果。报告时钟树偏斜是最直接的验证手段report_clock_timing -type skew输出里会列出每个时钟组的偏斜、延迟范围我一般重点看最大偏斜是否在目标范围内以及是否有离群点。另外用report_clock_tree -detail可以看树的具体结构哪里多插了一级缓冲器哪里分支太长都会一目了然。第五步看DRV和时序总结report_constraints -path_type full -max_violation -no_design_problem到这里一套CTS就跑完了。但我要强调跑通只是第一步你在报告里看到的偏斜和延迟才是需要花时间理解的东西。4.3 一个实际项目的CTS参数选择记录拿一个我经手的MCU项目举例这个项目时钟频率200MHz也就是5ns周期设计里有三个时钟域系统主时钟、外设时钟和低频看门狗时钟前两个是同源的后者来自独立振荡器。我的初始参数设定是这样的偏斜目标0.1nsmax_transition 0.1nsmax_fanout 30缓冲器选择中驱动力的BUFD2/BUFD4反相器用INVD2/INVD4。第一轮CTS跑完系统主时钟的实际偏斜是0.086ns外设时钟偏斜0.093ns看起来达标了。但在时序分析阶段发现一条跨时钟域的数据路径setup违例严重。追查原因发现工具为了降低偏斜在两个时钟域之间插了大量共享的缓冲器让公共路径延迟变大但公共路径的延迟不影响偏斜却直接增加了跨域路径的时钟延迟波动导致时序变差。这就是一个典型的“为了减小skew而牺牲延迟”的案例。我的应对办法是调整时钟组声明把两个时钟域设为logically_exclusive这样工具就知道不用强行对齐它们。结果系统时钟偏斜略升到0.11ns但仍在目标内跨域路径的违例直接消失。这说明一个道理偏斜不是越小越好必须结合具体的数据路径约束来判断。4.4 时钟树结果验证skew、latency、DRV全面检查CTS之后不能光看偏斜一个指标我习惯做一个三维检查。第一维是延迟一致性。用report_clock_timing -type latency看每个时钟源的延迟分布如果一个时钟域里延迟差异过大即使偏斜不大也可能存在局部长树枝。延迟异常通常指向某些区域缓冲器密度不够或者绕线资源紧张。第二维是DRV检查。CTS结束后工具会报出时钟树上的max_transition和max_capacitance违例。我要求项目里这些违例必须清零再进入布线不然布线的金属层切换和绕线寄生会把问题放大。修DRV的方法也不复杂在spec里降低max_fanout或者在违例位置手动加缓冲器。第三维是脉冲宽度检查Pulse Width Check。时钟信号经过太多级反相器后占空比可能发生偏移。工具在report_clock_tree里会给出min pulse width信息如果发现某个时钟树的脉冲宽度异常就要检查是不是缓冲器选型不当或压摆过慢。这套验证做完CTS这一步才算真正闭环。5. 常见问题与排查技巧实录5.1 偏斜超标时先看约束再看结构CTS最常遇到的问题就是偏斜超标。遇到这个情况我的排查顺序固定如下第一步确认约束本身是否合理。检查SDC里的时钟定义看是不是某个生成时钟的来源被错误指定导致工具把不相干的网络纳入偏斜计算。这个问题的坑在于工具报告的skew可能是对的但它对齐的目标压根不是你想要的。第二步看时钟树的物理结构。用report_clock_tree -detail找出偏斜最大的那组触发器在哪个区域看看是不是那一带布局密度太高缓冲器插不进去导致树枝过长。如果是可以考虑手动指定时钟网络绕线层避开拥塞区。第三步考虑目标偏斜是否设置得过严。0.05ns的偏斜在低频设计里实现不难在高频设计里可能根本无法完成。工具为了达成目标会疯狂插buffer结果偏斜终于达标了但延迟和功耗爆炸。如果你发现偏斜和延迟都好但功耗面积超标大概率是约束太激进了。5.2 时钟树综合后hold违例的常见解法CTS之后出现hold违例是常态因为数据路径的延迟可能比时钟延迟短。在CTS阶段修hold最粗暴的方法是插入延迟单元但这样会增加面积和功耗。更优雅的做法是结合时钟偏斜来修如果某条路径hold违例而目标触发器的时钟到达时间本来就比较早那就别强行拉平偏斜保留这个正偏斜来吸收数据路径的短延迟。CCopt引擎会自动做这件事但传统CTS模式下需要手动设置偏斜约束或对特定路径做时序例外。我在做高时序利用率设计时会专门检查CTS工具是否合理地利用了偏斜。方法是看时序报告中setup和hold的裕量分布如果hold违例频繁而setup裕量充足说明偏斜没有被有效利用需要检查偏斜目标是否设得过大、过于追求零偏斜。5.3 CTS后DRV违例过多如何定位与处理CTS后DRV违例多绝大多数原因是扇出和transition约束设置不合理其次是库单元选择不合适。定位方法用Innovus的时序报告列出违反max_transition的路径看集中在哪片区域。如果区域集中往往是局部拥塞或电源网络问题如果分散多半是约束设定本身有问题。处理方法分三种增加缓冲器驱动能力比如把BUF1换成BUF2解决单个或少数缓冲器驱动力不足的问题。降低max_fanout设置强制工具缩短单根网络的长度减少负载电容。在关键网络手动插入平衡缓冲器balance buffer把长树枝切短。这里有一个手工插buffer的案例某条时钟网络上挂了80多个触发器工具自动生成的树在大扇出处transition严重超标。我手动在该网络的中点位置插了一个BUF4把扇出从80降到40和40transition立刻恢复偏斜也变好了。手动干预在关键时刻比反复调参更有效。5.4 时钟门控毛刺与脉冲宽度丢失问题时钟门控单元使能信号时序检查不到位会出现一种很隐蔽的问题功能仿真正常后仿真偶发出错。原因是门控时钟的毛刺或脉冲宽度异常导致触发器采样到错误数据。排查思路如下先用report_clock_gating检查门控单元有没有违反时序然后看门控使能信号是否在时钟沿附近翻转如果在高电平期间使能信号有毛刺下游时钟就会出现毛刺脉冲。处理方法是给门控使能信号单独设置较紧的max_transition约束并确保SDC里对门控时钟定义了set_clock_gating_check。Innovus中还可以用set_clock_gating_pessimism来调整门控时序分析的悲观度但这个参数不能乱调调大了可能掩盖真实问题。我在项目里遇到过占空比从50%偏到35%的情况。原因是时钟路径上经过太多级反相器对高电平时间和低电平时间不对称。解决方案是减少反相器级数或者在关键位置用buffer替代inverter pair让信号占空比保持稳定。5.5 常见问题速查表现象可能原因检查方式常用解法全局偏斜大触发器分布不均report_clock_tree查看区域分布分区插平衡buffer、改NDR绕线局部过渡违例扇出太大、buffer驱动不足report_constraints查DRV提高buffer驱动级别、降低max_fanoutsetup违例集中在时钟路径时钟延迟波动大report_clock_timing看latency调整时钟树延时结构、检查公共路径长度hold违例多偏斜未合理利用检查时序裕量分配手动设定局部偏斜、插入延迟单元门控时钟毛刺使能信号transition差report_clock_gating收紧使能信号transition约束占空比偏移反相器级数过多检查min pulse width用buffer替代inverter pair这张表基本覆盖了我在CTS阶段遇到过的绝大多数问题。遇到问题别急着改命令先定位在哪个维度出了偏差再决定动哪里。6. 从时钟信号到项目实战一点个人体会书本上写时钟树综合往往是一个孤立的章节讲完插入缓冲器、讲完偏斜就结束了。但在实际项目里时钟信号贯穿了后端流程的每一个环节布局时就要考虑时钟网络的走线空间CTS时就要想着后续布线会不会拥塞布线完成还要回来验证时钟树在真实寄生参数下的表现。这是一个需要反复回头看的工程不是一个顺序执行的任务。我个人在实际操作中的体会Clock Tree Synthesis本质上是一场平衡的艺术。偏斜、延迟、功耗、面积、可制造性每个指标都在互相拉扯。一个优秀的后端工程师不是能把某个指标做到极致而是能在这些指标之间找到最适合当前项目目标的平衡点。高频芯片偏斜是命根子功耗敏感的可穿戴芯片适当的偏斜换来功耗大幅降低可能是更好的选择。CTS阶段的调试经验很多都是“记下来才能成体系”的东西。我建议每个初学者准备一个实验记录本每轮CTS的参数、结果、问题、解法都记下来跑三五个项目之后回头翻你会发现规律比想象中清晰得多。最后再分享一个实用技巧在做CTS之前先花一点时间在Innovus里打开时钟网络的物理视图亲眼看看那些还没处理的时钟树长什么样哪些网络特别长哪些扇出特别大。这个习惯让我在后来的项目中省了不少排查的时间。很多时候答案不在报告里在设计本身。下一篇笔记我打算继续沿着数字后端的学习路径深入讲讲CTS之后的路由阶段以及时钟网络在真实布线环境下的延迟计算和时序收敛问题。学习数字后端没有捷径但每一轮扎实的笔记和复盘都会变成下一轮项目里的底气。
返回列表