4. 综合环境设置:五大库路径
综合工具启动时,第一件事就是找文件。找什么?找库、找设计、找参考。如果路径没设对,工具会直接报错退出。我刚开始用 DC 时,就因为在 .synopsys_dc.setup 里少写了一个斜杠,折腾了整整一个下午。
说白了,综合环境设置就是告诉工具:你的东西在哪儿。今天咱们把五个核心变量讲透——search_path、target_library、link_library、symbol_library、synthetic_library。
核心原则:库路径设错,综合结果全错。这五个变量是工具链的"地基",地基不稳,上面盖什么都白搭。
4.1 整体关系:一张图看懂
先看这张结构图,把五个库的协作关系理清楚。我个人习惯在讲具体参数前,先让学员脑子里有个"全景图"。
4.2 search_path:搜索路径
search_path 是工具查找文件的"地图"。你想想看,综合工具要读 RTL 文件、读库文件、读约束文件——它怎么知道去哪儿找?就是靠这个变量。
设置方式很简单:
set search_path [list . /home/techlib/tsmc28nm /home/project/rtl /home/project/db]
几点经验:
- 当前目录 "." 一定要放在第一个——我见过有人漏掉这个,结果工具在当前目录下死活找不到文件
- 路径不要用相对路径——除非你确定脚本和工程目录永远不移动
- 路径不要有空格——Linux 下空格会截断路径,Windows 下用双引号包起来
我的习惯:在工程根目录建一个 scripts/ 文件夹,把所有 setup 脚本放进去,然后在 search_path 里把 ../ 加上。这样脚本和 RTL 分离,结构更清晰。
4.3 target_library:目标工艺库
这是最关键的库。target_library 告诉工具:你要把设计映射到哪个工艺上。说白了,就是最终芯片要用什么工艺生产。
典型设置:
set target_library "tcbn28hpcplus.db"
注意几点:
- 只放一个库——target_library 通常只设一个工艺库,多个库同时映射会出问题
- 文件格式是 .db——这是 Synopsys 的二进制库格式,由 foundry 提供
- 库文件必须在 search_path 里——否则工具找不到
我曾经踩过的坑:有一次把 target_library 设成了 .lib 格式(文本格式),工具直接报错。记住,综合工具只认 .db 二进制库。.lib 是给人看的,.db 是给工具吃的。
4.4 link_library:链接库
link_library 负责解析设计中的实例化引用。什么意思?你的顶层模块调用了子模块,或者调用了标准单元——工具需要知道这些单元的"长相",才能把它们链接起来。
典型设置:
set link_library "* $target_library dw_foundation.db"
关键点:
- 星号 "*" 必须放在最前面——表示"先搜索已经读入内存的设计"
- 通常包含 target_library——因为标准单元也需要链接
- 可以包含多个库——比如 DesignWare 库、IP 库、Memory 库
重要区别:target_library 是"映射目标",link_library 是"解析引用"。前者决定最终网表用什么单元,后者决定工具能不能找到这些单元的定义。
4.5 symbol_library:符号库
这个库只影响 GUI 显示。如果你用图形界面看综合后的原理图,symbol_library 决定了每个标准单元显示成什么形状。
设置方式:
set symbol_library "tcbn28hpcplus.sdb"
说实话,这个库在脚本模式(batch mode)下基本用不到。我只有在调试时打开 GUI 看网表才会关心它。如果你只用命令行跑综合,甚至可以不管它。
省事做法:把 symbol_library 设成和 target_library 同名但后缀为 .sdb 的文件。如果 foundry 没提供 .sdb,工具会用默认符号。
4.6 synthetic_library:综合库
这个库比较特殊。synthetic_library 包含的是 DesignWare 库和 GTECH 库。GTECH 是工具内部的"通用技术库",在 RTL 到门级映射的中间阶段使用。
典型设置:
set synthetic_library "dw_foundation.sldb gtech.db"
为什么需要它?
- DesignWare 库——提供乘法器、加法器、FIFO 等复杂运算单元的优化实现
- GTECH 库——工具内部使用的"虚拟门",在映射到 target_library 之前先用 GTECH 做逻辑优化
注意:synthetic_library 里的库文件通常由 EDA 工具厂商提供(比如 Synopsys 的 DesignWare),不是 foundry 提供的。别搞混了。
4.7 五个库的对比总结
为了方便记忆,我把五个库的核心差异整理成一张表:
| 库变量 | 文件格式 | 核心作用 | 通常设几个 | 谁提供 |
|---|---|---|---|---|
| search_path | 目录路径 | 告诉工具去哪儿找文件 | 多个 | 用户自己设 |
| target_library | .db | 综合映射的目标工艺 | 1 个 | Foundry |
| link_library | .db | 解析实例化引用 | 多个 | Foundry + 用户 |
| symbol_library | .sdb | GUI 图形符号 | 1 个或忽略 | Foundry |
| synthetic_library | .sldb / .db | 综合中间表示 | 1-2 个 | EDA 厂商 |
4.8 完整 setup 脚本示例
最后,给一个实际项目中我常用的 setup 脚本模板。你可以直接拿过去改:
# ============================================
# .synopsys_dc.setup 模板
# 工艺:TSMC 28nm HPC+
# 作者:你的名字
# ============================================
# 搜索路径
set search_path [list . \
/home/techlib/tsmc28hpcplus/synopsys \
/home/techlib/tsmc28hpcplus/dw \
/home/project/rtl \
/home/project/db \
/home/project/scripts \
]
# 目标工艺库
set target_library "tcbn28hpcplus.db"
# 链接库(星号必须放第一个)
set link_library "* $target_library dw_foundation.db"
# 符号库(可选)
set symbol_library "tcbn28hpcplus.sdb"
# 综合库
set synthetic_library "dw_foundation.sldb gtech.db"
# 其他常用设置
set verilogout_no_tri true
set bus_naming_style {%s[%d]}
define_design_lib WORK -path ./WORK
最后提醒一句:每次换工艺或换项目,第一件事就是检查这五个变量。我见过太多人拿着上个项目的 setup 脚本直接跑,结果综合出来的网表全是空的——因为库路径根本不对。