4、读取设计:read_verilog, read_db, link_design 命令详解,设计加载流程

好,咱们今天聊聊 PrimeTime 里最基础、也最容易被忽视的一步——怎么把设计读进来。

你想想看,一个芯片项目,动辄几百万门、上千万条线。STA 分析做得再漂亮,如果设计没读对,后面全是白忙活。我见过不少新手,上来就 run 时序,结果发现 timing 乱得一塌糊涂,最后查了半天——原来是某个库没 link 上。

嗯,咱们今天就掰开揉碎,把 read_verilogread_dblink_design 这三个命令讲透。

4.1 设计加载的整体流程

说白了,PrimeTime 读设计就三步:

  1. 读网表——把门级网表(Verilog 格式)吃进来。
  2. 读库——把标准单元库、IO 库、宏单元库(.db 格式)加载进来。
  3. 链接——把网表里的实例和库里的单元一一对应起来。

这三步缺一不可。顺序上,我个人习惯先读网表,再读库,最后 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% 的坑。

下一章,咱们聊聊时序约束的读取和检查。到时候你会发现,设计加载只是热身,真正的重头戏还在后面。