2. Virtuoso平台与IC项目交付环境搭建

在开始任何一次真实的IC设计之前,交付环境本身就是第一个需要被"设计"的对象。Virtuoso并不是一个双击即用的软件,它是一套由Cadence工具链、工艺设计套件(PDK)、工艺库、项目目录和版本控制共同构成的协作系统。环境搭建的质量,直接决定了后续原理图、版图、仿真和签核能否顺利复现。本节围绕PDK安装与配置、工艺库挂载、工具版本管理、项目目录结构规范以及版本控制集成五个环节,讲清楚"应该搭成什么样"以及"实际怎么搭"。

一、PDK安装与配置:环境变量的骨架

PDK(Process Design Kit)是晶圆厂提供的设计套件,通常包含工艺库、器件模型、技术文件(techfile)、版图规则(DRC/LVS/RCX runset)、符号库和文档。以常见的CMOS工艺为例,PDK交付物一般是一个压缩包,解压后得到类似 PDK_CMOS55/ 的目录,内部包含 tech/、models/、pcell/、calibre/ 等子目录。

安装的本质不是"复制文件",而是让Cadence工具能够通过环境变量找到这些文件。核心变量包括:

# 示例:PDK与Cadence环境变量(路径为示例,非真实实测)
export PDK_ROOT=/project/pdk/PDK_CMOS55
export CDS_INST_DIR=/opt/cadence/IC617
export PATH=$CDS_INST_DIR/tools/bin:$CDS_INST_DIR/tools/dfII/bin:$PATH
export CDS_LIC_FILE=5280@lic-server
export CDS_Netlisting_Mode=Analog
export PDK_TECHFILE=$PDK_ROOT/tech/techfile.tf
export MODEL_PATH=$PDK_ROOT/models/spectre

配置完成后,用 virtuoso -nograph 启动一次无图形模式,观察是否报出库路径或license错误;再用 cdsLibManager 检查库列表是否可读。判断PDK是否真正可用的关键,不是文件存在,而是技术文件能被attach到库上、模型能被仿真器加载、runset能被Calibre识别。这三项中任意一项失败,后续所有设计都会在某个环节卡住。

二、工艺库挂载:从PDK到可调用库

PDK中的工艺库通常以 cds.lib 定义文件的形式提供。挂载工艺库,就是在项目自己的 cds.lib 中通过 INCLUDE 或 DEFINE 语句把这些库引入当前工作目录。典型写法如下:

# 项目 cds.lib 示例
INCLUDE $PDK_ROOT/cds.lib
DEFINE my_analog ./lib/my_analog
DEFINE my_digital ./lib/my_digital

其中 INCLUDE 把PDK自带的库(如 tsmc55nmos、tsmc55pmos、tsmc55io)一次性引入,DEFINE 则把项目自建库指向本地目录。挂载完成后,在Library Manager中应能看到工艺库和项目库并列出现。需要特别注意的是:工艺库应保持只读,任何对工艺库的修改都会破坏PDK一致性,导致不同工程师之间无法复现。项目库才是可写的工作区。

Virtuoso IC交付环境结构关系 PDK 安装层 PDK_ROOT techfile.tf models/spectre calibre/runset pcell/ Cadence 工具层 IC617 / IC231 Spectre / APS Calibre / PVS Virtuoso Layout License Server 项目工作层 cds.lib lib/ (自建库) sim/ (仿真) layout/ (版图) .git/ (版本控制) 加载 调用 版本控制集成(Git / SVN) 跟踪:cds.lib、原理图、版图、仿真配置、脚本 忽略:*.cdslck、*.log、仿真波形、临时文件 项目目录结构规范 proj/ ├─ cds.lib ├─ lib/ ├─ sim/ ├─ layout/ ├─ scripts/ ├─ docs/ └─ .gitignore 原则:工艺库只读、项目库可写、仿真与版图分离、脚本集中管理

三、工具版本管理:避免"在我机器上能跑"

IC项目往往跨越数月甚至数年,期间Cadence工具可能升级,PDK可能发布新版本。如果项目没有锁定工具版本,就会出现"同一份原理图,不同人仿真结果不一致"的经典问题。工具版本管理包含三个层面:

  • 工具版本锁定:在项目根目录放置 tool_version.txt,记录 IC617.ISR23、Spectre 18.1、Calibre 2020.2 等具体版本号,并在启动脚本中通过 module load 或绝对路径调用对应版本。
  • PDK版本锁定:PDK目录名中应包含版本号,如 PDK_CMOS55_v1.3.2,项目 cds.lib 中引用该固定路径,而不是软链接。
  • 环境快照:用 env | grep -E "CDS|PDK|PATH" 导出环境变量快照,存入 docs/env_snapshot.txt,便于问题复现。

判断版本管理是否到位,有一个简单标准:换一台机器、换一个用户,按照 docs/ 中的说明执行,能否在30分钟内启动Virtuoso并打开项目库。如果做不到,说明环境依赖没有被完整记录。

四、项目目录结构规范

一个可交付的IC项目目录,应该让新成员在不询问任何人的情况下,通过目录名就能判断内容归属。推荐结构如下:

proj_analog_top/
├── cds.lib              # 库定义入口
├── .cdsinit             # Virtuoso启动配置
├── lib/                 # 自建设计库
│   ├── my_analog/       # 模拟模块
│   └── my_digital/      # 数字模块
├── sim/                 # 仿真配置与结果
│   ├── dc/
│   ├── ac/
│   └── tran/
├── layout/              # 版图与验证
│   ├── drc/
│   ├── lvs/
│   └── pex/
├── scripts/             # 自动化脚本
│   ├── run_sim.sh
│   └── run_drc.sh
├── docs/                # 文档与版本记录
│   ├── tool_version.txt
│   └── env_snapshot.txt
└── .gitignore

其中 sim/ 按分析类型分目录,layout/ 按验证类型分目录,scripts/ 集中存放可执行脚本。这种结构的好处是:仿真结果不会和版图文件混在一起,DRC/LVS报告有固定位置,自动化脚本可以被CI系统直接调用。

五、版本控制集成:Git在IC项目中的正确用法

IC设计文件多为二进制或Cadence私有格式,直接使用Git需要谨慎。核心原则是:跟踪源文件与配置,忽略生成物与临时文件。一个典型的 .gitignore 应包含:

# Cadence 临时与锁文件
*.cdslck
*.log
*.err
*.sim
*.raw
*.psf
*.trn
# 仿真波形与结果
sim/**/waves/
sim/**/results/
# 版图生成物
layout/**/*.gds
layout/**/*.calibre
# 编辑器与系统文件
*.swp
.DS_Store

对于原理图和版图这类Cadence数据库文件,建议在提交前用 cds2oa 或库导出功能生成可读的文本快照,或者直接跟踪 cds.lib、.cdsinit、脚本和仿真配置。这样即使数据库文件本身难以diff,也能通过配置和脚本的变更追溯设计意图。

实践建议:在项目启动阶段就建立 docs/env_snapshot.txt 和 docs/tool_version.txt,并在每次PDK或工具升级时更新。这两个文件是环境复现的"最小充分信息",比任何口头交接都可靠。
常见陷阱:不要把PDK目录直接放在项目目录内并用Git跟踪。PDK体积大、更新频繁,且通常有授权限制。正确做法是PDK独立安装,项目通过环境变量和 cds.lib 的 INCLUDE 引用。

环境搭建完成后,可以用一个最小验证流程确认整条链路是否通畅:启动Virtuoso → 新建一个cell → 从工艺库调用一个nmos器件 → 建立简单仿真 → 运行DRC。如果这四步都能走通,说明PDK、工艺库、工具版本和目录结构已经形成闭环,可以进入实际设计阶段。