ARTICLE DETAIL

资讯详情

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

Cadence Virtuoso两级运放仿真全流程:从DC工作点到工艺角分析

Cadence Virtuoso两级运放仿真全流程:从DC工作点到工艺角分析 在实验室里对着示波器上那个明显失真的波形我一度觉得运放设计就是玄学。后来把整套流程搬进 Cadence Virtuoso从原理图到工艺角一步一步重做才明白问题大多出在静态工作点和补偿上。这篇文章想把一套我反复使用的两级运放仿真流程完整记录下来从指标预算、原理图绘制、DC 工作点调试、AC 仿真到工艺角分析和常见报错排查每一步都讲清操作和判断依据让刚接触 Cadence 模拟仿真的同学也能照着做出来。如果你会界面基本操作但没完整跑过运放仿真这篇应该正好合适。1. 动手前先做指标预算两级运放的设计目标和补偿思路1.1 两级运放不是“两个放大级随便拼”每次有人问“两级运放可以先同相放大再反相放大吗”我都会先纠正一个概念模拟集成电路里的两级运放指的是第一级差分放大加第二级共源放大而不是像面包板上那样把两个同相放大器串联。第一级负责把差分输入信号转换为单端并提供主要的电压增益第二级负责提供输出摆幅和一部分增益中间用密勒补偿电容连接让主极点向低频移动、次极点向高频移动从而保证负反馈下的稳定性。以最常用的结构为例M1/M2 是 NMOS 差分输入对M3/M4 是 PMOS 有源负载M5 是 PMOS 尾电流源M6 是第二级 NMOS 共源管M7 是 PMOS 电流源负载。输出节点上再接一个补偿电容 Cc必要时串调零电阻 Rz。整个电路的总增益近似为两级增益相乘所以只要每一级有约 40dB总增益就能到 80dB 左右这是单级结构很难达到的数字。1.2 先定指标再定初值尺寸数量级别乱猜在实际开始画原理图之前我会先定一组设计目标。写文章方便说明这里用一个典型的 0.18μm CMOS 工艺、3.3V 电源做例子DC 增益大于等于 60dB单位增益带宽大于等于 10MHz相位裕度大于等于 60°负载电容 2pF静态功耗不超过 0.5mW。这个指标不高但它足以把流程完整走一遍还能把补偿和工艺角分析都体现出来。尺寸初值可以按“电流优先”的思路估。先定尾电流源的电流为 10μA那么差分对每只管子约 5μA第二级电流取 50μA保证输出级有足够的压摆率。接着按照基本的饱和区电流公式反推 W/L。这里的表不是最终值而是起点器件功能初始尺寸(W/L)预期电流M1/M2输入差分对10μ/0.5μ5μA eachM3/M4有源负载5μ/0.5μ5μA eachM5尾电流源10μ/1μ10μAM6输出级 NMOS40μ/0.5μ50μAM7输出级 PMOS 负载20μ/1μ50μACc密勒补偿电容1pF-Rz调零电阻2kΩ-补偿电容的初值通常取负载电容的 1/3 到 1/22pF 负载下取 1pF 左右。调零电阻 Rz 先给一个 1/gm6 量级的估计值具体要靠仿真调整。有了这组数字再进 Virtuoso后面每一步仿真都能对照。再做一个简单估算如果第一级跨导 gm1 约 100μA/V那么没考虑负载时的单位增益带宽大约为 gm1/(2πCc)15.9MHz第二级跨导 gm6 约 1mS负载 2pF 时的输出极点约 80MHz。从这两个数字看10MHz 的带宽目标是可以实现的但相位裕度大概率偏低需要靠 Cc 和 Rz 调整。2. 原理图绘制从库准备到连线节点的完整操作2.1 新建 Library 与工艺库关联打开 Virtuoso 后先创建自己的 Library。在 CIW 窗口选择 File - New - Library填好名字关键是选“Attach to an existing technology library”把工艺库关联上。这一步如果漏掉后面画原理图会报一堆 layer 错误颜色也无法正确显示工艺相关的器件也调不出来。接下来建 Cellview。Cell 名建议起得像一点比如 two_stage_opampView 选 schematic。我见过不少同学在这里纠结要不要建 symbol其实不用急先画完原理图再生成 symbol 也不迟。画的顺序也有讲究先把电源、地、输入输出 Pin 放好再放管子最后放电容电阻和输入激励不容易漏。建好工程后需要把模拟常用库引用进来。一般是你的工艺库加 analogLibanalogLib 里放着 vdc、vsin、gnd、电阻电容这些通用模拟器件。如果你的 PDK 有自带的 nmos4/pmos4优先用 PDK 里的因为已经绑定了模型名和 CDF 参数可以直接被 Spectre 识别如果用 generic 库里的符号仿真时容易遇到“器件未定义”的报错。2.2 放置器件时容易忽略的细节在原理图编辑器里按 i 添加 Instance。我的摆放习惯是左边放输入对中间放有源负载右边放第二级和补偿网络上面放 VDD 和尾电流源下面放地。M1/M2 的栅极分别接 VINP 和 VINN源极接到 M5 的漏极漏极分别接到 M3/M4 的漏极。M3/M4 采用交叉连接M3 的栅极和漏极接在一起M4 的栅极接到这个节点M4 的漏极作为第一级输出节点同时接到 M6 的栅极。连线时比较实用的几个快捷键先列一下不同版本键位略有差异但大体一致i添加实例w连线p添加 Pinq编辑属性c / m复制 / 移动u撤销ShiftF放大到全图CtrlE进入下一层视图或生成 symbol画连线时要注意节点命名。用 Create - Wire Name 给关键节点命名比如 VINP、VINN、VOUT、VBIAS。节点名写错是后面仿真结果对不上的常见原因尤其是 VDD/VSS 这种全局名一旦命名不统一电源就悬空了。电源和地我习惯直接放 vdc 的源仿真时再设置电压值或者放 gnd 符号作为参考地。给输入管脚命名后最好再用 ERC 或 Connectivity Check 看一眼有没有悬空。放激励源的时候不要直接拿一个 vdc 既当电源又当输入信号。电源用 vdcDC 电压设 3.3V输入信号用 vdc 或者 vsin 先给静态工作点。AC 扫描时输入需要设置 AC magnitude 为 1这个后面 AC 仿真章节再细说。假如你要跑瞬态输入就要换成 vpulse 或者 vsin否则阶跃响应是看不出来的。3. DC 仿真把每只管子都调到饱和区是后续一切的前提3.1 仿真环境配置model library 放错位置的连锁反应原理图画完先别急着跑 AC。我会先做一次 DC 工作点仿真因为所有小信号参数 gm、rds 都是工作点算出来的工作点不对AC 结果全是空谈。进入仿真前先配置环境Launch - ADE L打开后确认 Simulator 是 spectre。然后 Setup - Model Libraries把工艺库的模型文件加进去。这一步是新手报错最密集的地方。常见问题包括模型文件路径不对、section 选错、多个 corner 文件同时加载导致模型名冲突。如果发现仿真直接报“器件未定义”多半是模型库里没有对应 model name或者你虽然加了库但库里的名字和原理图符号的 model 参数对不上。处理办法是选中管子按 q在弹出的属性框里看 Model name 是什么再去模型文件里搜这个关键字。对于 0.18μm 工艺模型文件通常按工艺角分了 typ、ss、ff 等 section。先选择 typ 模型跑通再说。除了模型库还要在 ADE 里设置好 output 和保存选项。DC 分析时我会额外勾选“Save DC Operating Point”否则后面想看静态工作点会抓瞎。顺带把 simulation directory 路径设置成一个容易找的目录比如 /home/yourname/sim方便保存状态和查看 netlist。3.2 工作点调试先看 region再看 VovDC 分析设置Analyses - dc勾选 Save DC Operating Point点 Run。跑完后用 Results - Print - DC Operating Point在原理图上点击想看的器件就能看到 Vgs、Vth、Vds、Id 等参数。检查的优先级是这样的先看 region再看 Vds 与 Vov 的关系最后看电流比例是否正确。我用过的检查表放在这里检查项期望值如果不满足怎么办M5 尾电流源region2饱和调 VBIAS 或增大 W/LM1/M2 差分对region2Vds Vov调输入共模电平或尾电流大小M3/M4 负载region2调负载管 W/LM6/M7 第二级region2调 M6/M7 尺寸和偏置输出节点 DC 电压接近 VDD/2调 M6 与 M7 的电流比调试方法一般是逐个调整如果尾电流源不在饱和区就降低 VBIAS 或者增大尾电流管的 W/L让它能沉住电流。如果差分对在线性区常见原因是输入共模电压太低或者尾电流太小导致过驱动电压过大。输出级直流点如果偏到接近地或者 VDD说明 M6 和 M7 的电流比例失衡先调整 M7 的宽长比别急着动补偿电容。我实际调的时候会把输入共模设成一个留出余量的值比如 VDD3.3V 时取 1.65V。如果输入共模太低NMOS 输入对很容易掉出饱和区太高又会让尾电流源没压差。调试过程中多用 DC Operating Point 的信息配合原理图注释显示效率比自己猜高很多。4. AC 仿真增益、带宽和相位裕度的真实读法4.1 AC 扫描的输入激励和参数设置DC 工作点 OK 后我会先做一个反馈接法把负输入端 VINN 直接连到输出 VOUT正输入端给共模电压 1.65V再在这个输入上叠加一个 AC 小信号。注意 AC 仿真的输入源不能用 vdc要么用 port要么用 vdc 然后在 AC magnitude 里填 1。用 port 会更贴近实际匹配网络但这里用 vdc 设 AC magnitude1 就足够方便。AC 分析设置Analyses - ac扫频范围我习惯从 1Hz 到 100MHz 或者 1GHzsweep type 选 logarithmicpoints per decade 设 20 或 50。点数太少曲线不够平滑在单位增益点附近会看不出相位拐点点数太多仿真时间变长其实 AC 仿真很快20 点就够观察了。输出取 VOUT(V) 的幅度和相位表达式为 db20(VF(/VOUT)) 和 phase(VF(/VOUT))。跑完后你会看到典型的两极点幅频曲线低频增益可能 60~70dB过了主极点后以 -20dB/dec 下降到次极点附近变成 -40dB/dec。单位增益带宽就是幅频曲线穿过 0dB 的频率。相位裕度则是读出这个频率对应的相位再和 -180° 相减比如单位增益频率处相位是 -118°相位裕度就是 62°。4.2 相位裕度不足时的补偿思路我第一次跑这个电路的时候相位裕度只有 20° 左右波形在阶跃响应下一定会振荡。原因是输出极点离主极点太近相位下降很快。处理顺序是先加大 Cc让主极点继续往低频移单位增益带宽会降一些但相位裕度会明显改善如果加大 Cc 之后带宽降太多了再串调零电阻 Rz用它零点抵消次极点的影响。具体数值我记录过一次初始 Cc500fFPM22°改成 1pF 后 PM 到 52°带宽从 22MHz 降到 14MHz再加 Rz2kΩPM 到 71°带宽略微回升到 16MHz。这就是一个很典型的迭代过程。调的时候要注意Rz 不是越大越好太大反而会让零点跑到低频形成负相位裕度损失所以每改一次都要重新看一眼 AC 曲线。在看 AC 曲线的时候还要留意低频增益是否符合预期。如果低频增益少了很多先看看输出端是否被大电容负载压住了或者某只管子的输出阻抗低得不正常。这个现象往往不是补偿问题而是器件工作点漂移了要回到 DC 仿真去查。5. 工艺角分析五组 Corner 一次跑完并读懂的进阶操作5.1 工艺角到底在模拟什么制造过程中MOS 管的阈值电压、迁移率、氧化层厚度都会在一定范围内波动。工艺角就是对这种波动的最坏情况组合。TT 表示典型 NMOS 和典型 PMOSSS 表示偏慢的 NMOS 和偏慢的 PMOSFF 表示偏快的 NMOS 和偏快的 PMOSSF 和 FS 则是混合角。慢角意味着电流弱快角意味着电流强这直接影响增益、带宽和相位裕度。对两级运放来说最值得关注的是 SS 角下的带宽下降和 FF 角下的相位裕度下降。SS 角下管子电流小跨导降低第二级输出极点会往低频走单位增益带宽可能直接掉到指标以下FF 角下跨导高输出极点频率变高但补偿电容对应的主极点也可能移动相位裕度的变化要仔细看。不要只看 TT 角的结果就发布设计工艺角分析是对设计余量的体检。5.2 在 Cadence 里跑全角的两条路线跑工艺角最通用的办法也是最不容易出错的办法是在 ADE L 里手动替换模型库Setup - Model Libraries把 typ 模型文件替换为 ss 角文件或者把 section 改成 ss直接点击 Run重新 netlist 并跑结果用 Outputs 把关键曲线画出来记录增益、带宽和 PM重复上述步骤依次跑 tt、ff、sf、fs。这个办法虽然笨但完全不依赖 PDK 提供的 corner 环境任何版本都能用。缺点是每个角都要手动操作而且容易漏记录。如果你用的是带 Corners 功能的 ADE XL效率会高很多。流程是Launch - ADE XL新建一个 testbench 和 corner在 Corners 标签页里把 tt、ss、ff、sf、fs 五个角的模型配置分别填好每个角指定各自的 model file 或 section然后 Run 全部 corner结果会在一个界面里汇总可以直接对比多种指标。具体菜单会因为 PDK 不同有差异但核心思想是“每个 corner 对应一组模型参数”理解了这一点换什么界面都不慌。5.3 工艺角结果怎么对比、怎么改设计跑完后我会把所有关键指标汇总成一张表。这里的数字是示意但规律是真实的工艺角DC 增益单位增益带宽相位裕度静态功耗TT68dB15.6MHz63°0.21mWSS72dB9.8MHz70°0.14mWFF63dB22.4MHz48°0.32mWSF66dB14.1MHz58°0.22mWFS65dB13.2MHz55°0.18mW如果 SS 角带宽不够优先增加第一级尾电流因为 GBW 正比于 gm1如果 FF 角相位裕度不够可以稍微加大 Cc代价是带宽下降需要重新做 TT 角验证。这时候你会发现调一个参数往往在两个角之间形成拉扯所以模拟设计本来就是多目标权衡。千万别只盯着一个 corner 调参数否则很容易出现“TT 完美、FF 翻车”的局面。6. 瞬态仿真、环路稳定性和高频报错的排查记录6.1 瞬态仿真压摆率与过冲验证AC 和工艺角都过关后我会再跑一个瞬态仿真验证大信号行为。把输入换成 vpulse负反馈接法保持不变正输入端加一个阶跃信号从 0.2V 跳到 1.8V 或者从小信号幅值出发。设置 Analyses - transtop time 给 5μs 到 10μs然后看输出 VOUT 的阶跃响应。瞬态结果要关注三件事上升过程是否过冲、稳定时间多长、在大阶跃下输出的最大变化率是不是符合压摆率指标。压摆率可以从输出波形最陡的那一段估算单位是 V/μs它决定了运放在大信号下的速度。如果输出波形明显振荡通常说明相位裕度不够回到 AC 阶段调补偿如果输出上升和下降不对称可能是第二级上下管电流不对称导致的要查静态工作点。瞬态仿真偶尔也会遇到不收敛。我的处理顺序是先查有没有悬空节点、信号源有没有突变沿比如 vpulse 的 rise time 设成 0 就容易触发不收敛然后把仿真精度调高减小 reltol或者换积分方法在 ADE 里把 sim 参数里的 integration method 设为 gear2only很多时候就能跑过去。要是还不行可以加 gmin给节点提供一条数值泄漏路径但这个方法只能作为临时绕过最好还是找到根本原因。6.2 几个高频报错的实际排查记录把仿真里遇到比较多的三类问题放在一起说因为它们有共性前期库和环境配好后面能省很多时间。报错现象常见原因排查做法器件未定义 / model not foundmodel library 缺失或名称不匹配查器件属性里的 Model name去模型文件搜索关键字spectre 直接 terminatenetlist 里有非法连接或模型文件路径错看 simulation directory 里的 netlist 和 log 文件定位最后出现的器件瞬态不收敛信号源突变、环路初始条件不稳定、步长过大给 rise/fall 时间设置初始条件调 reltol必要时用 gear2only特别想提醒的是仿真报错时先去看 netlist别一上来就怀疑库。用 ADE 的 simulation directory 打开 netlist检查是不是少了某个子电路、某个节点是不是没连接。很多情况下所谓“玄学报错”只是因为某个器件的 instance 名字重了或者符号与 CDF 不匹配。按 q 检查一遍器件的 model、参数和连线问题往往就暴露了。最后说一个我自己的习惯每次跑新工程之前我会把模型库、各个 corner 的状态文件、ADE 的 state 都整理好命名比如 state_tt、state_ss。这样后续调参数或者换机器都不会丢上下文。仿真本身就够折腾了别再被可避免的环境问题拖住时间。
返回列表