4. ECO单元添加与删除:ECO单元的创建、标准单元的添加与删除、填充单元的ECO处理、ECO单元属性设置

好,咱们进入第四章。这一章讲的是ECO操作里最基础、也最频繁的动作——怎么添加和删除ECO单元。

说白了,ECO修改就是给已经布好线的版图做“外科手术”。你想想看,芯片都走到后期了,金属层都铺好了,这时候要改功能,你不能把整个底层全推倒重来。所以就有了ECO单元这套玩法。

4.1 ECO单元的创建

ECO单元是什么?我个人的理解是:它是专门为后期修改预留的“空白积木块”。

在项目初期,我们会在芯片里预先放好一些ECO单元。这些单元本身不参与功能,但内部预留了逻辑门和连线资源。等到需要改功能时,直接在这些单元上做金属层修改就行。

在华大九天的工具里,创建ECO单元有几种方式:

  • 手动创建:在版图编辑器中,直接调用ECO单元库里的模板
  • 自动创建:通过脚本批量插入ECO单元到指定区域
  • 转换创建:把现有的标准单元或填充单元转换成ECO单元

核心要点:ECO单元必须包含完整的逻辑功能单元(如与非门、或门、触发器等),不能只是一个空壳子。否则后期改不动。

我记得有一次,一个同事在项目里放了大量ECO单元,结果到修改时发现里面只有缓冲器,没有组合逻辑门。最后只能重新流片,教训深刻啊。

4.2 标准单元的添加与删除

标准单元的ECO添加,是日常工作中最常用的操作。流程其实不复杂,但细节很多。

4.2.1 添加标准单元

添加标准单元时,我建议按这个步骤来:

  1. 定位插入位置:找到需要修改的逻辑区域,确认有足够的空间
  2. 选择单元类型:从ECO单元库中挑选合适的标准单元(注意驱动能力)
  3. 执行插入:使用工具命令将单元放置到指定坐标
  4. 检查DRC:确认新插入的单元没有违反设计规则

举个例子,假设我们要在坐标(100, 200)处插入一个两输入与非门:

eco_add_cell -cell NAND2X1 -location {100 200} -layer M1

这里有个坑——-layer参数指定的是修改层。如果你指定的是M1,工具只会修改M1及以上的金属层,底层保持不动。这样做的好处是,不会影响已经验证过的底层器件。

小技巧:添加标准单元时,尽量选择驱动能力稍大一点的。我曾经因为选了驱动能力刚好够的单元,结果后仿时序不过,又得重新改。多留点余量,省得返工。

4.2.2 删除标准单元

删除标准单元比添加要小心得多。为什么?因为删除一个单元,可能会影响到周围的连线。

删除操作的基本命令:

eco_remove_cell -cell U123 -keep_net

注意这个-keep_net参数。加上它,工具会保留与该单元相连的线网,只是把单元本身移除。不加的话,连线和单元一起删,容易出问题。

警告:删除标准单元前,一定要先确认该单元没有被其他逻辑引用。我曾经在项目中删了一个看似“闲置”的单元,结果导致整个时钟树断掉,花了三天才把问题找出来。

4.3 填充单元的ECO处理

填充单元(Filler Cell)是版图里最容易被忽视的部分。很多人觉得它就是个“填空”的,没什么技术含量。其实不然。

填充单元的作用主要有两个:

  • 保证N阱的连续性,避免闩锁效应
  • 满足密度规则,防止化学机械抛光(CMP)时出现凹陷

在做ECO时,填充单元的处理逻辑是这样的:

场景 处理方法 注意事项
需要空间插入新单元 删除部分填充单元 删除后要检查阱连续性
修改后出现空隙 插入新的填充单元 注意填充单元的尺寸匹配
密度不满足要求 调整填充单元分布 优先使用高密度填充单元

我个人习惯的做法是:在做任何ECO修改之前,先把修改区域附近的填充单元标记出来。等改完逻辑单元后,再统一处理填充单元。这样能避免反复修改。

填充单元的ECO命令示例:

# 删除指定区域的填充单元
eco_remove_filler -area {50 50 200 200}

# 自动填充空隙
eco_add_filler -auto -cell FILL1 FILL2 FILL4

嗯,这里要注意:自动填充时,工具会优先使用小尺寸的填充单元来填补小空隙,大尺寸的填充单元留给大空隙。如果你有特殊要求,可以手动指定填充顺序。

4.4 ECO单元属性设置

ECO单元的属性设置,是很多人容易忽略的一步。但恰恰是这些属性,决定了你的ECO修改能不能被后续流程正确识别。

常见的ECO单元属性包括:

  • 修改层标识:标记哪些金属层被修改了
  • ECO版本号:记录这是第几次ECO修改
  • 修改时间戳:记录修改的时间
  • 修改原因:简要说明为什么要做这个修改

设置属性的命令:

eco_set_attr -cell U456 -layer M2 -version "ECO_v2" -reason "Timing fix for path A->B"

为什么属性设置这么重要?

因为芯片设计是个多人协作的过程。你改完版图,别人要能看懂你改了哪里、为什么改。没有属性标注,后期查问题就像大海捞针。

我曾经接手过一个项目,前工程师做了三次ECO修改,但没有任何属性记录。结果我在做第四次修改时,发现有些单元已经被改过了,但完全不知道改了什么。最后只能把整个模块重新验证一遍,浪费了两周时间。

所以我的建议是:每次做ECO修改,都要养成设置属性的习惯。哪怕只是加个版本号,也比什么都没有强。

知识体系总览

下面这张图,把本章的核心内容串起来了:

ECO单元添加与删除知识体系 ECO单元操作 创建ECO单元 手动创建 自动创建 转换创建 标准单元操作 添加单元 删除单元 DRC检查 填充单元处理 删除填充单元 插入填充单元 密度检查 属性设置 修改层标识 版本号/时间戳 核心:保留修改记录

这张图把ECO单元操作的四个核心环节串在了一起。你从中心出发,沿着四个方向走,就能覆盖本章的所有知识点。

最后说一句:ECO修改不是一锤子买卖。你改完一个单元,可能还会影响到其他单元。所以每次操作完,都要做一遍完整的检查。别嫌麻烦,流片失败的代价可比检查的时间成本高多了。


公众号:蓝海资料掘金营,微信deep3321