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
我的经验: 装完依赖后,建议重启一次系统。有些库的加载路径需要重新初始化,不重启的话,Spectre启动时可能会报"cannot open shared object file"。

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 安装流程

  1. 解压PDK包 — 通常是一个tar.gz或tar.Z文件。注意看README,有些PDK需要先解压到一个临时目录。
  2. 运行安装脚本 — 大部分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(看需求)
注意: 安装路径中不要有空格、中文、特殊字符。我曾经把PDK装到"/data/PDK v1.0"下,结果Spectre死活认不到管子模型,查了两天才发现是路径空格的问题。

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 知识体系总览

下面这张图,把本章的核心逻辑串起来了。你可以把它当作搭建环境的"路线图":

仿真环境搭建知识体系 仿真环境搭建核心流程 Linux环境准备 依赖包 / 文件系统 / 磁盘 PDK安装与配置 安装脚本 / 验证 / 模型路径 目录结构规范 项目层级 / case内部结构 环境变量设置 CDS_ROOT / PDK_DIR / MODEL_PATH / PATH / License 验证与调试 which / echo / 版本测试 / 仿真跑通 ✅ 可复现的仿真环境 关键:环境搭建不是一次性的,每次换项目、换PDK版本、换工具版本都要重新验证

2.6 常见问题与避坑

最后,分享几个我踩过的坑,你遇到了可以直接拿来用:

  • License连不上: 先ping一下license服务器,再telnet端口。很多时候是防火墙没开端口。
  • PDK模型报错: 检查模型文件里的路径引用。有些PDK用了相对路径,但你的安装路径和作者不一样。
  • 仿真跑一半崩溃: 先看磁盘空间,再看内存。我遇到过/tmp目录写满导致Spectre直接挂掉。
  • 不同工具版本冲突: 比如IC618和IC617的PDK不兼容。建议一个项目固定一套工具版本,不要混用。