PSpice模型创建与宏模型实战:从Unknown model到系统验证
简介一份围绕 PSpice 元器件模型创建与参数设置的实操文档面向使用 Cadence/OrCAD 做电路仿真的初学者以及需要自建元件库的工程人员重点解决软件自带模型库参数难以满足实际设计需求、新建元件缺少可用仿真模型的问题。文档说明了模型参数修改的入口与编辑器各栏功能并分别讲解 Model Editor 图形化建模与模型文本编辑两条路径涵盖模型命名、典型曲线描述、样本模板套用、参数描述语言书写以及从 lib 到 olb 的库分配与调用流程对宏模型的由来与分类也有交代并给出行为级宏建模的实例。整包仅 1 个 doc 文件约 1003KB篇幅集中便于按章节查阅。该文档已有 1149 人学习下载可作为仿真建模入门与日常查阅的参照。1. PSpice 模型创建从一句 Unknown model 说起仿真跑完波形平得像一条直线日志里只留一句 Unknown model回头查了半小时发现电路没接错是模型压根没进仿真配置。PSpice 模型创建这件事说白了就是给每个元器件补一份仿真器认得的数学身份证二极管靠 IS、RS、CJO 描述结特性逻辑芯片靠一段子电路网表描述电平和延时。它解决的是「原理图能连通、仿真算不出」的断层——自带库给的是典型值你手上的批次、你跑的温度点、你的驱动条件不一定对得上。做电源、做接口防护、做逻辑时序验证的人早晚会走到自己建模型这一步区别只是早一点动手还是被报错逼着动手。2. 改参数与挂载模型库三件套文件与右键编辑的边界2.1 自带库不够用的三种典型场景很多人第一次碰模型创建不是因为想研究建模理论而是被现实逼的。常见有三种情况。第一种是选型偏门库里搜不到对应型号只有一颗参数相近的通用器件直接拿来仿真正向压降和结电容差了一截算出来的开关损耗自然不准。第二种是同一型号不同批次阈值电压、饱和电流有离散性做最坏情况分析时得手动把参数往边角推这时不能改公共库只能派生一份私有模型。第三种是评估温度、驱动强度、寄生参数的影响自带模型里温度系数和结电容往往按典型条件填扫到零下四十度或者一百二十五度就开始失真。这三种场景对应同一个技术动作在已有模型基础上做参数层面的修改或派生。它和从零创建模型的区别在于前者保留模型的拓扑结构只动数值后者要连描述方式一起选。分清楚这一点很关键因为改参数十分钟能搞定建模型可能要花半天对数据手册。2.2 右键 Edit PSpice Model改参数的最小闭环最省事的路径是在原理图里选中元件右键选择 Edit PSpice Model模型编辑器会被直接拉起并且定位到该元件引用的那个模型名。进入编辑器后界面分三块Models List 栏列出当前模型库里的所有模型名用来确认你改的是哪一颗Simulation Parameters 栏是参数表格双击数值即可修改Model Text 栏显示对应的模型描述文本这一栏是只读的想改文本得另存成 .lib 文件后在外部编辑。这里有个血泪经验直接改公共库里的模型影响的是所有引用该模型的实例包括你半年前画好的另一张图。正确做法是先复制一份改模型名比如在原名字后面加批次或温度后缀再在新模型上动参数。改完之后存盘回到原理图元件属性里的模型名要同步指向新名字否则你改的和仿真用的根本不是同一个。提示改完参数不要立刻跑完整瞬态先做一次直流扫描看正向导通段和反向击穿段是否落在数据手册的区间内确认模型没被改坏再往下走。参数修改的验证逻辑是直流扫描看静态工作点交流扫描看结电容带来的高频滚降瞬态看反向恢复时间。三个都对得上模型才算能用。2.3 .lib、.olb、.ind三个文件各管一段缺一个都跑不通初学者最容易翻车的地方是把符号库当成模型库。原理图里能放出一个元件只代表符号库 .olb 被加载了仿真器能不能算出结果取决于模型库 .lib 有没有进仿真配置。这两件事是分开的。文件类型承担的角色缺失后的表现.lib模型文本仿真器读取参数的地方报 Unknown model 或找不到子电路.olb符号图形、引脚编号与引脚名映射原理图里放不出元件或引脚对不上.ind库索引加速库列表加载库列表刷新慢偶尔找不到新增条目挂载路径分两步走。第一步在元件放置环节把 .olb 加进符号库列表保证能画出图第二步打开仿真配置里的 Library 选项卡把 .lib 加入设计级或全局级库列表保证仿真器能解析。设计级只对当前工程生效全局级对所有工程生效我一般先用设计级验证稳定之后再考虑放全局避免一个坏模型污染所有项目。* 一个最简 .lib 片段验证挂载是否成功 .MODEL MY_D D ( IS1.0000E-15 RS1.0000E-3 CJO1.0000E-12 M.3333 VJ.75 BV100 IBV100.00E-6 TT5.0000E-9 )这段文本存成 .lib 之后通过仿真配置的库列表挂进去原理图里放一个二极管符号把它的模型名改成 MY_D就能跑通了。逻辑说明.MODEL后面第一个字段是模型名第二个字段是模型类型关键字括号里是参数键值对续行用加号开头每行不超过 132 个字符。参数说明IS 是饱和电流决定正向压降的量级RS 是串联体电阻影响大电流段的斜率CJO 是零偏结电容直接决定开关瞬态的边沿陡度TT 是渡越时间影响反向恢复。想验证挂载有没有生效最直接的办法是故意把模型名写错一个字母看仿真器是否报错报错说明配置路径通了只是名字不匹配。3. Model Editor 建模型曲线拟合、参数面板与导入向导3.1 新建模型的三个入口选项选错了后面全是返工从开始菜单的 PSpice 附件组进入 Model Editor执行 File 下的 New 命令会弹出新建模型对话框。对话框里三个选项看着简单选错方向后面要重来。第一个是 Use Device Characteristic Curves用器件数据手册上的典型曲线来反推参数。它适合手里有完整数据手册、能读到正向特性曲线和电容电压曲线的场景编辑器会让你在曲线上点几个关键点然后自动拟合参数。第二个是 Use Templates从软件自带的模板出发改参数适合常见的二极管、三极管、MOS 管模板已经把模型拓扑定好了你只需要填数值。第三个是 From Model直接指定模型类型从空白参数表开始填适合结构特殊或者要完全自定义的器件。我一般这么选有数据手册曲线就选第一个拟合出来的参数和实测最接近只有几个关键参数就选第二个省事且不容易漏项要做非标器件或者宏模型就选第三个从空白起步反而干净。选完点确定进入编辑器主窗口左边是参数区右边是曲线显示区改一个参数曲线立刻重画这种实时反馈是文本编辑给不了的。3.2 参数面板与实时曲线怎么判断拟合已经收敛编辑器里的参数区不是所有参数都同等重要。以二极管为例按影响程度排IS、RS、CJO 这三个先调它们分别管正向压降、大电流斜率和瞬态边沿VJ、M 管结电容随反偏电压的变化趋势属于第二梯队BV、IBV 管击穿段只有做防护电路才需要仔细调TT 管反向恢复做开关电源的必须对。判断拟合是否收敛有个笨办法但很有效把数据手册的曲线截图放在旁边一边改参数一边目测编辑器里的曲线和截图的贴合程度。正向段看两个点一个是小电流下的压降一个是大电流下的压降两点都对上说明 IS 和 RS 配合正确电容段看零偏容值和反偏五伏时的容值两个点对上说明 CJO 和 VJ 合理。如果曲线整体偏高或偏低优先动 IS如果曲线形状对但斜率不对动 RS如果电容曲线拐点位置不对动 VJ。参数区还有一个 Reverse Leakage 栏用来指定曲线上某个特定点的横纵坐标值编辑器会据此微调参数。这个功能在数据手册只给了个别离散点、没给完整曲线时特别有用。注意曲线拟合得再漂亮也只是在拟合那几个点。仿真跑到拟合区间之外比如深度击穿或者极低电流区误差会迅速放大。做最坏情况分析时要主动把参数往边角推一推看结果是否仍可接受。3.3 Model Import Wizard把 .lib 变成能画图的 .olb参数调完保存成 .lib这一步只完成了仿真侧的工作。原理图侧还需要一个符号否则你没法把器件放到图上。Model Editor 里执行 File 下的 Model Import Wizard弹出 Specify Library 对话框输入刚保存的 .lib 路径指定输出的 .olb 路径向导会读取 .lib 里的模型定义自动生成对应的符号并把引脚按模型里的节点顺序映射好。这一步最容易出的问题是引脚顺序。自动生成的符号引脚编号是按 .lib 里节点出现的先后顺序排的如果模型定义时节点顺序写成了「阳极、阴极」而实际器件封装是「阴极、阳极」符号画出来是对的连线上也没报错但仿真结果整个反了。所以导入完成后一定要打开符号看一眼引脚名必要时手动调整引脚映射。回到原理图通过放置元件的方式把新生成的 .olb 加进库列表就能调用这个元件了。放上去之后元件属性里的模型名应该自动指向 .lib 里的模型如果没有手动填一次。此后想再改参数右键 Edit PSpice Model 又能回到编辑器形成闭环。4. 手写 .lib 与宏模型网表从二极管参数到行为级子电路4.1 二极管模型十个参数各自管哪一段曲线文本建模的第一步是把参数和物理行为对应起来。下面这张表是我自己贴在显示器边上的对照调参数时先查它再动手。参数物理含义典型量级主要影响IS饱和电流1e-15 A正向压降整体水平RS串联体电阻1e-3 Ω大电流段斜率CJO零偏结电容1e-12 F瞬态边沿与开关损耗M结梯度系数0.3333结电容随反偏电压的衰减形状VJ内建电势0.75 V电容曲线的拐点位置ISR复合电流1e-10 A低电流区的非理想性BV反向击穿电压100 V击穿发生的电压点IBV击穿点电流1e-4 A击穿段的陡度TT渡越时间5e-9 s反向恢复电荷与时间N发射系数1.0 附近正向曲线的理想因子调参顺序建议按「先静态后动态」先用直流扫描把 IS、RS、N 调到正向曲线贴合再用反偏扫描把 CJO、VJ、M 调到电容曲线贴合最后用瞬态把 TT 调到反向恢复时间贴合。每调一轮存一次盘命名带上日期翻车了能退回去。4.2 网表语法边界132 字符、续行符与两类声明手写模型最容易犯的错不是参数写错是语法踩线。三条硬规则每行不超过 132 个字符超了必须用加号续行注释行以星号开头模型声明用.MODEL子电路声明用.SUBCKT起、.ENDS止两者不能混用。* 自定义二极管模型带完整参数 .MODEL DIODE_CUSTOM D ( IS1.0000E-15 RS1.0000E-3 CJO1.0000E-12 M.3333 VJ.75 ISR100.00E-12 BV100 IBV100.00E-6 TT5.0000E-9 ) * 一个两端口子电路供原理图以 X 器件方式调用 .SUBCKT RC_FILTER IN OUT PARAMS: RVAL1K CVAL1N R1 IN OUT {RVAL} C1 OUT 0 {CVAL} .ENDS RC_FILTER逻辑说明第一段是模型声明模型名 DIODE_CUSTOM类型 D括号内是参数。第二段是子电路声明.SUBCKT后面依次是子电路名、端口列表、可选参数声明内部用 R、C 等器件关键字连接节点.ENDS关闭定义。参数说明PARAMS:后面定义的变量在子电路内部用花括号引用原理图调用时可以通过属性覆盖这样一份子电路能当多个不同参数的滤波器用省去重复建模。端口顺序决定符号引脚顺序写反了符号引脚就反前面提过这个坑。4.3 行为级宏模型LOGICEXP、PINDLY、CONSTRAINT 三件套分工规模大的芯片做晶体管级仿真不现实宏模型就是在这个时候顶上的。行为级宏建模的核心思路是不描述内部每个管子怎么接只描述端口上看到的逻辑关系、延时和时序约束。以一款四位同步加减计数器为例子电路里通常分三块。第一块用逻辑表达式器件把输入到输出的组合逻辑写出来包括计数方向、使能、加载、进位借位这些关系第二块用延时器件把输出相对输入的传输延时加上并且区分上升沿和下降沿的不同延时第三块用时序约束器件把建立时间、保持时间、最小脉宽、最高频率这些限制声明出来仿真器据此做时序检查违反时给出告警。.SUBCKT CNT4_ABM CLK UD EN LOAD A B C D QA QB QC QD RCO * 逻辑关系用表达式描述计数与加载 LOG1 LOGICEXP(9,6) DPWR DGND CLK UD EN LOAD A B C D QA QB QC QD RCO BOOLEAN: UPDN { UD } CNTEN { EN ~LOAD } QA { CNTEN ~QA } QB { CNTEN (QB ^ QA) } QC { CNTEN (QC ^ (QB QA)) } QD { CNTEN (QD ^ (QC QB QA)) } RCO { QD QC QB QA ~UPDN } * 延时区分上升沿与下降沿 DLY1 PINDLY(6,0,6) DPWR DGND QA QB QC QD RCO CLK QA_D QB_D QC_D QD_D RCO_D IO_STD MNTYMXDLY {MNTYMXDLY} BOOLEAN: CLKEDGE { CHANGED_LH(CLK,0) | CHANGED_HL(CLK,0) } PINDLY: QA_D QB_D QC_D QD_D RCO_D { CASE( CLKEDGE TRN_LH, DELAY(2NS,-1,13NS), CLKEDGE TRN_HL, DELAY(2NS,-1,13NS), DELAY(2NS,-1,13NS) ) } * 时序约束声明检查规则 CON1 CONSTRAINT(4,0,4) DPWR DGND CLK A B C D FREQ: NODE CLK MAXFREQ 50MEG WIDTH: NODE CLK MIN_LOW 8NS MIN_HIGH 8NS SETUP_HOLD: DATA(4) A B C D CLOCK LH CLK SETUPTIME 6NS .ENDS CNT4_ABM逻辑说明第一段 LOGICEXP 器件负责逻辑括号里两个数字是输入和输出端口数量BOOLEAN:之后逐行写表达式花括号内是布尔运算。第二段 PINDLY 器件负责延时CASE结构按边沿类型选不同延时值三个参数分别是典型值、最小值、最大值做最坏情况分析时仿真器会在区间内取值。第三段 CONSTRAINT 器件负责时序检查FREQ、WIDTH、SETUP_HOLD是三类检查项违反时输出告警而不中断仿真。参数说明延时里的NS单位不能省省了按秒算波形会离谱到看不出问题在哪MNTYMXDLY是全局延时档位选择配合仿真配置里的最坏情况设置使用建立时间检查里的WHEN条件可以用来只在特定使能状态下做检查避免误报。这套写法的门槛在于表达式语法严格少一个括号、多一个空格都可能解析失败写完先做一次语法检查再跑仿真。4.4 数学宏模型与表格宏模型函数拟合与查表的两条路除了行为级还有两条更轻的路子。数学宏模型用受控源加数学表达式直接描述端口关系比如一阶低通滤波器用一个电压控制电压源配拉普拉斯表达式就能写出来不需要画电阻电容。它的优点是参数少、仿真快缺点是完全脱离物理结构只能反映输入输出关系。表格宏模型更进一步把实测数据点直接列进去仿真时按点查表插值。非线性器件尤其适合这条路所有元件都是线性的但端口关系非线性写不出解析式手里只有一堆测试数据。用法是把数据点按「电压电流」的形式列在受控源后面仿真器在两个点之间做线性插值。* 表格宏模型用实测数据点描述非线性电导 GTUNNEL N1 N2 TABLE {V(N1,N2)} (0,0) (0.01,2.153M) (0.02,2.973M) (0.03,4.567M) (0.04,5.155M) (0.05,5.402M)逻辑说明G 开头的受控源表示电压控制电流源TABLE关键字后面跟控制变量表达式等号右边是数据点对。参数说明每个括号里第一个数是控制电压第二个数是对应电流单位分别是伏和安点与点之间仿真器做线性插值所以采样点密度决定精度曲率大的地方要多放点。这套写法在原理图里对应一个 TABLE 符号属性里按同样格式填数据对即可不用手写网表。两条路的共同限制是宏模型只在一定精度范围内有效超出数据覆盖区间就是外推结果不可信模型结构要尽量简单堆太多分段反而拖慢仿真还容易不收敛。5. 常见问题排查五类翻车现场的现象、原因与解决5.1 现象仿真一启动就报 Unknown model原因基本只有两个模型库没进仿真配置或者模型名对不上。前者是只挂了 .olb 没挂 .lib原理图能画但仿真器读不到参数后者常见于手动改了元件属性里的模型名但 .lib 里没有对应条目或者大小写不一致。解决顺序是固定的先打开仿真配置的库列表确认 .lib 在里面且路径有效再打开 .lib 用搜索功能找模型名逐字符比对最后检查有没有多个同名库冲突旧版本库排在前面会遮住新库。我一般会在库列表里只留当前工程要用的库避免这种遮蔽问题。5.2 现象仿真能跑完但波形方向反了或者数值差一个量级这种最隐蔽因为不报错。原因通常是引脚映射错了或者子电路端口顺序和符号引脚顺序不一致。二极管方向反了正向段变成反向击穿段三极管集电极和发射极对调放大区整个变形。解决办法是回到符号编辑器把引脚编号和模型里的节点顺序一一对照。子电路定义里.SUBCKT后面的端口顺序就是节点顺序符号上第几个引脚连第几个节点必须严格对应。对照完再跑一次直流扫描看正向段和反向段的位置是否符合预期这是最快的确认方式。5.3 现象加了宏模型之后仿真不收敛时间步长越跑越小宏模型不收敛的原因比器件模型多。常见三种延时参数给了零或者负值仿真器在边沿处反复试探初始状态没定义逻辑器件上电时处于不确定态时序约束写得太紧仿真器不断回退重算。处理办法是先简化把约束器件整段注释掉只留逻辑和延时看能不能收敛能收敛说明问题在约束条件逐条加回去定位。然后把所有延时改成典型值去掉最小最大档位排除最坏情况取值带来的振荡。最后给关键节点加初始条件用.IC或者器件的初始态属性让上电状态确定下来。注意宏模型的延时值不要写成零。零延时在数学上意味着无穷大斜率仿真器只能靠不断缩小步长去逼近时间推进不动。5.4 现象常温仿真正常一加温度扫描就崩或者结果离谱器件模型里温度相关的参数没填全。二极管的自带模型至少有饱和电流的温度系数和禁带宽度参数MOS 管还有迁移率温度系数这些缺了温度一变化模型就外推到不合理区间。解决方式是回到模型编辑器把温度相关参数补上或者直接用带温度系数的模型模板重做一份。补完之后单独跑一次温度扫描只扫一个器件看它的正向压降随温度的变化斜率是否符合物理规律。常温能跑不代表全温域能用这是两回事。5.5 现象今天配好的模型明天打开工程又找不到了库路径用了绝对路径工程换目录或者换机器之后就断链或者模型放在了临时目录被清理掉了。这种情况在多人协作时尤其常见。稳妥做法是把自定义的 .lib 和 .olb 放在工程目录下的固定子目录里配置时用相对路径引用工程打包时把整个目录一起带走库列表里把自定义库放在靠前位置避免被系统库里的同名模型遮蔽。我自己的习惯是每个工程建一个 model 子目录所有自建模型只放这里绝不往公共库目录里塞东西。6. 验证与进阶让模型在动态系统里跑一遍才算数模型建完、参数调完、避坑走完最后一步是验证它在真实使用场景下站不站得住。我的做法分三层从便宜到贵依次来。第一层是静态验证直流扫描比对数据手册。把正向导通段的几个电流点对应的压降列成表和手册逐点比对误差超过百分之十就回去调 IS 和 RS。这一步只要几秒钟能挡掉大部分参数填错的问题。第二层是动态验证瞬态看反向恢复和边沿。给器件加一个方波激励串一个采样电阻看电流波形上的恢复尖峰和恢复时间和手册的反向恢复电荷对照。这里最容易忽略的是测试条件——手册给的恢复时间是在特定正向电流、特定 di/dt 下测的你的激励条件不一样结果自然对不上先对齐条件再比数值。第三层是系统级验证把模型放进整体电路跑一遍。做电源的看效率曲线和环路稳定性做接口的看浪涌下的钳位表现做逻辑的看时序裕量。这一层最能暴露问题因为单器件模型在孤立测试下往往表现良好一进系统就露馅比如结电容导致的振铃、延时参数导致的关键路径违例。验证层级激励方式关注量通过标准静态直流扫描正向压降、击穿电压与手册误差在允许区间动态方波瞬态反向恢复时间、边沿同测试条件下趋势一致系统完整电路效率、时序裕量、振铃满足设计指标且有余量进阶用法上行为级宏模型真正发挥价值的地方是动态系统仿真。把系统拆成若干子系统每个子系统用行为级模型描述再用信号线连起来整个系统的时域响应几秒就能算完。调参的时候改传递函数的系数波形立刻变比搭晶体管级电路快两个数量级。前提是每个子系统的宏模型都做过前面三层验证否则误差会在系统级累积放大。从那以后我每次交付模型前都强制走一遍「直流扫描、瞬态恢复、系统联调」这三步缺一步都不敢往库里放。早年有过一次模型单测漂亮装进整机跑出来的效率比实测高了五个点查了两天才发现是结电容填小了一个量级那次之后这个习惯就再没破过。希望帮到你。本文还有配套的精品资源点击获取