
Bandgap电路这个东西做模拟IC的都不陌生。它是整个芯片里最“稳”的那块基石——基准电压源负责给LDO、ADC、DAC、比较器这些模块提供一个几乎不随温度和电源电压变化的参考电压。但“几乎不随”这四个字恰恰是最难做到的。你仿真的时候看着27℃下输出1.2V挺漂亮温度一拉到-40℃或者125℃可能就飘了几十毫伏再换个工艺角SS角下直接掉出规格。所以Bandgap的仿真从来不是跑个DC就完事高低温扫描和工艺角Process Corner仿真是必须啃下来的硬骨头。这篇内容就是围绕Cadence Virtuoso这个平台把Bandgap电路的高低温仿真和TT/SS/FF工艺角仿真从头到尾捋一遍。我会从仿真前的准备工作讲起包括测试平台的搭建、温度扫描的设置、工艺角模型的加载再到结果的分析和常见问题的排查。不管你是刚接触Virtuoso的在校学生还是刚入行不久、第一次独立跑Corner仿真的工程师这篇内容都能让你少走弯路。我踩过的坑你就不用再踩一遍了。1. 仿真之前先把测试平台搭对很多人拿到一个Bandgap电路第一反应是直接打开ADE L选个DC仿真点一下Run看看输出。这么做不是不行但你会发现后面做温度扫描和Corner的时候整个流程特别别扭改一个参数要重新配一遍。问题出在测试平台Testbench没有搭好。一个好的Testbench应该让你在后续做各种仿真时只需要改仿真设置而不需要动电路连接。1.1 Bandgap测试平台的核心组成一个完整的Bandgap测试平台至少包含以下几个部分待测电路DUT也就是你的Bandgap核心电路包括启动电路、核心放大器和电流镜等。电源激励通常是理想电压源给Bandgap提供VDD。注意这里建议先用理想源不要一上来就加真实的电源模型否则你分不清输出漂移是Bandgap本身的问题还是电源的问题。负载Bandgap的输出通常会驱动一些电路所以在测试平台上加一个等效负载。最简单的做法是加一个理想电流源或者一个大电阻模拟实际负载情况。如果Bandgap输出还带电容也要加上。温度设置在ADE中通过Temperature参数设置或者用变量来控制。工艺角设置通过Model Libraries加载不同的工艺角模型。这里有个细节容易被忽略Bandgap的启动电路。在仿真时如果启动电路没有正确工作你可能看到输出一直是0V然后误以为是电路坏了。所以在Testbench里建议加一个启动脉冲或者初始条件设置确保电路能正常启动。我通常会在电源上做一个斜坡从0V升到VDD这样启动电路就能正常触发。1.2 用变量管理仿真参数在ADE L里面我强烈建议把所有关键参数都设成变量而不是写死。比如vdd电源电压设为变量方便后面做电源扫描。temp温度设为变量方便做温度扫描。corn工艺角名称设为变量方便切换Corner。这样做的好处是你只需要在ADE的Variables窗口里改一下值整个仿真就跟着变。特别是做Corner仿真的时候你可以用Ocean脚本或者ADE XL来批量跑变量管理是基础。具体操作在ADE L的Variables菜单里点击Copy From Cellview或者手动添加变量。然后在电路图中把电源电压、温度等参数用变量名代替。比如电源电压不要直接写1.8而是写vdd。温度在ADE的Setup→Temperature里填temp。1.3 输出表达式的设置Bandgap仿真你关心的输出通常包括基准电压Vref直接看输出节点的电压。温度系数TC需要计算公式是TC (Vref_max - Vref_min) / (Vref_typical × ΔT) × 10^6单位是ppm/℃。电源抑制比PSRR需要做AC仿真。功耗看电源电流。在ADE里你可以直接把这些表达式写进Outputs窗口。比如Vref就是/VrefTC可以用Calculator或者Ocean脚本算。我习惯在ADE里先跑一个温度扫描然后把结果导出到Calculator里算TC。提示TC的计算公式里ΔT是温度范围Vref_typical是常温下的基准电压。如果你做的是-40℃到125℃的扫描ΔT就是165℃。这个公式算出来的TC单位是ppm/℃是衡量Bandgap性能的核心指标。2. 高低温仿真从-40℃到125℃的完整扫描高低温仿真是Bandgap最基础的仿真之一。你需要在不同温度下看基准电压的变化算出温度系数。这个过程在Virtuoso里其实很简单但有几个关键设置容易出错。2.1 温度扫描的两种方式在Virtuoso里做温度扫描有两种方式方式一DC仿真 Temperature Sweep这是最常用的方式。在ADE L里选择Analyses→Choose然后选dc。在DC分析设置里勾选Sweep Variable选择Temperature设置扫描范围比如-40到125步长1℃或者5℃。然后点Run仿真器会在每个温度点做一次DC分析最后把结果画成曲线。这种方式的好处是简单直接适合快速看趋势。缺点是如果电路比较复杂每个温度点都做一次完整的DC收敛速度会慢一些。方式二使用Parameter Sweep如果你已经有一个温度变量temp可以在ADE里用Parametric Analysis对temp进行扫描。这种方式和方式一本质一样只是操作路径不同。我一般用方式一因为设置更直观。具体步骤打开ADE LLoad State确保电路和模型都加载好了。点击Analyses→Choose选dc。在DC Analysis窗口里勾选Sweep Variable选Temperature。设置Start-40Stop125Step1。在Outputs里添加Vref表达式。点Run。仿真跑完后你会看到Vref随温度变化的曲线。理想的Bandgap曲线应该是一个抛物线中间有个峰值或者谷值两端稍微低一点或高一点。如果曲线是单调上升或下降的说明你的Bandgap温度补偿没做好。2.2 温度系数的计算与优化跑完温度扫描接下来就是算TC。在ADE里你可以用Calculator工具打开Calculator选择Waveform。选中Vref的曲线。用ymax和ymin函数找到最大值和最小值。用value函数在27℃处取Vref的典型值。手动代入公式算TC。或者更简单直接在Ocean脚本里写tc (ymax(Vref) - ymin(Vref)) / (value(Vref, 27) * 165) * 1e6这个脚本可以直接在ADE的CIW窗口里跑算出来的就是TC值。如果TC不达标比如超过了50ppm/℃你需要回去调电路。常见的优化方向调整R1和R2的比例Bandgap的核心是PTAT电流和CTAT电流的加权求和电阻比例直接决定温度补偿的效果。调整BJT的个数比通常用8:1或者24:1这个比例影响PTAT电压的斜率。调整运放的失调运放的失调电压会直接叠加到Bandgap输出上影响TC。可以通过增大运放增益或者做chopping来减小失调。我遇到过一种情况温度扫描曲线在低温段翘起来了高温段又掉下去整体像个“M”形。这通常是因为PTAT和CTAT的补偿点没对准需要重新计算电阻比例。具体做法是先单独仿真PTAT电压和CTAT电压随温度的变化看看它们的交点在哪里然后调整电阻让加权后的曲线在目标温度范围内最平。2.3 高低温仿真中的收敛问题温度扫描最容易遇到的问题就是收敛失败。特别是在极端温度下比如-40℃或125℃仿真器可能报“DC convergence failed”。原因通常是模型在极端温度下参数变化大比如BJT的β值在低温下会下降很多导致偏置点偏移。启动电路在极端温度下失效如果启动电路设计不好低温下可能无法启动。数值收敛问题仿真器的迭代算法在极端条件下可能不收敛。解决办法增加迭代次数在ADE的Simulation→Options里把maxiters调大比如从100调到500。使用Nodeset在电路里关键节点加Nodeset给仿真器一个初始猜测值。分段扫描先扫-40到27再扫27到125看看哪一段出问题。检查启动电路在极端温度下单独仿真启动电路确保它能正常工作。注意如果温度扫描在某个温度点突然不收敛不要急着改仿真器设置先检查电路本身。很多时候是电路在那个温度下真的有问题比如某个管子进入了亚阈值区导致偏置点突变。3. 工艺角仿真TT/SS/FF的设置与实战工艺角仿真是Bandgap设计中最关键的一环。因为芯片制造过程中工艺参数会有偏差导致晶体管的阈值电压、迁移率、电阻值等都会变化。TT是典型角SS是慢角FF是快角。Bandgap必须在所有工艺角下都能正常工作输出偏差在规格范围内。3.1 工艺角模型的加载在Virtuoso里做工艺角仿真核心是加载不同的模型库。通常晶圆厂会提供一套模型文件里面定义了不同工艺角的参数。比如tt.lib典型角ss.lib慢角ff.lib快角sf.lib慢NMOS快PMOSfs.lib快NMOS慢PMOS在ADE L里通过Setup→Model Libraries加载这些文件。你可以一次加载多个然后在Simulation→Corner里定义不同的Corner组合。具体操作打开ADE LSetup→Model Libraries。添加模型文件比如/path/to/tt.libSection选tt。再添加/path/to/ss.libSection选ss。以此类推把所有需要的Corner都加进去。然后在ADE的Simulation→Corner里新建Corner比如TT、SS、FF每个Corner对应一个模型Section。这里有个坑不同晶圆厂的模型文件格式不一样。有的用.lib有的用.scs有的用.m。加载的时候要看清楚Section的名字不要选错了。我有一次把ss选成了sf结果仿真结果完全不对排查了半天才发现是模型选错了。3.2 用ADE XL批量跑Corner如果你只有几个Corner用ADE L手动切换也能凑合。但如果你要做完整的Corner分析比如TT/SS/FF/SF/FS五个角再加上温度扫描手动跑就太慢了。这时候用ADE XL或者ADE GXL会方便很多。ADE XL的基本流程打开ADE XL新建一个Cellview。在Data View里把Testbench加进去。在Corners里定义所有工艺角。每个Corner可以指定不同的模型Section。在Parameters里定义温度变量比如temp设置扫描范围。在Outputs里添加Vref、TC、功耗等指标。点RunADE XL会自动跑所有Corner和温度组合最后生成一个汇总表格。ADE XL的好处是你可以一眼看到所有Corner下的结果哪个角不达标一目了然。而且它支持Ocean脚本可以自动化后处理。我通常会在ADE XL里设置这样的Corner组合Corner名称NMOS模型PMOS模型温度范围TTtttt-40~125SSssss-40~125FFffff-40~125SFssff-40~125FSffss-40~125这样跑下来你能全面了解Bandgap在不同工艺和温度下的表现。3.3 工艺角仿真中的常见问题工艺角仿真最容易出的问题是某些Corner下电路不启动。比如SS角下晶体管速度慢启动电路可能无法在规定的启动时间内把Bandgap拉起来。或者FF角下启动电路又太强导致电路进入另一个简并点。解决办法检查启动电路的裕度在SS角下启动电路的驱动能力要足够在FF角下又不能太强。通常需要折中设计。增加启动时间在Testbench里把电源斜坡的时间加长给启动电路更多时间。仿真启动过程用Transient仿真看Bandgap输出从0V到稳定值的过程。如果输出一直不启动说明启动电路有问题。另一个常见问题是SS角下TC变差。这是因为SS角下BJT的β值下降运放的增益也下降导致失调增大TC恶化。这时候可能需要增加运放的增益或者调整电阻比例来补偿。提示在做Corner仿真之前建议先跑一遍TT角下的温度扫描确认电路基本功能正常。如果TT角都有问题先别急着跑Corner把TT角调好再说。4. 仿真结果的分析与问题排查仿真跑完了结果也出来了但怎么判断结果好不好出了问题怎么排查这一部分聊聊结果分析和常见问题的排查思路。4.1 如何判断Bandgap仿真结果是否合格判断Bandgap性能主要看几个指标基准电压Vref在TT角、27℃下应该在设计目标附近比如1.2V±1%。温度系数TC通常要求小于50ppm/℃高精度应用要求小于20ppm/℃。电源调整率Vref随VDD的变化通常要求小于1mV/V。PSRR低频PSRR通常要求大于60dB。功耗根据应用需求通常在几十微安到几百微安之间。启动时间从电源上电到Vref稳定的时间通常要求小于1ms。在ADE XL的汇总表格里你可以直接看到每个Corner下的这些指标。如果某个Corner下TC超标或者Vref偏差太大就需要回去优化电路。我一般会做一个这样的表格来记录结果指标TTSSFFSFFS规格Vref27℃1.2001.1951.2051.1981.2021.2±12mVTC(ppm/℃)153520252250功耗(μA)5045554852100启动时间(μs)2003501502501801000如果所有指标都在规格内恭喜你Bandgap设计基本过关了。如果有超标就要针对性地优化。4.2 温度曲线异常的排查思路温度曲线异常是最常见的问题。我总结了几种典型的异常曲线和对应的排查方向曲线单调上升或下降说明温度补偿完全没起作用。检查PTAT和CTAT电流是否正常运放是否工作在线性区电阻比例是否算错。曲线是抛物线但峰值偏离27℃说明补偿点偏了。调整电阻比例让峰值移到27℃附近。曲线在低温段或高温段突然翘起通常是某个晶体管进入了亚阈值区或者饱和区边缘导致偏置点突变。检查所有管子的工作区域确保在温度范围内都处于饱和区。曲线有台阶或跳变可能是启动电路在某个温度下重新触发或者运放发生了振荡。用Transient仿真看波形确认是否有振荡。排查的时候我习惯先把PTAT电压和CTAT电压单独画出来看看它们各自随温度的变化。如果PTAT电压的斜率不对说明BJT的比例或者偏置电流有问题如果CTAT电压的斜率不对说明BJT的VBE温度特性有问题。然后再看运放的输出确认运放是否正常工作。4.3 Corner仿真不收敛的解决技巧Corner仿真不收敛比温度扫描不收敛更让人头疼。因为Corner涉及模型切换仿真器需要重新建立偏置点。常见的解决办法使用Initial Condition在关键节点设置初始电压帮助仿真器收敛。比如在Bandgap输出节点设置ic1.2。分步仿真先跑TT角保存状态然后以TT角的结果作为初始条件跑SS角。在ADE里可以用readns和writens命令实现。调整仿真器选项在Simulation→Options里把reltol调大一点比如从1e-3调到1e-2牺牲一点精度换收敛。检查模型文件确认Corner模型文件没有语法错误Section名字正确。简化电路如果电路太复杂可以先简化比如去掉启动电路手动给一个初始条件看看核心电路是否能收敛。我遇到过最诡异的一次是SS角下仿真一直不收敛查了半天发现是模型文件里有个参数写错了。所以如果所有方法都试过了还是不收敛不妨回去检查一下模型文件。注意不收敛不一定代表电路有问题有时候只是仿真器设置的问题。但也不能掉以轻心因为有些电路在真实芯片上确实会存在简并点导致启动失败。所以仿真不收敛的时候既要排查仿真设置也要排查电路本身。5. 一些提高仿真效率的实操经验做Bandgap仿真尤其是Corner仿真往往要跑很多次。如果每次都要手动设置效率太低。这一部分分享一些我平时提高效率的经验。5.1 用Ocean脚本自动化仿真Ocean是Virtuoso的脚本语言可以把整个仿真流程自动化。比如你可以写一个脚本自动跑TT/SS/FF三个角自动算TC自动生成报告。这样每次改完电路跑一下脚本就行了不用手动点来点去。一个简单的Ocean脚本示例; 打开ADE L session axlGetWindowSession() ; 加载State axlLoadState(session myState) ; 设置温度扫描 axlSetAnalysis(session dc ?sweepVar temp ?start -40 ?stop 125 ?step 1) ; 跑仿真 axlRunSimulation(session) ; 获取结果 vref axlGetWaveform(session Vref) ; 算TC tc (ymax(vref) - ymin(vref)) / (value(vref, 27) * 165) * 1e6 ; 打印结果 printf(TC %f ppm/C\n tc)这个脚本只是示例实际使用时要根据你的State名字和输出节点名字调整。Ocean脚本的好处是你可以把它保存下来下次直接跑不用重新设置。5.2 用ADE XL的Run Options加速ADE XL在跑Corner的时候默认是串行跑的也就是一个Corner跑完再跑下一个。如果你机器核心多可以设置并行跑。在ADE XL的Run Options里把Number of Jobs调大比如设成4或者8这样多个Corner可以同时跑速度能快好几倍。另外ADE XL支持Save State你可以把设置好的Corner组合保存下来下次直接Load不用重新配。5.3 结果数据的导出与后处理仿真跑完后结果数据通常需要导出到Excel或者MATLAB里做进一步分析。在ADE里你可以用Export功能把波形数据导出成CSV格式。或者用Ocean脚本直接写文件; 导出Vref波形到CSV ocnPrint(?output vref.csv ?numberNotation engineering vref)导出的CSV文件可以用Excel打开画图、算TC都很方便。我通常会把所有Corner的结果导出来放在一个Excel表格里做一个汇总对比。5.4 一些容易忽略的仿真设置最后分享几个容易忽略但很重要的仿真设置精度设置在Simulation→Options里reltol默认是1e-3对于Bandgap这种高精度电路建议调到1e-4甚至1e-5否则仿真结果可能不够准。温度设置ADE里的温度单位是摄氏度不要填成开尔文。模型库顺序如果加载了多个模型库注意顺序后面的会覆盖前面的。通常把Corner模型放在最后。节点初始条件对于有简并点的电路加Nodeset或者Initial Condition能大大提高收敛性。我在实际项目中通常会把这些设置写成一个Checklist每次新建Testbench的时候对着检查一遍避免遗漏。这个习惯帮我省了很多调试时间。Bandgap的仿真说到底就是耐心加细心。温度扫描和Corner仿真本身不复杂复杂的是结果分析和问题排查。希望这篇内容能帮你在Virtuoso里更顺畅地完成Bandgap仿真少踩几个坑。如果你在仿真过程中遇到什么奇怪的问题欢迎一起交流。