第三章 仿真工具对决:HSPICE、Spectre、Ngspice 的 DC Sweep 设置

做 MOS 管特性曲线仿真,工具选对了,事半功倍。我这些年用过不少 EDA 工具,从老牌的 HSPICE 到 Cadence 的 Spectre,再到开源的 Ngspice,各有各的脾气。今天咱们就掰开揉碎,看看这三款主流工具在 DC Sweep 设置上到底怎么玩。

说白了,DC Sweep 就是让某个参数(比如栅压 VGS 或漏压 VDS)按步长变化,然后看 MOS 管的电流怎么变。不同工具的写法不一样,但核心逻辑是相通的。

DC Sweep 设置方法对比 DC Sweep 核心 HSPICE Spectre Ngspice .DC 语句 + .ALTER dc 分析 + sweep 参数 .DC 语句(类 HSPICE) 核心差异:语法风格、集成环境、后处理能力 选择依据:团队习惯、工艺库支持、预算

3.1 HSPICE:老大哥的硬核语法

HSPICE 是 Synopsys 家的产品,业界标准,几乎所有的工艺厂都会提供 HSPICE 的 PDK。我个人习惯用 HSPICE 做最底层的验证,因为它最接近硅片上的真实行为。

DC Sweep 在 HSPICE 里用 .DC 语句。举个例子,扫 VGS 从 0 到 1.8V,步长 0.1V:

.DC VGS 0 1.8 0.1

如果要扫 VDS 作为参数,嵌套扫描也很直接:

.DC VDS 0 1.8 0.1 VGS 0 1.8 0.2

这里 VDS 是内层扫描,VGS 是外层。跑出来的数据就是一组 ID-VDS 曲线族。

我的小技巧: 做 DC Sweep 前,先确认 MOS 管的模型参数。我遇到过好几次,模型文件没加载对,扫出来的电流全是零。用 .LIB 语句加载工艺库时,路径千万别写错。

HSPICE 还有一个好用的功能——.ALTER。比如你想对比不同沟道长度下的特性,不用改网表重跑,直接加一段:

.ALTER CASE=WIDE
WIDTH W=10u
.ALTER CASE=NARROW
WIDTH W=2u

这样一次仿真就能拿到多组结果。嗯,这里要注意,.ALTER 块里的参数会覆盖前面的定义,别搞混了。

3.2 Spectre:图形化时代的效率担当

Spectre 是 Cadence 家的,集成在 Virtuoso 环境里。说实话,我刚开始用 Spectre 时觉得它太「花哨」了,但用久了发现,图形化界面确实能提高效率。

在 Spectre 里做 DC Sweep,通常是在 ADE L/ADE XL 里设置。你打开「Analyses」→「dc」,然后勾选「Sweep Variable」。选好变量名(比如 vgs),设好起始、终止和步长,点一下就跑。

命令行方式也有,适合批量跑仿真:

dcOp dc dev=/M0 param=vgs start=0 stop=1.8 step=0.1

Spectre 的语法比 HSPICE 更「人性化」一点。比如参数扫描可以用 paramSweep:

parameters vgs=0
dcOp dc
paramSweep sweep param=vgs values=[0 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8]
避坑指南: 我曾经在 Spectre 里扫 VDS 时,忘了把 VGS 设成多个值,结果只跑出一条曲线。后来我习惯用 paramSweep 嵌套,或者直接在 ADE XL 里建多个 test,每个 test 对应一个 VGS 值。

Spectre 的后处理也很方便。跑完仿真,直接在波形窗口里选曲线,右键就能导出 CSV。我经常用这个功能把数据拉到 MATLAB 里做进一步分析。

3.3 Ngspice:开源界的良心

Ngspice 是开源免费的,基于 SPICE3 和 XSPICE 发展而来。如果你预算有限,或者想自己搭一套仿真环境,Ngspice 是个不错的选择。

Ngspice 的 DC Sweep 语法和 HSPICE 几乎一样:

.DC VGS 0 1.8 0.1

嵌套扫描也类似:

.DC VDS 0 1.8 0.1 VGS 0 1.8 0.2

不过 Ngspice 的收敛性有时不如 HSPICE。我遇到过几次,扫到某个电压点时仿真直接崩了。后来发现是模型参数的问题,或者步长设得太大了。

我的建议: 用 Ngspice 时,尽量用 BSIM4 或 BSIM3 模型,收敛性会好很多。另外,.OPTIONS RELTOL=1e-6 可以适当放松精度,加快收敛。

Ngspice 的输出是 raw 格式,可以用 write 命令导出:

.control
dc VGS 0 1.8 0.1
write dc_output.raw VGS I(VDD)
.endc

我个人习惯用 Python 的 ngspice 库来调用 Ngspice,直接在 Jupyter Notebook 里跑仿真、画图,非常方便。

3.4 三款工具的核心差异

我把它们的主要区别整理成了一张表,方便你对比:

对比项 HSPICE Spectre Ngspice
语法风格 传统 SPICE,严谨 更现代,支持参数化 类 HSPICE,简洁
集成环境 命令行 + 第三方 GUI Virtuoso ADE 全集成 命令行 + 可选 GUI
收敛性 优秀,工业标准 良好,自适应算法 一般,需手动调参
后处理 Awaves/CosmosScope ViVA 波形工具 GNUplot/Python
成本 商业授权,昂贵 商业授权,昂贵 免费开源
工艺库支持 最全,所有 PDK 都支持 主流 PDK 都支持 需手动转换模型

我的选择逻辑:

  • 如果是公司项目,用 HSPICE 或 Spectre,因为工艺库支持好,团队协作方便。
  • 如果是个人学习或小团队,Ngspice 完全够用,配合 Python 能玩出很多花样。
  • 做 DC Sweep 时,我习惯先用 HSPICE 验证核心电路,再用 Spectre 做参数扫描和优化。

3.5 实战对比:同一个电路,三种写法

咱们用一个简单的 NMOS 特性曲线仿真来对比。电路很简单:VGS 从 0 到 1.8V,VDS 从 0 到 1.8V,看 ID 的变化。

HSPICE 版本:

* NMOS DC Sweep - HSPICE
.OPTIONS POST=2
VGS G 0 0
VDS D 0 0
M1 D G 0 0 NMOS W=1u L=0.18u
.LIB 'cmos018.lib' TT
.DC VDS 0 1.8 0.1 VGS 0 1.8 0.2
.PROBE I(M1)
.END

Spectre 版本:

// NMOS DC Sweep - Spectre
simulator lang=spectre
parameters vgs=0 vds=0
M1 (D G 0 0) nmos w=1u l=0.18u
VGS (G 0) vsource dc=vgs
VDS (D 0) vsource dc=vds
dcOp dc
paramSweep sweep param=vds start=0 stop=1.8 step=0.1
paramSweep sweep param=vgs start=0 stop=1.8 step=0.2

Ngspice 版本:

* NMOS DC Sweep - Ngspice
.OPTIONS POST=2
VGS G 0 0
VDS D 0 0
M1 D G 0 0 NMOS W=1u L=0.18u
.LIB 'cmos018.lib' TT
.DC VDS 0 1.8 0.1 VGS 0 1.8 0.2
.control
run
write dc_output.raw VDS VGS I(VDS)
.endc
.END

你看,核心逻辑一模一样,就是语法细节不同。我个人觉得,学会一种,另外两种上手很快。

注意: 不同工具的模型文件格式可能不同。HSPICE 用 .lib,Spectre 用 .scs,Ngspice 用 .lib 或 .mod。我曾经因为混用模型文件,折腾了半天才发现是格式不兼容。

3.6 选型建议

最后给点实在的建议:

  • 如果你是学生或个人学习: 用 Ngspice + Python,零成本,还能练编程。
  • 如果你在公司做模拟 IC 设计: 用 Spectre,因为 Virtuoso 环境是标配,团队协作方便。
  • 如果你做高精度仿真或 Sign-off: 用 HSPICE,它最接近硅片行为,Foundry 也认。