Sentaurus sdevice I-V/C-V与瞬态仿真语句模板
简介:这份文档面向微电子、纳米电子与光电子器件方向的学习者和研究人员,汇集 Sentaurus TCAD 常用仿真语句与命令片段,用于解决器件电学特性与辐照效应建模时命令文件不会写、参数不知如何配置的问题。内容围绕 I-V 曲线、C-V 曲线、辐照损伤与重粒子入射、瞬态过程四类典型仿真展开,包含电流电压文件定义、电极与物理模型设置、Mixed Mode 交流耦合提取电容、重离子注入的 LET 与时间参数、激光光照瞬态求解等可复用代码块,并给出网格、求解器、输出文件与绘图变量的写法示例,便于读者对照修改后直接套用到自己的器件结构。压缩包共 1 个文件,为 docx 文档,体积约 16KB,轻量易检索,能按仿真类型快速定位。目前已有 2036 人学习下载,可作为 Sentaurus 入门到进阶阶段的命令速查与案例参考,帮助读者梳理器件建模、参数扫描与结果后处理的完整链路。
1. 一份三百行的语句集,比十篇教程更能应急:这份 .docx 里存了什么
凌晨两点,sdevice 跑到 87% 突然抛出一句 "Step size too small",日志最后一行停在 QuasiStationary 的某一步,屏幕上只剩下一个越来越小的 step。这时候最想要的不是一本八百页的手册,而是一段能直接粘进去、跑得通的语句。这份 sentaurus 语句集干的就是这件事:I-V 直流扫描的完整 File/Electrode/Physics/Math/Solve 五段、Mixed Mode 配合 ACCoupled 的 C-V 小信号链路、重离子入射与激光激励两类瞬态、辐照陷阱与界面电荷的 Traps 卡,都能找到成段的写法。它适合已经装好 Sentaurus、能跑通自带示例、但自己从零写 .cmd 就卡壳的人;也适合手上有一堆零散卡片、想把它们沉淀成可复用模板的老手。它不承担讲原理的任务,价值在于给出一份可逐段抄改的语句底稿。
2. I-V 直流扫描:File、Electrode、Physics、Math、Solve 五段的落地写法
一段能跑通的 I-V 命令文件,骨架其实很固定:告诉求解器网格在哪、电流记到哪、电极叫什么、物理模型开哪些、数值方法怎么走、电压从哪推到哪。难的不是记住这五段,而是每一段里那几个键写错一个字符,报错信息就会指到完全不相干的地方。下面按执行顺序拆。
2.1 File 与 Electrode 段:四个文件名和电极名必须成对
File { Grid = "Diode_msh.tdr" # SDE 或 mesh 生成器导出的网格 Current = "Diode_IV.plt" # 端电流/端电压,画 I-V 用这个 Plot = "Diode_IV.tdr" # 场分布快照,看击穿位置用这个 Output = "Diode_IV.log" # 求解日志,排错第一现场 } Electrode { { Name="ElectrodeN" Voltage=0.0 } }Grid指向的 .tdr 里已经写死了电极名,Electrode段里的Name必须与之逐字符一致,大小写也算。常见翻车是网格里叫anode,命令里写Anode,sdevice 不会提示"电极名不存在",而是在装配阶段给你一个更含糊的接触错误。Current和Plot不是一回事:前者是标量时间序列,后者是每个输出时刻的完整场,体积差几十倍,扫描几千个点还开 Plot 会把磁盘写满,所以实际做 I-V 时我一般先只留Current,确认曲线形状对了再打开Plot抓几个关键偏压。Voltage=0.0是初值,后面Goal段会把它推到目标值,这里的 0 不是"不扫描",而是"从这里出发"。
2.2 Physics 段:迁移率四项、复合四项,各管一段曲线
Physics { AreaFactor = 1 Temperature = 300 Mobility ( DopingDependence eHighFieldSaturation hHighFieldSaturation Enormal CarrierCarrierScattering ) Recombination ( SRH (DopingDependence) Auger (withGeneration) Avalanche (UniBo Eparallel) Band2Band (Hurkx) ) EffectiveIntrinsicDensity (OldSlotboom) }AreaFactor=1是二维仿真换算到"单位厚度"的电流,如果你的结构在 SDE 里定义了实际宽度,这个值要跟着改,否则电流量级会整体偏一个常数倍——这类错误曲线形状完全正确,只是数值不对,最难发现。DopingDependence让 SRH 寿命随掺杂浓度变化,重掺杂区寿命被压低,这直接决定漏电水平;不开它,仿真出来的反向电流往往比实测低一到两个数量级。Auger (withGeneration)里的withGeneration不能省,省掉之后 Auger 只算复合不算产生,在深耗尽和击穿区会算出一个物理上不成立的结果。
Avalanche (UniBo Eparallel)是这份语句集里最值得抄的一行。UniBo 是 van Overstraeten–de Man 模型的改进版,Eparallel表示用平行于电流方向的电场分量驱动离化积分。如果你要扫到 1000 V 反偏看击穿,这一行必须开,且必须配上eAvalanche、hAvalanche的 Plot 输出,否则你不知道击穿发生在结面还是终端。Band2Band (Hurkx)管的是带间隧穿,在重掺杂结上它对反向漏电的贡献可能超过 SRH,扫低偏压段时不开它,曲线会缺掉一段非线性抬升。
EffectiveIntrinsicDensity (OldSlotboom)是重掺杂带隙变窄模型。掺杂到 1e19 以上,本征载流子浓度会被显著修正,少子浓度跟着变,直接影响饱和电流。选OldSlotboom而不是Slotboom的经验是:前者在极高掺杂下数值更稳,代价是精度略低,做工程曲线够用。温度这里写死 300,如果后面要做温度扫描,把Temperature改成Temp变量,或者干脆在 Solve 里用Temperature作为扫描量,别在 Physics 里硬编码。
2.3 辐照陷阱与界面电荷:Traps 卡的量纲是第一个坑
Physics (material="Silicon") { Traps ( (Acceptor Level EnergyMid=0.42 fromCondBand Conc=2.3226E15 Randomize=0.29 eXsection=9.5E-15 hXsection=9.5E-14) (Donor Level EnergyMid=0.36 fromValBand Conc=1.8E15 Randomize=0.31 eXsection=3.23E-13 hXsection=3.23E-14) ) } Physics (MaterialInterface="Oxide/Silicon") { Charge (Conc=1.5e11) }EnergyMid是陷阱能级相对带边的位置,fromCondBand和fromValBand一个从导带往下量、一个从价带往上量,写反了能级就跑到带另一侧,结果是复合率符号都不对。Conc单位是 cm⁻³,语句集里那句注释#Conc=Fluence*1.1613说的是"注量乘系数换算成体浓度",这个系数跟粒子种类、能量、材料厚度都有关,直接照抄别人的系数是最常见的错误来源,必须用自己实验或 SRIM 类工具算出的值替换。Randomize是能级位置的随机扰动幅度,用来模拟缺陷能级的分散,取值 0.2 到 0.3 之间比较常见,给 0 会让 SRH 复合在某个温度点出现异常尖峰。
eXsection和hXsection是电子、空穴俘获截面,单位 cm²,二者差一个数量级在这类语句里很正常,别顺手改成一样。界面上的Charge (Conc=1.5e11)是固定电荷面密度,单位 cm⁻²,它和体陷阱是两套机制:固定电荷只改电势边界条件、不参与复合,想模拟界面态复合必须用Traps挂在MaterialInterface上,这两者混用会得到一个既不平移阈值又增加复合的错误结果。
2.4 QuasiStationary:步长三件套和 Goal 的关系
Solve { Coupled (Iterations=50) { Poisson } Coupled (Iterations=15) { Hole Poisson } Coupled (Iterations=15) { Electron Hole Poisson } QuasiStationary ( InitialStep = 1e-6 MaxStep = 0.01 MinStep = 1e-9 Goal { Name="ElectrodeN" Voltage=1000 } Plot { Range=(0 1) Intervals=2 } ) { Coupled { Hole Electron Poisson } } }前面三个Coupled是分级预热:先只解泊松,把电势场拉到一个自洽解;再加入空穴连续性方程;最后三方程全耦合。跳过预热直接上全耦合,在反偏初始几步就发散的比例很高,这是血泪经验。InitialStep=1e-6是第一步的电压增量,MaxStep=0.01是允许的最大步长,MinStep=1e-9是止损线——步长缩到这个值还收敛不了,求解器就报错退出。想让 1000 V 扫描跑完,MaxStep不能太激进,0.01 V 意味着理论上要一万步以上,实际会自适应放大,但自适应也受MaxStep封顶,所以想在击穿拐点附近拿细曲线,就得把MaxStep压到 1e-3;只想要粗略曲线,放到 0.1 也行,代价是拐点会被跨过去。
Plot { Range=(0 1) Intervals=2 }的意思是只在归一化进度 0、0.5、1 三个位置存场分布,这个写法比按电压列表输出省事,也避免了几千个 .tdr 堆满目录。
2.5 Math 段:线程、导数、止损阈值
Math { Method = Pardiso Number_of_threads = 4 Derivatives AvalDerivatives RelErrControl Iterations = 15 Notdamped = 60 BreakCriteria { Current (Contact="ElectrodeN" maxval=1e-8) } }Method=Pardiso是直接法求解器,内存换稳定性,二维几万节点没问题;三维大网格要换成迭代法,否则内存会先爆。Number_of_threads=4要和机器物理核数匹配,给超了反而因为调度开销变慢。Derivatives打开解析导数,AvalDerivatives单独打开雪崩项的导数——扫描到击穿附近不开这个,牛顿迭代的雅可比矩阵缺项,收敛会明显变差,表现为步长一路往下缩。
Notdamped=60允许前 60 次迭代不做阻尼,前期收敛快,后期如果还不收敛就自动加阻尼。Iterations=15是每个偏置点的最大牛顿迭代数,比默认值略高,适合有雪崩的非线性问题。BreakCriteria { Current (Contact="ElectrodeN" maxval=1e-8) }是止损:端电流超过 1e-8 A 就停,防止在击穿区把电流算到天文数字还继续扫。这个阈值要按你的器件面积和实际电流量级设,照抄别人的值可能导致曲线在感兴趣区间提前截断。
3. C-V 曲线:Mixed Mode 加 ACCoupled 的小信号链路
直流 I-V 是单向的,C-V 要在一个直流工作点上叠加一个小信号,所以结构上多出两层:一是把器件放进一个外部电路里(System 段),二是求解器要在每个偏置点做一次频域线性化(ACCoupled)。这两层任何一层参数对不上,出来的都是一条斜直线。
3.1 device 段与 System 段的三处对应
Device Diode { Electrode { { Name="ElectrodeN" Voltage=0 } { Name="ElectrodeP" Voltage=0 } } File { Grid = "Diode_msh.tdr" Current = "Diode_CV_1kHz.plt" Plot = "Diode_CV_1kHz.tdr" } Physics { /* 与 I-V 段保持一致的模型组合 */ } } System { Diode diodesystem ("ElectrodeN"=front "ElectrodeP"=0) Vsource_pset vn (front 0) { dc=0 } }三处必须对齐:器件段里出现的电极名,要在System的实例化语句里全部映射成电路节点;"ElectrodeP"=0里的 0 是接地节点,不是电压值;Vsource_pset的(front 0)表示电压源接在front节点和地之间。漏掉任何一个电极映射,装配时就报节点不匹配,而且报错行号往往指向System段末尾,容易误判成语法问题。
Device段的文件名建议带频率后缀(如1kHz),因为同一套结构你可能要扫多个频率,输出文件重名会互相覆盖,且覆盖时不报错——这是最隐蔽的一类问题,跑完发现曲线没变,其实是读到了上一次的文件。
3.2 ACCoupled 的四个关键参数
QuasiStationary ( InitialStep = 1e-6 MaxStep = 1e-2 MinStep = 1e-7 Increment = 2 Decrement = 4 Goal { Parameter=vn.dc Voltage=100 } ) { ACCoupled ( StartFrequency = 1e3 EndFrequency = 1e3 NumberOfPoints = 1 Decade Iterations = 15 Node (front) ACMethod = Blocked ACSubMethod ("diodesystem") = ParDiSo ) { Poisson Electron Hole Contact Circuit } }StartFrequency和EndFrequency都设 1e3、NumberOfPoints=1,意思是只算单频点,这就是标准的 1 kHz C-V。要做频率色散(比如看界面态响应),把EndFrequency拉到 1e6、NumberOfPoints给 4 到 6,Decade表示按十倍频程取点。Node (front)指定小信号加在哪个节点上,必须和上面Vsource_pset的节点名一致,写成ElectrodeN会直接报节点不存在。
ACMethod=Blocked配合ACSubMethod("diodesystem")=ParDiSo是块状分解的并行直接解法,适合器件加小电路的规模。如果电路里只有电压源,这套组合最稳;电路里有非线性元件时,Blocked可能不收敛,换成Full让整个系统一起解,内存换稳定性。Decade、NumberOfPoints、Iterations这三个值不要随手改大,频点数和每个频点的迭代次数是乘法关系,6 个频点乘 15 次迭代,单点耗时会明显上去。
3.3 从 ACExtract 里取 C-V:口径比参数更容易错
File { Output = "Diode_CV_1kHz.log" ACExtract = "Diode_CV_AC_1kHz.plt" }ACExtract输出的是小信号导纳随偏压或频率的表,不是直接的电容值。常见做法是从表里取导纳的虚部,用 C = −Im(Y)/ω 换算,ω = 2πf。语句集里没有现成脚本,因为每家的表头列名和单位不完全一样,硬给一个脚本反而容易读错列。我的习惯是先用前三个偏压点手工验算一遍,确认 ω 用的是弧度而不是赫兹、确认虚部符号约定(有的版本输出的是 Im(Y) 带负号),再把换算写成脚本批量跑。这一步不做,后面整条 C-V 曲线的绝对值都会错一个 2π 因子,形状却完全正确,非常迷惑人。
另外要注意Plot里如果要输出电容相关的场量,得在Plot段显式加eMobility、SpaceCharge这类条目,AC 求解不会自动继承直流段的输出清单。
3.4 偏置推进和 AC 求解的嵌套顺序
QuasiStationary外层推进直流偏压,ACCoupled内层在每个偏压点做频域求解,这个嵌套不能颠倒。写成先 AC 后 QS,语法上可能过得去,但求解器会在没有直流工作点的情况下做线性化,结果是零场附近的线性响应,曲线近似一条直线,而且不报错。判断方法很简单:如果 C-V 曲线随偏压几乎不变,先查嵌套顺序,再查Node名字。
Increment=2、Decrement=4控制步长自适应:一次收敛成功就把步长乘 2,失败就除以 4。反偏段电容变化平缓,这两个值可以给得激进些;正偏接近开启电压时电容上升快,Increment给 2 还是偏大,容易跨过拐点,想抓开启区细节就把它降到 1.5。这些参数没有普适最优值,靠的是先粗扫一遍看曲线形状,再在拐点区间重跑。
4. 两类瞬态:重离子入射与激光激励的时间轴写法
瞬态仿真的难点不在物理模型,在时间尺度。重离子入射的特征时间是皮秒量级,激光脉宽可以到几十皮秒,而器件的响应拖到几十纳秒,两者差三到四个数量级。步长设不对,要么算到天亮,要么波形被步长"抹平"。
4.1 HeavyIon 的五个几何与时间参数
Physics { HeavyIon ( Direction = (0, 1) Location = (200, 0) Time = 1e-9 Length = 2.0 Wt_hi = 2e-12 LET_f = [0 8.7e-6 8.7e-6 0] Gaussian PicoCoulomb ) }Location是入射点坐标,单位 um,要和网格坐标对齐,打在电极上或者网格外都不会报错,只是不产生电荷。Direction=(0,1)表示沿 y 方向入射,二维结构里这是最常见的设置。Time=1e-9是入射发生的绝对时间,必须落在Transient的InitialTime和FinalTime之间,写在外面等于没打。Length是离子径迹长度,单位 um,要覆盖敏感区厚度,给太短电荷沉积在半路就断了,收集电荷会偏小。
Wt_hi是特征时间,Gaussian表示时间波形按高斯分布展开,PicoCoulomb指定电荷量的单位制。这三个一起决定沉积电荷的时间分布:Wt_hi给 2e-12 就是 2 ps 的高斯脉宽。这个值直接决定瞬态电流脉冲的上升沿,和后面Transient的MaxStep之间必须满足"步长比脉宽小一个量级"的关系,否则波形采样不足。
4.2 LET_f 的分段线性与步长匹配
Solve { NewCurrentPrefix = "trans_" Transient ( InitialTime = 0 FinalTime = 35e-9 MinStep = 1e-17 MaxStep = 1e-10 ) { Coupled { Poisson Electron Hole Circuit } Plot (FilePrefix="TransHI_" Time=(0.5e-9; 1e-9; 2e-9; 5e-9; 10e-9) NoOverwrite) } }LET_f是一个分段线性的 LET 随时间变化表,四个数值对应三个时间段:0 到 8.7e-6 线性上升、保持、再降回 0。这个形状模拟的是电荷沉积的上升和拖尾。如果只用单点 LET,波形是一个矩形,算出来的瞬态电流上升沿会过于陡峭。
MaxStep=1e-10比Wt_hi=2e-12大两个数量级,看似够用,但实际因为自适应,求解器在脉冲期间会自动缩到 1e-13 甚至更小,MinStep=1e-17就是给这个缩步留的余量。反过来说,如果MaxStep设成 1e-8,脉冲期间求解器最多也只能按 1e-8 走,2 ps 的波形会被一两个点跨过去,表现为收集电荷明显偏小、脉冲形状失真——这是重离子仿真最常见的"物理没错、结果不对"。
NewCurrentPrefix = "trans_"是给瞬态阶段的输出文件加前缀,避免和前面直流阶段生成的 .plt 混在一起。Plot里的Time列表是绝对时间点,不是相对入射时刻,写的时候要算清楚;NoOverwrite防止重名覆盖,但要注意如果同名文件已存在,它是不写而不是报错,跑完发现没有新文件,先看目录里是不是有旧文件。
4.3 Laser:Optics 段的光学窗口与时间波形
Optics ( OpticalGeneration ( ComputeFromMonochromaticSource TimeDependence ( WaveTime = (1e-9 1e-9) WaveTSigma = 50e-12 ) Scaling = 0 Excitation ( Wavelength = 0.8 * um Intensity = 0.06 * W/cm2 Window "L1" ( Origin = (200, 0) XDirection = (1, 0, 0) Line (Dx = 10) Theta = 0 ) OpticalSolver ( OptBeam ( LayerStackExtraction ( WindowName = "L1" WindowPosition = Center Mode = ElementWise ) ComplexRefractiveIndex (WavelengthDep (real imag)) ) ) ) ) )WaveTime=(1e-9 1e-9)是脉冲的起止时间,两个值相同表示瞬时开关;WaveTSigma=50e-12是高斯展宽,50 ps。这两个一起定义时间波形,和重离子的Wt_hi是同一类参数,但作用在光生载流子上。Wavelength=0.8*um和Intensity=0.06*W/cm2决定光生率,强度单位是 W/cm²,注意别写成 W/m²,差一万倍。
Window "L1"定义光照窗口,Origin是窗口中心,Line (Dx=10)表示沿窗口方向等分 10 条光线,Theta是入射角相对 y 轴的偏转。光线数太少,光生载流子的空间分布会呈条带,影响瞬态电流的细节;给到 10 到 20 是常规量级。LayerStackExtraction要求你的网格里已经包含氧化层、金属层这些光学叠层,缺层会导致反射率算错,最终光生率整体偏大或偏小。Scaling=0表示不做额外缩放,光强完全由Intensity控制,这个值保持 0,不要拿来当调节旋钮用。
4.4 瞬态输出的组织方式
Solve { NewCurrentPrefix = "trans_" Transient ( InitialTime = 0 FinalTime = 60e-9 MinStep = 1e-17 MaxStep = 1e-10 ) { Coupled { Poisson Electron Hole Circuit } Plot (FilePrefix="TransLaser_" Time=(1e-9; 5e-9; 10e-9; 20e-9; 40e-9) NoOverwrite) } }激光瞬态的FinalTime给到 60 ns,比重离子长,因为光生载流子的复合和扩散拖尾更长。Time列表里第一个点放在 1e-9,正好是脉冲前沿,用来抓上升沿;后面几个点按十倍间隔铺开,覆盖整个恢复过程。MaxStep=1e-10在 60 ns 的窗口里意味着理论上最少 600 步,实际因为自适应会到几千步,这是二维结构能接受的范围;三维网格要把这个值放宽,否则算不完。
两类瞬态共用同一个Coupled { Poisson Electron Hole Circuit }求解块,如果电路里没有外部元件,Circuit可以去掉,能省一部分装配开销。
5. 避坑排查:五条让我返工的语句级问题
下面每条都是实际跑崩过、或者跑完发现结果不对回头查到的。语句集本身是对的,问题都出在"照抄时漏了半行"或者"参数之间没对上"。
5.1 收敛与步长类
现象:反偏扫到 0.3 V 左右就报 "Step size too small",日志显示步长一路缩到MinStep。
原因:三种可能叠在一起——初始三步的Coupled预热没做全,直接进了三方程全耦合;MaxStep给得太大,第一步跨过了强非线性区;Notdamped给得太小,牛顿迭代前几次没放开。三者中任意一个都足以让反偏段崩。
解决:先把Coupled { Poisson }单独跑到收敛再往下走,这是硬性顺序;把MaxStep从 0.01 压到 1e-3 试一次,如果能过就说明是步长太粗,逐步放大找到临界值;Notdamped从 60 提到 100,让前 100 次迭代不做阻尼。还有一点容易忽略:BreakCriteria的阈值给太小(比如 1e-12),会在电流刚开始抬升时就中止,看起来像不收敛,实际是主动停的。
现象:C-V 曲线是一条几乎水平的线,随偏压不变。
原因:嵌套顺序写反了,或者Node名和Vsource_pset的节点不一致。前者求解器在无直流工作点的情况下做线性化,后者直接加在错误节点上,两者都不报错。
解决:核对QuasiStationary在外、ACCoupled在内;核对Node (front)与Vsource_pset vn (front 0)完全一致;再检查ACMethod=Blocked和ACSubMethod里的实例名"diodesystem"是否与System段定义的实例名逐字符相同,这个名字对不上时部分版本会静默退化。
5.2 文件与输出类
现象:重跑之后曲线和上一次完全一样,明明改了参数。
原因:输出文件重名,NoOverwrite生效后新结果没写进去,后处理读的是旧文件。
解决:每次改参数前,把Current、Plot、ACExtract、NewCurrentPrefix里的名字带上一段可识别后缀(比如_v2),或者干脆每次跑之前清空输出目录。NoOverwrite是保护机制不是覆盖开关,它保护的方式是"不写",不是"报错"。
现象:跑了几千步,磁盘满了,但电流曲线只需要一条。
原因:Plot段把所有时刻的场分布都存了.tdr,每个文件几十 MB。
解决:Plot用Range加Intervals限定输出次数,或者用Time=(...)显式列出时间点;确认曲线形状之前,先把Plot整段注释掉,只留Current。
5.3 物理模型与量纲类
现象:辐照后的漏电曲线比实测高两三个数量级,形状倒是对的。
原因:Traps里的Conc直接用注量乘了一个从别处抄来的系数,单位从 cm⁻² 变成了 cm⁻³ 但数量级没换算对;或者EnergyMid的参考带写反,陷阱跑到了禁带另一侧。
解决:Conc必须是自己算出的体浓度,注释里那个换算系数只对特定粒子能量和特定材料厚度成立;fromCondBand和fromValBand按陷阱类型选,受主型靠近导带、施主型靠近价带是常见配置。检查方法:先只开一组陷阱跑一次,看 SRH 复合率在什么位置出现峰值,峰值位置应该和EnergyMid对应。
现象:从 .docx 里复制出来的 Physics 段一粘就报语法错。
原因:文档复制时丢了空格,出现DopingDependenceeHighFieldSaturation这种两项粘在一起的写法,Temperature也可能带上不可见字符。
解决:粘完之后逐项扫一遍,Mobility (括号里的每一项都是独立关键字,必须能被空格或换行分开;把整段贴进纯文本编辑器再看一遍,不可见字符会现形。这类错误最坑的地方是报错行号指向括号,而不是指向真正粘在一起的那两个词。
6. 把语句集变成自己的模板:三处改法和一个验证习惯
抄语句只是第一步,能复用的是结构。我现在的做法是把它拆成四个可拼接的片段文件:base.physics(迁移率、复合、带隙变窄这一组基础模型)、trap.inc(辐照陷阱与界面电荷)、heavyion.solve(重离子瞬态)、cv.mixed(Mixed Mode 加 AC)。sdevice 的命令文件支持include,主文件里只留File、Electrode和扫描目标,其余按需拼进来。
# main_iv.cmd —— 主文件只保留结构和目标 File { Grid="Diode_msh.tdr" Current="run_iv.plt" Output="run_iv.log" } Electrode { { Name="ElectrodeN" Voltage=0.0 } } include "base.physics" include "trap.inc" Solve { Coupled (Iterations=50) { Poisson } Coupled (Iterations=15) { Hole Poisson } Coupled (Iterations=15) { Electron Hole Poisson } QuasiStationary (InitialStep=1e-7 MaxStep=1e-3 MinStep=1e-10 Goal { Name="ElectrodeN" Voltage=100 }) { Coupled { Hole Electron Poisson } } }拆分的好处是变量收敛了:换个器件不用重写 Physics,只要换Grid和电极名;做辐照对比实验,注释掉一行include "trap.inc"就是干净器件。注意include的文件里不要再写Physics { }的外层大括号,片段本身应该是括号内的内容,或者完整的一段Physics,两种风格不能混,混了会出现大括号不配对。
验证这一步不能省。我的习惯是每搭一个新结构,先用这套语句跑一条"疋"曲线,再和解析解对一遍:低偏压下的理想因子、反偏饱和电流的量级、C-V 在耗尽区的 1/C² 线性关系,这三个指标任意一个偏离超过一倍,就说明模型组合或者单位换算出了问题,这时候再往下做瞬态都是白跑。用 1/C² 对反偏电压作图看是否成直线,是最省事的一步自查,比对着波形猜原因快得多。
再补一个具体技巧:把BreakCriteria和Plot的输出组合成"轻量探针"。反偏扫描时BreakCriteria { Current (Contact="ElectrodeN" maxval=1e-6) }让求解器在电流到阈值时停在一个接近击穿但没崩的位置,然后在这个位置开一次Plot抓雪崩产生率的分布,就能直接看出击穿点落在结面还是终端。这个用法比扫到崩掉再回头找位置省一大半时间。
从那以后我每次改完 Physics 段,都强制走一遍"单开一个模型、跑一条低偏压曲线、看三个指标"的流程,哪怕只改了一个Randomize。这套流程拦下过好几次看似无关、实际把量纲改错的改动。希望帮到你。
本文还有配套的精品资源,点击获取