ECO 自动化深入:布线后功能/时序 ECO、spare cell 与增量实现
更新时间:2026-09-25。芯片走到布线后(post-route),每一次改动都在和两样东西博弈:掩膜成本与迭代工期。基础流程与单轮修复手法在 物理 ECO 与时序收敛 里讲过,这一篇聚焦 tapeout 前最后阶段的 ECO 自动化——怎么让功能修改尽量只动金属层、让时序修复不推倒已收敛的结果、让每一轮迭代在自动化工具里收敛而不是发散。
本文要回答的问题
- 功能 ECO 和时序 ECO 改的东西不同,代价层级差在哪?为什么「metal-only」是硬约束?
- spare cell(备用单元)要铺多少、铺在哪,才能在布线后真正被 ECO 用上?
- setup 违例和 hold 违例的修复手段为什么会互相打架,工具按什么顺序修?
- post-route 增量布局/CTS/布线怎么保证只动受影响区域,而不是变相全芯片重跑?
- 每轮 ECO 之后,DRC/LVS、寄生参数、MMMC 时序哪些必须重新签核,怎么防止修好一个角破坏其它角?
一、ECO 的代价层级:先分清在改什么
布线后收到的修改需求五花八门,但按「动到哪一层」分类,代价差异是数量级的。功能 ECO(functional ECO)改的是网表逻辑——验证后期发现一个条件判断写反、一个中断屏蔽位漏掉,RTL 改一行,综合出来的门级结构却要重新接线。时序 ECO(timing ECO)不改逻辑功能,只调整驱动结构:插缓冲、换大尺寸单元、做有用偏斜(useful skew)。泄漏功耗 ECO(leakage ECO)则更进一步,在时序有余量的路径上把高阈值(HVT)单元换成低漏流版本,属于「白捡功耗」的收尾动作。
| 维度 | 功能 ECO | 时序 ECO | 泄漏功耗 ECO |
|---|---|---|---|
| 触发原因 | 逻辑缺陷、规格变更 | setup/hold 违例、转换时间差 | 时序余量过剩、功耗超标 |
| 改什么 | 门级连接关系,可能增删单元 | 缓冲器、单元尺寸、时钟偏斜 | 同功能不同 Vt 的单元替换 |
| 首选实现 | spare cell + metal-only | 增量 ECO 编译器自动修 | 直接 swap,工具批量做 |
| 最坏情况 | 重制晶体管层,重排重布 | 局部重布,偶发布局推挤 | 几乎无物理风险 |
| 掩膜影响 | 可能只换高层金属,也可能全换 | 通常只动金属 | 只动金属或不动 |
这张决策图是全篇的主线:任何 ECO 进来先问一句「逻辑变没变」,功能 ECO 再问一句「现有 spare cell 能不能凑出这个逻辑」。能走 metal-only 的修改,晶圆厂只需要重制上面几层金属掩膜,成本和周期都按小改版算;一旦要动扩散层和多晶硅,本质上就是重新流片。所以 spare cell 的规划质量,直接决定后期还有多少「便宜修改」的自由度。
二、功能 ECO:spare cell 预留与 metal-only 接线
spare cell 是布局阶段就撒进芯片、但输入端接成不翻转状态(通常 tie 0/tie 1)的「闲置逻辑」。常见组合是一批 spare inverter/buffer、若干两输入与/或门、少量带置位的 spare flop,总量一般占标准单元面积的 1% 到 3%,先进节点大芯片常铺到 3% 到 5%。铺少了后期不够用,铺多了白占面积、还增加漏电,这个比例由项目的历史 ECO 发生率反推,而不是拍脑袋。
光有数量不够,分布决定可达性。spare cell 必须均匀撒在整个摆放区域(place spare cells with uniform density),并且避开宏单元之间的狭窄通道——塞在 SRAM 夹缝里的 spare gate,金属线根本绕不进去。工程上还会把几个 spare cell 预先组成「功能岛」:比如一个 spare flop 加两个 spare mux 挨在一起,修一个常见的「加一级使能」逻辑时一次取齐,不必跨区域拉线。
一个典型的 spare 清单长这样:每十万门区域内铺约 200 个 spare inverter/buffer、80 个两输入 NAND/NOR/AOI 组合门、20 个 spare mux、8 到 12 个带异步置位的 spare flop,外加几个 spare delay cell 专门留给后期修 hold。数字不是教条——车载和高可靠项目历史 ECO 多,比例上浮;消费级成熟产品可以压低。布局工具通常支持按密度图自动撒 spare,但「功能岛」要人工或用脚本指定,因为自动撒布只会均匀、不会成组。
上图就是 metal-only ECO 的物理含义:spare cell 的晶体管在第一次流片时已经做好,功能 ECO 只通过金属跳线把它的输入从 tie 信号改接到真实逻辑,再把输出送到需要的地方。代价是受 spare 类型和位置约束——要加一个复杂门而附近只有 spare inverter,就得用多个简单门拼,拼出来的路径多了两三级串联门,延迟可能从几十皮秒膨胀到几百皮秒,直接把补丁点变成新的关键路径;距离太远则跳线要穿过四五层金属、挤占布线轨道,在拥塞区甚至绕不出去。所以 ECO 编译器在动手前会先做可行性检查:报告「这个补丁需要几个 spare、最近的一组在哪、预计绕线长度与新增延迟」,明显不划算的补丁要尽早和前端协商简化逻辑,而不是硬做。还有一个纪律:同一轮功能 ECO 若用掉了某区域大半 spare,要记录库存消耗,因为流片后的两个小版本之间 spare 不可再生,最后几轮 ECO 常常是在「还剩什么」而不是「想要什么」的约束下做设计。
三、时序 ECO:setup/hold 修复与有用偏斜
时序 ECO 是 ECO 自动化最成熟的部分。post-route 拿到带真实寄生参数的时序报告后,工具按违例类型选手段:setup 违例(路径太慢)优先 upsizing 驱动单元、在长线上插缓冲器,必要时把路径终点 flop 的时钟做有用偏斜——让时钟晚到一点,相当于借时间;hold 违例(路径太快、数据追上前一拍)则相反,在数据路径上插延迟缓冲把路径「拖住」。
| 手段 | 修 setup | 修 hold | 副作用 |
|---|---|---|---|
| upsizing(换大单元) | 增强驱动、缩短延迟 | 可能加重 hold 违例 | 增加功耗与局部拥塞 |
| downsizing(换小单元) | 不直接用 | 增大路径延迟 | 可能制造新 setup 违例 |
| 插 buffer | 分割长 RC 线 | 插入延迟单元 | 占面积、增加功耗 |
| useful skew | 借时钟边沿时间 | 调整捕获沿 | 借的时间要在邻接路径还 |
| 换低 Vt 单元 | 提速 | 不适用 | 漏电显著上升 |
注意表中 upsizing 和插缓冲同时影响两个指标:把发射路径加快,修好 setup 的同一条路径上 hold 裕量反而缩小。这就是「修 setup 修出 hold 违例」事故的机理。自动化流程的固定顺序是先修 setup 再修 hold,且 hold 修复阶段锁定 setup 关键路径的结构,只允许在路径上加延迟、不动大结构;修完 hold 再回扫一遍 setup 确认没有反噬。工具修 hold 时优先用 delay cell 而不是加长绕线——后者的延迟随工艺角漂移大,在快角可能不够、慢角又拖累 setup;delay cell 的延迟在库里经过特征化,多角行为可预测。
先进节点还要把串扰因素一起考虑:ECO 新插的缓冲器改变了相邻线的开关时序,可能让原本签核通过的线出现新的耦合噪声违例,所以时序 ECO 的收尾要带 SI(信号完整性)分析,相关机理见 串扰与 SI 签核。另外泄漏功耗 ECO 排在同一轮末尾:时序收敛后,工具批量扫描所有非关键路径,把 LVT(低阈值、快但漏电大)单元换成 HVT,只要每个角的 slack 仍为正就接受——典型项目这一步能再降 5% 到 15% 的漏电,几乎是免费的。多比特单元(multibit flop)合并也常在这一轮做:把多个单 bit 触发器换成同面积的 multibit 库单元,时钟引脚数下降,时钟功耗和布线资源一起省掉,手法见 多比特触发器与电源门控。
四、post-route 增量实现:把扰动圈在局部
无论是功能还是时序 ECO,物理实现都必须走增量流程(incremental implementation),而不是拿新网表重跑一遍布局布线。全芯片重跑的结果不可复现——工具的优化决策随网表轻微变化而整体漂移,一周前签核通过的区域可能冒出新违例,这在 tapeout 倒计时阶段不可接受。增量引擎的工作方式是先定位「受影响区域」:ECO 改动点周围一定半径内的单元允许移动,半径外的单元位置、走线全部冻结;CTS 只重建受影响时钟域的局部子树;布线器先 rip-up 改动点相关的线,在局部重新绕行,只有绕不通时才逐层扩大重布范围。
这张同心扩散图体现了增量流程的纪律:扰动从改动点向外逐层申请,而不是一开始就放开全局。每一轮 ECO 后必须比对增量前后的时序报告——冻结区路径的 slack 应当完全不变,只有数值在舍入误差内的寄生变化。如果出现大范围时序漂移,说明增量引擎实际上触发了全局重优化(常见原因是 ECO 点压在拥塞热点上、或一次改动单元太多),这种结果要丢弃并拆小 ECO 批次重来,不能带着漂移继续迭代。增量流程的工期优势同样明显:一次几百个单元的局部 ECO,增量实现加窗口提取通常几小时内完成,而全芯片布局布线加全量提取往往要跑一到两天,tapeout 前最后两周往往要迭代七八轮,没有增量能力排期根本撑不住。
时钟侧的增量要格外谨慎:CTS 重建局部子树后,新插入的时钟缓冲会改变树上的插入延迟,useful skew 预算和邻接 flop 的时钟相位都跟着变。做法是把重建范围严格限制在 ECO flop 所在的时钟分支,并对该分支重新平衡 skew,分支外的时钟树逐线段保持;重建后单独出一份该时钟域的偏斜报告,确认跨分支偏斜没有恶化,相关方法见 CTS 高级时钟树综合。另外 spare cell 被启用后留下的 tie 连接、原 spare 输出的悬空金属,也要在增量布线时一并清理,否则会留下 antenna(天线效应)和浮空网络隐患。
五、ECO 编译器与迭代收敛
ECO 编译器(ECO compiler)是把上述动作串成自动循环的引擎:读入 post-route 数据库、签核级时序报告和 ECO 指令(功能补丁或违例清单),自动选型、自动布线、自动提取局部寄生并复查,输出新的数据库和一份「修了什么、还剩什么」的报告。
收敛判据不是「违例数减少」这么宽松,而是最差负裕量(WNS)和总负裕量(TNS)逐轮单调改善。真实项目里最常见的发散场景是多角互相打架:在慢角 upsizing 修 setup,快角 hold 恶化,工具再插 delay buffer,慢角 setup 又退回——两三轮后违例原地打转。这时自动化必须停下来交人工:识别冲突路径,用 useful skew 从时钟侧解耦,或在约束层面确认某条路径的多角要求是否过约束。每轮改动规模也要设上限(比如单轮不超过几百个单元),小步快跑比一次大修更容易收敛,出了问题也容易定位是哪一轮引入的。
六、对 DRC/LVS/时序的影响与 signoff 再验证
ECO 改的是已完成物理实现的数据库,所以「改完能跑通」和「改完仍然可制造」之间还隔着完整的再验证。metal-only 虽然只动金属,但金属跳线恰恰是 DRC 高发区:高密度接线容易产生间距违规、面积不够的金属补丁违反密度规则,新增的高层跳线还可能制造 antenna。LVS 同样要重跑——启用 spare cell 后网表与版图的器件、连接对应关系全部变化,漏改一处 tie 断开就是 LVS mismatch。时序侧则必须重新提取寄生参数(哪怕只提取改动窗口,全芯片合并的 SPEF 也要重新生成),然后在全部 MMMC 角回归,方法与多角签核见 MMMC 高级 STA。
| 再验证项 | 是否全量 | 关注点 |
|---|---|---|
| DRC/DFM | 改动区全层 + 全芯片顶层规则 | 间距、密度、antenna、金属跳线 |
| LVS | 全量 | spare 启用后器件与网络一致性 |
| 寄生提取 | 窗口提取,全芯片合并 SPEF | 增量区域耦合电容变化 |
| STA(MMMC) | 全角全模式 | 修好的角 + 此前已闭合的所有角 |
| 形式验证 | 全量比对 | ECO 后网表与 RTL 功能等价 |
这张再验证流水线要和 DRC/LVS 物理验证 与 形式验证 ECO 网表一致性 配合理解。最容易被轻视的是「其它角回归」:ECO 编译器通常只在驱动修复的那个主角上迭代,而最终签核要求此前已闭合的每个角、每个模式仍然干净——一个在高温慢角修 setup 的 upsizing,可能在低温快角制造 hold 违例。因此每轮 ECO 的回归报告必须逐角对比 slack,任何角的新增违例都视为本轮失败,宁可回退也不「先签了再说」。最终发布的检查清单口径与 全流程 tapeout 签核清单 保持一致。
常见坑
- spare cell 铺得太少或全挤在宏单元夹缝里:计数够但不可达,功能 ECO 被迫动基区层。
- 只修 setup 不锁 hold:插缓冲提速后 hold 批量爆掉,两轮工作量互相抵消。
- 增量没真正增量:改动点压在拥塞区触发全局重优化,冻结区时序大面积漂移。
- 只在主角签核:其它 MMMC 角出现回归违例,带到终审才发现。
- spare 启用后 tie 线和悬空金属没清理:LVS 不过或留下 antenna 违规。
- 一轮 ECO 改动过大:发散后无法归因,正确做法是拆小批次、单调收敛。
这一篇在知识体系里的位置
- 向上承接:物理 ECO 与时序收敛 给出单轮 ECO 的基础手法,时序收敛实战案例 提供完整场景。
- 签核支撑:MMMC 高级 STA、DRC/LVS 物理验证、全流程 tapeout 签核清单 覆盖再验证各环节。
- 向下衔接:ECO 后的功能等价性由 形式验证 ECO 网表一致性 兜底。
总结
布线后 ECO 自动化的本质是「最小扰动加完整回归」:功能 ECO 靠预先均匀铺设的 spare cell 走 metal-only 接线,时序 ECO 按先 setup 后 hold 的顺序由编译器插缓冲、改尺寸、做有用偏斜并顺带做泄漏功耗替换,物理上用同心扩散的增量流程把改动圈在局部,以 WNS/TNS 单调改善判定迭代收敛,每轮冻结后必须重过 DRC/LVS、寄生提取与 MMMC 全角回归——修好目标角且不破坏任何已闭合的角,才算一轮真正成立的 ECO。