ARTICLE DETAIL

资讯详情

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

LDO仿真全流程详解:基于Cadence Virtuoso从原理图到OCEAN脚本

LDO仿真全流程详解:基于Cadence Virtuoso从原理图到OCEAN脚本 说句大实话模拟电源设计里最卡人的往往不是拓扑选型而是第一次把一颗 LDO 真正放进 Cadence Virtuoso 里跑通的那一步。见过太多刚接触版图和仿真的同学手册翻了一堆打开 Schematic Editor 之后盯着空白画布发愣——放什么管子、接什么偏置、跑哪些仿真、怎么看结果每一步都可能被劝退。这篇我就拿一颗 1.5V 输出的低压差稳压器 LDO 当靶子把从建库、搭原理图、写 testbench 到用 OCEAN 脚本跑直流、交流、瞬态和稳定性仿真的完整链路拆开讲。目标很清楚不讲推导玄学只讲能复现的操作所有参数、脚本、检查点都会给到你照着敲就能跑出结果。适合刚接触模拟 IC 设计的学生也适合从版图转前仿的工程师或者纯粹想把 LDO 仿真流程理顺的人。1. 内容整体设计与思路拆解做任何仿真前我的习惯是先花五分钟把“要验证什么”列清楚而不是急着开工具。这颗 LDO 算是一个很典型的低压差线性稳压器设计输入电压 3.3V输出 1.5V最大负载能力做到 100mA静态电流控制在几十微安量级压差目标小于 200mV。为什么选这个规格因为 1.5V 在现在的低功耗数字内核、MCU IO 供电、传感器接口里非常常见而且这个电压和工艺兼容性都很好拿来做 LDO 教学和工程参考都有代表性。1.1 先确定设计目标和一个清晰的规格表我习惯在正式开始前把所有指标量化成一张表后面所有的仿真其实都是在逐条检查这张表有没有兑现。下面是这颗 1.5V LDO 的目标规格后续电路参数和仿真脚本都是围绕它来的参数目标值说明输入电压 Vin3.3V可接受 2.7V~4.2V模拟典型锂电池或标准电源轨输出电压 Vout1.5V ±3%通过反馈电阻分压设定最大负载电流 Iload100mA覆盖常见数字负载场景压差电压 Vdropout 200mV 100mA压差小是 LDO 的核心卖点静态电流 Iq 50µA低功耗场景必须关注负载调整率 1%负载从 10mA 跳到 100mA 时输出的稳定度线性调整率 0.5%输入从 2.7V 到 4.2V 变化时输出的稳定度相位裕度 PM 45°保证闭环稳定最好能到 60°电源抑制比 PSRR低频 40dB针对 1kHz 左右纹波这个表看起来简单但特别重要。因为没有指标仿真就只是“跑个波形看看”有了指标你才能在每一次仿真后明确说“过了”还是“没过”。比如相位裕度如果只有 35°那就是不合格不是“看起来还行”。1.2 为什么调整管选 PMOS 而不是 NMOSLDO 的调整管选型是整个架构的起点。市面上大致有 PMOS、NMOS、NPN、PNP 这几种方案但绝大多数现代 CMOS LDO 都会选 PMOS 做功率管。原因很简单PMOS 在饱和区工作时不需要比输出更高的栅极驱动电压只需要把栅极往下拉就能增加电流这对于输入电压和输出电压非常接近的低压差场景是决定性的。NMOS 做调整管时因为源极跟输出走栅极需要至少比输出高一个阈值电压这在输入 3.3V、输出 1.5V 的场景下当然够用但在压差真的做小、比如输入 1.8V、输出 1.5V 时就会非常尴尬。从稳定性角度看PMOS 的栅极到输出之间存在一个反相增益级栅极电容和相关寄生会给环路带来额外极点这让补偿难度比 NMOS LDO 稍微大一些。不过通过片外输出电容和片内米勒补偿电容这个极点通常都能处理。对一颗 1.5V、100mA 的 LDO 来说PMOS 方案在效率、功耗、面积之间是最平衡的。1.3 Virtuoso 里的完整仿真闭环很多人以为画完原理图就能直接出报告实际上一次正经的 LDO 前仿至少包含这样几条链路建库并搭电路、生成符号、建立 testbench、设置仿真分析、跑完后读数据和报告、根据结果回头改参数。Cadence Virtuoso 的 ADE 环境和 OCEAN 脚本就是干这个的。在这个项目里完整闭环大概是在 Library Manager 里新建一个库用来放原理图和 symbol新建一个 cell 叫 LDO_CORE把基准源、误差放大器、PMOS 调整管、反馈分压网络搭进去再建一个 cell 叫 TB_LDO把 DUT 实例化加上激励源和负载用 ADE L 配置 dc、ac、stb、tran 四种分析导出 OCEAN 脚本保存以后改参数、批量跑都能复用后仿和前仿之间的区别只是在 TB 里换成寄生提取网表分析方法和判读方式完全一样。这套流程非常通用不只是 LDO做运放、基准、比较器都可以照搬。区别只是激励和被测电路不同方法论是一样的。2. 核心细节解析与实操要点搭建完整 LDO 电路画原理图是 LDO 仿真里最需要耐心的一步。很多人容易犯的错是边画边改参数结果连错了线自己都没发现。我的建议是先在纸上把电路结构画清楚确认每个管子的角色之后再进 Virtuoso 动手。下面先给出这颗 LDO 的完整结构然后逐一拆解每个模块的参数来源。2.1 在 Virtuoso 里建库并准备画布打开 Virtuoso 后打开 Library Manager菜单 File → New → Library名字可以叫 LDO_LIB。这里有个关键点新建库的时候一定要选“Attach to an existing technology library”把工艺文件挂上。没有技术库画上去的管子没有模型后续仿真必然报错。接着在 LDO_LIB 下新建 CellviewCell 名字叫 LDO_COREType 选择 schematic工具直接进 Composer Schematic。这里有几个快捷键必须会用按i调出添加实例窗口用来放器件按w画线按p添加引脚按c复制实例按q编辑属性。Virtuoso 里画原理图的迁移成本很低只要适应了这几个快捷键速度能提上来一大截。画之前先确认你能调出来哪些器件。这个例子假设使用某个标准 CMOS 工艺库里面至少有 nch、pch、理想电阻、理想电容、电源 vdc、电流源 idc 这些模型。如果库里没有模型也可以用 analogLib 里的 nfet、pfet不过那通常是理想模型仿真结果更“干净”但不反映工艺特性。工程上还是建议用 PDK 提供的器件。2.2 LDO 电路结构与参数选择这颗 1.5V LDO 的电路结构可以用下面这个示意表达VIN(3.3V) | |--- MP(PMOS 功率管) --- VOUT ------ ILOAD/RL --- GND | | | RF1100k | | VREF(0.6V) ------ 误差放大器(EA) VFB | | | | --------------- VBIAS --- 尾电流源 --- 误差放大器 | EA_OUT --- VG --- MP 栅极简单说基准电压 VREF 给到误差放大器的正端反馈分压点 VFB 给到负端放大器输出 VG 驱动 PMOS 栅极。VOUT 偏高时 VFB 升高EA 输出往上走PMOS 栅极电压升高、电流减小输出电压回落VOUT 偏低时则反过来。这是一个标准的负反馈闭环。下面逐个模块说参数。基准源。LDO 需要 VREF 才谈得上稳压。工程上很少用理想电压源做基准去仿真整体 LDO因为那样测不到基准自身随电源和温度的变化。但作为第一次跑通的测试可以在 testbench 里先用一个理想电压源 0.6V 顶替基准先把环路和关键指标验证到位下一步再换真实基准。为什么取 0.6V因为常见带隙基准输出约 1.2V经过内部电阻分压后取 0.6V 很常见也有一些工艺直接用 0.5V 左右的基准。反馈网络按 0.6V 计算即可实际设计时如果你的基准不是 0.6V把 RF1/RF2 的比值相应改一下就行。反馈分压电阻。输出 1.5V要跟 0.6V 基准相等满足VFB VOUT × R2 / (R1 R2)带进去就是 1.5V × R2 / (R1 R2) 0.6V所以 R1 : R2 3 : 2。选 R1 100kΩR2 66.7kΩ。这个阻值量级不会消耗太多静态电流反馈支路电流大约 9µA跟目标静态电流 50µA 比起来还算健康。如果电阻阻值再大省电但噪声变大再小反馈支路电流浪费太大。100k/66.7k 是低功耗 LDO 的常见量级。误差放大器。这里用最经典的单级 OTAPMOS 差分输入对加 NMOS 有源负载。为什么用 PMOS 输入因为输入共模范围要覆盖 0.6V 到 1.5V。PMOS 差分对输入耐压能力更靠近 VDD在这个共模区间工作比较舒服。尾电流设 20µA每边差分对管 10µA。差分输入对 W/L 选 20µ/1µ有源负载 NMOS 选 10µ/1µ。管子的具体宽长比不是唯一的核心是保证各管工作在饱和区这个在后面仿真里可以通过检查 DC 工作点确认。这个放大器增益通常在 40dB 上下对 LDO 的直流精度基本够用。如果发现负载调整率超标再看是增益不够还是负载电流泄放路径有问题。PMOS 功率管。这是整个 LDO 面积最大、也最容易拍脑袋选错的管子。目标是 100mA 负载、压差小于 200mV也就是说在满载时功率管的导通电阻要满足RDS_ON ≤ Vdropout / Iload 0.2V / 0.1A 2Ω用三极管区电阻近似公式估算RDS_ON ≈ 1 / [ μpCox × (W/L) × (VGS - VTH) ]假设工艺的 μpCox 大约为 80µA/V²过驱动电压按 0.3~0.4V 算那么需要的 W/L 大约在 15000~20000 之间。所以功率管我直接取 W/L20000取 L0.5µm换算成总宽就是 10mm。这个宽度单根管肯定画不下在 Virtuoso 里用 Multiplier 和 Fingers 拆分成多指并联比如 m8、finger16。仿真时这些参数只决定模型计算不决定版图形状但前仿就要预留足够的裕量。如果工艺的过驱动电压更低最好再把 W/L 往上提否则压差容易超标。补偿电容与输出电容。输出端接 1µF 陶瓷电容是绝大多数 LDO 的标配外部还要带一点寄生等效串联电阻 ESR这里在 testbench 里用理想电容串 0.1Ω 电阻模拟。内部再加一个 5pF 的 Cc 接到误差放大器输出形成主极点补偿让环路增益在单位增益带宽之前下降得更平滑。为什么输出要接大电容因为 LDO 输出阻抗和负载电流有关满载时等效负载电阻只有 15Ω 左右这个低阻抗节点如果全靠运放去驱动带宽和稳定性都很难做。输出电容可以把这个极点压到较低频率再由环路去控制它这是 LDO 稳定性的经典做法。2.3 testbench 搭建和激励设计电路主体画完后新建一个 cell名字叫 TB_LDO把 LDO_CORE 以实例形式调进来。testbench 虽然只是陪跑但它的质量直接决定仿真结果可不可信。testbench 里的激励大概这些电源 VIN接 VDC电压设为 3.3V。做线性调整率时可以扫 2.7V 到 4.2V负载需要一个从 1mA 到 100mA 变化的电流源。瞬态仿真里用 ipulse 或者 idc 配合参数扫描。推荐用ipulse可以模拟负载的跳变沿输出电容1µF 电容串 0.1Ω 电阻接到 VOUT 和地之间测 PSRR 时VIN 需要加 AC 幅度 1V这样在 AC 仿真里 VOUT 的频率响应就直接反映了电源到输出的抑制能力各测试点命名要规范。我习惯直接用 VIN、VOUT、VFB、VG、I_LOAD 这些名字后面 OCEAN 脚本里引用变量时方便得多不会因为名字写错而查半天。在 Virtuoso 里不要直接把理想电压源和被测电路的电源引脚焊死中间最好放一个电压探针或者电流探针方便做 AC 分析时注入信号。稳定性 STB 分析就要求在环路里插入一个 iprobe这个在画 testbench 时就要预先留好否则后面跑 STB 还要回去改原理图。3. 实操过程与核心环节实现写 OCEAN 脚本跑四个关键仿真很多教程教你直接点 ADE 窗口里的按钮跑仿真这当然没问题。但既然是“从零到一”我还是强烈建议你至少会写 OCEAN 脚本因为脚本才是可复现、可批量、可交接的。你这次手动点出来的波形下次换个工艺角重跑难道还重新点一遍下面给出一个可以直接用的 OCEAN 脚本框架然后逐个分析 dc、stb、ac、tran 四类仿真怎么看结果。3.1 一个可以直接改的 OCEAN 脚本框架; LDO_test.ocn ; 使用方法打开 Virtuoso 后在 CIW 或 ADE 里执行 load(LDO_test.ocn) simulator( spectre ) design( LDO_LIB TB_LDO schematic ) modelFiles( (/home/yourname/pdk/xxx.scs sectiontt) ) desVar( vin 3.3 ) desVar( iload 10m ) desVar( temp 27 ) ; 保存要观察的节点 saveOption( save all ) ; 直流分析扫描输入电压看线性调整率 analysis(dc ?save all ?dev VIN ?param dc ?start 2.7 ?stop 4.2 ?step 0.01 ) analysis(ac ?save all ?start 1 ?stop 1e6 ?dec 20 ) analysis(tran ?save all ?stop 300u ) ; 执行 run() ; 查看结果 selectResult( dc ) plot( v(VOUT ) ) selectResult( ac ) plot( v(VOUT ) ) selectResult( tran ) plot( v(VOUT ) v(VFB ) )这段脚本基本是 ADE 手动配置的自动化镜像。第一行指定用 spectre 引擎design 指定测试平台modelFiles 指定 PDK 模型文件这里要非常注意路径必须写绝对路径别用波浪号~OCEAN 有时不会自动展开desVar 是设计变量可以在仿真前快速改温度和负载后面是三种分析的定义run 开始仿真最后把结果 plot 出来。实际工程里我通常不会在一个脚本里同时跑这么多分析因为每个分析需要的前处理不一样。比如 AC 分析需要先算 DC 工作点STB 分析需要在环路里插 probe。不过作为入门示例这样写方便你一次性看全所有波形之后再拆细。3.2 直流仿真线性调整率和负载调整率直流仿真的核心目的有两个一是确认 DC 工作点正常所有管子都在预期区域二是看直流精度也就是线性调整率和负载调整率。线性调整率的做法是保持负载不变把 VIN 从 2.7V 扫到 4.2V观察 VOUT 的变化。理想情况下 VOUT 应该是一条几乎水平的线。如果扫描结果里 VOUT 在高压输入时先上升、又在某个点开始下降通常说明误差放大器共模范围或偏置电流出了问题。线性调整率的计算方法是取 VOUT 的最大最小值差值再除以标称 VOUT线性调整率 (Vout_max - Vout_min) / 1.5V × 100%比如扫描出 Vout 从 1.496V 变到 1.502V那变化量是 6mV比值 0.4%满足目标。负载调整率的做法是保持 VIN 不变把 ILOAD 从 1mA 扫到 100mA记录 VOUT 在不同负载下的变化。因为负载电流增加时功率管的导通压降会增大反馈环路会尝试把输出拉回来所以最终 VOUT 的变化量反映的是环路增益和功率管尺寸是否足够。如果满载时 VOUT 掉得厉害先看功率管是否真的进入了饱和区再检查放大器是否还能提供足够的驱动电压。有时候问题不是环路增益不够而是 PMOS 栅极被放大器顶到头了相当于环路已经失去调节能力。3.3 交流仿真与稳定性分析环增益和相位裕度LDO 是闭环系统必须验证相位裕度。如果相位裕度不够轻则波形振铃重则直接振荡这在电源设计里是不能接受的。Virtuoso 里最直接的办法是用 STB 分析。在 testbench 的反馈回路里插入一个iprobe让 STB 分析自动计算环路增益。OCEAN 或 ADE 里选择 Stability Analysis设置起始频率 1Hz、终止频率 10MHz跑完直接读增益曲线和相位曲线。重点关注两点增益过 0dB 时相位是否大于 -135°也就是相位裕度是否大过 45°以及相位过 -180° 时增益是否有足够的负增益裕度。如果没有 STB 版权退一步可以在开环结构里用 AC 仿真近似。把反馈电阻从环路上断开加一个非常小的 AC 信号源放大到足够大的 AC 信号值测从 VFB 到 VOUT 的传输函数。但这个做法容易引入负载阻抗变化所以只能做粗略估计。能上 STB 就优先 STB。PSRR 的测量也用 AC 仿真。把 VIN 的 AC 幅度设成 1DC 电平设 3.3V然后仿 AC。VOUT 对频率的响应就是电源抑制比曲线通常低频能到 -40dB 以下也就是电源纹波被衰减到 1% 以内。中频段如果出现抬升通常说明环路在这个频段失去了抑制能力这时可以检查是不是反馈网络的极点导致的。3.4 瞬态仿真上电启动和负载阶跃瞬态仿真有三种经典场景必须看上电启动、负载阶跃和输入电压阶跃。上电启动就是 VIN 从 0V 跳到 3.3V观察 VOUT 怎么建立。理想的启动波形应该是平稳爬升不要有大的过冲或振荡。过冲大的原因通常是软启动电路缺失或者环路带宽内相位裕度不够。没有软启动的简易 LDO上电瞬间误差放大器被强制推进大信号状态输出过冲几十毫伏很正常但如果超过 100mV 甚至振荡就要怀疑环路补偿。负载阶跃是最能体现 LDO 瞬态响应能力的测试。用 ipulse 把负载从 10mA 跳到 100mA上升沿设 1µs观察 VOUT 的下冲、恢复时间。下冲大小由输出电容和环路带宽共同决定输出电容越大下冲越小环路带宽越高恢复越快。第一次跑这个波形时看到几十毫伏下冲很正常关键是恢复后不要振荡如果波形在跳变后出现明显的振铃相位裕度大概就不够了。输入电压阶跃则模拟真实的电池或前级 DC-DC 输出波动。把 VIN 设成从 3.0V 到 3.6V 的方波观察 VOUT 在输入跳变瞬间的耦合过冲。这个过冲和 PSRR 密切相关输出电容大一点、环路低频增益高一点都能改善。4. 常见问题与排查技巧实录跑 LDO 仿真的过程中基本上每个人都会遇到的坑我按出现频率排一下帮你提前踩平。4.1 仿真不收敛DC 怎么都收不住Spectre 报 dc 不收敛是模拟仿真里最常见的报错。原因十有八九是工作点本身有问题某个管子没导通、某个节点悬空、电流镜没有启动路径。遇到这种问题先在 ADE 里打开 DC 工作点保存选项把每个管子节点电压打出来逐个检查是不是有管子栅极悬空或源漏接反。如果手写电路没问题、但仿真器就是不收敛有几种实用做法把仿真器 DC 求解里的gmin步进打开Spectre 默认会用 gmin stepping如果关了建议重新打开加合理的初始条件。对 VOUT 设初始值 1.5V对 VG 设初始值比 VIN 低一个阈值左右能帮仿真器快速找到工作点把某些节点的并联电阻加大比如在 VFB 和地之间放一个大电阻避免纯电容节点在 DC 上浮如果模型文件路径写错也会报类似不收敛但实际是找不到模型的问题所以先确认 log 里 modelFiles 加载成功。4.2 环路不稳定波形一直在振振荡的根源只有一个相位裕度不够。但导致相位裕度不够的原因可能有好几种。最常见的是输出电容 ESR 太大ESR 零点产生在带宽附近产生正相移但这个零点位置如果低于带宽很多可能会把增益曲线顶得不合理。另一个常见原因是误差放大器本身增益太高导致主极点位置过低带宽内还有多个次级极点单位增益频率处相位掉落严重。排查方法不复杂先跑 STB 画出伯德图看单位增益频率和相位裕度。如果相位裕度只有 20°检查补偿电容 Cc 是否足够。加大 Cc 会让主极点往低频推单位增益频率降低相位裕度通常会变好代价是瞬态恢复时间变长。如果加大 Cc 以后还是振再看是不是负载电流太小导致输出极点过低。轻载时输出阻抗很大输出极点很低往往这时候相位裕度最差所以空载和满载都要跑一遍稳定性。4.3 OCEAN 脚本和 Virtuoso 里的小坑OCEAN 脚本最坑的三个地方是模型文件路径、分析名称、节点引用方式。路径前面说了别用~分析名称比如analysis(dc ...)里的单引号不能掉节点引用有的版本用v(VOUT)有的用Vt(/VOUT)一旦写错出来的就是全零波形或者直接报错。建议先手动跑一次在结果里右键复制引用表达式再粘回脚本避免凭记忆写错。另外AC 仿真不会自动做直流工作点之外的瞬态分析如果你在瞬态结果里发现波形一直不启动检查是不是saveOption( save all )没写或者瞬态初始条件把 VIN 设成了 0 导致电路没上电。这种低级问题往往最浪费时间。4.4 用“观察中间节点”代替“只看输出”初学者特别喜欢只看 VOUT 曲线输出没问题就认为仿真过了。但在 LDO 调试中中间节点的信息量远比输出大。VFB 直接反映反馈环路有没有锁定到基准VG 反映误差放大器有没有输出空间功率管电流反映负载电流和功率管的匹配情况。我调试时总是把这些节点全部打开一旦输出不正常先看 VG 是顶到电源还是拉到地基本就能定位是放大器饱和还是负载短路。5. 从仿真到项目落地的经验扩展5.1 别只跑典型工艺角很多初学者跑了一次 TT 工艺角看到 VOUT 稳定、相位裕度 60°就觉得设计完成。但在流片前至少要把 SS、FF、SF、FS 工艺角和 -40°C、27°C、85°C 温度组合扫一遍。PMOS 功率管在 SS 工艺角下过驱动电压会变化导通电阻可能变大压差可能从 150mV 变成 250mV这就会直接打掉你的指标。仿真脚本的优势在这里就体现出来了把模型文件路径从 tt 改成 ss 或者 ff然后批量跑一遍把关键指标自动存成表比手动一个个点按钮高效太多。我在实际项目里会把上面的 OCEAN 脚本包装成一个带循环的版本对每个工艺角和温度组合循环最后把 Vout、PM、Vdropout、Iq 都打印到同一个文本文件里。这样半天时间就能把整颗 LDO 的指标给摸清楚。5.2 仿真报告要自动生成给别人看仿真结果时散落的波形截图没有说服力最好是把关键曲线和数值指标整理成一张表格。OCEAN 里可以用ocnPrint把数据打印成 CSV 文件再用脚本画图或者直接存成 PDF 报告。这样做的意义不是偷懒而是保证每次改版后都能对比“上一版和这一版到底差在哪”。比如这个项目里负载阶跃的下冲电压我第一次调是 120mV后来把输出电容从 1µF 加大到 2.2µF下冲降到了 60mV。如果没有自动化报告这种细微改进很难被记录时间一长就忘了哪次改动带来了什么变化。5.3 后续扩展方向这套流程跑通以后可以沿三个方向继续深入一是把理想基准源替换成真实的带隙基准电路重新测 PSRR 和对温度的稳定性二是加入短路保护电路验证过流时功率管会不会被导死三是做负载电流更大、压差更小的版本比如 300mA 负载、压差 100mV这时候功率管尺寸和补偿策略都要重新评估。不夸张地说这一套 LDO 仿真流程就是模拟电源设计的一个微型完整项目。你把它完整跑通一遍后面再做 Buck、Boost、LDO 衍生产品会轻松非常多。我自己带过的新人里凡是认真跑完一遍这种流程的后面看电路的能力和调试效率都明显上一个台阶。最后说个实操习惯每版仿真都保存一份 .ocn 脚本和 .log 文件日期命名清楚这样每次回头找问题都有据可查。这比记在脑子里的经验靠谱得多。
返回列表