4位SAR ADC仿真验证全流程:从CDAC到FFT的实战指南

发布时间:2026/10/7 8:45:06
4位SAR ADC仿真验证全流程:从CDAC到FFT的实战指南 SAR ADC 是我做过的第一个真正从头搭晶体管级的混合信号模块当时手里压着的题目就是一个 4 位 SAR ADC 的仿真验证。说来惭愧最开始我以为“4 位”这种精度接根导线都能当 ADC 用结果真把 CDAC、比较器、SAR 逻辑串起来跑仿真时踩的坑一点不比 12 位少。这个项目适合三类人一是刚接触混合信号设计、想搞明白 SAR ADC 内部到底怎么工作的初学者二是手里有工艺 PDK想做一次完整仿真验证流程的在校研究生三是想快速评估架构、给后续更高位设计打基础的工程师。4 位的优势在于量化台阶少、容差大可以让你把所有注意力放在“验证流程”本身而不是跟各种二阶效应死磕。等这套流程跑顺了再去做 10 位、12 位你至少知道每一步该看什么、该抓什么。下面我把整个设计、仿真和排查过程完整记录下来包括我最终采用的参数、踩过的坑和对应的解决思路希望能帮你少走一些弯路。1. 为什么选 4 位 SAR ADC 做仿真验证1.1 SAR 架构在 ADC 谱系中的位置ADC 的主流架构有好几种Flash、SAR、Pipeline、Sigma-Delta。在精度 812 位、采样率几百 kS/s 到几十 MS/s 这个区间里SAR ADC 几乎是统治级的存在。它之所以流行核心原因就一句话结构简单、功耗低、面积小而且数字工艺越先进越受益。SAR 的全称是 Successive Approximation Register逐次逼近寄存器。它的工作方式很像猜数字游戏裁判心里想了一个数你每次报一个中间值对方告诉你“大了”还是“小了”你根据答案不断缩小范围直到猜中。SAR ADC 里的“裁判”是比较器“报数字”的是 DAC“记录范围”的是逐次逼近逻辑。对比其他架构架构速度精度功耗面积典型场景Flash极高低≤8位极高极大高速接口、SerDesSAR中高中8~14位低小工业控制、IoT、生物电采集Pipeline高高10~16位中高中大无线通信、视频Sigma-Delta低极高16~24位中小音频、精密测量4 位精度离实际产品需求确实有点远但作为验证载体它的好处是哪怕你用最简单的二进制加权 CDAC、用最粗暴的同步时序只要开关和比较器逻辑正确转换结果基本都能出来。这种“低门槛”正是它适合做全流程验证的原因。1.2 4 位分辨率的设计余量4 位意味着输出码字范围是 0 到 15也就是 16 个量化台阶。设定电源电压 1.8V、参考电压 1.8V、单端输入时一个 LSB 就是 1.8V / 16 112.5mV。这个 LSB 数值带来的直接好处是比较器失调要求非常宽松。理论上只要失调小于半个 LSB也就是 56mV就不会出现明显的大码宽误判。在常规 180nm 工艺下一个动态锁存比较器的输入对管失配典型值只有 520mV完全在余量范围内。换句话说4 位设计基本不需要做失调校准这省掉了一大块工作。同样采样开关的导通电阻非线性、CDAC 电容失配、比较器回踢噪声这些让高阶设计头疼的问题在 4 位精度下都不构成致命威胁。这不是说可以忽略这些效应而是说你可以先跑通功能再回头观察这些非理想因素如何影响性能——这正是教学和验证最好的节奏。所以我的验证目标很清晰功能正确输入任意电压转换得到的 4 位码符合预期静态性能DNL 和 INL 都在 ±0.5 LSB 以内动态性能SFDR 和 SNDR 接近 4 位理想值 25.84dBENOB 能到 3.5bit 以上鲁棒性在不同 PVT 条件下至少保证功能正确。2. 整体设计与关键模块拆解2.1 CDAC 电容阵列4 位 ADC 的“主裁判”SAR ADC 的核心是 DAC。DAC 的作用是把每一次比较后得到的数字码转换成模拟电压送回比较器另一端。可以说 DAC 的线性度直接决定 ADC 最终能到多少位。我选的是二进制加权 CDAC电容型 DAC这也是最经典的结构。4 位二进制加权电容阵列由 4 个电容组成权重分别为 1Cu、2Cu、4Cu、8Cu总电容 15Cu。单位电容 Cu 的取值参考的是 kT/C 噪声约束和工艺匹配能力kT/C 噪声采样电容 15Cu 750fF 时热噪声均方根值约为 74μV远小于 1 LSB 对应的量化噪声均方根 32.5mV完全不构成瓶颈失配约束180nm 工艺下 MIM 电容的失配系数大约在 1% 左右单位电容取 50fF最大权重电容 400fF这个面积对应的失配足够让 4 位 ADC 做到 INL/DNL 远小于 0.5 LSB面积考虑如果取 50fF按照 MIM 电容密度约 2fF/μm² 估算单位电容面积约 25μm²整个 CDAC 也就几百平方微米非常小。最终电容阵列参数如下电容权重数值C01Cu50fFC12Cu100fFC24Cu200fFC38Cu400fF总采样电容15Cu750fF采样方式我采用了上极板采样top-plate sampling也就是所有电容下极板接输入信号上极板接到比较器输入端采样结束后断开输入把所有下极板切到参考电压。这种做法的好处是信号路径上的开关数量少电荷注入的误差也相对容易控制。2.2 比较器每次决定一个 bit 的“裁判”比较器在 SAR 里承担的是二元判决任务任何时刻只要比较器输出错了对应的 bit 就可能出错。4 位精度下我直接使用经典的 StrongARM 动态锁存比较器这个结构在绝大多数论文里都能看到特点是零静态功耗、速度极快、不需要额外的偏置电流源。我用的比较器管子和初始尺寸如下输入对管 NMOSW/L 10μm / 0.18μm交叉耦合锁存 PMOSW/L 2μm / 0.18μm交叉耦合锁存 NMOSW/L 2μm / 0.18μm尾电流管 NMOSW/L 5μm / 0.18μm复位开关 PMOSW/L 1μm / 0.18μm。这里有一个工程习惯输入对管尺寸尽量做得比锁存管大。因为输入对管的失调和噪声会直接折算到比较器输入端增大面积可以有效降低失配锁存管尺寸则决定正反馈速度太大反而增加回踢噪声。比较器的回踢噪声kickback noise在 4 位精度下问题不大但如果你后面做 12 位就必须认真对待。回踢噪声的来源是比较器在锁存阶段内部节点电压发生大幅度翻转这些翻转通过输入对管的栅漏寄生电容耦合到 CDAC 上极板导致 DAC 电压被扰动。减小回踢的常用手段包括增加输入对管面积减小寄生电容到输入节点的耦合、在比较器前加一级预放大器、或者增大 CDAC 电容量来吸收电荷扰动。2.3 SAR 逻辑与时序每一步都必须踩准SAR 逻辑是连接比较器和 CDAC 的桥梁。4 位转换需要 4 个比较周期每个周期确定一个 bit从 MSB 开始到 LSB 结束。完整的一次转换流程可以拆成 5 个阶段采样阶段下极板接 Vin上极板复位到共模电压保持阶段关断输入开关准备开始转换第 1 次比较把所有下极板接 GND等效于 DAC 输出 0比较器先确定符号不更准确的流程是 DAC 先输出 1/2 Vref也就是 MSB 对应的中间电平第 24 次比较根据前一次比较结果决定上一 bit 保留 1 还是 0同时把下一 bit 的位置触发转换结束4 个 bit 全部确定输出数字码进入下一次采样。我采用同步逻辑实现用一个 4MHz 的主时钟做比较时钟用它的下降沿做采样阶段的同步信号。每次转换需要 4 个时钟周期加 1 个采样周期总共 5 个周期完成一次 4 位转换。如果采样率设定为 1MS/s那么需要主时钟 5MHz而不是 4MHz。这一点很多初学者容易算错。时序上最容易遇到的问题是“比较器的输出还没稳定下来SAR 逻辑就把开关切走了”。为了规避这个风险我在比较时钟的上升沿触发比较在下降沿锁存结果并把 DAC 开关更新放到下降沿之后保证比较器的判决结果至少有半个时钟周期的稳定时间。这个设计习惯在更高速的设计里会成为瓶颈但在 4 位精度下非常稳妥。3. 仿真验证全流程实操3.1 仿真 testbench 搭建与参数设置本次仿真我用的工具是 Cadence Virtuoso IC6.1.8 Spectre 19.1工艺库是典型的 180nm Mixed-Signal PDK。其实工具不是关键你只要明白了原理换 HSPICE、Ngspice 甚至 LTspice 都能完成同样的事情。Testbench 整体结构如下模拟输入01.8V 可调直流源或慢斜坡用 vpwl 实现采样时钟1MS/s 方波占空比 20%高电平时间 200ns转换时钟5MHz 方波占空比 50%电源1.8V负载比较器输出接 4 位寄存器和理想 ADC code 记录器可写成 Verilog-A 模块也可以直接用理想 ADC 模型提取波形。我强烈建议第一步先把 CDAC 换成理想电容、比较器换成理想 Verilog-A 模型先把整体功能和时序验证跑通再逐步替换成真实晶体管模块。道理很简单如果理想模型下功能就错了那一定是逻辑或时序问题换成真实晶体管后再出错才可能是电路的非理想效应导致。这样分层排查问题定位会快很多。仿真参数上Spectre 里我会设置tran stop5.1u因为 1MS/s 采样率下一个采样周期是 1μs加上 4 个转换周期共 5μs跑 5.1μs 正好能看到完整的一次转换过程。为了控制精度最大步长maxstep20p通常足够但如果你发现比较器翻转阶段波形异常可以把 maxstep 调小到 2p 看一次翻转波形正常之后再把 maxstep 调回来否则全芯片 long transient 会跑得非常痛苦。3.2 功能验证从斜坡台阶看 16 个码功能验证的第一步是给一个固定直流输入确认码字正确。我给的第一个输入是 0.3V。0.3V / 1.8V × 16 2.67理论上应该量化到 3 或 2。跑完一次转换后观察输出寄存器得到码字 3二进制 0011。这一步能说明最基本的功能是通的。接下来做斜坡测试。用 vpwl 生成一个从 0 到 1.8V、步进 10mV、每步维持 10μs 的准斜坡信号。所谓“准斜坡”本质上是 180 个直流台阶让 ADC 在每个台阶上都能完成多次采样转换。跑完斜坡后我把输出码字按照时间顺序画出来应该看到从 0 到 15 共 16 个清晰的台阶。如果某一个码字跳过去没出现或者某个码字宽度明显偏窄那就要回头查 CDAC 开关逻辑或者比较器的判决方向。我第一次跑的时候就出现过码字 7 和 8 之间跳变异常后来定位到是 MSB 电容在切换时出现了建立不足的问题。功能验证的最后一步是验证传输特性曲线。把输入电压跟输出的码字对应起来画成类似阶梯的曲线检查每个码字的上下边界是否都在理论值附近。这一步刚开始不用追求精确到小数点后几位只要阶梯形状完整、步进单调功能就算基本过关了。3.3 动态性能仿真FFT 与 SFDR/SNDR/ENOB功能通了之后进入性能验证环节。SAR ADC 的动态性能通常看三个指标SNDR信纳比、SFDR无杂散动态范围、ENOB有效位数。我采用的 FFT 测试方法是相干采样法。设置如下采样率 fs 1MS/sFFT 点数 N 4096输入频率 fin 127/4096 × 1MHz ≈ 31.006kHz输入幅度为满量程正弦即幅度 0.9V、偏置 0.9V。为什么选 127 这个数因为相干采样要求 fin/fs M/N其中 M 和 N 必须互质这样采样点才能均匀分布在正弦波周期上避免频谱泄漏FFT 结果不需要加窗也能得到干净的频谱。我习惯选一个质数 M配合 2 的幂次 N这是标准做法。从仿真中提取 4096 个采样点对应的输出码字后我在 Python 里做了 FFTimport numpy as np # codes 是从仿真中抽取的 4096 个整型码字 codes np.array(codes, dtypefloat) x codes - np.mean(codes) # 去掉直流分量 win np.blackman(len(x)) X np.fft.rfft(x * win) spectrum np.abs(X) ** 2 # 找基波 bin理论上在 127 fin_bin 127 signal_power spectrum[fin_bin] noise_power np.sum(spectrum[:fin_bin]) np.sum(spectrum[fin_bin1:]) # SNDR 和 ENOB sndr_db 10 * np.log10(signal_power / noise_power) enob (sndr_db - 1.76) / 6.024 位 ADC 的理想 SNDR 是 25.84dB理想 ENOB 是 4bit。实测晶体管级仿真在输入幅度接近满量程时我得到的结果是 SNDR 约 24.5dBENOB 约 3.78bitSFDR 约 28.7dB。这个结果在 4 位精度下很合理损失的一小部分主要来自采样开关的导通电阻非线性、比较器的回踢扰动和有限的建立精度。如果 SNDR 掉得非常严重比如低于 20dB那就要怀疑是不是采样保持阶段出了问题。常见问题包括采样开关尺寸不够导致高阻状态下信号失真严重CDAC 上极板复位开关动作导致信号被拉偏或者比较器判决延迟导致 SAR 逻辑采到了错误输出。3.4 静态性能仿真INL/DNL 与码密度测试静态性能主要看 DNL差分非线性和 INL积分非线性。传统思路上可以从斜坡传输曲线提取跳变点来计算但实测中更可靠的是码密度测试code density test。码密度测试的思路是给 ADC 一个频率与采样率不相干的慢正弦信号均匀覆盖整个输入范围采集足够多的码字样本统计每个码出现的次数再根据已知的正弦概率密度函数反推出每个码的实际宽度。4 位 ADC 总共只有 16 个码每个码理论上需要几百次出现才能得到统计稳定结果。我采集了 8000 个样本每个码大约 500 次出现足够估算 DNL/INL。实测得到的 DNL 最大绝对值约 0.15 LSBINL 最大绝对值约 0.20 LSB。这个结果说实话比我预期的要好主要原因是 4 位分辨率对电容失配的容忍度太高了——就算电容失配 2%对 4 位 DAC 线性度的影响也压进了 0.5 LSB 以内。这个环节我最想提醒的一点是码密度测试得到的码宽如果出现个别码明显偏窄或偏宽先别急着怀疑比较器先检查输入正弦是否真的覆盖了满量程。我发现过因为输入正弦偏置设置错误导致正负半周期不对称最终码密度统计结果出现假性 DNL 尖峰的情况——那是测试设置问题不是 DNL 问题。4. 常见问题与排查技巧实录4.1 比较器亚稳态、回踢噪声与毛刺做比较器仿真时最让人恼火的问题就是毛刺。表现为比较器输出在判决边缘反复翻转或者从波形上看 CDAC 上极板电压在比较器翻转后出现一个明显的尖峰。先说亚稳态。动态比较器是正反馈结构如果输入差分电压非常接近零锁存器可能需要很长时间才能翻转到稳定的数字电平。在仿真里这表现为比较器输出长时间停在 VDD/2 附近上不去。4 位精度下这种概率很小但一旦出现结果就是该 bit 判决错误最终码字偏差巨大。解决思路有两个一是加强锁存管正反馈强度让翻转更快二是在 SAR 逻辑里加“比较器完成”检测等输出真正稳定后再锁存。后者更彻底代价是逻辑复杂度增加这也是很多工业级 SAR ADC 采用异步控制的原因。回踢噪声的典型表现是比较器输出翻转前后CDAC 上极板电压出现几十毫伏的毛刺。在 4 位精度下只要毛刺幅度小于半个 LSB56mV通常不影响结果但它在波形上看起来非常吓人。要区分“毛刺是否影响性能”我通常直接看最终码字如果毛刺导致结果差 2 个码以上那就要进一步处理。减小回踢噪声的工程手段在比较器输入和 CDAC 上极板之间插入一个缓冲级或预放大器增大 CDAC 电容总量提高节点对电荷扰动的吸收能力优化比较器输入对管尺寸降低与内部锁存节点的寄生耦合实在不行采用两级比较器结构。4 位仿真验证阶段我建议先不做这些优化而是记录毛刺幅度确认在容差范围内即可。把精力留给后面的流程。4.2 DAC 建立时间不够量化结果“差一码”CDAC 的建立时间是 SAR 转换中很重要的约束。每次比较结果出来后SAR 逻辑要把某个开关切换到位CDAC 上极板电压需要在新状态稳定后才能进行下一次比较。如果建立时间不够比较器就会在一个还没稳定的电压上做判断结果自然不可靠。建立时间可以用一阶 RC 模型近似分析。设开关导通电阻为 RonCDAC 总电容为 C。切换后 DAC 电压需要从旧值过渡到新值允许的最大误差是 0.5 LSB。对于 4 位转换初始最大误差约 1.8V目标误差 56mV衰减倍数是 32 倍也就是要求 t 3.47 × Ron × C。示例计算Ron 1kΩC 750fF时间常数 τ 0.75ns需要的建立时间约 2.6ns。5MHz 时钟下半个周期 100ns从理论上看离很充足。如果你用的开关很弱或者电容取值非常大这个余量会急剧缩小。我在项目中遇到的“差一码”问题根源不是开关电阻而是 SAR 逻辑里开关切换动作与比较器判决同时发生。解决办法是重新调整时钟相位确保 DAC 开关更新后至少留出 20ns 的建立窗口。如果你用同步逻辑可以把比较器判决放在时钟下降沿DAC 开关更新放在下一个时钟上升沿之后这样就有整整一个周期让 CDAC 稳定。4.3 时序竞争与仿真收敛问题同步 SAR 的时序竞争和异步 SAR 还不一样。同步 SAR 的竞争主要出现在时钟偏斜和组合逻辑延迟上。两个触发器如果共用同一个时钟但时钟到达时间不同就可能出现前一级的输出还没稳定的情况下后一级已经采样的局面。这个问题在仿真里通常不明显因为仿真没有真实的时钟偏斜但换成真实电路后要特别小心。在 Spectre 仿真中比较器这种正反馈结构经常导致收敛困难。典型报错是“Newton-Raphson did not converge”或者瞬态仿真突然中止。一些行之有效的处理技巧设置合理的仿真精度参数gmin默认值可能太小可以尝试gmin1e-12或更大给可能的振荡节点加一个很小的电容比如cmin1fF帮助数值收敛降低 maxstep让仿真器能捕捉到比较器翻转过程比较器内部复位阶段节点电压可能飞很高如果没有 ESD 保护钳位可以临时在节点上并联大电阻到电源或地。还有一个经验如果仿真卡死在一个时间点上反复迭代优先检查是不是时钟沿瞬间有多个开关同时动作导致 CDAC 节点出现极小的时间常数仿真器被迫用极小步长推进。解决思路是让这些开关动作在时序上错开一点而不是完全同时。4.4 仿真速度优化把半天缩短到半小时晶体管级 SAR ADC 的 transient 仿真速度是非常慢的尤其当你为了算 FFT 需要跑 4096 个采样点时全晶体管仿真可能要跑好几个小时甚至更久。4 位单体还好但如果你不提前规划等一下午不是梦。我实际采取的提速组合拳功能验证阶段用慢速时钟采样率降到 100kS/s转换时钟 500kHz这样 50μs 就能看到 5 次完整转换跑完只要几秒性能验证阶段不必全晶体管跑 4096 个点。我的做法是先用理想模型跑 4096 点验证 FFT 流程和脚本正确性再抽 128 个有代表性的采样点跑晶体管级仿真确认性能在预期范围内在 Spectre 中关闭不需要的寄生提取只用 schematic 级别的仿真速度和精度都够对比不同 tran 算法gear2在开关电容电路里通常比trap更稳定误收敛现象更少利用仿真器的“fast”模式或aps加速器对于中小规模电路可以做到 35 倍提速。另外一个小技巧在 FFT 测试时如果你只需要看前几次谐波和噪声底可以把 FFT 点数从 4096 降到 1024采样点少了四倍仿真时间就能大幅缩短。代价是频谱频率分辨率降低但对于 4 位 ADC 的性能评估1024 点已经足够看清谐波结构了。5. 关于这个小项目的几点心得走完整个 4 位 SAR ADC 仿真验证流程我最深的体会是低分辨率项目从来不是“低价值项目”。它最大的价值在于帮你把从电路结构、参数计算到验证方法的整套方法论建立起来。比如单位电容怎么选、比较器失调容限怎么算、相干采样频率怎么定、FFT 结果怎么解读、码密度测试怎么排除测试本身引入的误差这些能力在位数提高后依然完全复用。我后来去看 10 位 SAR ADC 的失配仿真和动态性能验证时思路跟做 4 位时几乎是同一个框架只是把余量收紧、把模型做精细。最后再分享一个经验在做这类小项目时一定要养成保存“中间快照”的习惯。我会在一次转换完成的位置、采样结束的位置、每次比较结束的位置分别打标记跑一次 transient 后快速查看这几个时间点的节点电压极大提升排错效率。如果你一开始就觉得“仿真全绿”就是万事大吉后面大概率会在某一步被一个很细微的时序问题绊住脚。4 位 SAR ADC 的 16 个量化台阶看起来很简单但它背后藏着一整套模拟与混合信号设计的核心思维。把它吃透了你后续再面对更复杂的 ADC心里就有底了。