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 添加标准单元
添加标准单元时,我建议按这个步骤来:
- 定位插入位置:找到需要修改的逻辑区域,确认有足够的空间
- 选择单元类型:从ECO单元库中挑选合适的标准单元(注意驱动能力)
- 执行插入:使用工具命令将单元放置到指定坐标
- 检查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修改不是一锤子买卖。你改完一个单元,可能还会影响到其他单元。所以每次操作完,都要做一遍完整的检查。别嫌麻烦,流片失败的代价可比检查的时间成本高多了。
公众号:蓝海资料掘金营,微信deep3321