第三章 仿真工具对决:HSPICE、Spectre、Ngspice 的 DC Sweep 设置
做 MOS 管特性曲线仿真,工具选对了,事半功倍。我这些年用过不少 EDA 工具,从老牌的 HSPICE 到 Cadence 的 Spectre,再到开源的 Ngspice,各有各的脾气。今天咱们就掰开揉碎,看看这三款主流工具在 DC Sweep 设置上到底怎么玩。
说白了,DC Sweep 就是让某个参数(比如栅压 VGS 或漏压 VDS)按步长变化,然后看 MOS 管的电流怎么变。不同工具的写法不一样,但核心逻辑是相通的。
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 曲线族。
.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]
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。我遇到过几次,扫到某个电压点时仿真直接崩了。后来发现是模型参数的问题,或者步长设得太大了。
.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
你看,核心逻辑一模一样,就是语法细节不同。我个人觉得,学会一种,另外两种上手很快。
3.6 选型建议
最后给点实在的建议:
- 如果你是学生或个人学习: 用 Ngspice + Python,零成本,还能练编程。
- 如果你在公司做模拟 IC 设计: 用 Spectre,因为 Virtuoso 环境是标配,团队协作方便。
- 如果你做高精度仿真或 Sign-off: 用 HSPICE,它最接近硅片行为,Foundry 也认。