4、读取设计:read_verilog, read_db, link_design 命令详解,设计加载流程
好,咱们今天聊聊 PrimeTime 里最基础、也最容易被忽视的一步——怎么把设计读进来。
你想想看,一个芯片项目,动辄几百万门、上千万条线。STA 分析做得再漂亮,如果设计没读对,后面全是白忙活。我见过不少新手,上来就 run 时序,结果发现 timing 乱得一塌糊涂,最后查了半天——原来是某个库没 link 上。
嗯,咱们今天就掰开揉碎,把 read_verilog、read_db 和 link_design 这三个命令讲透。
4.1 设计加载的整体流程
说白了,PrimeTime 读设计就三步:
- 读网表——把门级网表(Verilog 格式)吃进来。
- 读库——把标准单元库、IO 库、宏单元库(.db 格式)加载进来。
- 链接——把网表里的实例和库里的单元一一对应起来。
这三步缺一不可。顺序上,我个人习惯先读网表,再读库,最后 link。当然,先读库再读网表也行,PrimeTime 不挑。但有一点要注意:link 之前,所有用到的库必须已经读进来了。
核心原则:link_design 之前,确保所有需要的 .db 文件都已经 read_db 完毕。否则 PrimeTime 会报 "unresolved reference" 错误。
4.2 read_verilog —— 读入门级网表
这个命令很简单,就是把综合后的门级网表读进来。语法长这样:
read_verilog {top.v module1.v module2.v}
或者你也可以一个一个读:
read_verilog top.v
read_verilog module1.v
read_verilog module2.v
我个人更推荐第一种写法,把文件列在一个大括号里,干净利落。我在项目中遇到过一种情况:有人把同一个模块在两个不同的文件里各定义了一次,结果 PrimeTime 直接报错。所以,读网表之前,先确认一下有没有重复定义。
小技巧:如果你用的是 DC 综合出来的网表,通常只有一个 top.v 文件。但如果是手工写的或第三方 IP,可能有好几个文件。建议用 read_verilog -netlist 选项,告诉 PrimeTime 这是门级网表,不是 RTL。
4.3 read_db —— 读入库文件
库文件是 .db 格式,这是 Synopsys 的二进制格式。你不能直接打开看,但 PrimeTime 能读懂。
read_db {/path/to/typical.db /path/to/slow.db /path/to/fast.db}
这里有个坑,我曾经踩过:库文件的路径一定要写对。PrimeTime 不会自动去搜索路径,你得把完整路径写出来,或者用 set_search_path 先设好搜索路径。
set_search_path "/home/libs /home/techlibs"
read_db typical.db
read_db slow.db
read_db fast.db
嗯,这样写就省事多了。PrimeTime 会在 set_search_path 指定的目录里找 .db 文件。
注意:.db 文件是工艺库,不同 PVT(工艺、电压、温度)条件对应不同的库。通常你会读三个库:typical(典型条件)、slow(最差条件)、fast(最好条件)。别只读一个,否则时序分析会不完整。
4.4 link_design —— 把网表和库链接起来
这是最后一步,也是最关键的一步。link 的过程,说白了就是 PrimeTime 拿着网表里的每个实例名,去库里找对应的单元定义。
link_design
就这么简单?对,就这么简单。但 link 之后,你一定要检查一下有没有问题。
link_design
report_link
report_link 会告诉你:
- 有多少个实例被成功链接
- 有多少个实例没找到对应的库单元(unresolved)
- 有没有黑盒子(black box)
我曾经有一次,link 完之后发现 200 多个 unresolved reference。查了半天,原来是某个 IP 的库文件版本不对,读进来的是旧版,里面少了好几个单元。所以,link 之后一定要跑一下 report_link,别偷懒。
避坑指南:如果 link 报 unresolved reference,先检查两点:
- 库文件有没有读全?
- 库文件的版本和网表是否匹配?
我曾经因为库文件路径写错了一个字母,折腾了整整一下午。
4.5 完整的设计加载脚本示例
好了,咱们把上面讲的串起来,写一个完整的加载脚本:
# 设置搜索路径
set_search_path "/proj/libs /proj/techlibs"
# 读入网表
read_verilog {top.v clk_gen.v dft.v}
# 读入库文件
read_db typical.db
read_db slow.db
read_db fast.db
# 链接设计
link_design
# 检查链接结果
report_link
# 可选:列出所有未链接的实例
report_unresolved_references
这个脚本跑完之后,如果没有任何 warning 和 error,恭喜你,设计已经成功加载到 PrimeTime 里了。接下来就可以做时序约束、跑 STA 了。
4.6 常见问题与排查方法
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
| unresolved reference | 库没读全,或库版本不匹配 | 检查 read_db 是否完整,确认库版本 |
| black box 警告 | 某个模块没有对应的库单元 | 确认该模块是否需要库支持,或添加 .db 文件 |
| read_verilog 报语法错误 | 网表文件有语法问题 | 用其他工具(如 VCS)先检查网表语法 |
| link 时间过长 | 设计规模太大,或库文件太多 | 考虑使用 link_design -keep_unresolved 先跳过 |
个人经验:我习惯在 link 之后,用 list_designs 看一眼当前加载了哪些设计,再用 list_libs 看一眼有哪些库。这样心里有数,后面分析起来也踏实。
好,关于设计加载流程,咱们就聊到这儿。说白了,就是三步:读网表、读库、链接。每一步都不难,但每一步都可能出问题。你只要记住:link 之后一定要检查,就能避开 90% 的坑。
下一章,咱们聊聊时序约束的读取和检查。到时候你会发现,设计加载只是热身,真正的重头戏还在后面。