☰
ICC2与Starrc时序相关性提升:从SPEF回注到RC提取对齐的完整流程
2026/10/18 13:23:14 网站建设 项目流程

数字IC后端交付前挨过ICC2时序收敛、到PT读Starrc提取的SPEF却一片大红的朋友,应该都对“correlation”这个词有肌肉记忆。同样是R、C,同样版图、同样的网表,实现工具和签核工具算出来的delay差得离谱,项目就得被反复打回重做,后端工程师在工具之间来回搬运ECO,痛苦指数极高。这篇我想把自己在多个项目里打磨过的“提高ICC2与Starrc correlation”的流程、命令和坑一次性说清楚,讲的东西全来自实用场景,不绕弯子,照着做能省下大量重复收敛工时。

1. 为什么ICC2和Starrc会算不到一起去:先搞清偏差从哪里来

1.1 前端收敛、签核崩溃的典型剧本

先说一个几乎每个团队都发生过的场景。某项目的时序收敛进入倒数第三周,ICC2里report_qor显示setup负裕量只剩几皮秒,hold修到基本稳定。按正常流程,做完详细布线之后导出最终版图、跑Starrc提取SPEF,丢给PT做签核级STA。可PT一开跑,关键路径setup violation冒出来三四十条,有的甚至超过80ps。你回头查ICC2里同样的路径,明明它的delay计算值和PT差了不到5%,可偏差积累在一条多级组合链上,最终slack就完全不是一个量级。

这种分裂感就是correlation问题的直接表现。要真正解决它,得先把ICC2和Starrc在“物理参数提取 + 延时计算”上的差异来源拆清楚,否则只会陷入“调一个参数,好一条路径,坏另一条路径”的恶性循环。

1.2 ICC2与Starrc到底各自在算什么

ICC2内部做时序收敛用的寄生参数,来自布局布线过程中对版图的近似提取。它更关注速度,需要在每次增量ECO、skew优化时快速算出相对可信的RC值,路线压力很大,因此会使用经过简化的几何提取模型和库抽象。

Starrc是独立的场解算器,本质上是把版图当成三维导体系统,用场求解方程算每个net的整段电阻、总电容、耦合电容以及对地电容,再降阶成RC网络给PT做精确STA。它精度高但速度慢,不适合在设计流程中间反复跑。

两者差异概括如下:

维度ICC2内部估算Starrc签核提取
提取算法几何近似/查找表三维场求解
单位面积电容来源工艺厂captbl/QRCE表工艺厂itf/tluplus文件
电阻网络可选CwL或RwL完整电阻网络
耦合电容取决于模式设置完整耦合提取
使用阶段布局布线、ECO迭代签核最终时序

核心逻辑只有一个:你希望ICC2在迭代时看到的RC值,尽量像Starrc签核时看到的RC值。两者不是谁对谁错,而是“近似的快速evaluation”和“精确的signoff reference”之间的差距。提高correlation,本质是把这个差距收窄到一个可预测、可容忍的范围,不让误差影响收敛方向。

1.3 偏差的四个主要来源

根据项目实操经验,ICC2和Starrc的偏差几乎都跑不出以下四个层面:

一是文件源不一致。ICC2挂的QRCE techfile和Starrc用的itf/tluplus来自不同工艺版本,或者干脆是不同来源目录下的“旧货”,这是最致命的基础性错误。源文件一旦分叉,后面再怎么调参数都白费。

二是提取模式不一致。ICC2默认可能走CwL模式,Starrc签核通常用包含耦合电容和完整电阻网络的PEX/RwL模式。模式差一级,长线上电阻差距能到两位数百分比。

三是计算口径不一致。温度设定了不同corner,PBA和EBA没对齐,derate系数各用各的,SPEF降阶精度不同,这些细节单独看都是百分之几,乘起来就是灾难。

四是结构性问题。某些net太长、block pin位置浮动、macro内部pin的RC建模方式、绕线不自然的snake路径,这些是“同一条路径在两边权重不同”的原因,经常被忽略但实际影响很大。

排查correlation时,我习惯先按这四层逐一排除,而不是上来就动手改提取选项——因为只有先知道偏差从哪来,才知道改哪里是安全的。

2. 前期就把“签核尺度”装进ICC2:文件、温度与库设置

2.1 寄生参数文件同源同版本

这是所有环节里优先级最高、成本最低的一项,却也是最容易被忽略的。很多项目里QRCE文件和tluplus是从不同时间点从工艺厂拿的,前者停留在项目启动时的版本,后者是最近一次技术研讨会后更新过的。

正确做法是建立一个“寄生参数文件登记表”,在项目启动时就确认以下几项完全匹配:

  • ICC2用的QRCE techfile版本
  • 后端库captbl版本
  • Starrc用的itf/tluplus版本
  • 设计库中引用的互连电容查找表版本

任何一列对不上,都必须在顶层规定文件中锁定为同一工艺版本。实际项目中,我曾遇到整体cap偏差恒定在6%左右的情况,排查到最后就是QRCE和itf差了一个很小的版本号。换回同源文件后,差距瞬间掉到2%以内。这类问题最难发现,因为所有路径都“稳定地偏”,很容易误判成温度或derate问题。

2.2 温度与线电阻老化不能各设各的

温度对线电阻的影响在先进工艺下非常明显。铜互连的电阻温度系数不是零,温度从25度升到125度,同样一根线的方块电阻可能出现可观增长,而电容对温度的敏感度则相对较弱。如果ICC2内部delay计算按常温model跑,而PT签核按高温worst-case温度跑,那么长路径上电阻相关delay就会系统性偏小,表现为ICC2总是比PT乐观。

在ICC2中有对应的delay estimation温度设置项,要和PT/Starrc提取时使用的温度corner保持一致。同一套设计,set_operating_conditions里的温度、签核SDC里的温度、Starrc提取时写的温度参数,三者必须同一数字。

另外还要注意互连老化(aging)效应。老练项目会看到它在长线上改变线电阻2%左右,这部分如果只有签核环境考虑了、ICC2没有,那么correlation就会“越老的路径越差”。做法是在前期就把aging factor作为公共参数注入到两边的RC估值中,不要等签核阶段才发现。

2.3 电容表与单位的一致性

单位问题看起来基础,实际出错频率很高。后端库里用pF还是fF、Starrc提取输出用1e-15还是1e-18、QRCE表里写的是 per micron 还是 per square,这些单位错位后通常在全设计范围产生固定倍数的偏差。

有个很容易验证的土办法:挑一个中等长度的普通net,分别在ICC2和Starrc里报它的total cap。如果两者相差一个固定整数倍,比如2倍、1000倍,那大概率不是提取算法差异,而是单位或倍率不一致。我在一个早期项目里就遇到过ICC2报的net cap与Starrc报的总是差10倍,查到最后是库表定义中电容单位标注与后端flow里默认单位不一致,全流程没有任何报错,属于“数值都对但各有各的标准”。

另一种常见单位陷阱在电阻上。ICC2里有些库表现为 sheet resistance(欧姆每方块),Starrc输出则是整段net的绝对电阻。对比时要先把维度统一成同一个物理量,不要拿两种定义直接比数字。

2.4 开启与签核对齐的估算模式

很多版本的ICC2提供了多种delay estimation选项,用于控制内部RC估算模型。如果条件允许,应该主动让ICC2内部的寄生估算更接近Starrc风格,而不是停在默认的快速模式。

比较典型的选项包括:

  • 是否启用完整的电阻网络模式(RwL)还是只使用CwL
  • 耦合电容是否计入side cap和fringe cap
  • 是否使用带correlation增强的估算引擎对齐签核场解算器的behavior
  • 同一net在ECO迭代中是否保持原有RC网络稳定性

这些选项开启后会影响runtime和内存,但它们带来的收益是让ICC2内部路径delay分布和PT看到的分布高度重合。视觉上,第一个体现就是两边的路径排列顺序基本一致:在ICC2里最差的20条路径,在PT里也大致是那20条,只是绝对数字有很小的偏移。有了这个前提,后续用SPEF回注就顺理成章。

另外一个建议是在跑大型网表前,先用一个标准模块做“空跑对比”:同一floorplan、同一routing结果,分别记录ICC2自提取的net cap和Starrc提取的net cap,画出散点分布。如果散点整体落在y=x附近且没有明显离群点,说明基础环境是对的;如果存在一个稳定的系统偏差角,那就先修文件/单位/温度,而不是盲目调提取模式。

3. 用Starrc提取结果校准ICC2:从SPEF回注到逐层拆解

3.1 让ICC2直接读签核SPEF

文件、温度、单位都对齐之后,如果correlation还不够好,最直接有效的一招就是把Starrc的提取结果直接送回ICC2的时序引擎里。这就是常说的SPEF回注,也是很多团队签核前最后阶段的高效做法。

大致流程是:

  1. ICC2完成详细布线并导出最终netlist和layout数据。
  2. 用Starrc对该版本layout做签核级提取,生成SPEF。
  3. 在ICC2中读入该SPEF,让内部delay计算基于这份SPEF进行更新。
  4. 之后ICC2里做的任何ECO与adjustment,都是在“签核RC口径”下的操作。

用tcl示意:

# 在ICC2中回注Starrc提取的签核SPEF read_parasitics -format spef /path/to/starrc_output.spef \ -keep_capacitance -keep_net_rc update_timing -full report_qor

这里有个使用前提:回注的SPEF必须来自当前一致的逻辑和物理拓扑。如果在读SPEF之后又挪动了std cell、改动了routing topology,SPEF里的RC分布就和实际版图失配,回注就失去了意义,甚至会给出错误引导。因此SPEF回注通常用在“拓扑已经冻结,只剩小范围hold修复或ECO”的阶段,效果最好。

我自己最喜欢的用法是拿它做“场景替换”:ICC2默认按内部估算跑floorplan和place,到route完成、预签核前,生成一次Starrc SPEF并回注,让最终修hold和min pulse的ECO都基于签核口径。这样PT第一次跑出来的结果,和ICC2最后一次report的差距通常能被压到很小的范围内,不再需要“PT报一条、ICC2修一条”的笨办法。

3.2 量化correlation:路径抽样的delta统计

要谈correlation好坏,先得定义“好”的标准。不能只看一两条关键路径的slack差值,那只是个案。正确的做法是设计一个路径抽样脚本,从每个corner、每条时钟域随机抽取足够多的路径,比较两边算出来的arrival time和slack。

我在项目里常用的参数是:每个corner抽200到500条路径,覆盖setup和hold,优先覆盖从长线、高翻转率、时钟路径三类来源的net,避免只抽“恰好类似”的路径。

统计指标包括三项:

  • 平均delta,指所有路径arrival time差值的算术平均,反映系统性偏差方向
  • 最大delta,指个别路径的极端差值,反映随机波动
  • 符号一致性,指“ICC2快则PT也快,ICC2慢则PT也慢”的比例

经验上,成熟项目的平均delta可以压到3%以下,最大delta压到10%以内,而且符号一致性在90%以上。如果平均delta接近0但最大delta很高,说明有特定类型的net在两边处理不同,要去定向拆;如果符号一致性低,说明两条timing path上的计算逻辑已经“各走各的路”,问题大概率在模式或derate层面。

实际对比时注意:两边要按同样的OCV模式、同样的derate系数来跑,否则统计结果被“人为因素”污染,完全不可用。先做“裸对比”(两边都不加derate,纯看RC和cell delay差异),再逐步加回derate,才能区分到底是谁拖累了correlation。

3.3 逐net拆解误差:电容、电阻、延时分段归因

抽样统计只能告诉你“哪里差”,不能告诉你“为什么差”。想要修得准,需要落到单个net上做归因。

我在项目里会挑统计中delta最大的几十条路径,抽出这些路径上所有net,分别在ICC2和Starrc里报出三组数字:总电容、总电阻、耦合电容占比。然后按下表归类:

现象可能原因优先排查方向
总电容整体偏高提取模式或capsource不一致检查captbl、QRCE、Starrc提取模式
总电容接近但delay差电阻网络、拓扑降阶不同检查RwL、SPEF reduce设置
耦合电容占比差很多耦合模式、density环境差异检查提取阶段是否缺少dummy/filler
短net正常、长net异常电阻模型/网络拟合单独针对长net的重复提取比较

逐net拆解时有一个实用技巧:只挑“真实影响时序”的net,不要拿无关的短复位线或纯电源线来对比,否则会浪费时间在物理上没有意义的数字差上。

比较结果里,我经常看到的一种典型分布是:总电容已经非常接近,误差不到1%,但延时差距仍超过8%。这时候问题几乎都出在电阻网络或RC拓扑上——ICC2可能用了简化的单节点模型,而Starrc给出的是几段电阻与电容交织的分布RC,同样的总R、总C,分布方式不同,path delay就不同。遇到这种情形,优先考虑反馈到RC网络拟合设置,而不是继续和电容较劲。

4. 常见偏差的定向修法与优先级

4.1 CwL和RwL:要不要让ICC2提前看到电阻

CwL模式下,ICC2只考虑线的总电容,忽略电阻分布,所有net被近似看成集总电容挂在线段上。这在低速信号和短线上问题不大,但在先进工艺下,长线电阻会对cell delay和transition产生不可忽略的影响,线越长,CwL的乐观偏差越明显。

RwL模式把net展开成包含电阻和耦合电容的RC网络,让ICC2在计算delay时充分看到线电阻带来的“负载化”效应。从提升correlation角度看,只要runtime和内存允许,优先开启RwL,尤其对时钟树、高速接口、跨模块长线这些“高频高风险”net。

不过开RwL不是无脑的,它会带来几个直接代价。第一条是运行时显著上升,大型SoC上可能多出20%到40%的delay计算时间;第二条是当RC网络细化后,某些之前“假干净”的路径会暴露出真实冲突,short噪声集中在ECO上;第三条是极端情况下ICC2会过于保守,导致过量插buffer,反而抬高了面积。

我的习惯是分层处理:时钟树全局开启RwL,数据通路关键net开启RwL,一般信号和复位线保持CwL模式。这样correlation主要贡献来源被控制住了,回归开销也可控。

4.2 耦合电容与绕线pattern

从某个工艺节点开始,线间耦合电容会超过对地电容成为总电容的主体。如果ICC2内部提取时没有正确计入side cap、fringe cap,或者绕线密度变化大而没有filler反馈,那么在高拥挤区域,耦合电容的缺失会让ICC2严重低估路径delay。

典型症状:同一模块,横向比较时线路密集区域路径偏差特别大,而外围稀疏区域几乎看不出差异。这是因为耦合电容和局部density强相关,ICC2在布线迭代中若用平均density代替真实局部density,高低密度区域的误差就分开了。

修法上,第一步是确保在详细布线后、提取前,filler metal和dummy metal已经正确填充,让两边看到的是同一个金属环境;第二步是在Starrc提取时使用包含完整耦合的模式,而不是单纯的total-only提取;第三步是在ICC2估算选项中同步开启耦合电容计入。

另一个容易踩的坑是shield(屏蔽线)。有些团队为了减小耦合,给敏感信号加屏蔽地线。但Starrc和ICC2如果对shield的处理口径不一致,比如一边把它计入cap、一边忽略掉,那么敏感信号路径的cap会差出两三倍。遇到shield分布密集的设计,要专门核对shield net的提取设置。

4.3 系统性快慢先查derate与温度

如果统计结果显示几乎每条路径都同方向偏,比如ICC2总体比PT快6%,且这个比例在全网表都不变,那基本可以排除RC提取本身的问题,优先检查温度和derate。

derate是最容易在correlation里“偷走”一个固定系数的变量。OCV derate、AOCV depth table、POCV sigma值,这些在PT签核中通常按工艺厂的参考值设置,而ICC2内部如果要复现同一个结果,需要同步这些系数。很多团队只同步了derate数值,忘了depth table和sigma table的版本,结果就是“短路径对得上,长路径对不上”,因为不同深度路径的derate权重不同。

正确排查方法如下:

  1. 两边都关闭derate,对比纯RC+cell delay下的路径差别,记录delta1。
  2. 两边同时开启相同derate,对比delta2。
  3. delta2相对delta1的增量就是derate口径差异带来的系统性偏差。

如果delta2比delta1明显变大,去查derate文件版本和table类型;如果delta2和delta1差不多,说明问题不在这里。

温度带来的系统性偏差更像“慢热变量”。worst-case corner下,温度对线电阻影响大,如果ICC2内部温度仍按typical,那长路径的线电阻会被低估,表现为“越长越乐观”。修法是把两边温度设定成同一个corner值,并把这个值写死在所有脚本里,不要靠“记得改”。

4.4 网表与floorplan里的隐藏因素

correlation不好时,还有一种被严重低估的原因:路径所经过的物理结构在两边代表的意义不同。

举几个真实遇到的例子。第一个是block pin的位置漂移。ICC2内部优化时可能微调过pin的位置来改善congestion,但布局完成后的物理数据和签核网表里pin的位置若没有同步,SPEF提取出来就会对不上,导致该pin临近net的RC值长期偏高或偏低。

第二个是特殊cell的提取方式。像decap cell、tie cell、switch cell,它们在图里不承担时序使命,但物理上占据面积、影响density和邻近net的耦合环境。如果floorplan阶段这些cell的数量和位置在两边不一致,周围net的cap就会系统偏差。

第三个是max_net_length设置不合理。超长net如果不做重复器插入,在ICC2内可能被算法“视而不见”,而Starrc提取时完全按真实长线建模,两边对待同一个net的物理量级就完全不同,correlation想好都难——这已经不是correlation问题,而是设计质量问题。遇到时先修设计,再谈调参数。

综合这些情况,我给出的修法优先级是:

  1. 锁定同源工艺文件、相同温度和相同单位。
  2. 开启感知电阻和耦合的提取模式,与Starrc对齐。
  3. 在拓扑冻结后做一轮“提取—回注—收敛”闭环。
  4. 最后才用derate和估算选项做精细微调。

顺序不要反,否则会在错误的地基上盖楼,调出来的结果经不起换corner的考验。

5. 真实项目里的坑和心得:PBA、降阶模型与自查清单

5.1 PBA和EBA没有对齐的坑

Correlation对比有个很隐蔽的变量是STA模式。PT可以用EBA(基于路径的图型分析)或PBA(基于实际路径的时序分析),两者在先进工艺下对同样RC网络算出的路径delay差别可能超过5%,而ICC2内部通常默认一种近似模式。

如果比较时PT开了PBA、而ICC2的report用的是EBA,得到的delta会混入大量“同一物理路径、不同计算方式”的差距,误以为RC提取出了问题。更麻烦的是,PBA和EBA的差距在不同路径上方向还不完全一致,导致统计符号一致性骤降。

我在流程上的处理是:对比阶段两边先统一用EBA,确认RC相关correlation已经OK后,再统一开PBA,用PBA的增量差异评估“计算方式”对相关性的影响。如果PBA增量差异仍然很大,那就要检查斜率敏感的OCV系数是否同步,这种问题靠调整提取参数是修不好的。

5.2 SPEF降阶模型不一致的坑

Starrc输出的SPEF可能经过降阶(reduce)处理,把详细RC网络压缩成更高层级的等效模型,以减小PT的运行时间和内存占用。ICC2如果读的是未降阶SPEF,而PT签核用的是降阶SPEF,两边虽然物理来源相同,但网络形态已经不同,路径delay也会出现非系统偏差。

同样,如果Starrc在某些net上输出的网络结构包含大量小电容节点,而ICC2在内部估算时自动合并了这些节点,那么高频信号路径对“网络细分度”会特别敏感。

解决的方向是让两边吃同一个网络版本:如果签核flow决定用降阶SPEF,那么回注给ICC2的也应是同版本降阶SPEF;如果决定用未降阶完整网络,那PT那边也要准备好承受相应runtime。统一这一点,可以消除一批“看起来完全随机”的correlation抖动。

5.3 我惯用的收敛顺序与自查清单

下面这张清单是项目里每次做correlation专项收敛都跑一遍的,建议直接贴到team的运维文档里:

序号检查项错误表现正确做法
1QRCE与tluplus版本整体cap恒偏同一工艺版本同源引用
2温度corner长路径固定乐观两边统一worst温度
3电容单位固定整数倍偏差统一pF/fF口径
4RwL/CwL模式长线、时钟路径偏大关键net开RwL
5耦合电容计入拥挤区域偏大开启完整耦合提取
6SPEF版本随机抖动统一降阶策略
7EBA/PBA模式符号一致性低分阶段统一模式
8derate table长短路径分化同步depth/sigma表
9拓扑与SPEF匹配回注后无法复现拓扑冻结后回注
10filler/dummy局部density误差提取前补全filler

每次完整走一遍大概需要一到两天工时,但如果能定位到根因,省下的是后面几周的签核返工,性价比很高。

5.4 最后的小习惯

我做correlation收敛反复踩坑之后,养成一个习惯:每次升级工具版本或工艺文件时,先跑一个“最小回归”——一个中等规模block、固定seed、固定floorplan,输出ICC2与Starrc的路径delta分布,和上一次基线对比。只要这个基线的平均delta没有明显漂移,才继续跑真实项目;一旦漂移超过1%,先停下来查环境变化,而不是直接开始新流程。

这个习惯帮我挡掉了至少两三次“工具更新导致correlation莫名恶化”的大麻烦。对大多数做后端的人而言,correlation不是一次性能解决的问题,而是一个需要持续看守的指标,越早建立基线,后续项目越稳。希望这篇东西能帮你在下个项目里少走几趟弯路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询