第二章: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目录:记录每一步操作,出问题了也好查
2.2 工艺库与标准单元库准备
工艺库和标准单元库,是ECO的「原材料」。没有它们,你连门都画不出来。
你需要准备的东西,我列个表:
| 文件类型 | 格式 | 用途 |
|---|---|---|
| 工艺技术文件 | .tf / .techfile | 定义工艺层、设计规则、通孔定义 |
| 标准单元LEF | .lef | 单元的物理尺寸、pin位置、布线阻挡 |
| 标准单元LIB | .lib | 时序信息、功耗、噪声模型 |
| 标准单元GDS | .gds / .oas | 单元的完整版图,用于merge |
| 标准单元CDL | .cdl | 单元的晶体管级网表,用于LVS |
嗯,这里要注意一个坑。很多新手以为把PDK里的文件全拷过来就行了。其实不是的。你只需要ECO会用到的那些标准单元,别把IO、PLL、SRAM这些大模块的库也全拉进来,文件太大,加载慢。
加载库的脚本,我一般这么写:
# 设置工艺技术文件
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
导入之后,一定要做一致性检查。我见过有人导完版图就开始改,改了半天发现原始版图和网表对不上,白忙活一场。
为什么会不一致?最常见的原因是:
- 版图是旧版本,网表是新版本
- 版图里做了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修改了。
公众号:蓝海资料掘金营,微信deep3321