3. 仿真器设置:Cadence Spectre与HSPICE中噪声分析的参数配置与仿真控制语句

噪声仿真,说白了就是看你的电路到底有多“吵”。

很多新手觉得把仿真跑通就行,结果流片回来发现信噪比差得一塌糊涂。我早年就吃过这个亏——一个LNA设计,Spectre仿真显示NF只有1.2 dB,结果实测飙到1.8 dB。后来一查,是仿真器设置里漏了某个关键参数。

所以这一章,咱们把Spectre和HSPICE的噪声仿真设置掰开揉碎讲清楚。你想想看,工具用不对,再好的电路也是白搭。

3.1 噪声分析的核心参数

不管用哪个仿真器,噪声分析都绕不开这几个参数:

参数 含义 典型值
fstart 起始频率 1 Hz ~ 10 Hz
fstop 截止频率 电路带宽的3~5倍
sweeptype 扫描方式 logarithmic / linear
npoints 扫描点数 100 ~ 1000
noisetype 噪声类型 sources / timeaverage
我的习惯:起始频率设1 Hz,别设0 Hz。0 Hz是直流,噪声仿真在直流点没意义,还会让仿真器报错。

3.2 Cadence Spectre中的噪声仿真配置

Spectre的噪声分析,我一般用两种方式:图形界面和命令行。图形界面适合新手,命令行适合批量跑仿真。

3.2.1 图形界面设置(ADE L/XL)

在ADE中,选择 Analyses → Choose → noise,然后填参数:

  1. Sweep Type:选 logarithmic,点数设200。线性扫描在低频段浪费点数,高频段又不够密。
  2. Frequency Range:Start = 1 Hz,Stop = 10 GHz(根据你的电路带宽调整)。
  3. Output Noise:选 voltage 或 current,指定输出节点。
  4. Input Noise:选 voltage 或 current,指定输入源。
我曾经踩过的坑:输出节点选了差分对的共模点,结果噪声谱全错了。输出节点一定要选信号真正输出的地方,比如运放的输出端,而不是内部偏置点。

3.2.2 命令行设置(netlist)

如果你用Ocean脚本或直接写netlist,噪声分析语句长这样:

// Spectre netlist 噪声分析示例
simulator( 'spectre )
design( "./my_amplifier.scs" )

analysis( 'noise ?start "1" ?stop "10G" ?sweeptype "log" ?npoints 200
          ?noisetype "sources" ?outprobe "VOUT" ?inprobe "VIN" )

// 可选:指定噪声贡献
noiseContrib( ?type "device" ?devices "M1 M2 R1 R2" )

这里有个细节:?noisetype "sources" 表示只考虑独立噪声源(电阻、晶体管沟道噪声等)。如果你用 "timeaverage",它会计算周期性稳态噪声,适合开关电容电路。

3.3 HSPICE中的噪声仿真配置

HSPICE的噪声分析,语法上比Spectre更“老派”一些,但功能一点不弱。

3.3.1 基本噪声分析语句

*** HSPICE 噪声分析示例 ***
.AC DEC 200 1 10G
.NOISE V(VOUT) VIN 20

*** 可选:打印噪声贡献 ***
.PRINT NOISE ONOISE INOISE

解释一下:

  • .AC DEC 200 1 10G:先做AC分析,200点/十倍频,从1 Hz到10 GHz。
  • .NOISE V(VOUT) VIN 20:输出噪声在VOUT,输入源是VIN,20表示每十倍频采样20个点。
  • ONOISE:输出噪声谱密度。
  • INOISE:等效输入噪声谱密度。
关键区别:Spectre的 ?npoints 是总点数,HSPICE的 20 是每十倍频的点数。如果你仿真1 Hz到10 GHz(10个十倍频),总点数就是20×10=200点。

3.3.2 噪声贡献分析

HSPICE里想看每个器件贡献了多少噪声,用 .NOISECONTRIB:

.NOISECONTRIB M1 M2 R1 R2

仿真完后,在输出文件里找 NOISE CONTRIBUTION SUMMARY 表格。我习惯把这个数据导出来,画成饼图,一眼就能看出哪个器件是“噪声大户”。

3.4 两种仿真器的关键差异

对比项 Cadence Spectre HSPICE
扫描方式 ?sweeptype "log" DEC / LIN
点数定义 总点数(如200) 每十倍频点数(如20)
输出噪声 ?outprobe V(节点)
输入噪声 ?inprobe 直接指定源名
噪声贡献 noiseContrib() .NOISECONTRIB
1/f噪声模型 默认包含(需确认工艺文件) 需显式开启 NOISEF
个人建议:如果你做低频电路(<1 MHz),HSPICE的1/f噪声模型有时需要手动开启。我在一个仪表放大器项目中就遇到过——HSPICE仿真NF只有0.5 µV/√Hz,实测却到1.2 µV/√Hz。后来发现是 .OPTION NOISEF=1 没加。

3.5 噪声仿真流程总览

下面这张图,是我自己总结的噪声仿真标准流程。每次跑仿真前,我都会过一遍:

噪声仿真配置流程 噪声仿真配置流程 确定仿真目标 选择仿真器 Spectre 配置 HSPICE 配置 设置频率范围 指定输入/输出节点 运行仿真 & 检查结果 💡 检查要点: • 噪声谱是否连续 • 1/f拐点是否合理

3.6 常见问题与避坑指南

问题1:噪声仿真结果不收敛
我曾经遇到一个运放,噪声仿真一直不收敛。折腾了两天,最后发现是偏置电路没启动。
解决办法:先跑DC仿真,确认所有管子都在饱和区。DC不收敛,噪声仿真肯定挂。
问题2:1/f噪声拐点不对
仿真出来的1/f拐点在100 kHz,但工艺文档写的是1 kHz。这通常是因为模型参数没设对。
解决办法:检查BSIM模型中的 NOIA、NOIB、NOIC 参数。Spectre里可以用 print noise 看每个器件的噪声贡献。
我的小技巧:在跑完整噪声仿真前,先跑一个单频点(比如1 kHz)的噪声。如果这个点对了,再扫全频段。这样能快速定位问题,不用每次等半小时才发现参数错了。

3.7 总结

噪声仿真器的设置,说白了就是三件事:频率范围、输入输出节点、扫描点数。Spectre和HSPICE的语法不同,但核心逻辑一样。

嗯,这里要注意:别迷信默认设置。每个工艺的噪声模型都不一样,跑仿真前一定要确认工艺文件里的噪声参数是开启的。

我个人习惯,每次跑完噪声仿真,都会把结果和理论计算对比一下。如果差太多,先别急着调电路,回头检查仿真设置——八成是哪里设错了。