4. 设计输入与数据准备:读取 Verilog、Liberty、LEF/DEF 文件
设计输入这一步,说白了就是把你的芯片设计“喂”给 OpenROAD。很多新手一上来就跑 flow,结果卡在文件读取上,半天找不到原因。我刚开始用 OpenROAD 时也踩过不少坑,今天就帮你把这些雷区都排一遍。
核心要点:OpenROAD 读取的四大类文件——Verilog(网表)、Liberty(时序库)、LEF(物理库抽象)、DEF(设计交换格式)。任何一个文件出问题,后续流程都跑不下去。
4.1 文件找不到?先检查路径
这是最常见的报错,没有之一。OpenROAD 报“file not found”,八成是路径写错了。
我个人习惯把所有设计文件放在同一个目录下,然后在脚本里用相对路径引用。比如:
read_verilog ./rtl/top.v
read_liberty ./lib/slow.lib
read_lef ./lef/tech.lef
read_def ./results/floorplan.def
但要注意,OpenROAD 的工作目录是启动时的当前目录。如果你在 /home/user/project 下运行,那路径就得从这儿开始算。
小技巧:在脚本开头加一行 pwd 打印当前目录,能帮你快速定位路径问题。我每次调试新 flow 都会先跑这一步。
还有一种情况——文件名大小写。Linux 系统是区分大小写的,TOP.V 和 top.v 是两个文件。我在项目中遇到过有人把 Liberty 写成 liberty,结果报错半天。
4.2 格式不兼容:版本和规范问题
文件找到了,但 OpenROAD 说“格式不对”。这通常是因为文件版本或规范不匹配。
4.2.1 Verilog 文件
OpenROAD 支持标准的 Verilog-2001 语法。但如果你用了 SystemVerilog 的特性(比如 always_ff、logic 类型),它可能不认。
我曾经接手一个项目,网表里全是 always_ff @(posedge clk),OpenROAD 直接报语法错误。后来发现是综合工具输出时用了 SystemVerilog 格式。解决办法很简单:让综合工具输出纯 Verilog-2001 格式。
# 在综合脚本里指定输出格式
set_format verilog -2001
注意:OpenROAD 的 read_verilog 命令默认只读 Verilog,不支持 SystemVerilog。如果你必须用 SV,可以试试 read_systemverilog,但功能有限。
4.2.2 Liberty 文件
Liberty 文件是时序库,版本不对会直接导致时序分析失败。OpenROAD 通常支持 Liberty 2007 及以后的版本。
怎么检查版本?打开 Liberty 文件,看第一行:
library (my_lib) {
delay_model : "table_lookup";
revision : 1.0;
...
}
如果 delay_model 是 table_lookup 或 polynomial,一般没问题。但如果是 cmos 这种老模型,OpenROAD 可能不认。
| Liberty 版本 | OpenROAD 兼容性 | 常见问题 |
|---|---|---|
| 2007 及以后 | 良好 | 基本无问题 |
| 2004-2006 | 部分支持 | 可能缺少某些属性 |
| 2003 以前 | 不推荐 | 时序模型不兼容 |
4.2.3 LEF/DEF 文件
LEF 是物理库的抽象描述,DEF 是设计的具体布局信息。这两个文件版本不匹配,是物理设计中最头疼的问题之一。
我记得有一次,团队用 5.7 版本的 LEF 文件,但 DEF 是 5.8 版本。OpenROAD 读 DEF 时报了一堆解析错误。后来发现是 DEF 里用了 5.8 新增的关键字,LEF 里没有对应定义。
建议:尽量保持 LEF 和 DEF 版本一致。如果必须混用,先检查 DEF 文件头部声明的版本号:
VERSION 5.8 ;
DESIGN top ;
...
然后确认 LEF 也支持这个版本。
4.3 版本不匹配的典型场景
除了文件自身版本,OpenROAD 的版本也可能导致问题。你想想看,OpenROAD 更新很快,不同版本对文件格式的支持可能有细微差别。
我遇到过最典型的情况:用 OpenROAD 2.0 生成的 DEF 文件,拿到 1.5 版本上读,结果报错。原因是 2.0 版本在 DEF 里加了新的 COMPONENT 属性,老版本不认识。
怎么解决?
- 方法一:升级 OpenROAD 到最新版本。这是最省事的办法。
- 方法二:用
write_def -version 5.7指定输出版本,兼容老工具。 - 方法三:手动编辑 DEF 文件,删掉不兼容的部分。但我不推荐,容易出错。
4.4 知识体系:设计输入流程
下面这张图展示了设计输入的整体流程和文件依赖关系。你可以看到,所有文件最终汇聚到 OpenROAD 的数据库中,然后才能进行后续的 floorplan、placement 等步骤。
4.5 避坑指南:我的实战经验
最后分享几个我踩过的坑,希望能帮你少走弯路。
避坑 1:我曾经在读取 LEF 文件时,OpenROAD 报“unexpected ”。查了半天,发现 LEF 文件里有一行注释用了中文标点符号。OpenROAD 的解析器对非 ASCII 字符很敏感,建议所有文件都用纯英文保存。
避坑 2:Liberty 文件里如果包含 wire_load 模型,OpenROAD 可能会忽略它。我建议在 Liberty 里显式指定 slew_derate_from_library 等参数,避免时序分析偏差。
避坑 3:DEF 文件里的 COMPONENT 和 NET 部分,如果数量很大(比如上百万),OpenROAD 读取时会比较慢。我习惯先用 read_def -verbose 看进度,确认没有卡住。
嗯,设计输入这部分就讲到这里。记住一句话:文件读不进去,先看路径,再看版本,最后查格式。按这个顺序排查,90% 的问题都能解决。