2. 仿真环境搭建:Linux环境准备、PDK安装与配置、仿真目录结构规范、环境变量设置
说实话,很多刚入行的朋友觉得仿真环境搭建是件小事。随便装个软件,跑通就行。我当年也这么想,结果第一个项目就吃了大亏——仿真跑着跑着报错,查了半天发现是PDK路径配错了。从那以后,我花了不少心思在环境搭建上。
这一章,我就把这些年积累的经验拆开揉碎了讲给你听。你跟着做,至少能省下80%的排错时间。
2.1 Linux环境准备
模拟IC仿真,99%的场景都在Linux下。为什么?说白了,EDA工具对Linux的支持最成熟,而且服务器集群管理方便。我个人习惯用CentOS 7或Red Hat Enterprise Linux 7/8。Ubuntu也能用,但有些PDK的安装脚本对Ubuntu支持不太好。
2.1.1 基础依赖包
装完系统第一件事,把基础依赖包装上。别偷懒,我见过有人漏装libXext,结果Spectre跑了一周突然崩溃,数据全丢了。
# CentOS/RHEL 7/8
sudo yum groupinstall "Development Tools"
sudo yum install -y libXext libXft libXpm libXmu libXrender \
libXrandr libXfixes libXcomposite libXcursor libXdamage \
libXi libXinerama libXScrnSaver libXtst \
motif lesstif openmotif compat-openmotif \
glibc.i686 libstdc++.i686 zlib.i686 \
csh tcsh ksh perl python3 python3-devel \
java-1.8.0-openjdk java-1.8.0-openjdk-devel \
flex bison byacc
# Ubuntu 20.04/22.04
sudo apt update
sudo apt install -y build-essential \
libxext-dev libxft-dev libxpm-dev libxmu-dev libxrender-dev \
libxrandr-dev libxfixes-dev libxcomposite-dev libxcursor-dev \
libxdamage-dev libxi-dev libxinerama-dev libxss-dev libxtst-dev \
libmotif-dev lesstif2-dev \
gcc-multilib g++-multilib lib32z1 lib32stdc++6 \
csh tcsh ksh perl python3 python3-dev \
openjdk-8-jdk openjdk-8-jre \
flex bison byacc
2.1.2 磁盘与文件系统
仿真产生的数据量很大。一个中等规模的ADC仿真,跑一个月,数据可能上TB。我建议你单独挂一个分区给仿真数据,文件系统用XFS或ext4。别用ZFS或Btrfs,虽然功能多,但性能不稳定。
# 查看磁盘
lsblk
# 挂载示例(假设 /dev/sdb 是数据盘)
sudo mkfs.xfs /dev/sdb1
sudo mkdir /data
sudo mount /dev/sdb1 /data
echo "/dev/sdb1 /data xfs defaults 0 0" | sudo tee -a /etc/fstab
2.2 PDK安装与配置
PDK(Process Design Kit)是工艺厂提供的"配方"。没有它,仿真器不知道管子长什么样。我装过TSMC、SMIC、GF、ST的PDK,流程大同小异,但坑不少。
2.2.1 安装流程
- 解压PDK包 — 通常是一个tar.gz或tar.Z文件。注意看README,有些PDK需要先解压到一个临时目录。
- 运行安装脚本 — 大部分PDK提供
install.sh或setup.pl。以TSMC 28nm为例:
# 解压
tar -xzvf TSMC28HPC_PDK_v1.0.tar.gz -C /data/PDK
# 运行安装脚本
cd /data/PDK/TSMC28HPC
./install.sh -d /data/PDK/TSMC28HPC
# 安装过程中会询问:
# - 安装路径(建议用绝对路径)
# - 工艺版本(选最新稳定版)
# - 是否安装Calibre rule(选Yes)
# - 是否安装Assura rule(看需求)
2.2.2 验证安装
装完后,先别急着跑仿真。验证一下PDK是否完整:
# 检查关键目录结构
ls /data/PDK/TSMC28HPC/
# 应该看到:models/ drc/ lvs/ pex/ pcell/ doc/
# 检查模型文件
ls /data/PDK/TSMC28HPC/models/
# 应该看到:spectre/ hspice/ eldo/ etc.
# 检查PDK版本信息
cat /data/PDK/TSMC28HPC/doc/version.txt
如果缺少某个目录,说明安装不完整。别跳过这步,我吃过亏——有一次PEX目录没装全,后仿跑了三天才发现提取的寄生参数全是0。
2.3 仿真目录结构规范
这个是我最想强调的。很多团队没有目录规范,每个人按自己习惯来。结果项目交接时,找文件找到崩溃。我建议你从一开始就建立一套规范。
2.3.1 推荐结构
/project/
├── 00_doc/ # 设计文档、规格书
├── 01_schematic/ # 原理图源文件
├── 02_simulation/ # 仿真目录(核心)
│ ├── 01_pre_sim/ # 前仿
│ │ ├── dc_op/ # DC工作点
│ │ ├── ac/ # AC分析
│ │ ├── tran/ # 瞬态分析
│ │ ├── noise/ # 噪声分析
│ │ └── monte_carlo/ # 蒙特卡洛
│ ├── 02_post_sim/ # 后仿
│ │ ├── rc_typ/ # 典型RC
│ │ ├── rc_max/ # 最大RC
│ │ └── rc_min/ # 最小RC
│ └── 03_corners/ # 工艺角仿真
├── 03_layout/ # 版图
├── 04_extraction/ # 寄生提取
├── 05_verification/ # DRC/LVS
└── 06_results/ # 最终报告
核心原则:
- 每个仿真case独立一个子目录
- 子目录名用"序号_描述"格式,方便排序
- 仿真结果(波形、日志)放在case目录内,不要散落在各处
- 公共文件(模型、PDK路径)用符号链接或环境变量引用
2.3.2 仿真case内部结构
每个仿真case内部,我习惯这样组织:
02_simulation/01_pre_sim/ac/
├── netlist/ # 网表文件
│ ├── opamp_ac.scs # Spectre网表
│ └── opamp_ac.sp # HSPICE网表(可选)
├── results/ # 仿真结果
│ ├── opamp_ac.raw/ # Spectre原始数据
│ ├── opamp_ac.psf/ # 波形文件
│ └── opamp_ac.log # 仿真日志
├── scripts/ # 辅助脚本
│ ├── run_spectre.sh # 启动脚本
│ └── plot_results.ocn # Ocean脚本
└── README.md # 仿真说明
为什么要这么细?因为仿真跑起来后,你不可能一直盯着。有了规范,你或者同事回来一看目录就知道:这个case跑完了没、结果在哪、怎么复现。
2.4 环境变量设置
环境变量是仿真环境的"交通指挥"。配好了,工具自动找到PDK、模型、license。配不好,各种"command not found"和"file not found"。
2.4.1 核心环境变量
| 变量名 | 作用 | 示例值 |
|---|---|---|
CDS_ROOT |
Cadence工具安装根目录 | /opt/cadence/IC618 |
CDS_LIC_FILE |
License文件路径 | 5280@license_server |
MGC_HOME |
Mentor(Siemens)工具根目录 | /opt/mentor/calibre2023 |
PDK_DIR |
PDK安装路径 | /data/PDK/TSMC28HPC |
MODEL_PATH |
模型文件路径 | $PDK_DIR/models/spectre |
PATH |
可执行文件搜索路径 | $CDS_ROOT/tools/bin:$MGC_HOME/bin:$PATH |
2.4.2 我的配置文件模板
我习惯把环境变量集中写在 ~/.bashrc 或 ~/.cshrc 里。下面是一个bash版本的模板:
# ============================================
# 模拟IC仿真环境配置
# 作者:你的名字
# 最后更新:2024-01-15
# ============================================
# --- EDA工具路径 ---
export CDS_ROOT=/opt/cadence/IC618
export CDS_LIC_FILE=5280@10.0.0.100
export MGC_HOME=/opt/mentor/calibre2023
export MGC_LIC_FILE=1717@10.0.0.100
# --- PDK配置 ---
export PDK_DIR=/data/PDK/TSMC28HPC
export MODEL_PATH=$PDK_DIR/models/spectre
export PDK_INSTALL_DIR=$PDK_DIR
# --- 仿真目录 ---
export SIM_ROOT=/project/my_project/02_simulation
export WORK_DIR=$SIM_ROOT/current_run
# --- 路径设置 ---
export PATH=$CDS_ROOT/tools/bin:$CDS_ROOT/tools/dfII/bin:$PATH
export PATH=$MGC_HOME/bin:$MGC_HOME/lib:$PATH
export PATH=$PDK_DIR/tools/bin:$PATH
# --- 其他设置 ---
export LANG=en_US.UTF-8
export LC_ALL=C
ulimit -s unlimited
umask 022
# --- 别名 ---
alias spectre='$CDS_ROOT/tools/bin/spectre'
alias virtuoso='$CDS_ROOT/tools/dfII/bin/virtuoso'
alias calibre='$MGC_HOME/bin/calibre'
小技巧: 如果你同时做多个项目,每个项目用的PDK版本不同,建议为每个项目单独写一个环境配置文件(比如 env_project_a.sh),用的时候 source 一下。这样切换项目时不会互相干扰。
2.4.3 验证环境变量
配完后,重启终端或 source ~/.bashrc,然后验证:
# 检查工具是否找到
which spectre
# 应该输出:/opt/cadence/IC618/tools/bin/spectre
# 检查PDK路径
echo $PDK_DIR
# 应该输出:/data/PDK/TSMC28HPC
# 检查License
echo $CDS_LIC_FILE
# 应该输出:5280@10.0.0.100
# 测试工具启动
spectre -version
# 应该输出版本信息,而不是"command not found"
2.5 知识体系总览
下面这张图,把本章的核心逻辑串起来了。你可以把它当作搭建环境的"路线图":
2.6 常见问题与避坑
最后,分享几个我踩过的坑,你遇到了可以直接拿来用:
- License连不上: 先ping一下license服务器,再telnet端口。很多时候是防火墙没开端口。
- PDK模型报错: 检查模型文件里的路径引用。有些PDK用了相对路径,但你的安装路径和作者不一样。
- 仿真跑一半崩溃: 先看磁盘空间,再看内存。我遇到过/tmp目录写满导致Spectre直接挂掉。
- 不同工具版本冲突: 比如IC618和IC617的PDK不兼容。建议一个项目固定一套工具版本,不要混用。