
简介面向微电子、纳米电子与光电子器件仿真的初学者与工程技术人员这份文档以Sentaurus命令语句为主线覆盖I-V曲线计算、C-V曲线提取、辐照损伤与重粒子入射、瞬态过程四类典型场景。内容包含电流电压File中网格与输出参数的定义、Diode在Mixed Mode下交流耦合的电容仿真设置、HeavyIon模型的方向位置与LET参数写法以及激光光照下的Transient求解配置并给出Plot输出、Math数值方法与Solve迭代策略的示例读者可据此改写为自己的输入文件。包内共1个docx文件约16KB纯文本语句便于检索与复制粘贴适合作为案头速查手册。目前已有2036人学习下载对需要快速回忆关键字拼写、参数组合与求解流程的器件仿真人员具有较高参考价值也可作为课程实验与课题建模的语句底稿。1. 从一份全是片段的 docx 说起拿到「各种语句sentaurus.docx」这种文档第一反应通常是失望——它不像工程没有一行能直接双击跑起来的脚本打开全是按功能切开的命令片段。但真在 Sentaurus 里搭过器件仿真的人都清楚卡人的从来不是软件装不上而是 Physics 段里那几十个模型开关怎么组合、Solve 段的步长给多少才不炸、混合模式里 AC 分析的节点名往哪挂。这份文档的价值就落在这儿I-V 扫描、C-V 混合模式、重离子入射、激光注入、辐照陷阱五类语句都按 SDevice 的真实语法摆在一起能直接抄进自己的 .cmd 里改。它适合两类人刚接触 TCAD、手上有网格但不知道命令怎么写的新手以及做器件可靠性、想把瞬态和陷阱模型串起来的熟手。2. 语句骨架拆解一份 SDevice 命令从 File 到 Solve 的六段式组织SDevice 的命令文件习惯叫 .cmd不是脚本而是一份声明书。它从头到尾只干一件事告诉求解器去哪读网格、在哪个电极上加什么条件、开哪些物理模型、用什么数值策略、最后把哪些量吐出来。这份文档里每一个例子无论是直流扫描还是纳秒级瞬态都严格落在这个六段结构里。先把骨架立住后面所有复制粘贴才有地方放否则改一个模型开关都不知道该改哪一行。2.1 File / Electrode / Physics 三段的职责边界最容易被新手糊在一起的就是这三段。File 管输入输出路径Electrode 管电学边界Physics 管材料层面的方程。文档里的 Diode 例子把三者分得很清楚File { Grid Diode_msh.tdr # 由 sde / snmesh 生成的网格输入 Current Diode_IV.plt # 电极电流电压纯文本可直接画图 Plot Diode_IV.tdr # 场量分布需要可视化工具打开 Output Diode_IV.log # 求解日志不收敛时的第一现场 } Electrode { { NameElectrodeN Voltage 0.0 } # 初始偏压后续由 Solve 段接管 } Physics { AreaFactor 1 # 二维仿真按厚度折算电流单位 um Temperature 300 # 晶格温度单位 K Mobility (DopingDependence eHighFieldSaturation hHighFieldSaturation EnormalCarrier CarrierCarrierScattering) Recombination (SRH (DopingDependence) Auger (withGeneration) Avalanche (UniBo Eparallel) Band2Band (Hurkx)) EffectiveIntrinsicDensity (OldSlotboom) }File 段的四个键各有分工。Grid 是唯一必须存在的输入路径写错会直接报找不到文件Current 记录的是电极上的积分量文件小、纯文本、方便用脚本批量抓取Plot 记录的是每个网格点上的场量体积大只在需要看分布时才开。Output 是日志很多人忽略它但收敛失败时真正能定位问题的就是这份 log 里最后几步的残差。Electrode 段里的 Voltage 只是初值不是扫描终点。这一点经常被误解有人把 1000 V 直接写进 Electrode然后抱怨为什么没扫描。正确的扫描范围由后面 Solve 段里的 Goal 决定Electrode 里给 0 表示从零偏开始。Physics 段是整份文件里最需要经验的部分。AreaFactor 在二维仿真里代表器件在第三维的厚度默认 1 um如果你的器件宽度是 10 um这里就得改成 10否则算出来的电流小一个量级。Mobility 括号里的四个开关分别对应掺杂散射、高场饱和、界面法向场退化和载流子间散射少开一个低场和高场的迁移率曲线就对不上。Recombination 里的 Avalanche 打开后才会出现击穿UniBo 是雪崩模型的一种Eparallel 表示驱动量取电场平行分量。Band2Band 用 Hurkx 模型反向漏电大的器件必须开否则仿真出来的漏电流比实测低好几个数量级。EffectiveIntrinsicDensity 用 OldSlotboom 是为了在重掺杂区修正禁带变窄高浓度 emitter 的仿真离不开它。2.2 五种文件后缀的职责划分文档里反复出现 .tdr、.plt、.log、.cmd 以及后处理用的 .tcl混着用很容易翻车。下面这张表是我自己贴在显示器边上的对照后缀内容谁生成谁读取体积.tdr网格 场量分布sde / sdevice可视化工具、tcl 脚本大.plt电极电流、电压、电容sdevice曲线工具、gnuplot小.log求解过程、残差、警告sdevice文本编辑器中.cmd仿真命令手写sdevice极小.tcl后处理与绘图脚本手写可视化工具极小理解这张表的关键在于.plt 里的量是电极层面的标量你想看器件内部发生了什么必须打开 .tdr而 .tdr 只在 Plot 段声明的时间点或偏压点才写一次求解过程中的中间状态是看不到的。所以调试瞬态时把 Plot 的时间点排密一点比事后猜要省事得多。文档里还藏着一个命名习惯值得抄走稳态用IV_、CV_瞬态用trans_前缀配NewCurrentPrefix重离子用TransHI_。配合NoOverwrite关键字能避免同名文件被悄悄覆盖——这个坑我踩过不止一次跑了两小时的瞬态最后发现结果被第二次运行冲掉了。2.3 Math 段把求解器的锅先甩出去物理模型决定方程对不对Math 段决定方程解不解得出来。文档里的配置是这样的Math { # Cylindrical # 轴对称器件才放开普通二维别开 Method Pardiso # 稀疏直接求解器小规模网格的首选 Number_of_threads 4 # 线程数跟 license 和物理核数对齐 Extrapolate # 用上一步的解外推当前步初值 Derivatives # 解析求导收敛更快 AvalDerivatives # 雪崩项求导开雪崩就必须开这个 RelErrControl # 用相对误差而非绝对误差做收敛判据 Iterations 15 # 单个非线性迭代上限 Notdamped 60 # 前 60 次迭代不做阻尼 BreakCriteria { Current (Contact ElectrodeN maxval 1e-8) } }MethodPardiso 是直接法内存占用大但不需要调参网格在十万节点以内基本都能一次跑通网格再大就得换迭代法那时候收敛参数才需要细调。Number_of_threads 不是越大越好超过物理核数反而拖慢而且每增加一个线程都要占 license。Extrapolate 和 Derivatives 是提速项前者用上一步的解做初值后者避免数值差分两者一起开能让迭代次数明显下来。AvalDerivatives 是雪崩模型的专属开关忘了开的话一旦偏压接近击穿残差就会来回震荡。RelErrControl 决定收敛判据的量纲开与不开在电流跨度大的 I-V 扫描里差别很明显。Notdamped60 是最容易被忽视的一项。默认情况下求解器会对每一次更新做阻尼接近击穿时步长被压得极小扫描就卡住了。给前 60 次迭代放开阻尼让它先大步走到解的附近再靠后面的阻尼收敛这个技巧在雪崩和瞬态仿真里几乎是必需的。BreakCriteria 是安全阀。当某个电极的电流超过设定值就中止求解避免在击穿区无限细分步长。文档里给的是 1e-8 A实际用的时候要按器件面积折算否则小器件永远触发不了、大器件一上来就退出。3. 曲线仿真主线Diode 的 I-V 与 C-V 求解链怎么搭曲线是 TCAD 最基础的产出也是校核模型参数的第一道关。文档里给了两条完整链路直流扫描出 I-V混合模式加 AC 分析出 C-V。两条链路的骨架相同差别全在 Solve 段和是不是引入了外部电路。3.1 直流 I-V分级 Coupled 加 QuasiStationary 的递进策略先把三条耦合语句摆出来看Solve { Coupled (Iterations50) { Poisson } Coupled (Iterations15) { Hole Poisson } Coupled (Iterations15) { Electron Hole Poisson } QuasiStationary ( InitialStep 1e-6 MaxStep 0.01 MinStep 1e-9 Goal { NameElectrodeN Voltage1000 } Plot { Range(0 1) Intervals2 } ) { Coupled { Hole Electron Poisson } Plot (FilePrefixIV_ Time(0.01; 0.05; 0.1; 0.5) NoOverwrite) } }前三行是初始化顺序不能乱。先单独解泊松方程让电势在没有载流子输运的情况下先站稳再加空穴解一次让空穴分布跟上电势最后三个方程一起解。为什么要分三级而不是直接上全耦合因为零偏初始状态下载流子浓度和电势互相拉扯直接全耦合经常在第一步就发散。分级之后每一级都有前一级的解当初始值收敛概率高得多这是血泪经验换来的写法。QuasiStationary 是准静态扫描意思是每一步都当作稳态来解只是外部偏压缓慢变化。InitialStep 给 1e-6 V意思是第一步只加 1 微伏几乎肯定能解出来MaxStep 给 0.01 V限制单步最大跨度。Goal 里的 Voltage1000 是扫描终点注意这里写的是绝对值不是增量。Plot 里的 Range(0 1) 和 Intervals2 是另一层意思在每一步内部再细分成两段输出场量分布。这个机制常被误解成扫描步长其实它只影响 .tdr 的输出密度不影响求解精度。最后一个 Plot 的 Time(0.01; 0.05; 0.1; 0.5) 看着奇怪——准静态扫描里哪来的时间这里的 Time 实际是归一化的扫描进度0.5 表示扫到半程。分号是分隔符写成逗号在某些版本上会被当成小数分隔符这个细节文档里没写但踩过的人不少。扫描到高偏压时雪崩倍增会让电流在很小的电压区间内涨好几个数量级此时 MaxStep 的 0.01 V 就显得太粗经常出现用了 1000 步还没到终点的情况。我的做法是在 0.8 倍击穿电压之后把 MaxStep 降到 1e-3或者在 Goal 里拆成两段先扫到 0.8 倍再单独扫剩下的区间。3.2 混合模式 C-VSystem 段加 ACCoupled 的接法C-V 不能靠准静态扫描直接得到必须引入小信号分析。文档里用的是混合模式把器件当成一个元件接到外部电路上再在电路节点上做 AC 分析Device Diode { Electrode { ... } File { Grid Diode_msh.tdr Current Diode_CV_1kHz.plt Plot Diode_CV_1kHz.tdr } Physics { ... } Plot { } } System { Diode diodesystem (ElectrodeNfront ElectrodeP0) Vsource_pset vn (front 0) { dc0 } } File { Output Diode_CV_1kHz.log ACExtract Diode_CV_AC_1kHz.plt } Solve { Coupled (Iterations50) { Poisson } Coupled (Iterations15) { Hole Poisson } Coupled (Iterations15) { Electron Hole Poisson } Coupled (Iterations15) { Electron Hole Poisson Contact } 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 } } }System 段是新东西。Diode diodesystem (ElectrodeNfront ElectrodeP0)把器件实例化成电路里的一个元件电极 N 接到节点 front电极 P 接地。Vsource_pset vn (front 0) { dc0 }是一个理想电压源串在 front 和地之间dc0 是它的偏压初值。Solve 段比 I-V 版本多了一行Coupled { Electron Hole Poisson Contact }。Contact 方程的作用是让电极上的电流成为独立未知量参与耦合没有这一行后续电路节点上的 KCL 就没法闭合。QuasiStationary 的 Goal 换成了Parameter vn.dc意思是扫描电压源 vn 的直流值。Increment2 和 Decrement4 是自适应步长的放大缩小倍数一段扫得顺利就把步长乘 2不顺利就除 4。这两个参数比固定 MaxStep 灵活得多在电容变化剧烈比如耗尽层刚好穿通的区间会自动加密。真正的 AC 分析在 ACCoupled 里。StartFrequency 和 EndFrequency 都给 1e3NumberOfPoints1意思是只算 1 kHz 这一个频点——这是文档例子的局限做实际 C-V 曲线通常要扫频把 EndFrequency 拉到 1e6、NumberOfPoints 给到 10 才是常规做法。Decade 表示频点按十倍频程分布。Node (front) 指定在哪个电路节点上注入小信号、并在哪个节点上读取响应。ACMethodBlocked 表示把 AC 计算和 DC 解耦先解完直流再单独求小信号ACSubMethod 里的 ParDiSo 是求解该子系统的算法Blocked 模式下每个 AC 频点独立求解内存占用小缺点是没法处理强非线性耦合——不过 C-V 本来就是小信号这个限制影响不大。ACExtract 指定 AC 结果的输出文件里面的量是导纳 Y 的实部虚部电容要从虚部换算C -Im(Y)/(2πf)。这一步文档没写新手拿到 .plt 经常不知道怎么变成 C-V 曲线。3.3 结果对齐怎么判断曲线是对的跑出曲线不等于曲线可信。我的核对顺序是三条。第一看零偏I-V 在 0 V 处的电流应该是正负对称的极小值如果一上来就是毫安级多半是 AreaFactor 或掺杂浓度错了C-V 在零偏处的电容应该接近按耗尽层宽度手算出来的值。第二看单调性I-V 必须单调递增出现回落说明扫描步长太粗、跳过了某个解分支。第三看 .log 里的步长记录正常扫描的步长应该是逐渐放大的如果一直在 MinStep 附近徘徊说明每一步都在硬撑结果不可信。C-V 还有一条容易忽略低频和高频曲线在反型区会分开。如果扫频范围只给了一个点这条判据就用不上务必先做一次宽频扫描确认频散特性再固定单频点批量跑。4. 物理模型落地重离子入射、光注入与辐照陷阱三套语句怎么填前面两条链路是稳态这一章的三套语句全都落在瞬态和物理模型上。它们的共同点是Physics 段决定发生了什么Solve 段的 Transient 决定什么时候发生两者时间尺度必须匹配否则要么看不到响应要么算到天荒地老。4.1 HeavyIon一次入射的完整参数拆解Physics { HeavyIon ( Direction (0, 1) # 入射方向单位向量沿 y 轴向下 Location (200, 0) # 入射点坐标单位 um必须在器件内 Time 1e-9 # 入射时刻单位 s Length 10 # 轨迹长度单位 um Wt_hi 0.05 # 横向特征宽度单位 um LET_f [0 8.7e-6 8.7e-6 0] # 时间相关的 LET 波形 Gaussian # 横向高斯分布默认是均匀分布 PicoCoulomb # 电荷量单位pm 级另一种是 fC ) } Solve { NewCurrentPrefix trans_ Transient (InitialTime 0 FinalTime 35e-9 MinStep 1e-17 MaxStep 1e-10) { Coupled { Poisson Electron Hole Circuit } Plot (FilePrefixTransHI_ Time(0.5e-9; 1e-9; 2e-9; 5e-9; 10e-9) NoOverwrite) } }Direction 是单位向量二维仿真里通常写 (0,1) 或 (1,0)第三个分量可以省略写成三元组也合法。Location 的坐标必须落在网格覆盖范围内落在外面不会报错只会得到一条平直的电流曲线这是最隐蔽的坑之一。Length 是电离轨迹的长度应该和器件耗尽区厚度匹配。写得比器件厚多余的电荷会沉积在衬底里写得比耗尽区薄收集电荷量偏少。Wt_hi 是轨迹的横向展宽配合 Gaussian 关键字把线电荷抹成一条高斯带数值上更稳定。LET_f 是随时间变化的线性能量转移单位是 pC/um。数组里[0 8.7e-6 8.7e-6 0]表示从一个较早时刻开始上升、在某个时刻达到平台、再回落四个点线性插值。这条波形的时长要和后面 Transient 的 MaxStep 匹配——MaxStep 给 1e-10 意味着 100 皮秒内有 1000 步足够把波形解析出来如果 MaxStep 给到 1e-9波形就被跨过去了电流尖峰直接消失。PicoCoulomb 和 fC 是电荷单位的选择选哪个取决于你的 LET 数值量级两种写法算出的结果等价别混用就行。Transient 段里 MinStep 给 1e-17 秒这个量级接近双精度极限作用是给自适应步长留出足够的下调空间FinalTime 35e-9 对应的物理过程是电荷收集完成、电流回到基线。Plot 的时间点用分号分隔0.5e-9 和 1e-9 两个点靠得很近是为了抓住上升沿。NewCurrentPrefix trans_是给所有输出文件加前缀避免多次运行互相覆盖。它和 Plot 里的 FilePrefix 是两套机制前者改的是 .plt后者改的是 .tdr两个都要设。4.2 Optics单色光注入与时间波形Optics ( OpticalGeneration ( ComputeFromMonochromaticSource () TimeDependence ( WaveTime (1e-9 1e-9) # 光脉冲的起始与结束时刻 WaveTSigma 50e-12 # 上升/下降沿的时间常数 ) Scaling 0 # 0 表示不缩放用给定的 Intensity 原值 Excitation ( Wavelength 0.8 * um Intensity 0.06 * W/cm2 ) Window (L1) ( Origin (200, 0) # 入射窗口起点 XDirection (1, 0, 0) # 窗口的横向方向 Line (Dx 10) # 窗口宽度 10 um Theta 0 * # 相对 y 轴的入射角 ) OpticalSolver ( OptBeam ( LayerStackExtraction ( WindowName L1 WindowPosition Center Mode ElementWise ComplexRefractiveIndex (WavelengthDep (real imag)) ) ) ) ) )Optics 段的核心是把光翻译成每个网格点上的载流子产生率。ComputeFromMonochromaticSource 表示按单色光源解析计算不做射线追迹TimeDependence 把光照强度变成时间的函数WaveTime 给起止时刻WaveTSigma 给高斯型脉冲的宽度两个值都设成 1e-9 时形成一个近似方波的光脉冲。Scaling0 这一项经常被误解成关闭光照。实际上它是关闭对 Intensity 的额外缩放因子让后文给的 0.06 W/cm² 原样生效设成 1 才是开启缩放那时候还得再给一个系数反而容易把功率算错。Window 定义光照落在器件的哪一段。Line(Dx10) 表示一条长 10 um 的窗口线Origin 是起点XDirection 决定这条线怎么摆。Theta 是入射角0 表示垂直入射单位写成0 *是为了适配内部的角度单位制。LayerStackExtraction 会从网格里提取每一层的厚度和复折射率据此算反射、透射和吸收分布。ComplexRefractiveIndex 里同时给 real 和 imagimag 部分才决定吸收系数只给实部的话产生率会全是零。这一段必须配合瞬态求解才有意义Solve 段和重离子例子几乎一样只是 FinalTime 拉长到 60e-9因为光生载流子的复合过程比重离子慢。4.3 Traps辐照损伤的陷阱参数怎么填Physics (materialSilicon) { Traps ( (Acceptor Level EnergyMid 0.42 fromCondBand Conc 2.3226E15 Randomize 0.29 eXsection 9.5E-15 hXsection 9.5E-14) # Conc Fluence * 1.1613 - 浓度由注量换算而来 (Acceptor Level EnergyMid 0.46 fromCondBand Conc 1.8E15 Randomize 0.23 eXsection 5E-15 hXsection 5E-14) (Donor Level EnergyMid 0.36 fromValBand Conc 1.8E15 Randomize 0.31 eXsection 3.23E-13 hXsection 3.23E-14) ) } Physics (MaterialInterfaceOxide/Silicon) { # Traps (FixedCharge Conc5e10) Charge (Conc 1.5e11) }Traps 里每个括号定义一种陷阱。Acceptor 和 Donor 决定陷阱带电时的符号进而决定它是补偿 n 型还是 p 型衬底。Level EnergyMid 给能级位置单位 eVfromCondBand 表示从导带底往上量fromValBand 表示从价带顶往下量两种写法不能混——把 0.42 eV 写成 fromValBand能级就跑到了禁带另一侧仿真结果会完全对不上。Conc 是陷阱体浓度单位 cm⁻³。注释里的Conc Fluence * 1.1613说明了它的来历由辐照注量乘以一个经验系数换算得到这个系数跟粒子种类和能量有关不是普适常数换实验条件就得重算。Randomize 给的是浓度的相对抖动幅度0.29 表示各点的陷阱浓度在均值上下浮动 29%。这个开关的意义在于模拟真实材料里的空间不均匀性但打开后每次运行的随机种子可能不同同一份命令跑两遍结果会有细微差别。要做参数扫描先把 Randomize 去掉跑基线确认趋势对了再开。eXsection 和 hXsection 是电子和空穴的俘获截面单位 cm²。这两个值直接决定 SRH 复合率取值通常来自文献或实验拟合跨度可以有好几个数量级。文档里第三个陷阱的 eXsection 给到 3.23e-13比前两个大了两个量级这是有意为之——不同能级的俘获能力本来就不同。最后那段 Oxide/Silicon 界面上的 Charge 是固定电荷不是陷阱。固定电荷不参与复合只改变界面附近的能带弯曲。注释里被注掉的Traps (FixedCharge Conc5e10)是一种旧写法某些版本上仍然可用但新版本推荐用独立的 Charge 语句。5. 避坑与排查不收敛、结果反常、文件被覆盖的三个高发区这份文档给的是能跑通的语句但换到自己器件的网格上十有八九第一次跑不顺。下面五条是我和身边人反复踩过的按现象、原因、解决分开写遇到问题可以照着对号入座。5.1 求解不收敛从步长和初始解查起现象QuasiStationary 跑到某个偏压附近log 里反复出现步长被压缩的记录最后停在 MinStep 退出或者直接报迭代次数超限。原因绝大多数时候是单步步长跨过了非线性最强的区间。雪崩倍增、耗尽层穿通、陷阱填充这几个物理过程在很小的电压窗口内会让电流变好几个数量级0.01 V 的 MaxStep 在低压区绰绰有余到高压区就太粗了。另一种原因是初始解离真实解太远三级 Coupled 没起到作用。解决先把 Goal 拆成两段低压段用 0.01 V 的 MaxStep接近击穿后改成 1e-3 V同时确认 Math 段里的 Notdamped 给了足够大的值让求解器有机会大步走到解附近。如果还是不行把 Coupled 的 Iterations 从 15 提到 30代价是每步慢一点但能撑过去。千万不要靠一味缩小 MinStep 解决那只是让失败来得晚一些。5.2 曲线形状不对先怀疑参数再怀疑模型现象I-V 曲线在低偏压就出现明显电流或者 C-V 曲线算出来的电容是负值、跟频率完全无关。原因低偏压电流异常八成是 AreaFactor 没按器件厚度改或者掺杂浓度单位搞错了cm⁻³ 写成 m⁻³C-V 出问题多半是 ACCoupled 只给了单一频点加上 QuasiStationary 的 Increment 太大导致偏压点稀疏电容微分算不准。解决先把 AreaFactor 和网格里的掺杂剖面对一遍用 .plt 里的 DopingConcentration 或者直接在 .tdr 里看确认量级对。C-V 这边把 StartFrequency 和 EndFrequency 拉开成 1e3 到 1e6、NumberOfPoints 给 10 点先看全频段的行为再回去固定单频点偏压步长用 Increment/Decrement 自适应别写死 MaxStep。现象重离子瞬态跑完电流曲线是一条平线完全没有尖峰。原因Location 落在了器件外面或者落在网格很稀疏的区域另一种是 Transient 的 MaxStep 比 LET 波形的持续时间还大整个入射过程被一步跨过去了。解决先在结构图里标出入射点坐标确认它落在耗尽区内再把 MaxStep 压到 1e-11 量级在 .log 里确认入射时刻附近的步长确实变小了。Direction 也顺手检查一遍二维仿真里写成 (0,0,1) 会得到零响应。5.3 文件与环境那些跟物理无关的坑现象换一台机器跑同样的 .cmd报找不到网格文件或者跑了两小时结果文件被第二次运行覆盖。原因Grid 用的是相对路径工作目录一变就失效输出文件名没带前缀加上没写 NoOverwrite同名文件被直接冲掉。解决Grid 统一写绝对路径或者固定一个工作目录、所有 .cmd 都在那里执行。输出侧把 NewCurrentPrefix、FilePrefix 和 NoOverwrite 三个一起用上瞬态跑多个偏压点的时候尤其重要。现象陷阱模型加进去之后求解直接发散或者 I-V 跟没加陷阱时完全不同。原因陷阱浓度量级填错或者 Randomize 打开导致局部浓度出现极端值也可能是 fromCondBand 和 fromValBand 用反了。解决先把 Randomize 去掉、只留一个陷阱跑基线确认收敛之后再逐个加浓度从 1e14 量级起步往上试别一上来就给 2e15。能级方向再核对一遍施主型陷阱靠近价带、受主型陷阱靠近导带这个对应关系记牢就不容易错。6. 二次开发把散装语句整理成可参数化的仿真模板零散语句最大的问题是复用成本高。每次换器件都得在几十行里找那几个真正要改的值——网格路径、电极名、扫描终点、频率。我的做法是把文档里的五类语句拆成五个模板文件每个模板头部放一组变量正文里只引用变量名这样换项目时改十行就够。具体做法是建一个params目录每个模板开头写成这样# Diode_IV 模板参数 # $GRID$ 网格文件绝对路径 # $CONTACT$ 扫描电极名必须和网格里的电极一致 # $VMAX$ 扫描终点电压单位 V # $AREA$ 二维仿真的第三维厚度单位 um # $TEMP$ 仿真温度单位 K # File { Grid $GRID$ Current IV_${CONTACT}.plt Plot IV_${CONTACT}.tdr Output IV_${CONTACT}.log } Electrode { { Name$CONTACT$ Voltage 0.0 } } Physics { AreaFactor $AREA$ Temperature $TEMP$ Mobility (DopingDependence eHighFieldSaturation hHighFieldSaturation EnormalCarrier CarrierCarrierScattering) Recombination (SRH (DopingDependence) Auger (withGeneration) Avalanche (UniBo Eparallel) Band2Band (Hurkx)) EffectiveIntrinsicDensity (OldSlotboom) } Math { Method Pardiso Number_of_threads 4 Extrapolate Derivatives AvalDerivatives RelErrControl Iterations 15 Notdamped 60 } Solve { Coupled (Iterations50) { Poisson } Coupled (Iterations15) { Hole Poisson } Coupled (Iterations15) { Electron Hole Poisson } QuasiStationary ( InitialStep 1e-6 MaxStep 0.01 MinStep 1e-9 Goal { Name$CONTACT$ Voltage$VMAX$ } ) { Coupled { Hole Electron Poisson } } }占位符用$NAME$这种形式是为了和 Sentaurus 自身的变量语法区分开替换脚本用最简单的字符串替换就行不需要引入模板引擎。替换之后先用--dry-run模式把渲染结果打印出来人工扫一眼再交给求解器能省掉大量跑了两小时发现电极名写错的时间。五个模板之间的差异其实很有限我做了一张对照表贴在项目 README 里模板关键差异必须替换的参数IV准静态扫描 Goal 电压GRID、CONTACT、VMAX、AREACVSystem 段 ACCoupledGRID、CONTACT、FREQ、VMAXHeavyIonPhysics 加 HeavyIonSolve 换 TransientGRID、LOC、TIME、LETOpticsPhysics 加 OpticsSolve 换 TransientGRID、WAVE、INTENSITYTrapsPhysics 加 Traps 与界面电荷GRID、CONC、LEVEL、XSECT验证方法上我坚持三条硬规则。第一任何新模板先在原始 Diode 网格上跑一遍结果要和文档里的例子对得上这是基准。第二改完参数后对比 .log 里的总迭代次数如果突然翻了好几倍说明某个模型被意外激活了得回头查。第三瞬态模板必须检查 Plot 时间点是否真的被写出来了用ls -l看文件时间戳和大小比事后打开可视化工具找要快。从那以后我每次新建仿真目录都强制走一遍复制模板 → 渲染参数 → 基准网格试跑 → 对比 log这四步哪怕只改一个电极名也不跳。 TCAD 的调试成本太高一次跑错就是半小时起步前面多花两分钟自查后面少折腾一晚上。希望帮到你。本文还有配套的精品资源点击获取