ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

运放CMRR的蒙特卡洛仿真:Cadence完整流程与工程实践

运放CMRR的蒙特卡洛仿真:Cadence完整流程与工程实践 做运放设计这些年我有个很深的体会DC增益和带宽是面子CMRR才是里子。CMRR不够后级电路再漂亮共模噪声一过来照样全线崩盘。更麻烦的是CMRR这东西在流片前不看分布根本不知道会差到什么程度tt corner只能给你一个想象中的完美值。这也是为什么在Cadence里做蒙特卡洛仿真去分析CMRR是运放性能分析里绕不开的一项基本功。这篇文章我就把CMRR的原理、Cadence蒙特卡洛仿真的完整流程、以及我踩过的一些坑一次性讲完力求看完就能直接上手复现。1. 为什么CMRR值得专门做蒙特卡洛分析1.1 CMRR到底在衡量什么CMRR全称Common Mode Rejection Ratio中文叫共模抑制比定义是差模增益和共模增益的比值CMRR Ad / Acm工程上习惯用分贝表示CMRR(dB) 20 * log10(Ad / Acm)。这个指标描述的是运放对“同时出现在两个输入端的信号”的抵抗能力。理想运放只响应两个输入端的差值完全不理会共模分量所以共模增益Acm为0CMRR无穷大。但实际运放做不到差分对管的Vth、gm不完全相同尾电流源的输出阻抗不是无穷大电流镜负载的镜像比例也有偏差这些因素都会让共模输入在输出端产生分量。举一个实际场景传感器信号经过长线缆进入运放线缆上感应到的工频噪声、地电位差等干扰会同时耦合到正负输入端形成共模电压。如果运放CMRR只有60dB而干扰是1V等效到输入端的误差就是1mV对很多精密放大应用来说已经是不可接受了。低频时CMRR通常最高随着频率升高由于电路寄生电容和环路增益下降CMRR会逐渐恶化。所以评估CMRR一般约定看低频段的值比如100Hz或1kHz。1.2 工艺偏差从哪些路径影响CMRR这是理解蒙特卡洛仿真结果的关键。流片后的每一颗芯片工艺参数都不是标称值而是围绕某个中心值随机分布的。CMRR又是一个严重依赖对称性的指标工艺偏差对它的影响非常直接。CMRR恶化的主要来源有三类输入差分对的失配Vth失配和gm失配会让差分对在小信号下输出不平衡共模输入变化时两侧电流变化量不一致直接转化为差模输出。负载电流镜的失配对于常见的电流镜负载两侧镜像电流比例不完全是1:1共模输入引起的尾电流波动无法被完全抵消从而产生输出误差。尾电流源的有限输出阻抗共模电压变化会导致尾电流源的漏端电压变化尾电流随之波动。尾电流源的输出阻抗越低这个波动越大共模增益就越高。这三条路径对CMRR的影响程度不一样。经验上mismatch的影响远大于全局process偏差。原因是process偏差只改变所有同类型器件的整体快慢而对称结构中的两个器件仍然保持相对一致mismatch则是同一颗芯片上相邻器件之间的随机差异直接破坏对称性。这一点在做蒙特卡洛时会非常明显只跑process-onlyCMRR分布很窄跑mismatch分布立刻拉开。2. 蒙特卡洛仿真的基本原理与Cadence环境准备2.1 Monte Carlo仿真解决什么问题常规的corner仿真比如tt、ff、ss只能告诉你工艺处于某个极端角时电路的性能。但真实晶圆上的参数不是取某个固定角而是连续分布的。哪怕同一片晶圆、相邻的两颗die参数都会略有不同。蒙特卡洛仿真做的事情就是根据foundry提供的统计模型让每个器件的参数在每一轮仿真中按照独立同分布的随机规律取值跑几百次之后就能得到电路性能的分布。比如CMRR在200次蒙特卡洛中的最小值、均值、3σ、不满足spec的比例这些是corner仿真给不出来的。对CMRR这种“对称性敏感指标”来说蒙特卡洛几乎是唯一能在流片前预判良率的手段。你可以在tt corner下把CMRR调到100dB但如果失配严重量产时可能一大批芯片只有60dB。没有蒙特卡洛这个问题要到量产测试才会暴露。2.2 Cadence里process和mismatch的统计模型要跑蒙特卡洛首先得保证PDK提供的模型库里有统计模型。以常见的spectre模型为例模型文件中通常用section或subckt参数来区分普通工艺角模型和统计模型比如普通cornertt、ff、ss统计模型mc、stat、mismatch等不同foundry命名习惯差别很大有的叫mc_all、mc_mismatch、mc_process有的把process和mismatch分开两个section。跑之前一定要查PDK文档确认自己加载的模型section支持蒙特卡洛统计。Cadence的蒙特卡洛支持三种模式process only所有同类型器件按全局统计参数随机变化保持相对匹配。mismatch only只考虑邻近器件之间的随机失配。process and mismatch两者都考虑最接近真实情况。对CMRR来说强烈建议至少跑process and mismatch或者mismatch only只跑process only基本看不到CMRR的显著变化。2.3 仿真器选择和基础配置Cadence环境下仿真器主要用spectre速度敏感的场景可以用APSAccelerated Parallel Simulator。APS对蒙特卡洛的加速效果非常明显尤其在大规模MC时能省下几倍到十几倍的时间。启动APS的方式是在ADE里的Simulator选项选择spectre然后在setup里勾选APS相关选项或者直接用命令行选项。在跑蒙特卡洛之前有三件事必须确认模型库的section是否包含统计模型并且已经正确加载。测试bench的DC工作点正常所有管子都在预期的饱和区。输入共模电压设置合理不要靠近运放输入共模范围的边界否则MC中部分样本可能进入不正常的工作区。3. CMRR测试电路搭建两种常用测法3.1 双端口测法差模增益和共模增益分开测这是最标准、最不容易出错的CMRR仿真方法。思路很简单分别测出差模增益Ad和共模增益Acm再相除换算成dB。具体到Cadence schematic里通常这样搭建放置运放symbol正输入端接一个理想电压源VCM提供直流共模工作点负输入端接另一个理想电压源或直接通过电感/大电阻接地。差模激励在正输入端串联一个AC源幅度设为0.5V、相位0°在负输入端串联另一个AC源幅度设为0.5V、相位180°。这样两输入端之间的差模小信号为1V共模小信号为0V。共模激励把两个AC源改为同相即正负输入端都接幅度0.5V、相位0°的AC源。此时差模小信号为0V共模小信号为1V。输出端挂上负载电容和负载电阻模拟实际应用场景。仿真时分别跑两次AC分析第一次得到Vout_dm第二次得到Vout_cm。Ad Vout_dm / 1VAcm Vout_cm / 1VCMRR 20 * log10(Ad / Acm)。很多人第一次跑出来CMRR是负值就是因为差模和共模两种状态下输出端看的是同一个节点电压而Acm的相位和Ad的相位可能差180°取对数前没有取模。用Calculator计算时记得对Ad/Acm取magnitude或者用dB20的绝对值。如果用的是理想电压源AC幅度取多少无所谓因为增益是比值最后会约掉但取1V或0.5V方便直接读数推荐这么做。3.2 单位增益跟随器测法双端口测法最标准但每次都要跑两次AC在蒙特卡洛场景下会让仿真时间翻倍。另一种工程上常用的间接测法是把运放接成单位增益跟随器反相输入端和输出短接正相输入端加包含DC偏置和AC扰动在内的共模信号然后测输出端对输入端的闭环增益。单位增益跟随器结构下输出端的AC响应近似等于1 /1 CMRR也就是说闭环增益越小CMRR越高。这种做法优点是单次AC就能出结果适合快速比较不同电路的CMRR高低。缺点是不够精确因为闭环增益还受环路增益、输出阻抗等因素影响更适合定性和相对比较。我的建议是初期学习和调试testbench用双端口测法确保数据可靠MC阶段如果觉得时间太长再考虑用跟随器法做快速扫描但最终交付数据还是以双端口测法为准。3.3 AC扫描范围与仿真精度设置AC扫描范围建议从1Hz或10Hz扫到比运放GBW高一个数量级的频率比如GBW是10MHz就扫到100MHz甚至1GHz。这样才能同时看到低频平台区和高频CMRR滚降的完整曲线。扫描点数取100 points/decade或者直接用linear总共几百个点不需要太密MC时点数太多会明显拖慢速度。仿真精度方面spectre的默认精度对绝大多数运放AC分析都够。如果发现曲线在高频有毛刺或者不光滑可以尝试把仿真器的精度从moderate改成conservative或者减小最大步长。但别盲目提高精度MC下每个样本的计算时间都很宝贵。4. 蒙特卡洛仿真核心操作从ADE L到ADE XL4.1 用ADE L快速跑通流程对于只关心单工艺角、单corner下的CMRR分布ADE L足够。操作路径是在ADE L里选择Analysis选中AC分析设置频率范围。打开Monte Carlo Sampling选项勾选Process和Mismatch设置Number of Runs。确认Model Library Setup中加载了正确的统计section。运行仿真仿真结束后在Results里的Direct Plot或Calculator中查看每个run的CMRR值。先用50个runs跑一遍看整个流程能否跑通。MC仿真的收敛时间会明显长于单run AC仿真50个runs可能需要几分钟视电路规模和机器性能而定。4.2 ADE XL来做完整的MC统计如果要做多corner对比、批量统计、良率分析推荐直接用ADE XL。它的优势是可以把多个corner、多个MC配置放在同一个job里批量跑。能保存所有runs的数据支持后续二次分析。自带直方图、良率统计和worst case定位功能。ADE XL中创建MC job的要点在Testbenches里选中当前schematic和config。在Corners里定义要跑的工艺角比如tt、ff、ss每个corner下都可以单独配置MC的模型section。在Analyses里添加AC分析勾选Monte Carlo采样选项。在Outputs里用Calculator构建输出表达式把CMRR的计算公式写进去。运行整个job结束后在Results模块里看统计表和直方图。如果testbench本身是双端口测法而你又想在一个MC run内同时得到差分和共模结果可以借助设计变量控制两个AC源的幅度。比如定义变量cm_mode差模AC源的magnitude设为(1-cm_mode)共模AC源的magnitude设为cm_mode然后在ADE XL里建两个AC analysis一个设cm_mode0一个设cm_mode1。这样同一个MC样本下两个AC结果可以合并计算出CMRR。这个技巧我在多个项目中使用是提高MC效率比较实用的办法。4.3 输出表达式与统计量提取在ADE XL的Outputs里输入CMRR表达式时需要从两个AC结果中分别取低频点数据。以100Hz为例如果差模AC结果名称是ac_dm共模AC结果名称是ac_cm用Calculator里的getData和value函数表达式大概长这样CMRR_100Hz 20 * log10( mag( value( getData(VOUT ?result ac_dm) 100 ) / value( getData(VOUT ?result ac_cm) 100 ) ) )不同版本的Cadence函数名称略有差异但思路一样先把节点电压取出来再作比值和对数。统计量方面至少要看这几个Mean所有样本CMRR的均值。Std Dev标准差反映分布宽度。Min最差样本的CMRR。Spec Fail落在spec线以下的样本比例。直方图建议以20log尺度的CMRR为横轴bin数取10到20低于10个bin看不出分布形状太高了每个bin里样本太少噪声很大。4.4 常见MC参数经验值参数建议值说明初跑样本数50验证流程观察大致量级正式样本数200~500统计意义足够时间可接受Random Seed固定值如1固定seed可以复现结果扫描点数100/dec 或 500 total点数太多拖慢MC仿真器APS多线程MC加速明显固定seed这点很容易被忽略。同一套电路和模型固定seed后跑两次应该完全一致这在排查问题和对比设计改动时非常方便。如果seed每次不同你很容易把随机噪声当成设计差异。5. 结果分析与设计优化方法5.1 从直方图和统计表判断设计是否可靠拿到MC结果后先别急着看均值先看min值和不良率。均值好看不代表良率高CMRR分布如果太宽均值90dB但tail拖到50dB照样不能用。举一个实际案例。某两级运放tt corner下CMRR仿真值为92dB看着很漂亮。跑了200个MC样本统计结果如下指标数值Mean85.3 dBStd Dev9.6 dBMin58.2 dB低于70dB的样本数17个等效良率91.5%如果spec要求所有芯片CMRR不低于70dB这个设计就是不达标的有8.5%的不良率。这在量产时是很大一笔成本。tt corner的92dB完全体现不了这个问题。5.2 定位影响CMRR的关键器件如果MC结果显示CMRR分布过宽或min值过低需要定位是哪个模块造成的。我常用的方法有三种分别跑process-only和mismatch-only两组MC对比CMRR分布。如果mismatch-only的分布已经非常宽说明问题主要出在对称性失配如果process-only也很宽则更多是全局工艺参数导致的增益变化。对关键器件逐个注入失配。比如在输入差分对的一个管子源端串联一个1mV的失调电压源单独看CMRR下降了多少再在负载电流镜上做同样操作。下降幅度最大的就是贡献最大的失配源。对比改进前后的拓扑和尺寸。把尾电流源管子长度加倍或者把输入对管面积加大看MC分布是否明显收窄。实际项目中遇到过最常见的情况尾电流源输出阻抗不够导致共模增益偏大。解决方式是把尾电流源改成cascode结构或者增加尾电流源管的L使其输出阻抗提高一个量级。改完之后CMRR分布整体上移效果非常明显。5.3 改进设计的典型思路针对CMRR的蒙特卡洛结果不佳优化方向按优先级排序尾电流源cascode尾电流源或者加L提高输出阻抗这是最直接有效的手段。输入差分对增大W和L减小Vth失配同时版图上用common-centroid布局。负载电流镜增大L和面积把镜像比做准两侧管子尽量靠近。输入共模电平有些CMRR恶化是因为器件工作在增益偏低的工作点调整偏置让输入对管处于最佳gm区也有帮助。回到上面的例子把尾电流源改成cascode输入对管面积增加30%后重新跑200个MC样本min值从58.2dB提升到74.6dB低于70dB的样本只有2个良率接近99%。这就是蒙特卡洛仿真对设计改进最直接的价值。6. 常见问题与排查技巧实录6.1 MC仿真的典型报错和解决方法现象可能原因处理建议所有MC run结果完全相同模型库没有加载统计section打开Model Library Setup确认选中mc/stat/mismatch相关section报错No statistical models found当前模型section不支持MC换成PDK提供的统计模型查阅PDK文档确认名称MC仿到一半不收敛某些样本工作点偏移器件进入线性区或截止区检查输入共模范围和偏置缩短步长改用APS的conservative精度CMRR为负值Acm与Ad相位相差180°取对数前没有取模在计算器中用mag()或abs()包裹Ad/AcmMC分布出现双峰样本数过少或部分样本进入不同工作状态增加run数检查所有样本的DC工作点是否一致MC结果和corner差异过大mismatch对CMRR影响远超预期单独跑mismatch-only确认重点检查对称结构和尾电流源ADE XL中两个AC结果无法合并变量控制AC源的设置不正确用cm_mode变量控制ac magnitude确认两个analysis分别对应0和16.2 MC效率优化心得蒙特卡洛仿真最让人头疼的就是时间。200个runs每个runs还要跑两次AC如果电路规模再大一点一跑就是好几个小时。我常用的优化手段把AC扫描范围收紧比如只扫10Hz到100MHz扫描点数降到50/dec。低频平台区只需要少数几个点。先在tt corner下确认电路工作点和AC响应没问题再开MC不要拿着问题电路直接跑几百次。先用50runs试跑看分布量级和稳定性。如果50和100的统计结果差别不大就可以安心跑200如果差别大可能模型或电路有异常。用APS多线程模式尤其对于同时跑process和mismatch的场景加速非常可观。计算CMRR时可以只取100Hz或1kHz的输出值不需要保存全频带数据能省不少存储和IO时间。6.3 几件跑MC时容易被忽视的事第一个是seed固定问题。经常有人跑了两版MC发现分布不一样就去怀疑电路改坏了。其实只要seed不固定两次结果本来就不同。我习惯在工程记录里写明模型版本、seed值、样本数、corner配置这样任何一次MC结果都能追溯到具体环境。第二个是要留出testbench的DC工作点余量。蒙特卡洛跑的是随机样本有些样本的器件参数偏离标称值较多会导致DC工作点明显偏移。如果输入共模电压原本就卡在范围边缘这些样本直接崩掉AC结果毫无意义。设计testbench时把输入共模点放在范围中间是减少不收敛最有效的办法。第三个是不要只盯着最大值和平均值。CMRR的tail才是决定良率的关键通常看min值和3σ下界。如果min值离spec很近即使均值很好看也必须bother。设计余量至少要留10dB以上才能抵抗MC分布的尾部风险。第四个是关于新版PDK的模型改动。我遇到过PDK升级后同样的电路MC分布整体偏移好几个dB的情况。不是说PDK错了只是统计模型的参数更新了。这时候一定要对比新旧模型的MC结果确认是模型变化还是电路变化别稀里糊涂去改电路。CMRR的蒙特卡洛仿真说到底是把“量产不确定性”提前到设计阶段来管理。tt corner只能证明电路在理想对称工艺下能做多好蒙特卡洛才能告诉你仿真良率大概是多少、尾部最差能差到什么程度。每次跑完MC看到直方图和统计表我一般会顺手把这版结果存档标注好seed、模型版本和电路版本。等后续改版时再跑一轮对比两版分布就能非常清楚地知道每次优化到底换来了多少良率提升。这种实践习惯比单纯会点按钮有价值得多。
返回列表