3. 仿真环境搭建:Cadence Virtuoso ADE L/XL 设置、瞬态仿真参数配置、FFT 分析设置
好,咱们进入实操环节。仿真环境搭建这事儿,说简单也简单,说复杂也复杂。很多新手一上来就点个瞬态仿真,跑完看个波形就完事了。但采样电路的失真分析,对仿真环境的要求其实挺苛刻的。我刚开始做这个的时候,就吃过亏——仿真跑了一整天,结果FFT出来的谐波全是数值噪声,根本没法看。
为什么会这样?说白了,就是仿真精度没设对。采样电路本身是个非线性很强的系统,你仿真步长设得太大,或者算法选得不对,结果里就会混入大量虚假的谐波分量。今天咱们就把这个环境搭得明明白白。
核心要点:采样电路失真仿真的精度,90%取决于仿真环境配置。瞬态仿真参数和FFT分析设置,是决定你能否看到真实谐波的关键。
3.1 ADE L/XL 环境初始化
我个人习惯用ADE XL来做这种需要参数扫描的仿真。但如果你只是验证一个单点,ADE L也完全够用。咱们先说说最基本的设置。
打开Virtuoso后,在原理图窗口选择 Launch → ADE L 或 ADE XL。我建议你直接用ADE XL,因为后面做PVT扫描或者蒙特卡洛分析时,不用再重新搭环境。
进入ADE环境后,第一件事是设置 Model Libraries。这个步骤很多人会忘,或者路径设错。我遇到过最离谱的一次,是有人把tt模型和ss模型混在一起用,仿真结果当然不对。
| 库类型 | 典型路径示例 | 说明 |
|---|---|---|
| MOS模型 | ./models/tsmc28nm_hp.l |
包含tt/ss/ff等工艺角 |
| 电阻电容模型 | ./models/res_cap.l |
注意温度系数模型是否包含 |
| 理想元件库 | analogLib |
用于理想开关、电压源等 |
小技巧:在ADE XL中,我习惯把Model Libraries放在一个单独的Section里,用section语句区分不同工艺角。这样切换仿真条件时,只需要改一个变量名,不用重新加载库。
3.2 瞬态仿真参数配置——这是重头戏
采样电路的失真仿真,核心就是瞬态分析。参数设得好,FFT出来的谐波干净利落;设得不好,全是噪声。咱们一个一个来看。
3.2.1 仿真时长与步长
首先,仿真总时长要覆盖多少个信号周期?对于采样电路,我一般建议至少仿真 1024个采样点 对应的时长。为什么是1024?因为FFT分析时,2的整数次幂点数能避免频谱泄漏。
举个例子:假设采样时钟频率是100MHz,信号频率是10.1MHz(注意,这里故意选了一个非整数倍关系,避免相干采样带来的假象)。那么采样周期是10ns,仿真总时长至少要 1024 × 10ns = 10.24μs。我通常会再加一个起始的稳定时间,比如再加2μs,总共设12.24μs。
// 瞬态仿真参数示例(ADE L中的设置)
// 仿真时长:12.24μs
// 最大步长:10ps
// 精度控制:conservative
tran stop=12.24u maxstep=10p errpreset=conservative
这里有个关键点:最大步长。采样电路的开关动作非常快,如果步长太大,开关切换瞬间的电压变化会被平滑掉,导致失真信息丢失。我一般设成采样时钟上升时间的1/10左右。比如时钟上升时间100ps,步长就设10ps。
警告:千万不要为了省时间把最大步长设得太大。我曾经为了快速验证一个想法,把步长设成了100ps,结果FFT出来的SFDR比实际差了15dB。白白浪费了一天去排查电路问题,最后发现是仿真精度不够。
3.2.2 算法选择与精度控制
Spectre仿真器提供了几种积分算法:traponly、gear2only、trap、gear2 等。对于采样电路,我强烈推荐使用 trap 算法,并开启 conservative 精度模式。
为什么?trap算法在低频段精度高,而采样电路的失真分量往往集中在低频到中频区域。gear2算法虽然在高频段更稳定,但会引入额外的数值阻尼,把真实的高次谐波给抹掉了。
| 算法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| trap | 低频精度高,谐波保真度好 | 高频可能轻微振荡 | 采样电路失真分析 |
| gear2 | 高频稳定,收敛性好 | 数值阻尼大,会衰减谐波 | 开关电源、大信号瞬态 |
| traponly | 速度最快 | 精度最差,容易不收敛 | 快速验证,不推荐用于失真分析 |
我的经验:在ADE XL中,我会在仿真设置里加上 method=trap 和 errpreset=conservative。如果仿真收敛困难,可以尝试 reltol=1e-6 和 vabstol=1e-9,但不要轻易换算法。
3.3 FFT 分析设置——从时域到频域的关键一步
瞬态仿真跑完了,波形看起来可能很正常。但真正的失真信息藏在频域里。FFT分析设置得好,才能把这些信息挖出来。
3.3.1 采样点数与窗口函数
在Cadence的Calculator里,FFT函数有几个关键参数:采样点数、起始时间、结束时间、窗口类型。
采样点数我一般选 8192 或 16384。点数太少,频率分辨率不够,谐波和噪声的谱线会混在一起;点数太多,仿真时间太长,而且对存储空间要求高。
窗口函数的选择也很讲究。对于采样电路,信号通常是周期性的,但仿真时长往往不是信号周期的整数倍,这就产生了频谱泄漏。我常用的窗口是 Blackman-Harris 或 Kaiser 窗,它们的旁瓣抑制比Hanning窗更好,能更干净地分离出谐波分量。
// Calculator中FFT函数调用示例
// 假设输出节点是 vout
// 采样点数:8192
// 窗口:Blackman-Harris
// 起始时间:2μs(跳过初始稳定阶段)
// 结束时间:12.24μs
FFT(vout 2u 12.24u 8192 "Blackman-Harris" 1)
注意最后一个参数 1,它表示是否进行相干平均。对于单次仿真,我一般设成1,能稍微平滑一下噪声基底。
3.3.2 如何读取SFDR和THD
FFT做完后,你会看到一堆谱线。怎么从中提取出SFDR(无杂散动态范围)和THD(总谐波失真)?
我个人习惯在Calculator里用 sfdr() 和 thd() 函数直接计算。但要注意,这些函数默认会搜索前几次谐波。对于采样电路,谐波次数可能很高(比如第5次、第7次),你需要手动指定搜索范围。
// 计算SFDR,搜索前10次谐波
sfdr(FFT(vout 2u 12.24u 8192 "Blackman-Harris" 1) 10)
// 计算THD,包含前10次谐波
thd(FFT(vout 2u 12.24u 8192 "Blackman-Harris" 1) 10)
注意:FFT分析的结果高度依赖于瞬态仿真的精度。如果瞬态仿真步长太大或算法不对,FFT出来的谐波幅度会严重失真。所以,先确保瞬态仿真参数正确,再做FFT分析,这个顺序不能乱。
3.4 本章知识体系总览
下面这张图总结了仿真环境搭建的核心流程和关键参数。你可以把它当作一个检查清单,每次做仿真前对照一遍。
嗯,到这里,仿真环境搭建的核心内容就讲完了。记住,采样电路的失真仿真,功夫在诗外——花在配置仿真参数上的时间,最终都会体现在FFT结果的可靠性上。下次你跑仿真时,不妨多花几分钟检查一下这些设置,相信我,值得的。