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 等步骤。

设计输入文件读取流程 Verilog 网表 Liberty 时序库 LEF 物理库 DEF 设计 OpenROAD 数据库 read_verilog / read_liberty / read_lef / read_def 后续流程:Floorplan / Placement / CTS / Routing 常见错误:文件找不到 | 格式不兼容 | 版本不匹配 检查路径、文件版本、OpenROAD 版本兼容性

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% 的问题都能解决。