
干模拟的应该都听过这么一句话比较器嘛增益拉高、翻转够快就行了。可偏偏就是这套“想当然”让不少人第一次流片回来就被打脸。明明DC仿真增益90dB漂亮得很实际测下来分辨率不到设计值的一半延时也慢得离谱。我自己早几年做SAR ADC里的比较器时就因为在仿真阶段只盯增益、没把噪声、失调和延时这三件事放在一起看结果白白浪费了一轮MPW。所以这篇东西我想以一个“踩过坑又爬出来”的身份和你在Cadence环境下把两级比较器的噪声、失调、延时这三项仿真完整过一遍。不管你是在校学生还是刚转行做模拟IC的工程师只要你手头有Virtuoso和一套能跑的PDK照着下面的思路走就能在流片前把这三项指标真正摸到底。1. 为什么“增益至上”是个坑两级比较器三大非理想因素1.1 两级结构到底解决什么问题两级比较器的经典架构是第一级预放大pre-amplifier加第二级锁存或输出级。为什么非要两级单级比较器不是没见过但它在速度、增益、摆幅三者之间很难平衡。第一级通常做成差分输入的单级放大器它负责把输入的小信号先放大到第二级能“看得清”的程度同时提供较高的增益来抑制第二级的失调折算到输入端第二级则承担输出摆幅的整形任务把信号拉成满摆幅的数字电平。两级一拆每个模块的任务就单纯了设计上也更容易收敛。但结构变复杂之后非理想因素也跟着翻倍第一级贡献了主要的输入参考噪声和部分失调第二级虽然对输入等效失调的贡献会被第一级增益压低但它对延时的拖尾效应非常明显尤其是当第二级进入再生锁存状态后输出的翻转速度取决于再生时间常数而不是第一级的-3dB带宽。很多人仿真时只看第一级的AC增益却忘了第二级的摆率、再生时间和输出电容才是决定瞬态行为的隐形推手。这也是为什么我在后面的仿真环节里会把三个指标分开测、再放在一起评估。1.2 噪声、失调、延时三兄弟怎么联手坑你先说说这三者的关系它们不是互相独立的而是会叠加成同一个结果。噪声决定的是“分辨率的底噪”就是你给一个近零电平输入输出却有可能随机翻到高或者低这相当于在你设定的阈值附近蒙了一层雾失调则是一个固定的偏移相当于把判决阈值从理想位置硬生生挪走了一段电压而且不同芯片挪的方向不一样、挪的量也不同延时则是输入过阈值到输出真正翻转到逻辑电位的响应时间它决定了比较器能跑多高的时钟频率、留给后端数字逻辑的裕量还剩多少。三者对系统的影响经常是混合出现的。比如SAR ADC比较器的输入参考噪声直接决定量化噪声地板失调会引入码字跳变或失码而比较器延时则挤占DAC建立时间和数字逻辑的时序窗口。最麻烦的是你做DC仿真时看不到这些因为DC仿真的工作点分析是基于理想失配模型只跑典型值的噪声压根不会出现在DC结果里。所以你必须在Cadence里用noise分析、蒙特卡洛分析和瞬态分析这三把尺子分别量清楚。1.3 仿真前的环境准备版本、模型和库的选择开始之前先把环境捋一遍。我这边用的是Cadence IC6.1.8Virtuoso ADE L/ADE XL配合spectre仿真器。PDK用的是某成熟工艺的1.8V器件比较器核心是5管OTA加一个class-AB输出级负载电容设了200fF。如果你用的是其他工艺或版本菜单名称可能会有差异但原理和流程大同小异。有几点必须提前检查第一仿真器类型要选对spectre和APSAdvanced Parallel Simulator在瞬态噪声处理上有细微差别建议在最终的验证阶段用spectre跑一遍parse快节奏调试时再用APS第二model library里要包含statistical section否则后面的蒙特卡洛跑不出来mismatch第三看看你的PDK是否提供了用于噪声仿真的输入源模型一般analogLib里的vsource和isource都能直接用。环境没配好后面所有步骤都是空中楼阁这步看起来简单但真能卡住一大批人。2. 噪声仿真给比较器做一次“体检”2.1 输入参考噪声是什么、怎么算比较器的噪声指标一般不直接看输出端的总噪声因为输出噪声跟增益强相关、可比性差业界惯例是把输出噪声折算到输入端称为输入参考噪声input-referred noise。你可以把它理解为“在输入短接的情况下等效为输入端存在多大的噪声电压”。这个值的大小直接限制了比较器能分辨的最小信号所以比较器输入参考噪声的上限往往是系统精度要求倒推出来的。手算层面第一级差分对管的输入参考热噪声可以用这个经典公式估算[ \overline{v_{n,in}^2} \approx 4kT \left( \frac{2}{3} \cdot \frac{1}{g_{m1,2}} \frac{2}{3} \cdot \frac{g_{m3,4}}{g_{m1,2}^2} \right) ]这里k是玻尔兹曼常数T是绝对温度gm1,2是第一级输入管跨导gm3,4是负载管跨导。从公式能看出两件事增大输入管跨导能压制输入参考噪声而负载管的噪声会被gm1,2的平方衰减所以通常第一级输入管要用较大的过驱动电压和电流来换取较低的噪声。不过这个公式只包含热噪声闪烁噪声在低频段同样重要尤其当比较器工作在较低的斩波频率或低速场景时闪烁噪声会占主导。2.2 Cadence noise仿真实操步骤含积分带宽选择在Cadence里跑比较器噪声仿真最稳妥的做法是在固定偏置点下做小信号噪声分析。虽然比较器本质上是强非线性器件但在“判决前的预放大阶段”它确实工作在线性区这时候小信号噪声分析是有意义的。具体步骤我按自己常用的流程走建好比较器testbench输入两端都接到共模电平比如VCM或者用一个小的AC源串在输入端做参考源。在ADE L里打开Analyses选择noise分析。设置噪声扫描范围起始频率从1Hz开始终止频率可以设到比较器带宽的3-5倍比如1GHz。在“Output”栏选输出节点需要选一个你要观察的端口或节点比如第二级输出端。在“Input Source”栏选输入源这里选你接在输入端的AC源实例名。这一步很关键选了输入源之后spectre才会帮你算输入参考噪声。勾选“Output Noise”和“Input Noise”跑完后在Direct Plot里选input noise并做rms积分。关于积分带宽我的经验是不要从0.001Hz这种低频起积闪烁噪声在极低频段的贡献会被积分时间无限放大反而丢掉真实有效的噪声。一般取1Hz到比较器主极点频率的5倍左右或者根据系统的等效噪声带宽来取。噪声带宽和比较器的闭环或采样带宽有关比如你的比较器在一个10MHz时钟下工作噪声积分带宽取到50MHz-100MHz就足够工程参考了。跑完之后你会得到一条输入参考噪声频谱曲线。对输出频谱做平方积分再开方就能得到rms电压。举个例子我之前做的比较器在1Hz到100MHz积分带内输入参考rms噪声大约在280μV左右而系统的LSB是500μV算下来余量只有大概6dB虽然能用但明显偏紧后来通过加大输入管电流把噪声压到了210μV才踏实了一些。实操中建议在三个corner下各跑一次tt、ff、ss。噪声在ff corner下通常最大因为管子的gds和沟道调制效应更严重ss corner下虽然gm变小但有时热噪声反而低一点。总之不要只看tt。2.3 高级话题周期稳态噪声与地弹噪声的正确打开方式如果你的比较器用在开关电容电路里工作过程是周期性的那普通的noise分析就有局限了因为它是在固定偏置点下做的近似。这时候更严谨的做法是用PSSPnoise分析先用PSS找到比较器工作的周期稳态再做周期噪声分析能得到更接近实际工作状态的折算噪声。PSSPnoise在spectre里支持得不错但跑起来耗时比普通noise分析高一个数量级所以我通常只在关键验证阶段跑前期的参数扫描还是用普通noise分析。还有一点想单独拎出来讲官方口径叫“地弹噪声”ground bounce它实际上是数字电路开关时在电源和地回路上产生的大电流毛刺导致局部地电位瞬态抬升或跌落。这个东西跟比较器本身的器件噪声完全是两码事很多人仿真时把电源上叠加一个噪声源就以为在“仿真地弹”其实是混淆了概念。地弹是回路寄生电感和电流变化率共同作用的结果要准确定量得做电源网络提取和瞬态联合仿真这往往是数字后端的事。在比较器设计阶段我们能做的只是在版图上分离模拟地和数字地、在电源引脚附近加足够的高频去耦电容并在前仿时给电源一个干净的单点激励避免不小心把数字噪声耦合进电源学习。记住前仿阶段的地弹噪声评估是“有限条件”评估别指望一场瞬态仿真就能把PCB级别的噪声全部复现。3. 失调仿真蒙特卡洛的正确跑法3.1 失调从哪里来、为什么手算和仿真对不上失调分为系统失调和随机失调。系统失调来自电路结构本身的不对称比如负载不匹配、输入对管尺寸不同、偏置电流分配不均这种可以通过设计手段剪掉仿真里只要不做特殊处理、DC工作点下就能看出来随机失调则来自制造工艺的统计涨落包括阈值电压Vth失配、氧化层厚度偏差、几何尺寸的随机抖动等等。随机失调本质上是一个统计量所以只能用蒙特卡洛仿真去估计分布。很多人手算失调时喜欢用Pelgrom模型[ \sigma_{Vos}^2 \frac{A_{VT}^2}{WL} S_{VT}^2 \cdot D^2 ]这个公式能给你一个粗略的失调标准差但实际结果往往对不上原因至少有三个模型参数不准、忽略偏置点影响、没有考虑相邻器件相关性。所以工程上我更推荐以仿真为准手算只用来定数量级。比如你说“估算失调大概2mV”仿真出来3.5mV这很正常如果仿真出来35mV那就不是估算误差的问题而是电路结构本身有隐患了。3.2 失调提取testbench设计测失调的testbench有两种主流做法。第一种是直接开环扫描DC。给比较器一端接理想电压源另一端接一个斜坡电压从负到正扫过去观察输出翻转的临界输入电压这个电压就是失调电压。优点直观缺点是在高增益比较器下翻转区域非常窄仿真步长设不好会漏掉翻转点甚至出现“翻转曲线不单调”的假象。第二种是我个人更推荐的闭环求零法。把比较器接成单位增益负反馈结构输出通过一个理想VCVS或者大电阻反馈回反相输入端然后给同相输入端加一个直流扫描电压让输出等于输入时的那个点就是失调点。这种方法相当于让电路自己“找到”翻转阈值扫描步长要求低很多而且能复用到蒙特卡洛仿真中逐个样本提取。不管哪种方法都要注意测试bench里的激励源对失调提取结果的影响。理想电压源的电阻为零它的噪声和压降不会引入额外失调但如果你用了有内阻的源内阻会跟输入偏置电流作用产生额外的失调电压这在测试bench里是不该出现的“假失调”。实测中我习惯在输入端串一个虚拟探针电阻同时把它的阻值设成极小的1μΩ方便提取节点电压又不影响静态工作点。3.3 MC仿真配置与结果判定蒙特卡洛仿真在ADE XL里配置比较顺手。流程是先把工艺库里的statistical模型加到model setup然后new一个Monte Carlo run变量域选择mismatch抽样次数设200到400次。mismatch域只随机失配参数保持工艺角固定如果你连process corner一起随机结果会更全面但分布更发散建议分两步看。抽样次数低于100次时统计均值可能还在真实中心附近但标准差会明显偏低我之前做过对比50次跑出的σ比200次能差20%-30%所以别偷懒。跑完以后在ADE XL的结果窗口里查看目标变量的直方图。正常情况下结果应该近似高斯分布如果直方图出现双峰或明显倾斜大概率是testbench收敛出了问题或者电路本身有双稳态。还要同时关注标准差和均值均值明显偏离零说明存在较大的系统失调这时候先用DC工作点排查版图对称性标准差超出预算则说明随机失配过大考虑增大尺寸或调整偏置点。另外蒙特卡洛仿真对初值和仿真步长很敏感。有些样本会在某个静态点附近长时间迭代导致仿真异常慢或结果不收敛。可以在瞬态之外给比较器加一个复位信号让它每次上电从一个已知状态启动这样能大幅减少蒙特卡洛跑飞的概率。这个技巧是版图前仿真时积累出来的很实用。4. 延时仿真把“反应速度”测准4.1 比较器延时的两条路径线性与再生比较器延时并不是一个单一值它由两个阶段串成。第一阶段是线性放大期输入的小信号经过预放大器放大到能让第二级开始再生的程度这一段的延时大致等于预放大器时间常数和输入过驱动电压的函数第二阶段是再生期第二级锁存器一旦进入正反馈输出以指数速度摆动这一段的延时由再生时间常数决定。经典的近似公式是这样的[ t_p \approx \frac{C_L}{g_{m,eff}} \ln\left(\frac{V_{OH}}{2 \cdot V_{os}}\right) ]其中gm_eff是再生级等效跨导CL是输出负载电容VOH是最终的数字高电平Vos是输入等效失调或初始的小信号电压。从这个公式能得到一个关键直觉如果输入信号很大初始量很大ln项就小再生延时短如果输入信号逼近失调电压的量级ln项会变得很大延时急剧拉长。这就是为什么在比较器设计中过驱动力overdrive对延时的敏感度非常高——输入信号贴着阈值附近时延时可能成倍增长。4.2 延时testbench与measurement方法测量延时的testbench设计思路是在比较器输入端加一个阶跃信号或斜坡信号从输入跨越判决阈值的时刻开始到输出跨越50%VDD的时刻为止这段时间就是传播延时。如果比较器是差分结构就把输入的一端加VCM、另一端加一个“VCM 阶跃量”的激励阶跃量可以设成1mV、10mV、100mV三个档位分别对应小过驱、中过驱、大过驱三种场景。具体到Cadence操作我一般这样做在输入测试源用vpulse或pwlf搭一个阶跃让它在1ns内从VCM跳到VCMΔV。跑tran分析步长设到远小于预计延时比如1ps以分辨到比较器翻转的细节。总仿真时长可按比较器时钟周期的5-10倍设确保能观测到多个翻转事件。仿真完成后打开Calculator找到cross函数。在cross函数里设置目标波形选输出节点crossing type选rising或falling看你测的是哪个方向threshold设成50%的VDD比如0.9V找到翻转时间。对输入波形同样用cross函数找跨越判决阈值的时间点两个时间相减就是传播延时。至少测三组过驱电压1mV、10mV、100mV。记录延时随过驱电压的变化曲线这个曲线是评估比较器速度潜力的关键数据。我在实际项目中遇到过一个问题输出波形在翻转前有一段长长的“瓶颈”看着像没翻完实际上是因为负载电容太大而第二级驱动能力不足导致输出斜率极慢。这时候即使你测出了延时它也不够“数字友好”因为下一级逻辑可能等不了这么慢的边沿。解决办法是加大第二级电流或者在输出端加一个施密特整形缓存但这个面积和功耗代价要提前算进去。4.3 延时与系统时序裕量的关系比较器延时不是一个孤立数字它直接参与系统时序预算。SAR ADC里比较器被触发后输出必须在一个时钟相位内稳定下来之后DAC才能开始建立。如果你测出比较器延时是2ns而你的时钟周期是10ns看起来余量很大但别忘了DAC建立需要4ns数字逻辑和同步还需要2ns留给比较器的窗口其实就只剩4ns延时2ns只能算一半余量。所以比较器延时的评估要放在系统时序里整体看否则很容易出现“单模块指标全过、系统跑飞”的怪现象。延时仿真还应该结合工艺角来看。ss corner下管子驱动能力弱延时可能比tt corner大30%-40%温度也是大变量高温下载流子迁移率降低延时同样会上涨。我一般要求延时设计值留出至少50%的余量并且至少覆盖ss/125℃这个最差组合再去谈系统时序。5. 常见问题与排查技巧实录5.1 五大高频踩坑速查表这节我按自己踩过的坑和帮别人debug的经验整理一张速查表每一项背后都是真金白银换来的教训。现象可能原因排查与对策noise分析报错“noise source not found”没有在noise分析里指定有效的输入源检查input source是否填了测试源实例名且该源要参与AC小信号通路蒙特卡洛跑完全是同一个结果model library里没有加载statistical section在model setup中确认nfet、pfet的statistical模型已勾选重跑前清空旧run失调直方图均值严重偏离零电路存在较大的系统性失配比如负载不对称先跑DC工作点对比差分管电流是否对称再看版图对称性延时波形翻转时出现长拖尾输出级驱动不足或负载电容过大加大第二级电流减小输出节点寄生考虑加整形级仿真结果与手算偏差100%以上手算使用了错误的gm或忽略了次级效应从仿真器里回读工作点gm、gds重新代入公式核对数量级这张表看着简单但每一条都可能让人折腾半天。最坑的是第三条有次我因为负载管尺寸在原理图上看着对称实际版图里一根follow pin接错了结果蒙特卡洛跑出来均值偏了15mV当时还以为是模型问题最后追了两天才发现是版图寄生不对称。所以提醒一句前仿的失调仿真结果不等于真实硅片结果它只能帮你排查原理图层面的失配版图引入的额外失配要靠LVS、PEX后的后仿暴露。5.2 手算与仿真对不上的排查清单如果你发现自己手算的噪声、失调或延时跟仿真差得离谱先别怀疑仿真器按这个清单排查工作点对不对仿真器实际偏置的gm、Vov跟你手算用的参数一致吗从Results Browser里把工作点数据拉出来逐项核对这是最常出问题的地方。模型级别够不够高spectre的模型有spectre、cmos、bsim等不同等级精度直接影响噪声和寄生参数。前仿一定要选用PDK推荐的精度等级别为了速度牺牲模型精度。积分带宽取了吗没取很多新手看到噪声密度曲线就以为完事了忘了积分。密度单位是V/√Hz必须乘以带宽的平方根才有意义。激励源有没有污染信号比如电压源带内阻、时钟信号有额外抖动这些都会让仿真结果偏离理想手算假设。电路是否真的工作在你假设的工作模式比较器有没有进入不合适的工作区第二级有没有饱和或截止这些在DC工作点里一目了然。5.3 仿真速度与收敛性优化被仿真速度卡住也是常态。两级比较器的蒙特卡洛跑300次如果testbench过于复杂可能一整天都跑不完。我一般这样优化在噪声和失调仿真时把比较器后面的数字链路全部去掉只保留比较器核心和必要的负载瞬态仿真的时间步长不要设死太小的固定步长可以采用带自适应步长的设置同时在跳变段强制更细的步长蒙特卡洛则优先用ADE XL的并行核能多核并行就多核并行。再说一个非常实用的收敛技巧如果比较器在瞬态仿真中发生振荡或长时间不自检尝试把仿真器的“reset”初始条件设成“user specified”并手动给输出节点一个初值相当于给电路一个明确起点。很多时候比较器难收敛并非电路真有问题而是初值落在了一个不稳定的中间态上。给完初值半天跑不动的仿真经常十几分钟就收工了。6. 一点仿真之外的心得6.1 先手算、后仿真、再流片验证的习惯说个我自己的习惯拿到一个比较器设计任务先花半天时间把手算和结构分析做一遍哪怕是粗略的数量级也行。噪声、失调、延时的手算公式虽然不准但它们能给你一个重要的“常识范围”。有了这个范围仿真结果出来你一眼就能判断合不合理。仿真不是万能药。早几年我见过一个团队电路全靠仿真调参调出来后一切指标都很好结果流片回来芯片根本不工作。后来定位发现是电源上电顺序的问题而这在纯前仿的testbench里根本没被覆盖。所以我的建议是仿真阶段就要主动构建更贴近真实系统的testbench比如加入电源斜坡上电、时钟源抖动、参考电压的建立过程。这样能在流片前暴露更多系统级问题而不是只盯着模块指标。6.2 三个“一定”和三个“不要”一定在每个corner下都跑一遍噪声、失调、延时的组合别只看tt。一定是看完整testbench系统的结果而不是只盯着比较器单模块的输出曲线。一定把仿真结果跟手算数量和系统时序预算交叉验证确认每个数字都有工程意义。不要以为增益高了就万事大吉增益之外那三项才是决定成败的关键。不要过分依赖单一仿真工具不同仿真器和模型版本之间有小概率的行为差异关键结论要用两种方式交叉确认。不要忽视版图后仿与温度漂移很多前仿看不出来的问题是版图寄生和温度效应共同作用才爆发的。6.3 扩展从比较器到系统级验证这篇文章虽然聚焦两级比较器的噪声、失调、延时仿真但核心方法是可以迁移的。任何模拟模块仿真本质上都在做三件事确定小信号性能、量化统计偏差、确认大信号瞬态响应。比较器只是把这三件事集中在了三个最容易翻车的指标上。如果你能把上面这套流程跑熟再去做运放、LDO、甚至连SAR ADC全链路的仿真思路都是相通的。最后再分享一个小技巧仿真结果和数据曲线一定要养成边跑边记录的习惯。我自己会用一张Excel表记录每个版本的噪声rms、失调σ、三个过驱下的延时以及对应的corner和温度。出了异常结果翻表就能快速定位是哪个条件变了。这个习惯帮我在后来多次版本迭代中省了大量返工时间建议你也从一开始就建立起来。