4. 综合环境设置:五大库路径

综合工具启动时,第一件事就是找文件。找什么?找库、找设计、找参考。如果路径没设对,工具会直接报错退出。我刚开始用 DC 时,就因为在 .synopsys_dc.setup 里少写了一个斜杠,折腾了整整一个下午。

说白了,综合环境设置就是告诉工具:你的东西在哪儿。今天咱们把五个核心变量讲透——search_path、target_library、link_library、symbol_library、synthetic_library。

核心原则:库路径设错,综合结果全错。这五个变量是工具链的"地基",地基不稳,上面盖什么都白搭。

4.1 整体关系:一张图看懂

先看这张结构图,把五个库的协作关系理清楚。我个人习惯在讲具体参数前,先让学员脑子里有个"全景图"。

综合环境五大库协作关系图 综合工具 (DC/Genus) search_path 搜索范围 target_library 目标工艺库 (.db) 综合映射的目标工艺 link_library 链接库 (.db) 解析实例化引用 symbol_library 符号库 (.sdb) GUI 图形符号 synthetic_library 综合库 (GTECH) RTL 到门级中间表示 💡 说明: search_path 是"搜索范围",其他四个库文件必须放在 search_path 指定的目录下,工具才能找到。

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 脚本直接跑,结果综合出来的网表全是空的——因为库路径根本不对。