
前阵子把一颗基于 SMIC 0.18µm 工艺的 10bit SAR ADC 完整设计流程走完最终前仿 ENOB 做到了 9.8离理想值还差 0.2bit左右。这个结果放在 0.18µm 这个工艺节点上算是比较扎实的成绩关键是整个设计过程没有靠“调参碰运气”而是把每一项指标都拆开算明白了。如果你正在做 ADC 相关的课设、项目或者刚入职接触 SAR ADC这篇内容可以拿来当一份实战参考。我会从指标拆解、核心模块设计、Cadence 环境里的工艺库挂载、ENOB 仿真到版图后仿验证完整串一遍最后把所有踩过的坑整理成清单尽量让你少走弯路。做 SAR ADC 这件事真正难的不是懂原理而是把原理落到具体工艺和具体电路上单位电容取多少、比较器噪声控制在什么量级、采样开关要不要做自举、版图寄生怎么压这些细节直接决定 ENOB 能不能到 9.8。这篇文章不堆理论只讲实际设计过程中怎么决策、怎么算、怎么验证。1. 项目定位与指标拆解先别急着画schematic很多新手拿到“10bit SAR ADC”这个题目第一反应是打开 Virtuoso 开始画电路。这个顺序基本是错的。正确的做法是先做指标拆解把所有误差源换算成 LSB分清楚每一项预算再回头决定电路怎么画。1.1 为什么选SAR架构速度、精度、功耗的三角权衡SAR ADC 在中等速度、中等精度区间几乎是天然选择。10bit、几十 MS/s 这个范围流水线做到这个指标当然也可以但功耗和面积代价明显更大过采样型 ADC 在这个速度下又要消耗大量数字滤波资源闪存型更不用说256 个比较器直接劝退。SAR 只需要一个比较器和一个电容阵列数字逻辑为主天然适配先进工艺下数字部分越来越便宜的趋势这也是为什么从工业检测到无线终端SAR 始终占着重要位置。回到项目本身SMIC 0.18µm 工艺能提供的模拟性能其实相当不错。1.8V 电源电压MIM 电容密度和匹配性都够用MOS 管的 flicker noise 比更先进节点反而好控制这对低频高精度应用是加分项。速度上做到 50MS/s 左右在这个工艺下需要花点心思但 10MS/s 到 20MS/s 是完全没有压力的。所以我最终把采样率定在 20MS/s留出余量去做校准和数字逻辑优化这样整个系统更好收敛。1.2 从ENOB 9.8倒推SNDR、失配、噪声都要分账ENOB 9.8bit 看起来只是比 10bit 少 0.2但这个数字非常诚实。先算一下对应关系理想 10bit 的 SNDR 是 6.02×10 1.76 61.96dBENOB 9.8 对应的 SNDR 大约是 9.8×6.02 1.76 60.76dB。也就是说整个信噪失真链路上能够容忍的总恶化只有不到 1.2dB各种误差源加在一起只能吃掉这么多。这个预算要往细了分。量化噪声在理想情况下是 1/√12 LSB rms这是不能省的采样热噪声也就是 KT/C 噪声要控制在 0.5 LSB rms 以内电容失配引入的 DNL/INL 会直接表现为谐波和杂散通常要控制在 0.5 LSB 以内比较器失调和噪声也要压到 0.5 LSB 以下时钟抖动在高频输入下还会额外贡献噪声。每一个 0.5 LSB 看起来宽松四个叠在一起就非常紧张了。所以在动手之前我专门做了一张误差预算表把每个模块能占多少噪声和失真写清楚。比如 LSB 电压值是 1.8V / 1024 ≈ 1.76mV那么 0.5 LSB 就是 0.88mV。比较器输入等效噪声我就按 0.3 LSB 控制留出余量给后仿寄生。这个做法强烈推荐大家学习不要凭感觉。1.3 SMIC18工艺库能给你什么、不能给你什么工艺库决定了设计的上限。SMIC18 这个 PDK 本身提供的器件很完整1.8V Core MOS、3.3V IO MOS、MIM电容、MOM电容、多晶电阻、各类二极管和ESD器件基本上一个完整 ADC 需要的所有元件都能找到。但工艺库不会替你做决定。MIM 电容密度是多少单位面积失配参数大概什么水平顶层金属的方块电阻这些参数不会直接写在你眼前需要去查 PDK 文档或者跑匹配性测试。我实际用下来SMIC18 的 MIM 电容匹配性在 10bit 级别是够用的但单位电容如果选太小边缘效应和光刻偏差占比就会上升失配就压不住。这个矛盾在 0.18µm 上特别明显单位电容通常不能做得像 28nm 那么小。另外要提醒工艺库里的模型文件有自己的适用范围和仿真温度范围不要拿到一个 corner 模型就全线都用。后面我会专门讲 Cadence 里应该怎么挂载和选择模型。2. 核心电路模块设计CDAC、比较器和采样开关的设计思路SAR ADC 的核心就是三个模块CDAC 电荷重分配电容阵列、动态比较器、自举采样开关剩下就是实现逐次逼近算法的数字逻辑。这三个模块互相牵制任何一个拖后腿ENOB 都会直接掉。2.1 CDAC的值怎么定单位电容与总电容CDAC 的设计是 SAR ADC 最关键的一步。一个 10bit 二进制加权阵列如果完全不分段总电容就是 2 的 10 次方乘以单位电容。假设单位电容取 25fF总电容就是 25.6pF面积大不说驱动它的前级电路也很难做。所以工程上几乎都会用分段结构把高几位和低几位分成两个子阵列中间用耦合电容连接。这个项目里我采用的是高 5 位加低 5 位的分段结构。单位电容我最后定在 80fF整体顶板等效采样电容大约 2.56pF。这个值是算出来的不是拍脑袋定的。采样热噪声的公式是 KT/C室温下 K 乘 T 大约是 4.14×10⁻²¹ 焦耳除以 2.56pF得到电压噪声功率约为 1.62×10⁻⁹ V² 开根号后噪声 rms 大约 0.4mV正好小于 0.5 LSB 的 0.88mV。如果再加大电容当然噪声更低但面积和前端驱动压力都会变大。单位电容 80fF 还有一个好处SMIC18 的 MIM 电容在这个尺寸下的失配参数足够支撑 10bit 精度。太小了匹配性差太大了面积浪费80fF 是我批量扫描了失配模型之后确定的平衡点。电容阵列的开关控制也有讲究高 5 位直接接 Vref 或者 GND低 5 位经过耦合电容等效到顶板上极板统一接到比较器输入端这样电荷重分配的线性度才有保障。2.2 比较器设计动态锁存加失调校准比较器是 SAR ADC 里面最容易拖后腿的模块。动态锁存比较器功耗低、速度快但失调电压和回踢噪声需要单独处理。10bit 精度下比较器输入失调要控制在 0.5 LSB 以内也就是 0.88mV。动态比较器如果不做任何校准失调随工艺偏差能跑到十几毫伏甚至几十毫伏完全不可接受。我的做法是输入对管加大面积来压低随机失调同时加入一个开关电容失调校准网络。比较器的回踢噪声同样不能忽视锁存器翻转瞬间会把电荷反灌回 CDAC 顶板影响比较结果。为此我在比较器输入和锁存级之间加了一级前置放大器既能抑制回踢又能提供额外增益帮比较器降低输入等效噪声。比较器的噪声也做了严格约束。在比较判决之前CDAC 顶板上的电压需要建立到足够精度比较器必须在设定的比较窗口内做出正确判断。动态比较器的噪声主要来自输入管热噪声通过增大输入管跨导和降低比较器输出节点电容最终把等效输入噪声压到了 0.3 LSB 以内。这个指标在 ss corner 下也能满足没有靠运气。2.3 采样开关自举开关的必要性很多人在 SAR ADC 设计中容易忽略采样开关的线性度然后发现谐波很大、ENOB 上不去。原因很简单普通 CMOS 开关的导通电阻随输入电压变化在采样电容上会产生与输入相关的非线性电荷这直接变成采样失真而且这种失真靠后级校准很难完全修正。解决思路就是自举采样开关。它的核心思想是把开关管的栅源电压 Vgs 保持恒定让导通电阻不随输入信号变化。栅压直接自举到输入信号加一个固定的 VDD这样采样开关就像一根线性电阻THD 指标会明显改善。这个技巧在 SAR ADC 里几乎是必选项只要采样精度要求超过 8bit建议直接上。自举开关还有两个细节值得注意。一是开关管沟道注入效应采样管关断瞬间沟道里的电荷会注入采样电容造成采样值偏移这个可以通过在采样管旁边加 dummy 管来抵消二是采样时钟的抖动输入信号频率越高时钟抖动带来的噪声越大所以在版图上要把采样时钟走线缩短、加屏蔽把抖动压到皮秒级。3. Cadence环境和工艺库挂载把PDK跑起来再谈设计电路设计之前先把仿真环境准备好。Cadence Virtuoso 配合 SMIC18 PDK 是这套流程的标准组合很多人卡在第一步的往往不是设计本身而是工艺库怎么导入、模型怎么选、仿真时为什么报错。3.1 工艺库挂载流程Library Path与config拿到 SMIC18 工艺库之后第一步是在 Cadence 里创建 library然后把 PDK 提供的各种 view 关联进去。最常见的错误是直接复制 PDK 目录然后发现 schematic 和 layout 对不上或者跑仿真时找不到模型。正确做法是在 Library Manager 里新建 library选择 attach 到现有 PDK把 smic18 的 display 文件、techfile、各种 CDF 参数一次性关联好。接下来要把模型库路径写进仿真环境。很多人用 ADE L 或者 ADE XL 时模拟库都能跑但数字库或者 IO 库的路径经常漏掉。SMIC18 的数字标准单元库通常是一堆 Verilog 或者 Liberty 文件如果你要做混合仿真需要单独把数字库加到 hdl 路径里。我习惯在仿真开始前把 cds.lib 文件全部检查一遍谁依赖谁、路径对不对都有了再启动 Virtuoso 会省很多事。另外如果你用过 TSMC18rf 这类类似工艺库会发现挂载流程和 SMIC18 没有本质区别都是把 PDK 的 techfile、模型文件、参数化单元配置好区别只在具体文件名和模型调用名上。工艺库安装本身不是难度难的是后续模型选择不犯错。3.2 Corner与模型文件选择别用错cornerSMIC18 的模型文件里通常包含 tt、ss、ff 等典型 corner以及温度变化范围。仿真的第一课就是不要只用 tt也不要全程用 ss。SAR ADC 的关键指标在不同 corner 下表现差异很大比如比较器的速度在 ss corner 下可能下降 20%采样开关的导通电阻在 ff corner 下反而可能因为过驱动太大出现问题。我的做法是分成两轮。第一轮全部核心模块用 tt corner 快速验证功能把逻辑跑通第二轮把全电路放到 ss、ff、tt 三个 corner 下分别仿真温度取 -40、27、125 三档。这样能快速暴露哪些模块是短板尤其是比较器速度和 CDAC 建立时间这两个点。如果某个 corner 下 ENOB 明显掉优先检查是不是比较器没有足够时间完成判决。还有一点仿真器里模型选择要对应你实际流片时用的 mask 层。SMIC18 有不同金属层数版本如果你用的是 1P6M但模型里选了 1P4M 的寄生参数后仿一定会出现偏差。这个细节平时没人提但能直接导致前仿和后仿不一致。3.3 ENOB仿真瞬态采样与FFT处理ENOB 不是仿真器直接给你的你需要对瞬态输出做 FFT 处理。最干净的方法是相干采样也就是让输入频率和采样频率满足整数倍关系且采样点数取 2 的 N 次方。具体来说我做 20MS/s 采样率采样点数 N4096输入频率选一个与采样率互质的倍数比如 Fin 20MHz × 257 / 4096 ≈ 1.255MHz这样频谱不会出现泄漏不需要加窗函数也能直接做 FFT。瞬态仿真时间其实是 204.8µs在 Spectre 里全电路跑这么长时间速度会比较慢。我一般会把数字逻辑简化成 Verilog-A 行为模型先跑功能验证确认算法逻辑没有错再换成真实的数字标准单元做全电路联合仿真。这样既能保证精度又能节省时间。FFT 处理完成后从频谱里读出信号功率、总谐波功率、总噪声功率SNDR 就是信号功率除以噪声加谐波功率的和ENOB 通过 SNDR 换算得到。这里有个坑FFT 点数太少会把噪声折算得不准确最少也要 1024 点我自己实验下来 4096 点比较稳定如果更高当然更好就是仿真时间变长。4. 版图设计与后仿验证前仿再好也要过寄生关前仿 ENOB 做到 9.9 不算难难的是版图后仿还能保持在 9.5 以上。SAR ADC 是一个对寄生极其敏感的电路尤其是 CDAC 顶板、比较器输入端、采样开关这三个地方任何多余电容都可能改变整个系统的行为。4.1 电容阵列布局共质心与dummyCDAC 的版图决定了一个 SAR ADC 的线性度能否兑现。电容阵列必须采用共质心布局让工艺梯度误差对所有电容的影响尽量一致。普通二进制加权阵列里最大电容和最小电容相差 32 倍如果布局不对称光刻和刻蚀造成的偏差会直接变成 INL在频谱上体现为高次谐波。标准做法是把电容分成方形阵列每个单位电容周围放 dummy保证边缘环境一致。SMIC18 的 MIM 电容有上下极板之分上极板寄生对比较器输入端的影响比下极板严重得多所以我在版图里尽量把上极板做成一个共享节点减少走线长度。所有连接到比较器输入端的金属线都要加地屏蔽防止相邻信号串扰。还有一点容易被忽略电容阵列下方的衬底噪声。SMIC18 的衬底是重掺杂的数字逻辑翻转时会产生衬底电流耦合到电容阵列下极板表现为噪声。我的做法是在电容阵列下方加隔离环并且把模拟地单独走线不跟数字地共用。4.2 后仿流程与性能回调经验后仿我用的方法是抽取 RCCC 参数然后在 Spectre 里读回去。抽寄生之前要先做 DRC 和 LVS 检查否则抽出来的寄生存在连通性问题后仿结果就没有意义。抽寄生时特别关注 CDAC 顶板的寄生电容这部分会直接叠加到采样总电容上改变电荷分配比例从而引入增益误差。后仿结果通常比前仿掉 0.2 到 0.4 个 ENOB这是正常范围。如果掉得更多优先检查三个地方一是采样开关的寄生电容二是比较器输入端到 CDAC 顶板的连线寄生三是时钟树的偏斜。这三个点是最容易出问题的地方。我在后仿阶段就踩过一个大坑CDAC 顶板寄生电容比预期多了 100fF导致比较器看到的电荷分配发生了变化后仿 SNDR 直接掉了 3dB后来通过缩短顶板互连和调整单位电容补偿才拉回来。后仿叠加 corner 也非常必要我通常会把后仿寄生文件分别放到 tt、ss、ff 三组模型下跑看 ENOB 的分布范围。如果某个 corner 掉得特别厉害就要回到前仿阶段重新调整设计余量不要指望后仿来救你。5. 调试实录与避坑清单设计做完之后我把整个过程中遇到的高频问题按现象、原因、解决方法整理成了一张表。这些问题有一些是 SMIC18 工艺下的特殊毛病有一些是 SAR ADC 的共性问题希望你能直接对照排查。5.1 高频问题排查表现象可能原因解决方法FFT 中三次谐波明显偏大采样开关非线性或 CDAC 上极板寄生随输入变化改用自举开关缩短顶板走线加屏蔽DNL/INL 在中间码附近跳变分段电容阵列的耦合电容失配或寄生不对称耦合电容取整倍数周围加 dummy重新提寄生ENOB 在 ss corner 下降明显比较器速度不够建立时间不足加大比较器电流缩小输出节点电容检查时钟时序后仿比前仿掉 0.3bit 以上CDAC 顶板寄生过大或比较器回踢噪声加剧优化顶板连线加前置放大器重新评估单位电容采样值整体偏移但线性度还可以输入管沟道电荷注入或自举开关 dummy 失配加 dummy 管调整采样管尺寸减小注入电荷这几类问题基本覆盖了 SAR ADC 设计 90% 的返工场景。遇到问题先看表格往往比从头查电路效率高得多。5.2 几个让我印象深刻的坑第一个坑是分段电容的耦合电容太理想化。前仿时我用理想电容建模一切正常换成 PDK 里的 MIM 电容后中间码的 INL 立刻变大。原因是耦合电容两侧的寄生不一致破坏了电荷分配关系。最后的解决办法是把耦合电容也做进共质心阵列而不是单独放在旁边。第二个坑比较隐晦是电源电压的选择。SMIC18 有 1.8V core 和 3.3V IO 两种电源模拟核心电路我用了 1.8V但一开始给自举开关的电荷泵供电直接接了 3.3V导致采样管栅氧化层承受的电压超出了安全范围可靠性在高温下严重下降。后来改成所有自举相关电路都用 1.8V 域虽然开关导通电阻稍大一点但可靠性高很多。第三个坑是仿真环境的临时目录。后仿抽取出的寄生网表非常大Spectre 在默认临时目录下跑经常因为磁盘空间不足直接中断。这个问题低级但杀伤力极强强烈建议在仿真前把 temp 目录指到足够大的空间并且定期清理旧仿真文件。最后说一点个人体会。做 SAR ADC 最怕的不是不会画电路而是指标拆不细。ENOB 能到 9.8背后是每一项噪声、失配、时序都算到了位而不是靠调参碰运气。先把误差预算表做出来把工艺库和仿真环境跑顺再谈电路优化。SMIC18 这个节点虽然不算先进但做 SAR ADC 是非常好的实战平台一套流程走通之后换到更先进工艺只是换 PDK、重新评估寄生和失配的问题方法论完全通用。