3. ADC/DAC核心性能指标与仿真方法

ADC/DAC 的性能指标可以分成三类:静态精度(INL、DNL、失调、增益误差)、动态速度(采样率、建立时间、带宽)和频域纯度(SNR、SFDR、THD、SNDR、ENOB)。理解这些指标的关键,不只是记住定义,而是知道每个指标在 Virtuoso 中对应哪一类仿真、观察哪个波形、用什么公式从结果反推指标值。下面按“定义—仿真设置—结果判读”的顺序展开。

分辨率与采样率:最基础的两个约束

分辨率 N 表示量化台阶数 2^N,理想量化步长 LSB = VFS/2N。例如 12 位、满量程 1.2 V 的 ADC,LSB = 1.2/4096 ≈ 293 µV。分辨率决定量化噪声下限:理想 SNR = 6.02N + 1.76 dB,12 位对应约 74 dB。采样率 fs 决定奈奎斯特带宽 fs/2,也决定建立时间预算——对 SAR ADC,每位比较需要约 (N+2)·τ 的建立时间,因此 fs 与比较器速度、DAC 建立时间直接耦合。

在 Virtuoso 中,分辨率通过输入斜坡或正弦波后观察输出码的跳变点来验证;采样率则通过给 ADC 输入一个接近 fs/2 的高频正弦,检查输出是否出现混叠或码丢失。DAC 侧则用理想 ADC 或 VerilogA 比较器采样 DAC 输出,重建码流后与输入码比较。

SNR、SFDR、THD、SNDR 与 ENOB

给 ADC 输入一个相干采样正弦(频率 fin = M/N · fs,M 与 N 互质,N 为采样点数),对输出做 FFT 得到频谱。信号功率 Psig 位于 fin 处,噪声功率 Pnoise 为除直流和前若干次谐波外的所有 bin 之和,则:

  • SNR = 10·log10(Psig/Pnoise),只计噪声,不计谐波;
  • THD = 10·log10(Psig/ΣPharm),通常取前 5~7 次谐波;
  • SNDR = 10·log10(Psig/(Pnoise+ΣPharm));
  • SFDR = 10·log10(Psig/Pmax_spur),最大杂散可能是谐波,也可能是时钟馈通或电源耦合;
  • ENOB = (SNDR − 1.76)/6.02,把实测 SNDR 折算回等效位数。

在 Virtuoso 中,常用 spectre 的 dft 函数或 Calculator 的 dft() 对瞬态输出做加窗 FFT。相干采样时用矩形窗即可;非相干时需加 Hann 窗并做功率修正。采样点数建议取 2k(如 4096、8192),并保证 M 为奇数,避免谐波折叠到信号 bin。

INL 与 DNL:静态线性度

DNL 是实际码宽与理想 LSB 之差,INL 是实际跳变点与理想跳变点之差的累积。对 ADC,输入慢速斜坡(远低于 fs),记录每个码的跳变电压 Vt(k),则:

DNL(k) = (V_t(k+1) - V_t(k))/LSB - 1
INL(k) = (V_t(k) - V_t_ideal(k))/LSB

理想情况下 DNL 应在 ±0.5 LSB 内,INL 在 ±1 LSB 内;若 DNL < −1 LSB 则出现失码。在 Virtuoso 中,可用 dc 扫描输入电压,用 cross() 函数提取输出码跳变点,再用 Calculator 或 Ocean 脚本计算 DNL/INL 曲线。DAC 侧则扫描数字码,测量输出模拟电压,同样计算。

相干采样条件:fin/fs = M/N,M、N 互质,N 为 2 的幂。这样信号和谐波都落在整数 bin 上,无需加窗即可精确提取功率。

仿真流程与结果判读

一个完整的 ADC 动态性能仿真通常包含:搭建 testbench(理想时钟、理想输入源、输出码采集)→ 设置瞬态仿真(stop 覆盖 N 个采样周期,maxstep ≤ 1/(20·fs))→ 导出输出码到文本或直接使用 dft() → 计算 SNR/SFDR/ENOB → 扫描输入频率和幅度,绘制性能曲线。判读时注意:若 SFDR 远低于 SNR,说明存在谐波或杂散;若 ENOB 比分辨率低 2 位以上,需检查时钟抖动、比较器失调或 DAC 建立不足。

ADC/DAC 性能指标仿真链路与判读 仿真设置 相干正弦输入 f_in = M/N · f_s 瞬态仿真 maxstep ≤ 1/(20·f_s) 输出码采集 N = 4096 / 8192 FFT / DFT dft() 或 Calculator DC 扫描 cross() 提取跳变点 指标计算与关系 SNR P_sig / P_noise SFDR P_sig / P_max_spur THD P_sig / ΣP_harm SNDR P_sig / (P_noise+ΣP_harm) ENOB (SNDR − 1.76) / 6.02 DNL / INL DNL = ΔV/LSB − 1 | INL = ΔV_t/LSB 结果判读 理想 12-bit SNR ≈ 74 dB ENOB ≈ 12 SFDR 偏低 谐波 / 时钟馈通 电源耦合 ENOB 偏低 抖动 / 失调 DAC 建立不足 DNL < −1 LSB 失码 INL > ±1 LSB 非线性 理想 SNR = 6.02N + 1.76 dB | ENOB = (SNDR − 1.76)/6.02 | 相干采样:f_in/f_s = M/N,M、N 互质

实操要点与常见陷阱

在 Virtuoso 中做 FFT 时,最容易出错的是采样点数和窗函数选择。若 N 不是 2 的幂,dft() 会补零导致频谱泄漏;若 M 与 N 不互质,谐波会与信号 bin 重叠,SNR 被高估。建议先用 Ocean 脚本自动检查 M/N 互质性,再启动仿真。

另一个常见问题是输出码的量化方式。ADC 输出可能是二进制补码、偏移二进制或温度计码,做 FFT 前必须统一转换为有符号整数并减去直流分量,否则直流 bin 会污染低频噪声。DAC 仿真中,输出模拟电压需先经过理想低通滤波再采样,否则开关毛刺会直接进入频谱。

对于 INL/DNL,斜坡输入的步长应远小于 LSB(如 LSB/10),且每个码至少采集 10 个点,用 cross() 的 edge 参数提取跳变点。若 DNL 曲线在中间码出现周期性波动,通常指向 DAC 电流源失配或比较器失调;若 INL 呈弓形,则可能是参考电压梯度或增益误差。

ENOB 不能超过标称分辨率。若计算出的 ENOB 大于 N,说明 FFT 设置或码转换有误,应优先检查相干条件和直流去除。

指标之间的相互制约

这些指标并非独立:提高采样率会压缩建立时间,可能恶化 INL;增大输入幅度可提升 SNR,但会逼近满量程非线性区,使 SFDR 下降;时钟抖动对高频输入的影响远大于低频,因此 SNR 随 fin 升高而下降。在 Virtuoso 中做设计验证时,应扫描 fin 和幅度,绘制 SNR/SFDR/ENOB 对频率和幅度的曲线,而不是只测一个点。只有看到完整趋势,才能判断设计余量是否足够。

总结来说,静态指标靠 DC 扫描和跳变点提取,动态指标靠相干采样 FFT,两者结合才能完整描述 ADC/DAC 的真实性能。在 Virtuoso 中,建议把上述流程封装成参数化 Ocean 脚本,一次运行输出全部指标和曲线,既减少人为错误,也便于不同工艺角下的批量对比。