news 2026/10/7 12:20:19

OCC时钟树综合实战:5个关键技巧搞定扫描测试时钟

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OCC时钟树综合实战:5个关键技巧搞定扫描测试时钟

1. 项目背景与核心挑战:为什么OCC时钟树综合让人头疼

做数字IC后端的朋友应该都有体会,时钟树综合(CTS)本身就是一个需要耐心打磨的环节,而一旦设计里出现带OCC(片上时钟控制器,On-Chip Clock Controller)电路的扫描链,复杂度和坑的数量直接翻倍。

我刚接手这个项目的时候,模块规模不算特别大,但客户要求所有的扫描测试时钟都要走片上OCC逻辑,用来在移位(shift)和捕获(capture)两种模式下灵活切换功能时钟和测试时钟。听起来很简单是吧?真正落地的时候,CTS阶段踩了一堆坑,最后总结下来,核心难点集中在几个地方:OCC电路本身是一段受控的组合逻辑,时钟信号穿越它之后,通常意义下的时钟传播路径就不再是单纯的buffer/inverter链;shift模式和capture模式下时序要求完全不同,前者要求时钟偏移尽量小,后者反而需要特定的延迟关系来满足捕获沿和发射沿的配合;再加上多模式多角(MMMC)分析的约束切换,一个不小心就把hold修爆或者把setup搞崩。

先用一句话说清楚OCC时钟树综合的核心问题:OCC就是把功能时钟和测试时钟合并成一个统一时钟域的模块,CTS的任务是要保证这个合并后的时钟树无论在测试模式还是功能模式下,都能满足后端时序收敛的要求。这里面牵扯到时钟门的穿越、测试时钟的专属约束、capture和shift两种模式的差异化处理,以及最终在Synopsys工具链里怎么把这些约束和策略落到具体命令上。

本文会以一个实际项目为主线,把我调通OCC电路CTS的5个关键技巧完整拆出来,包括我的取舍思路、踩过的坑,以及最终的Synopsys工具配置脚本。无论你是刚接触后端的新人,还是已经在做DFT相关CTS的工程师,这套方法论都能直接拿去做参考,至少在第一次面对OCC电路的时候,不会像我当初那样手足无措。

2. 方案选型思考:OCC电路应该当成什么看待

2.1 先把OCC的资源结构摸清楚

要做OCC的CTS,第一步不是急着写约束,而是把电路结构吃透。标准的OCC单元内部通常是由MUX和触发器的组合构成的,常见的有两种实现方式:一种是纯组合逻辑的MUX,用测试使能信号(scan_enable)来切换功能时钟和测试时钟;另一种是带同步复位的触发器方案,也叫时钟切换同步器,目的是避免切换瞬间产生毛刺。

两种方案对CTS的影响差异非常大。纯MUX方案结构简单,但时钟切换时容易出毛刺,对约束的要求更高;触发器方案则把时钟门控和使能信号都做了统一处理,CTS的时候更容易控制,不过多了一级触发器的延迟,对timing预算会有影响。

我这里用的是触发器方案,也就是业界常说的标准单元库自带的OCC cell。这种cell在工作时有一个关键特性:它输出的时钟信号在功能模式下是功能时钟的延伸,在测试模式下则是测试时钟的延伸,同时输出端的传播条件还受scan_enable信号的控制。在CTS工具眼里,这个cell的输出pin仍然是一个时钟端点,但它的内部路径是组合逻辑+寄存器混合的,所以不能简单把它理解成一个buffer。

这一点的直接后果是:如果你在SDC里把OCC的输出当做普通时钟源点来约束,CTS工具在展树的时候,大概率会把OCC内部的MUX路径当成普通的组合逻辑路径来处理,造成时钟树插入大量的延迟单元,甚至在scan_enable切换时产生毛刺。后面时序收敛一定出问题。

2.2 两种主流工具处理OCC的差异

如果是用Cadence的Innovus,工具对OCC这类时钟门控穿越逻辑有专门的透明时钟(transparent clock)处理机制,配合CTS专用约束可以达到不错的效果。但在咱们讨论的Synopsys流程里,核心工具是PrimeTime做signoff,ICC2做后端实现。不过我这里更想强调一个关键点:后端CTS阶段的约束思路,和最终signoff阶段的约束思路必须是同源的,否则前面做的一切都白搭。

我自己在项目里用的是Synopsys ICC2,配合Design Compiler综合出来的门级网表,以及PT做最终时序验证。工具链的选择之所以重要,是因为ICC2对时钟门控单元的处理有一套完整的derived clock和case analysis机制,这些机制如果用对了,OCC电路的CTS会非常顺利;用不对,ICC2会把OCC的输出端口当成普通数据端口来处理,给你报出一堆莫名其妙的DRC violation。

所以我最终的方案是:把OCC电路抽象成特殊的时钟门控单元,在SDC里明确给OCC的输入时钟建立master clock,给OCC的输出建立generated clock,然后通过set_case_analysis或者set_clock_gating_check这类命令去约束OCC内部MUX的传播条件。

这里要特别强调一个理念,也是整个方案的地基:OCC输出的时钟本质上是一个“被使能信号控制的时钟”,它和普通的时钟门控(ICG)不一样的地方在于,ICG的enable信号是一个静态电平,而OCC的scan_enable信号在测试模式下会动态变化。因此,CTS工具在处理OCC电路时,必须同时满足两个条件:一是OCC输出时钟的skew和latency要可控,二是scan_enable信号不能成为一个延迟瓶颈,否则测试模式下hold时序会非常难收敛。

2.3 理解shift和capture模式的本质差异

做OCC的CTS,如果不懂shift和capture模式的时序差异,基本等于盲人摸象。Shift模式(移位模式)下,所有扫描单元串成移位寄存器,时钟必须同时到达所有扫描单元,这样数据才能一级一级传下去。因此这个模式对时钟skew的要求极其严格,最好做到接近于零偏差。想象一下,一群人手拉手站成一排,口令必须同时传到所有人耳朵里,动作才能整齐划一,就是这个道理。

Capture模式(捕获模式)下,两个连续的时钟沿分别给launch(发射)和capture(捕获),数据经过组合逻辑之后要在捕获沿到来之前稳定下来。这个模式下launch和capture可能来自不同的时钟源(比如功能时钟和测试时钟),它们之间的偏斜关系决定了setup和hold检查的结果。CTS的目标就是要把这两种模式下的时钟路径latency拉到一个可接受的范围内。

实际项目里,shift模式用的时钟频率通常比较低,但skew必须很小;capture模式的频率可能更高,但两个沿之间的偏斜要求相对宽松一些。这两个需求的优先级是有冲突的,所以我们必须通过合理的约束,让工具在展树过程中找到一条兼顾两者的路径。

3. 核心细节解析:OCC电路CTS的5个关键技巧

3.1 技巧一:给OCC输出单独建模,避免时钟网表和功能网表混在一起

很多人拿到OCC电路后,直接在SDC里面写一行create_generated_clock就完事,这是最典型的错误做法。OCC输出pin上的时钟,说到底是一个受scan_enable影响的时钟信号。如果你只是简单地从这个pin上定义generated clock,CTS工具会认为这条时钟路径上的所有逻辑单元都是透明的,会把OCC内部的MUX路径也当成了时钟树的一部分,插入大量不必要的延迟单元。

正确做法是先在综合阶段就对OCC的测试时钟输入端口和功能时钟输入端口分别建立master clock,然后对OCC的输出pin单独建立一个generated clock,并且用set_clock_sense把OCC输出的时钟传播方向锁死。这一步的目的是让工具清楚地知道:OCC输出到扫描单元之间才是真正的时钟树主干,而OCC内部是受控的逻辑穿越路径,不参与时钟树的延迟补偿。

以Synopsys工具为例,可以在综合后的SDC中这样写:

create_clock -name func_clk -period 10 [get_ports func_clk_in] create_clock -name test_clk -period 10 [get_ports test_clk_in] # 假设OCC输出为occ_out create_generated_clock -name occ_func_clk -source [get_ports func_clk_in] \ -divide_by 1 [get_pins occ_inst/occ_out] create_generated_clock -name occ_test_clk -source [get_ports test_clk_in] \ -divide_by 1 [get_pins occ_inst/occ_out] -add

这里有一个关键点,是很多人容易忽略的:OCC输出pin上同时存在两个generated clock,分别对应功能时钟和测试时钟,必须用到-add选项,否则后定义的时钟会覆盖先定义的时钟,工具就会认为OCC输出上只有一条时钟路径,然后CTS的时候把另一条路径的时序约束完全忽略掉。

注意:如果OCCcell本身已经包含了时钟方向选择的内部逻辑,建议在SDC中对OCC输入侧先做set_case_analysis,强制工具在CTS阶段只分析其中一种模式,等CTS完成后在signoff阶段再做多模式分析。这是标准做法,可以显著降低CTS阶段的复杂度。

3.2 技巧二:用set_clock_sense锁死时钟传播方向,让工具不迷路

OCC电路最讨厌的地方在于,时钟信号在OCC内部要穿过MUX。MUX的选通信号是scan_enable,但scan_enable在shift和capture两种模式下的电平是不一样的。在时序分析的时候,工具会对MUX的路径做传播分析,如果没有特殊声明,它会认为两个输入都可以传到输出,进而导致侦测时序时产生一个很宽的虚假窗口,出现大量幽灵violation。

解决这个问题靠的是Synopsys里的set_clock_sense命令。你可以把它理解成给时钟传播路径贴一个“只允许从这个方向走”的标签。我们在OCC的输出pin上指定positive clock sense,让工具把从OCC两个输入时钟来的路径都当作正向传播时钟处理,而不是做数据传播分析。

具体配置是在综合脚本或者CTS脚本里面加上:

set_clock_sense -pulse [list occ_inst/occ_out] -clock [list func_clk test_clk]

在这个配置之后,工具就会明确知道,OCC的输出时钟只是两个输入时钟选通后的结果,不会再去探索scan_enable信号变化对时钟路径的影响。同时,也要配合对OCC cell内部的MUX选通端设置set_case_analysis,让工具在CTS阶段选择一个固定的模式来分析。

我当时做的时候,把scan_enable在shift模式下设为1,capture模式下设为0,分别跑两遍CTS,然后比较两遍的结果看哪条时钟树更均衡。这种做法的好处是思路清晰,缺点是时间翻倍。后来熟练了以后,我改成直接在MMMC里配置两种模式,让CTS工具一次性处理两个约束条件,效率高很多,不过前提是得对工具的行为有充分把握。

3.3 技巧三:区别对待shift模式和capture模式的skew约束

到了设置CTS约束的环节,shift和capture两种模式的目标值一定要分开设。Shift模式下,目标是让所有扫描单元尽可能同时收到时钟沿,所以skew要设得很紧。Capture模式下,目标的重点变成了发射沿和捕获沿之间的路径延迟可控,skew的基准值可以适当放宽,但要保证发射沿和捕获沿不会靠得太近。

具体到工具配置,ICC2里面可以用set_clock_tree_options来设定不同时钟的skew目标。我实际项目中这样配置:

# shift模式,skew目标最小化 set_clock_tree_options -clock_trees occ_shift_clk \ -target_skew 0.05 \ -target_max_latency 1.0 # capture模式,skew适当放宽但latency严格限制 set_clock_tree_options -clock_trees occ_capture_clk \ -target_skew 0.2 \ -target_max_latency 1.5

很多人不理解为什么capture模式的target_skew可以适当放宽,因为只关系到两个沿之间的相对延迟。如果把capture模式的skew也设成0.05,工具有可能会为了追求极端平衡而插入大量buffer,反而让时钟延迟变长,结果setup紧张甚至violation。这里一定要理解一个底层原理:CTS的本质是延迟最小化和skew平衡之间的折中,不同的模式,折中的方向不一样。

还有一个很重要的点:shift模式下,频率比较低,但skew很紧,所以工具可能会优先采用平衡树结构;capture模式下,频率要求高,latency要尽量短,所以工具可能会选择更短的路径而牺牲一定的skew。这两个目标本质上是有冲突的,但我们又不能跑两遍单独的CTS,所以最终的方案是让工具在MMMC环境下统一处理,通过给不同模式设置不同的权重和约束值,让工具自己平衡。

3.4 技巧四:对scan_enable信号做延迟约束,防止测试模式下hold崩掉

这可能是我这个项目里最值钱的一个经验,也是大多数后端工程师第一次接触OCC时完全不会意识到的问题——scan_enable信号的延迟,对OCC电路CTS的成败有决定性影响。

为什么?因为scan_enable在shift模式下是时钟切换的控制信号,它必须保证在时钟的有效沿到来之前稳定下来。如果scan_enable的延迟太大,导致时钟切换动作滞后,就会出现数据还没来得及锁存就被冲掉的情况。你可以想象一下高铁站台上的信号灯,如果信号灯切换慢了半拍,列车就会按错误的信号进站,晚点甚至事故都是迟早的事。

因此,在SDC里面必须对scan_enable信号单独做set_clock_gating_check或者set_data_check约束,确保它相对时钟沿有足够的setup余量。我当时的做法是:

set_clock_gating_check -setup 0.2 -hold 0.1 [get_pins occ_inst/scan_en]

同时,在CTS阶段,为了不让scan_enable的负载太重导致延迟过大,我把它单独拉出来,在布局阶段用set_optimize_constant_net保持走线短而宽,把驱动单元的size放大,尽量降低RC延迟。我曾经试过完全不管scan_enable的布线,结果CTS完成之后测试模式下一堆hold violation,折腾了两天才发现根源在scan_enable上——这个教训很深。

提示:在综合阶段就应该给scan_enable信号设置set_driving_cell和set_load,保证它的驱动强度和负载接近实际值。如果综合阶段就低估了负载,到了CTS阶段你会发现scan_enable的延迟根本压不下来,后端能吃下这个锅,但最终结果还是得自己收拾。

3.5 技巧五:用MMMC统一管理多模式约束,让工具一次收拢

既然OCC电路涉及功能模式、shift测试模式、capture测试模式,那肯定逃不开MMMC(多模式多角分析)。如果不把模式管理好,最常见的问题就是:CTS做完功能模式的时钟树,结果一跑测试模式,时钟树完全不满足约束,只能推翻重来。

我在项目中的做法是,在CTS之前就把所有的scenario都定义好,并且把每个模式下的约束都梳理干净。ICC2的create_scenario和set_scenario_options在这里派上大用场。一个我总结出来的关键经验:CTS阶段尽量不要把所有scenario都激活,而是选择一个主要模式(通常是工作时钟频率最高、时序约束最紧的模式)作为主scenario,其他模式作为辅助scenario参与分析。

create_scenario -name func_mode -func -mode func create_scenario -name shift_mode -func -mode shift create_scenario -name capture_mode -func -mode capture set_scenario_options -scenarios {shift_mode capture_mode} \ -setup true -hold true set_scenario_options -scenarios func_mode \ -setup true -hold true

在CTS的过程中,工具默认会同时考虑所有激活的scenario,但在时钟树优化时,权重最高的还是主scenario。我给主scenario设置了func_mode,因为功能模式是流片后实实在在要跑的,优先级最高。测试模式作为约束场景参与检查,但不干预工具的主目标。这样做的好处是CTS工具不会因为需要在多个模式之间反复权衡而陷入无解,最终结果在功能模式上表现很好,测试模式也有足够的余量。

4. 实操过程全记录:从约束编写到CTS收敛的完整路径

4.1 第一步:整理输入数据和约束层次

做OCC电路CTS的前提,是把后端实现需要的数据准备好。我建议先列一个清单:综合后的门级网表(DC输出的.v或.vg文件)、时序约束SDC、物理库文件和LEF(用Innovus或者ICC2都行,本文以Synopsys流程为准)、功耗约束UPF(如果设计有低功耗需求)、DEF/floorplan文件。

拿到这些文件之后,优先检查SDC里的时钟定义是否完整。OCC电路相关的时钟至少要包含两部分:一是功能时钟的master clock,二是测试时钟的master clock。很多人会漏掉测试时钟,因为在功能模式下测试时钟确实不需要,但在测试模式下,它就是timing analysis里最重要的时钟。

这里我放一份我自己项目里用过的SDC模板,涵盖OCC电路的关键约束:

# 定义功能时钟和测试时钟 create_clock -name func_clk -period 10 [get_ports {FUNC_CLK_IN}] create_clock -name test_clk -period 20 [get_ports {TEST_CLK_IN}] # 设置OCC输出的生成时钟 create_generated_clock -name occ_func_clk -source [get_ports FUNC_CLK_IN] \ -divide_by 1 [get_pins occ_inst/occ_out] create_generated_clock -name occ_test_clk -source [get_ports TEST_CLK_IN] \ -divide_by 1 [get_pins occ_inst/occ_out] -add # 约束OCC内部时钟传播方向 set_clock_sense -pulse [get_pins occ_inst/occ_out] -clock [get_clocks {func_clk test_clk}] # 设置时钟树目标 set_clock_tree_options -clock_trees occ_shift_clk -target_skew 0.05 set_clock_tree_options -clock_trees occ_capture_clk -target_skew 0.2 # 对scan_enable设置时钟门控检查 set_clock_gating_check -setup 0.2 -hold 0.1 [get_pins occ_inst/scan_en] # 对OCC单元设置dont_touch,防止综合阶段被优化掉 set_dont_touch [get_cells occ_inst]

4.2 第二步:用ICC2跑CTS的完整命令流程

准备好SDC之后,进入ICC2环境,我用的是Synopsys ICC2 2020版本,整体流程和其他版本差异不大。核心命令序列如下:

# 读入设计数据 read_verilog -netlist top.v read_sdc -scenario func_mode top.sdc read_parasitic -format SPEF top.spef # 设置顶层 current_design top link_design # 设置时钟树选项 set_app_options -name cts.clock_tree_options -value {target_skew 0.05} set_app_options -name cts.max_buffer_fanout -value 32 # 指定OCC相关pin为时钟端 set_clock_tree_references -references {CLKBUFX12 CLKBUFX16 CLKBUFX20} # 执行时钟树综合 clock_opt # 同时做时钟树优化和布线 route_opt

上面命令中,clock_opt是关键的一步。ICC2会自动识别时钟门控单元(包含OCC电路),并生成时钟树。如果你的设计中OCC结构特别复杂,建议在clock_opt之前先单独跑一遍set_clock_tree_exceptions,把OCC的引脚设为stop pin或者通过pin,避免工具在OCC内部插入不必要的延迟单元。

4.3 第三步:根时钟源的选择和延迟平衡

在CTS过程中,工具会自动从每个clock root开始插入buffer。对于OCC电路来说,OCC输出引脚就是root。但这里有一个非常微妙的问题:工具可能会尝试从OCC的输入时钟源头开始梳理时钟树,而不是从OCC的输出端开始。这会导致一个后果:工具认为OCC输出pin之前的逻辑路径也是时钟树的一部分,从而插入buffer来补偿延迟。

为了规避这个问题,要在CTS之前明确告诉工具:OCC输出pin是时钟树的root或者通过点。在ICC2里,可以通过set_clock_tree_exceptions来指定:

set_clock_tree_exceptions -stop_pins [get_pins occ_inst/occ_out]

用stop_pins声明的意思是:时钟树到这里就终止了,不允许越过这个pin继续插buffer。这样一来,工具就会把OCC输出端当作时钟树的终点,后续的展树只往扫描单元方向走,而OCC内部的延迟则完全由SDC的约束来约束,不会在OCC内部做延迟补偿。

注意:如果OCC输出的扇出特别大(驱动几百个扫描单元),建议在OCC输出引脚后面再加一级buffer,然后在buffer的输出端设为stop point,这样能让主时钟树的root更稳定,也方便后续做时钟门控。

4.4 第四步:多模式CTS的最终收敛方法

多模式CTS跑完之后,得到的时钟树往往是多个模式需求折中后的产物。此时要做的工作是检查每个模式下时钟延迟是否满足要求。我习惯用report_clock_tree的命令来查看结果:

report_clock_tree -summary report_clock_timing -type skew -transition

这两个命令的输出会告诉我每个时钟端点的延迟和偏斜情况。如果存在某些端点的skew超过目标值,就得看是不是scan_enable路径延迟太大或者OCC内部MUX的选择路径不均衡造成的。这种时候优先查看对应端点的布局位置,看是不是走线过长导致的RC延迟偏大。如果只是个别端点的问题,我会用skew group的方式把问题区域单独拉出来优化。

最终收敛的判定标准是:在功能模式下setup和hold都没有violation,在测试模式的shift和capture下也都不存在violation。如果做不到同时满足,我的调试顺序是:先保证功能模式下的收敛,再回头修测试模式,因为功能模式的时序一旦失败,整个芯片都跑不起来,而测试模式的问题还可以通过调整测试向量来规避。

5. 常见问题与避坑经验汇总

5.1 OCC输出时钟被工具当数据路径处理

这是我第一次做OCC时犯的错,表现是CTS走完之后,报告里显示OCC输出pin的时序检查全部fail,而且时钟树里莫名其妙多了大量buffer。原因就是没有做set_clock_sense和set_clock_tree_exceptions,工具把OCC输出当成了一个普通的数据输出pin,在数据路径上做了延迟补偿。

解决方法是方案里提到的:给OCC输出定义清晰的generated clock,并设置stop_pins。这一套组合拳打下去之后,时钟树的形态立刻正常了。

5.2 shift模式hold violation大面积爆发

出现这个问题的核心原因通常是scan_enable信号延迟过大,导致时钟切换不及时。检查方法是在PT里报一下scan_enable到OCC输出的时序路径,如果延迟超过了0.5ns,基本就是它了。解决办法有两个优先级:第一优先是约束好scan_enable的延迟预算,其次才是增大OCC驱动能力。我当时把scan_enable的驱动cell换大了一档,再把走线长度控制了一下,hold violation立刻少了一半。

5.3 多模式CTS结果和单模式CTS结果差距巨大

一个很正常的现象,但第一次遇到会很慌。多模式CTS会额外考虑测试时钟树,而测试时钟树的起点通常和功能时钟不一样,这会导致部分扫描单元的时钟延迟变大,功能模式下看原本没有问题的setup反而出现violation。

我的建议是:如果项目时间紧,可以先用功能模式跑一遍CTS,然后在这个基础上手动插入测试时钟树。如果项目要求必须在统一流程下完成,那就得接受多模式CTS的折中结果,然后在最后用post-CTS优化去收敛setup。记住一个原则:功能模式永远优先,测试模式可以牺牲部分性能但不能牺牲功能正确性。

5.4 工具配置速查表

我把常见问题、原因和解决办法汇总成了一张表,方便大家在实际项目中快速定位:

现象可能原因解决方案
OCC输出时钟skew异常大未设置clock sense或stop_pins添加set_clock_sense和set_clock_tree_exceptions -stop_pins
shift模式hold大面积violationscan_enable延迟过大增大驱动、约束clock gating check、优化走线长度
capture模式setup violation时钟树latency过长调整target_max_latency,优先缩短路径
多模式CTS结果差scenario设置不合理主scenario设为功能模式,测试模式设为约束scenario
时钟树插入大量冗余bufferOCC内部被当普通逻辑优化用set_dont_touch保护OCC单元,设置stop_pins

5.5 我踩过的几个隐蔽坑

有一个细节特别值得说:OCC电路所在的电压域。如果设计里有多个电压域,OCC的电源域切换逻辑往往会让时钟树的分析变得更加复杂。我当时有一个OCC单元跨越了电压域,CTS的时候工具报了无数个level shifter相关的violation,那时候才意识到必须对跨电压域的单元做特殊处理。

还有就是库单元选型问题。OCC cell的驱动能力和库里面普通时钟门控单元不一样,我在项目里试过用不同驱动强度的OCC cell,发现驱动能力越大的cell对CTS越有利,但代价是面积和功耗上升。建议大家在项目早期就做一组实验,选出最适合自己设计的OCC驱动强度。

最后一点,也是我自己反复强调的:SDC约束写的完整程度决定了CTS的天花板。如果你在SDC阶段就把OCC相关约束写得清清楚楚,CTS阶段的工作会轻松一半。反之,如果SDC里缺了测试时钟定义或者生成时钟定义,后面再怎么调工具也白搭。

6. 项目总结与个人体会

做OCC电路时钟树综合这个项目,最大的收获是让我对测试时钟和功能时钟的关系有了更深入的理解。很多人觉得CTS就是把buffer插一插、skew调一调,但实际上,OCC电路的出现把CTS的复杂度拉高了一个维度。你必须同时考虑功能模式、shift模式、capture模式三种场景,还要保证工具在这种多模式下能找到合理的折中方案。

我个人在实际项目中最深的体会是:OCC电路CTS的成败,在SDC编写阶段就已经决定了60%。如果时钟约束定义不清晰,特别是OCC输出的generated clock、时钟传播方向、scan_enable的检查约束这些关键点没有在SDC阶段处理好,后面CTS阶段再怎么调工具,都是事倍功半。所以我的建议是:动手做CTS之前,先花半天时间把SDC彻底理清楚,哪怕因此推迟CTS的启动时间,也是值得的。

另外一个值得分享的小技巧是:在CTS完成之后,不要急着往后端流程走,先做一个快速的PT检查,把功能模式和测试模式下的setup/hold都过一遍。这一遍检查只需要花几十分钟,但能帮你提前发现80%的隐患。我这次项目就是因为提前做了这一步,在布线之前就发现了一个潜在的capture模式setup问题,省下了整整一天的re-run时间。

最后再补充一句:OCC电路的CTS没有银弹,不同设计、不同库、不同工具版本都会带来不同的表现。上面的5个技巧是我总结出来的通用方法,但你自己的项目里一定会有自己的边界情况,关键是理解每个技巧背后的原理,这样才能在遇到新问题时举一反三。希望这篇分享能让你少走一些弯路。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/7 12:19:59

1688物流API接入实战:运费计算工具如何把采购隐性成本降下来

上个月帮朋友做采购系统升级,对账时发现一个惊人的数字:他们一个月的运费支出占了采购总额的6.8%。仓库负责人还补了一句,这还没算供应商私下收的打包费和气柱费。我问采购员下单前知不知道运费是多少,回答出奇一致:不…

作者头像 李华
网站建设 2026/10/7 12:17:11

GitHub月榜项目筛选与评估:从热词需求到落地实操的完整指南

1. 月榜项目的价值与筛选逻辑1.1 为什么月榜比日榜更值得花时间看很多人刷热榜的习惯是每天看一次,看到眼熟的项目点个星就划走。我自己也经历过这个阶段,后来发现一个问题:日榜的波动太大,一个项目可能因为某条社交平台的帖子突然…

作者头像 李华
网站建设 2026/10/7 12:15:40

拆解18个ChatGPT提示词:四要素与三类Prompt的工程化打法

简介:面向职场人士、创业者及中高层管理者,这是一份围绕ChatGPT(对话式预训练模型)打造的提示词模板合集,聚焦如何借助生成式AI快速完成市场策略、品牌建设、运营优化、供应链管理、商业模式设计、财务预测、风险管理等…

作者头像 李华
网站建设 2026/10/7 12:14:25

餐饮管理系统毕业设计全攻略:从数据库设计到论文写作

简介:一份面向计算机相关专业毕业设计的餐饮管理系统设计与实现成果文档,适用于需要完成JSPMySQL方向课程设计或毕业论文的在校生。文档共28页、约1万字,资源压缩包内包含1个doc文档,大小2.29MB,内容覆盖开发背景、系统…

作者头像 李华
网站建设 2026/10/7 12:13:17

LLM与智能体如何重塑芯片设计:从RTL生成到验证闭环的落地实践

去年底我在一个行业交流会现场,听到旁边两位做验证的老工程师在聊一件事:他们团队试用LLM生成SystemVerilog断言,原本要写两三天的覆盖率收敛任务,竟然在一个下午就有了初步结果。虽然离真正跑完流片验收还有很长距离,…

作者头像 李华
网站建设 2026/10/7 12:12:28

19pin USB3.1 Gen1接口详解:从针脚识别到Type-E升级全攻略

1. 19pin USB3.1 Gen1接口的核心认知与价值1.1 这个接口到底长什么样、能干哪些活很多玩家装机几年下来,主板换了好几块,但可能从来没正眼看过机箱前面板那根又粗又难弯的接线。这根线上有个看起来像“拉长版9pin”的接头,针脚密密麻麻排成两…

作者头像 李华