
10bit的SAR ADC听起来不算难——本科毕业设计都能做。但当你把目标从“能出波形”改成“ENOB稳定在9.8以上”事情就完全不一样了。0.2bit的性能差距在指标表上只是小数点后一位在物理上却是热噪声、电容失配、比较器回踢、时钟抖动、参考电压毛刺一起向你索债。这篇文章是我用smic18工艺从零做一颗10bit SAR ADC的完整记录流片前典型条件仿真ENOB做到了9.81bitSFDR超过72dBc全工艺角最差也有9.7bit。整个过程踩了不少坑我会把关键的设计决策、误差预算拆解、仿真验证方法和翻车点都写出来希望能给正在做类似项目的同学省点时间。先说清楚项目边界采样率定在10MSPS差分输入满摆幅2Vpp电源1.8V总功耗约1.6mW。这个定位适合工业数据采集、传感器信号链、电池管理系统这类场景对速度要求不算极端但对有效位数和功耗有硬指标。标题里的“有工艺库”是个好消息因为smic18的PDK在Cadence里用起来很成熟模拟器件模型、版图规则、蒙特卡洛模型都齐备真正需要用心的地方在于怎么把库用对、把每一分噪声和失配预算算清楚。1. 为什么必须较真“ENOB 9.8”这个数字1.1 从10bit到9.8bit设计师的第一笔账很多人拿到10bit SAR ADC的指标第一反应是“不就是10位嘛能到9.5就交差了”。这种想法在学术练习里没问题但在工程交付里会出大事。你把ENOB 9.8和9.5分别换算成SNDR看看理想10bit的SNDR是6.02×101.7661.96dB。ENOB 9.8对应的SNDR是6.02×9.81.76≈60.76dBENOB 9.5对应的SNDR是6.02×9.51.76≈58.95dB。两者差了接近2dB也就是信号链整体噪声功率差了约1.5倍。换句话说ENOB从9.5提升到9.8意味着你要把系统里所有噪声和失真的总等效输入功率再砍掉三分之一这绝对不是靠运气能做到的。我的做法是把60.8dB当作目标SNDR然后反向拆预算。热噪声、比较器噪声、DAC失配、采样时钟抖动、参考电压扰动、采样开关非线性每一项都分配一个允许的“功率贡献”。总噪声预算约等于理想SNDR之下1dB多的余量听起来很宽裕实际上平均到每个模块头上每一笔都紧巴巴的。比如比较器输入参考噪声我把它限制在0.15LSB以内对于2Vpp差分输入、LSB≈1.95mV的10bit系统来说就是有效值小于0.3mV这已经需要仔细设计前置放大器的功耗和噪声了。1.2 ENOB计算方式与仿真中的FFT细节ENOB不是直接测出来的它是从SNDR反推出来的ENOB(SNDR-1.76)/6.02。问题在于SNDR本身很敏感FFT窗口、输入频率、输入幅度、噪声设置都会影响最终读数。要拿到可信的ENOB第一件事是保证相干采样。如果你直接用任意的fin和fs做瞬态仿真频谱泄漏会把能量抹开SNDR被低估一大截。相干采样的条件是fin(M/N)×fs其中N取2的幂FFT点数M与N互质。我常用N1024M101于是N 1024 M 101 fs 10e6 fin M * fs / N # 0.986328125 MHz sndr_db 60.86 enob (sndr_db - 1.76) / 6.02 print(ffin {fin/1e6:.6f} MHz, ENOB {enob:.2f} bit)算出来ENOB约9.82bit。这里有个经验仿真时输入幅度不要设满幅我习惯设-0.5dBFS到-1dBFS留给削顶和失真一点余量。满幅输入会让大信号失真吃掉有效位数测出来的ENOB偏低而且不代表真实应用。还有一点容易忽略Cadence里如果只跑普通tran仿真不打开transient noise选项那么仿真结果里几乎不存在热噪声SNDR会虚高。我见过有人用理想开关和理想比较器跑出ENOB 9.95换到实际电路后直接掉到9.0。正确做法是在Spectre的瞬态分析里开启noise选项设置好噪声种子和分析时间让采样开关、比较器、参考源的噪声真实地叠加到信号上。这个设置很关键后面我会展开讲。2. smic18工艺库的搭建与DAC电容选型2.1 工艺库导入与PDK目录检查标题里写“有工艺库”但实际用起来仍然有新坑。smic18的PDK在Cadence里不是解压就能用的要确认三件事库文件是否正确attach、仿真模型路径是否指定、器件调用的model name是否匹配。我的习惯是拿到PDK后第一件事看cds.lib和model文件。smic18的模拟器件通常包含在analogLib之外的smic18mmrf或类似名字的库里里面能找到nch、pch、mimcap、res等基本器件。仿真前必须确认Spectre加载的model library中包含了对应的section比如typ、ss、ff等。最典型的问题就是你调了一个MIM电容但仿真器没加载MIM的model结果电容值默认为0整个DAC不工作。排查这类问题最快的办法是在ADE里跑一个只有电容和理想电流源的简单DC/AC仿真检查节点电压是否符合预期。版图方面smic18通常提供多种电容选择。MIM电容匹配好、单位电容密度高但有额外mask层金属交指电容MOM不需要额外mask但匹配性和寄生对画版图的人要求高。对于10bit SAR DAC我建议直接用MIM因为PDK里有对称性良好的pcell蒙地卡罗模型也完整省掉自己验证交指电容匹配的功夫。2.2 单位电容究竟取多大kT/C噪声与匹配的联合约束CDAC的总电容不是拍脑袋定的要从噪声和匹配两个方向推导。10bit SARLSB约1.95mV要求DNL小于0.5LSBINL小于0.75LSB。电容失配直接影响INL尤其二进制加权结构MSB电容失配会带来最大INL跳变。先看噪声约束。采样噪声功率是kT/Ctotal这个噪声直接叠加到信号上必须远小于LSB。假设总采样电容只有2pFkT/C≈4.14e-21/2e-122.07e-9换算成rms电压约45.5uV换算成LSB大约0.023LSB其实远低于10bit的量化噪声。所以严格来说10bit精度对kT/C的要求很低总电容不需要为了噪声取得很大真正卡住电容下限的是匹配。匹配约束就麻烦多了。10bit单调性要求最差DNL小于0.5LSB这要求MSB电容与其余电容之和的相对匹配误差在0.05%量级。MIM电容的失配和面积相关单位电容取太小会导致失配超差。我最终选定Cu45fF采用64分段结构高6位用64个Cu低4位用16个Cu通过一个桥接电容串联到高段。总有效电容约80×45fF3.6pF面积和功耗都可控蒙地卡罗仿真全corner下INL最大0.6LSB、DNL最大0.35LSB余量刚好够。2.3 分段DAC的桥接电容陷阱分段结构能大幅减小总电容但桥接电容最容易引入系统误差。理想情况下64分段的桥接电容等于Cu但实际版图上桥接电容两端都存在寄生电容这些寄生会和桥接电容分压导致低段权重偏大或偏小表现为INL出现周期性毛刺。我的做法是在版图阶段给桥接电容两侧都画了dummy并且在比较器输入端做过dummy补偿同时在前仿阶段就建立了一个包含寄生电容的netlist做快速验证。注意桥接电容的值不一定要严格等于Cu设计时可以先算好寄生比例然后稍微调大或调小桥接电容来补偿。这个“预失真”操作在10bit设计里很实用能把INL从0.9LSB拉回到0.5LSB以内。3. 核心电路CDAC、比较器与SAR逻辑的工程化实现3.1 为什么我选择下极板采样而不是上极板采样SAR ADC可以只用一个CDAC同时完成采样和数模转换但采样开关的接法会直接决定线性度上限。上极板采样结构简单采样开关接在比较器输入端少一组开关速度快面积省但有一个致命问题采样开关的沟道电荷注入量随输入电压变化这个非线性会直接进入采样值导致SFDR上不去。下极板采样则把采样开关放在DAC电容的下极板比较器输入端只接固定共模开关关断时注入的电荷与输入信号无关线性度好很多。代价是控制时序复杂一些需要额外一路采样时钟。在10bit、SFDR要求超过70dBc的项目里这个代价完全值得。我实际验证过同一套CDAC上极板采样跑了SFDR只有59dB第三阶谐波特别明显改成下极板采样后SFDR直接提升到66dB以上配合后级的自举开关最终SFDR超过了72dBc。3.2 比较器前置放大加动态锁存噪声和回踢怎么平衡比较器是SAR ADC里最容易被低估的模块。很多人觉得“能比较就行”但实际上比较器噪声、失调、回踢噪声、速度会共同限制ENOB。我的比较器结构是经典的两级第一级PMOS输入对加电阻负载的预放大器第二级strongARM动态锁存器。预放大器主要干三件事提供约8~10dB增益把锁存器失调折算到输入端时除以这个增益隔离锁存器翻转时产生的回踢噪声不让它污染DAC电容上的电压顺便消耗一定电流来压低输入参考噪声。参数上有个取舍预放大器增益太大带宽下降比较速度变慢增益太小失调和回踢压不住。8~10dB是比较稳的区间。动态锁存器尺寸要足够大到让失调在可接受范围但又不能太大否则回踢噪声和功耗同时上升。自动调零是必须的。smic18工艺下动态比较器本身的输入失调可能有几个mV到十几mV10bit LSB不到2mV不校准的话良率出问题。我的做法是用输入失调存储技术在采样相把比较器两个输入短接到共模把失调电压存储到前置放大器和锁存器之间的耦合电容上比较相时失调被相减掉。这样1000次蒙特卡洛跑下来比较器等效输入失调小于0.1LSB对系统的影响可以忽略。3.3 异步SAR逻辑省掉高频时钟但要管理好时序10bit SAR需要至少10次逐步逼近比较。如果采用同步逻辑内部需要一个至少11倍于采样率的时钟也就是110MHz以上。在smic18工艺下110MHz的数字时钟不是问题但时钟分配功耗和数字噪声耦合会影响模拟性能。我最终选择了异步SAR逻辑比较器的valid输出直接触发下一轮的DAC切换和比较启动无需外部高频时钟。异步逻辑的隐患是时序竞争。比较器刚翻转到稳定电平DAC开关还没来得及完成切换如果下一轮比较立刻开始就会基于一个错误电压做比较。解决办法是在valid信号之后插入一段可调的delay cell让DAC的建立时间先被满足。另外一个更工程化的做法是加冗余位——比如在MSB转换阶段多设计一个冗余电容即使DAC建立不足也能被后续比较纠正。实际项目里两种手段都用了delay cell保证正常时序冗余电容兜底极端corner整套逻辑在SS/110°C下也稳定工作。4. 仿真闭环为什么我的ENOB能做到9.84.1 前仿瞬态噪声FFT与模数混合仿真设定ENOB 9.8不是拍出来的是一整套仿真流程收敛出来的结果。前仿时我跑的是带transient noise的长瞬态仿真采样时钟10MHz输入频率按上面说的约0.986MHz采样点数1024瞬态仿真总时长约102.4us。打开Spectre的noise选项后采样开关、比较器、参考源的热噪声都会进入仿真结果FFT计算出的SNDR才接近真实电路。典型TT/27°C下得到SNDR约60.86dBSFDR 72.5dBENOB约9.81bit。这里要提醒一句如果不加瞬态噪声SNDR能到61.6dB看着更漂亮但那是纸面数字。要验证真实噪声贡献一定要开噪声仿真。至于DAC电容失配的影响我用蒙地卡罗模型跑了100个点统计得到的DNL最大0.37LSB、INL最大0.58LSBSNDR均值约60.2dB、最低59.4dB。这说明电容失配不是限制ENOB到9.8的瓶颈真正的瓶颈在比较器噪声和采样开关线性度。4.2 Corner下谁在吃掉有效位数光有TT corner不够流片出来什么温度什么工艺都有。我完整跑了SS、FF、FS、SF四个corner和-40°C、27°C、110°C三档温度结果如下Corner温度SNDR (dB)SFDR (dBc)ENOB (bit)TT27°C60.8672.59.81FF-40°C61.3073.19.86SS110°C60.1070.89.70FS27°C60.4571.69.76SF27°C60.7072.29.80最差的是SS/110°CENOB掉到9.70。主要原因是高温下比较器噪声变大预放大器增益和带宽下降同时DAC开关导通电阻变大、建立时间变长。针对这个我把预放大器尾电流加大了15%锁存器输入对管也加大了一点再跑SS/110°CENOB回到了9.73左右。虽然没到9.8但保证全角最差不低于9.7TT典型值稳定9.8对交付来说够了。4.3 后仿的教训寄生如何偷走0.5bit前仿ENOB 9.8后仿第一次跑出来只有9.3这个落差差点让人怀疑人生。排查后发现了两个主要寄生问题。第一个问题在比较器输入端。比较器输入管栅极和DAC上极板之间的走线寄生电容加上输入管本身的Cgs会改变CDAC的分压比例。寄生电容等效叠加在比较器输入端导致实际电容阵列权重偏移产生非线性。解决办法是减小输入对管尺寸、缩短走线、对称布局并在输入端不留多余焊盘。第二个问题在桥接电容。版图寄生让桥接电容偏离设计值低段权重误差在INL上表现为周期性的锯齿状波动。最后通过Calibre xRC提取后把桥接电容的值在版图里微调了约3%INL才恢复。所以我的建议是后仿ENOB掉得厉害时先看比较器输入端寄生电容再看桥接电容不要一上来就怀疑DAC失配或者比较器噪声。5. 项目中踩过的坑与完整排查链路5.1 最坑的SFDR采样开关还是DAC建立项目初期前仿SFDR只有55dBTHD以三阶和五阶为主。一开始怀疑DAC失配把单位电容从45fF加到80fF结果SFDR只提升了不到1dB说明方向错了。后来用排除法理想化DAC把DAC电阻设为0SFDR没改善把采样开关理想化SFDR立刻跳到68dB。这才锁定问题是采样开关。普通CMOS传输门在输入电压变化时导通电阻Ron随Vgs变化导致采样时刻的有效带宽随输入信号变化产生显著谐波。SNDR被拉低。解决办法是换成栅压自举开关让采样管栅源电压恒定Ron与输入电压无关。替换后SFDR从55dB提升到70dB以上这一步是整个项目里收益最明显的一次改动。5.2 异步SAR里的时序竞争delay cell不是随便给的有段时间前仿TT没问题但跑蒙特卡洛时偶尔出现某一位比较结果异常ENOB分布出现长尾。用波形去盯单次仿真发现比较器的valid信号在DAC尚未完成建立时就拉高了下一轮比较提前启动导致一个动态错误。排查链路是先怀疑比较器速度不够加大电流没有用然后用理想delay替换实际delay cell异常消失最后确定是delay cell延迟不足。解决方法是采用带冗余的异步逻辑加可调delaydelay保证正常时序不发生竞争冗余电容保证即使极端情况下建立不够后续位也能纠正错误。经过这个组合1000次蒙特卡洛再没出现过异常点。5.3 参考电压毛刺理想Vref换成真实模型后ENOB崩了这个坑最有代表性。前仿阶段参考电压一直用理想电压源ENOB稳定9.8。后来把系统级模型换成了带有限驱动能力和输出阻抗的参考缓冲器ENOB直接掉到9.0。原因是DAC切换时低位和高位电容同时接入Vref会在参考网络上产生电流脉冲参考电压瞬间跌落并振荡比较器在这个时间点启动比较就会出错。我做了两个修正。第一在DAC的参考端加了大容量片上MIM去耦电容把参考电流脉冲的能量就地吸收第二把参考开关的时序改成make-before-break避免开关切换瞬间出现参考端悬空或瞬间短路。改完后ENOB恢复到9.65再优化去耦电容布局最终回到71dB SFDR的稳定水平。建议所有做SAR ADC的人前仿阶段就引入带输出阻抗的参考源模型别等到系统集成才暴露问题。5.4 涉及工艺库的仿真环境坑最后说个和smic18库使用相关的经验不少人卡在“为什么我仿真DC正确、tran噪声仿真却异常”这种问题上。smic18 PDK里的模型文件通常很大需要确认Spectre加载的是正确的section。我遇到过某次跑蒙地卡罗时电容失配模型没有加载所有DAC电容的失配参数都是0等于白跑。检查方法很简单在ADE里看model library设置确认包含uncertaitly/mismatch参数的section被引用了。另外MIM电容的pcell在网表里可能调用的是特定model name比如cnmim4或类似字段一旦model名对不上仿真器会静默把电容设成理想值。最好新建一个测试cell跑简单仿真确认电容值等于版图预期再开始全芯片仿真。这些小问题虽然蠢但会浪费至少一天时间。6. 一点个人体会这十几个月的项目做下来最深的感受是ENOB 9.8不是靠某个灵光一现的电路结构实现的而是靠把每个环节的误差预算算清楚、把每一步仿真的边界条件做严谨。如果把SAR ADC比作接力赛采样开关、DAC、比较器、参考电压、逻辑时序每一棒都必须稳定任何一棒掉一点性能最终ENOB都会往下掉。我自己总结了一个排查口诀后仿ENOB上不去先看比较器输入端寄生再看参考电压响应最后才怀疑DAC失配。项目里所有“灵异现象”——TT好、corner差FF好、SS差前仿好、后仿差——最后都能追到一个具体的物理机制不存在玄学。如果后面继续这个系列我大概率会往两个方向扩展一是给比较器加动态失调校准把10bit设计稳步推向12bit二是做版图级的参考电压网络优化进一步压低高速采样时的SFDR退化。smic18虽然老但用来做10bit SAR ADC一点不过时反而因为器件模型成熟、文档丰富非常适合做ADC入门和高性能设计的对比研究。