第二章:ECO环境准备

做ECO,说白了就是给芯片做「微创手术」。手术刀再锋利,手术台没搭好,那也是白搭。今天我就带你把ECO的工作环境搭起来,这是后面所有操作的基础。

2.1 ECO项目文件结构

我刚开始带团队的时候,最头疼的就是项目文件乱七八糟。每个工程师都有自己的习惯,有的把文件扔桌面,有的建一堆看不懂的文件夹。后来我定了一套标准,大家照着做,效率高了不少。

一个典型的ECO项目,我建议这样组织:

ECO_Project/
├── data/                # 原始数据,只读
│   ├── layout/          # 原始版图(GDS/OASIS)
│   ├── netlist/         # 原始网表(SPICE/Verilog)
│   └── tech/            # 工艺文件
├── work/                # 工作目录,随便折腾
│   ├── eco1/            # 第一次ECO
│   ├── eco2/            # 第二次ECO
│   └── ...
├── lib/                 # 标准单元库
│   ├── timing/          # .lib文件
│   ├── layout/          # .lef文件
│   └── symbol/          # 符号库
├── scripts/             # 脚本文件
│   ├── tcl/             # Tcl脚本
│   └── perl/            # Perl脚本
└── logs/                # 日志文件

为什么要这么分?我解释一下:

  • data目录:放原始数据,设成只读权限。防止手滑把原始版图改了,这种事我见过不止一次
  • work目录:你的战场。每次ECO新建一个子目录,方便回溯
  • lib目录:标准单元库,一般从PDK里拷过来,别乱动
  • scripts目录:所有脚本放这里,方便复用
  • logs目录:记录每一步操作,出问题了也好查
我的小习惯:每次开始新ECO,我都会在work目录下建一个以日期命名的文件夹,比如eco_20241015。这样半年后回头看,还能知道哪天改了什么。

2.2 工艺库与标准单元库准备

工艺库和标准单元库,是ECO的「原材料」。没有它们,你连门都画不出来。

你需要准备的东西,我列个表:

文件类型 格式 用途
工艺技术文件 .tf / .techfile 定义工艺层、设计规则、通孔定义
标准单元LEF .lef 单元的物理尺寸、pin位置、布线阻挡
标准单元LIB .lib 时序信息、功耗、噪声模型
标准单元GDS .gds / .oas 单元的完整版图,用于merge
标准单元CDL .cdl 单元的晶体管级网表,用于LVS

嗯,这里要注意一个坑。很多新手以为把PDK里的文件全拷过来就行了。其实不是的。你只需要ECO会用到的那些标准单元,别把IO、PLL、SRAM这些大模块的库也全拉进来,文件太大,加载慢。

我曾经踩过的坑:有一次做28nm工艺的ECO,我把整个PDK的LEF文件都加载了,结果工具光读LEF就花了40分钟。后来发现,我只需要用到大概200个标准单元,其他几千个根本用不上。从那以后,我都会先分析网表,看看用了哪些单元,只加载对应的库。

加载库的脚本,我一般这么写:

# 设置工艺技术文件
set_tech_file -path ./data/tech/tsmc28hpc.tf

# 加载标准单元LEF
read_lef -path ./lib/layout/tsmc28hpc_stdcell.lef

# 加载标准单元时序库
read_lib -path ./lib/timing/tsmc28hpc_stdcell_typical.lib

# 加载标准单元GDS
read_gds -path ./lib/layout/tsmc28hpc_stdcell.gds

# 加载标准单元CDL
read_cdl -path ./lib/layout/tsmc28hpc_stdcell.cdl

2.3 原始版图与网表导入

原始版图和网表,是ECO的「病人」。你得先知道病人长什么样,才能决定怎么动手术。

导入版图,我建议用GDS格式。虽然OASIS压缩率高,但有些老工具兼容性不好。我一般这么做:

# 导入原始版图
read_gds -path ./data/layout/chip_top.gds \
         -top_cell CHIP_TOP \
         -layer_map ./data/tech/gds_layer.map

# 导入原始网表
read_netlist -path ./data/netlist/chip_top.v \
             -top_module CHIP_TOP \
             -format verilog

# 检查一致性
check_lvs -cell CHIP_TOP

导入之后,一定要做一致性检查。我见过有人导完版图就开始改,改了半天发现原始版图和网表对不上,白忙活一场。

关键点:原始版图和网表必须是一一对应的。如果版图里有个NAND2X2,网表里也得有。多一个少一个都不行。这是ECO的「黄金法则」。

为什么会不一致?最常见的原因是:

  • 版图是旧版本,网表是新版本
  • 版图里做了ECO但没更新网表
  • 网表里有些模块被综合工具优化掉了

遇到这种情况,别急着做ECO。先跟前端设计确认,拿到一致的版本再说。

2.4 ECO工作目录设置

工作目录设置,说白了就是给工具指路。工具找不到文件,就像你找不到手术刀一样,没法干活。

我习惯用一个Tcl脚本统一设置:

# 设置ECO工作目录
set_eco_work_dir ./work/eco_20241015

# 设置输出目录
set_output_dir ./work/eco_20241015/output

# 设置临时文件目录
set_temp_dir ./work/eco_20241015/temp

# 设置日志文件
set_log_file ./logs/eco_20241015.log

# 设置报告目录
set_report_dir ./work/eco_20241015/reports

你想想看,如果每次都要手动敲路径,多容易出错。写成脚本,一键执行,省心省力。

目录设置好之后,我还会做一件事:生成一个环境检查报告。看看所有文件是不是都能找到,库是不是都加载成功了。

# 环境检查
check_eco_environment -report ./work/eco_20241015/reports/env_check.rpt

这个报告我会仔细看。如果报错,说明环境没搭好,别急着往下走。我见过有人忽略警告,结果做到一半发现缺文件,前面的工作全白费。

我的经验:环境检查报告里,重点关注三个地方:
1. 所有库文件是否加载成功
2. 原始版图和网表是否匹配
3. 工作目录是否有写权限
这三个没问题,基本就稳了。

知识体系总览

这一章的内容,我用一张图总结一下:

ECO环境准备知识体系 ECO项目文件结构 ├─ data/:原始数据(只读) ├─ work/:工作目录(可写) ├─ lib/:标准单元库 ├─ scripts/:脚本文件 └─ logs/:日志文件 工艺库与标准单元库 ├─ .tf:工艺技术文件 ├─ .lef:物理尺寸信息 ├─ .lib:时序功耗模型 ├─ .gds:完整版图 └─ .cdl:晶体管级网表 原始版图与网表导入 ├─ 导入GDS版图文件 ├─ 导入Verilog网表 ├─ 检查版图网表一致性 └─ 确认版本匹配 ECO工作目录设置 ├─ 设置工作目录路径 ├─ 设置输出/临时目录 ├─ 设置日志文件 └─ 生成环境检查报告 环境准备是ECO的基石,一步错步步错

环境准备这一步,看起来琐碎,但真不能马虎。我见过太多人因为环境没搭好,后面改了半天发现改错了地方。花半小时把环境搭好,后面能省半天时间。

好了,这一章就到这里。环境准备好了,下一章我们就可以正式开始做ECO修改了。


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