简介:面向微电子、纳米电子与光电子器件仿真方向的学习者,这份文档把 Sentaurus TCAD 中常用的 sdevice 命令语句集中整理,可用于对照搭建 I-V、C-V 曲线提取、辐照损伤与重粒子入射、瞬态响应等典型仿真流程。包内仅含 1 个 docx 文件,体积约 16KB,篇幅精炼,便于随查随用。内容以可直接套用的语句块为主体:电流电压 File 与 Solve 段的准静态扫描设置、Diode 混合模式下的 AC 耦合电容仿真、HeavyIon 重离子撞击的 LET 与时间参数配置,以及激光光照瞬态中的 Optics 与 WaveTime 写法,并配合 Physics、Math、Plot 中的复合、迁移率、雪崩等模型声明,展现各参数在完整输入文件中的位置关系与搭配方式,便于读者理解语句之间的调用顺序。目前已有 2036 人学习,适合初学 Sentaurus、需要快速回忆语句结构与参数含义的读者作为案头参考。
1. 为什么 Sentaurus 脚本「跑完了」不等于「算对了」
Sentaurus 这类 TCAD 工具最反直觉的地方在于:它几乎不会因为物理设错而报错。你写一份 I-V 扫描脚本,把迁移率模型全关、把 QuasiStationary 的 MaxStep 放大一百倍,求解器照样一路通过,plt 文件里也照样画出一条光滑曲线——只是那条曲线和真实器件已经没有关系了。它真正报错的场合几乎只有一种:数学上真的解不下去。
所以值得搞懂的不是「语句怎么写」,而是这些语句之间的耦合关系:Physics 里每加一个模型,Math 里的 Newton 迭代就要多承担一份非线性;Solve 里的每一层嵌套,都在决定上一层的解能不能当作下一层的初值。后面几章按「命令骨架 → I-V → 小信号与瞬态 → 排查 → 取舍」拆开讲,把每块为什么这么设计、改哪个参数会出问题说清楚。
2. 命令文件的骨架:File、Electrode、Physics、Math 四个块为什么不能乱序
Sentaurus 的 cmd 文件读起来像一份声明式配置单,实际却是一条有向依赖链:File 决定器件长什么样,Electrode 决定边界条件挂在哪,Physics 决定方程里有哪些项,Math 决定这些项怎么被线性化。顺序颠倒未必立刻报错,但会在某一步给出一个和物理毫无关系的失败——这是排查时最浪费时间的一类。
File { Grid = "Diode_msh.tdr" # 网格:器件几何与掺杂分布 Current = "Diode_IV.plt" # 曲线:端电流随偏置的变化 Plot = "Diode_IV.tdr" # 场分布:每个解点的空间量 Output = "Diode_IV.log" # 日志:每步迭代残差与收敛信息 } Electrode { { Name = "ElectrodeN" Voltage = 0.0 } # 初始偏置,非接地声明 }四类输出各管一件事,混用会直接毁掉后处理:plt 是标量曲线数据,适合直接画 I-V;tdr 是场数据,体积大,只在需要看结区电场、电流密度分布时才写入。见过不少脚本把 Plot 设成每个电压点都存,跑一次 1 mm 深的功率器件能写出几十 GB 的 tdr,磁盘先于求解器崩溃。
2.1 File 与 Electrode:先给器件一个身份,再谈偏置
Electrode 的 Name 必须和网格文件里的 contact 名逐字符一致,包括大小写。这里是最常见的低级翻车点:网格是从别的工具转出来的,contact 名可能叫anode,脚本里写ElectrodeN,求解器不会告诉你名字不匹配,而是报一个「contact not found」或者干脆在电流提取时给出零。
Voltage = 0.0 是求解的起点,不是「这个电极接地」的语义。真正的接地信息来自 Mixed Mode 里的 System 块或者 Solve 里的电压目标。这一点在纯器件仿真里无所谓,一旦切到混合模式,初始偏置和电路节点的对应关系就必须对齐,否则第一步 Newton 就会在一个自相矛盾的边界条件下打转。
另一个容易忽略的是网格文件本身。tdr 里已经固化了掺杂分布、材料区域和接触位置,脚本里的 Physics 只能在这些区域上生效。如果网格里没定义 Oxide 区域,后面写MaterialInterface="Oxide/Silicon"的界面陷阱就是空操作——不报错,只是不起作用。这类「静默失效」是 TCAD 脚本最典型的坑。
2.2 Physics:每开一个模型,都是在物理精度和收敛域之间做交易
Physics 块是整个文件里最容易被复制粘贴搞坏的部分。一份典型的 I-V 脚本会长这样:
Physics { AreaFactor = 1 # 器件面积因子,决定电流标度 Temperature = 300 # 晶格温度,单位 K Mobility ( DopingDependence # 掺杂浓度对迁移率的影响 eHighFieldSaturation # 电子速度饱和 hHighFieldSaturation # 空穴速度饱和 EnormalCarrierCarrierScattering # 界面法向电场相关散射 ) Recombination ( SRH (DopingDependence) # 肖克利-里德-霍尔复合,含掺杂依赖寿命 Auger (withGeneration) # 俄歇复合,高注入下主导 Avalanche (UniBo Eparallel) # 碰撞电离,雪崩击穿靠它 Band2Band (Hurkx) # 带间隧穿,反偏漏电的来源之一 ) EffectiveIntrinsicDensity (OldSlotboom) # 重掺杂带隙变窄修正 }这些开关不是「全开就最准」的清单,而是各自有明确适用域。DopingDependence 在轻掺杂时几乎没影响,重掺杂下才是决定性的;Auger 只有在注入载流子浓度接近 1e18 量级时才压过 SRH,低注入下开了只是白增非线性;Avalanche 的 UniBo 参数化对电场方向敏感,Eparallel 表示驱动力取电场平行分量,用错分量方向会得到一条「永远不会击穿」的曲线。
EffectiveIntrinsicDensity 值得单独说。重掺杂下掺杂能级展宽、带隙收缩,本征载流子浓度 n_i 会显著偏离纯硅的值,直接影响 PN 结的内建电势和少子浓度。OldSlotboom 是这套修正的一个经典参数化,代价是它让 n_i 变成位置的函数,Jacobian 多了一项耦合。重掺杂器件的 I-V 曲线如果开和不开差出几十毫伏的开启电压,那不是数值误差,而是物理必须。
常见的实现思路是:先用最小模型集(SRH + 掺杂依赖迁移率)把曲线跑出形状,再逐个加上高场相关的模型,每加一个就看曲线哪一段变了。哪一段没变,这个模型在你的偏置范围内就是可省的,而省掉它意味着 Newton 迭代的收敛半径会宽一圈。
2.3 Math:Newton 迭代黑匣子的四颗旋钮
Math 块决定的是「同样的方程,用什么数值手段解」。它不改变物理,但几乎决定了收敛还是失败。
Math { Method = Pardiso # 线性求解器,稀疏直接法 Number_of_threads = 4 # 线程数,与网格规模匹配 Stacksize = ... # 递归栈大小,大网格时需调 ExtrapolateDerivatives # 外推导数,减少 Jacobian 重算 AvalDerivatives # 雪崩项也参与导数计算 RelErrControl # 用相对误差而非绝对误差判敛 Iterations = 15 # 每个 Coupled 块的默认迭代上限 Notdamped = 60 # 前 60 次迭代不加阻尼 BreakCriteria { Current (Contact = "ElectrodeN" maxval = 1e-8) # 电流超阈值即中止 } }Notdamped = 60 是个很实用的旋钮。Newton 迭代初期离解很远,过强的阻尼会把步长压得太小,反而收敛慢;前几十次放开阻尼让它快速接近解,之后再靠默认阻尼策略稳住。这个数字设得太小会看到残差在下降途中反复回弹,设得太大则在强非线性区(比如击穿拐点)直接发散。
ExtrapolateDerivatives 的机制是从前两步的解外推当前步的导数,省掉一次 Jacobian 组装。在 QuasiStationary 扫电压时收益明显,因为相邻偏置的解很接近;但在重离子瞬态这种解本身剧烈变化的场景,外推反而会引入假导数,此时更稳妥的做法是关掉它、老老实实重算。
BreakCriteria 容易被误当成「收敛条件」,其实它是中止条件。maxval = 1e-8表示某个接触电流超过 1e-8 A 就停止整个 Solve——这恰恰是击穿仿真的常用手法:你不需要真的扫到 1000 V,只要器件电流开始指数上升,就让它提前停下,再回看 plt 里哪一点开始拐弯。
2.4 Solve 的嵌套顺序:为什么 Poisson 必须先单独解
Solve { Coupled (Iterations=50) { Poisson } # 只解泊松,拿到初始电场 Coupled (Iterations=15) { Hole Poisson } # 加入空穴连续性 Coupled (Iterations=15) { Electron Hole Poisson } # 三方程全耦合 ... }这三行不是仪式感。零偏下器件的载流子浓度跨好几个数量级,直接把三个方程一起丢给 Newton,初值差得太远,迭代会在几个量级之间来回震荡。先单独解 Poisson 得到与 doping 自洽的电场,再纳入空穴方程(对 PN 结来说空穴是少子,先稳住它),最后三方程全耦合——每一步都在给下一步喂一个质量更好的初值。
这套「逐级加变量」的策略在瞬态和 AC 小信号里同样成立,只是加的不是方程而是外部激励。理解了这一点,后面看 C-V 和重离子为什么要先跑一遍 DC 就顺理成章了:所有时变或频域的求解,都建立在某个自洽的直流工作点上。
3. I-V 曲线仿真原理:QuasiStationary 的步长为什么比网格更能毁掉一条曲线
I-V 扫描是 TCAD 里最常见的任务,也是「看起来最简单、翻车最多」的一个。网格只决定空间离散误差,而电压步进方式决定的是一个更根本的问题:Newton 能不能在你给的初值附近找到解。反偏击穿、正偏大注入这两个区段,电流对电压的敏感度相差好几个数量级,用一套固定步长扫过去基本等于放弃。
3.1 外层电压步进、内层 Newton 的两层循环
QuasiStationary ( InitialStep = 1e-6 # 首个电压步长(V) MaxStep = 0.01 # 步长上限 MinStep = 1e-9 # 步长下限,低于此值判定失败 Goal { Name = "ElectrodeN" Voltage = 1000 } # 扫描终点 Increment = 2 # 收敛后步长放大倍数 Decrement = 4 # 失败后步长缩小倍数 ) { Coupled { Hole Electron Poisson } # 每个电压点内部的全耦合 Newton Plot (FilePrefix="IV_" Time=(0.01; 0.05; 0.1; 0.5) NoOverwrite) }这里有两层循环,容易混淆。外层是电压的准静态推进:从一个偏置出发,按 InitialStep 迈一步,内部用 Coupled 求解,收敛就把步长乘以 Increment,失败就把步长除以 Decrement 重试。内层是标准的 Newton 迭代,变量是三个方程的离散解向量。
自适应步长的本质是在「解曲线的局部曲率」上做采样。正向导通区的电流随电压近似指数增长,固定 0.01 V 步长在开启电压附近可能一步跨过好几个电流数量级,Newton 拿前一点的解当初值,残差直接爆炸。而击穿区更极端:电流从 nA 到 mA 只隔零点几伏,步长必须压到 1e-6 以下。Increment/Decrement 设成 2/4 的意思是「谨慎减、大胆加」——降低步长要更果断,因为失败重试的成本高于多走几步。
MinStep 是最后的防线。它设成 1e-9 意味着:当电压步长已经小到 1 nV 还收敛不了,就判定这一步在数值上无解。这时要么是物理模型自相矛盾(比如电场方向设错导致雪崩项永远不触发),要么是网格在某处太差。
3.2 Plot 里的 Time 是电压点,不是时间
Plot (Time=(0.01; 0.05; 0.1; 0.5))这一行在瞬态里是时间,在 QuasiStationary 里是电压到达值。这是同一个关键字在两种求解上下文下的不同语义,抄脚本时最容易被骗过去。如果把它理解成时间,你会以为仿真在 0.5 s 停止,实际它指的是电极上 0.5 V 的那一点。
Range = (0 1) Intervals = 2是另一种控制:在 0 到 1 的归一化扫描区间里均匀取 2 段,配合外层步进做场分布采样。NoOverwrite 表示同名文件不覆盖,防止多步写到同一个 tdr 里互相踩掉。
写场分布这件事要算成本。一个 50 万节点的网格,单次 tdr 写盘量在几百 MB 量级,而一次 I-V 扫描可能走几百个电压点。合理的做法是只在关心的区段采样:开启电压、击穿拐点、某个指定的反偏值,其余交给 plt 的曲线数据。
3.3 AreaFactor、温度与电流数量级
AreaFactor = 1 是最容易被忽略的一行。TCAD 的二维仿真本质是「一个截面」,求解器算出来的是单位深度上的电流密度积分。AreaFactor 就是把这个截面按器件实际宽度缩放成总电流的因子。设成 1 意味着你拿到的是「每微米宽度」的电流,若直接和实测的安培级数据对比,会差出三到四个数量级。
这和网格分辨率是两回事。加密网格减少的是离散误差,AreaFactor 影响的是标度,前者让曲线更准,后者让曲线对得上。我一般会在脚本顶部把它写成一个显式常量,并在后处理脚本里再乘一遍确认,避免出现「两边都乘了」或「两边都没乘」的翻车。
温度同理。Temperature = 300 是晶格温度,单位 K。有些脚本写成 27(摄氏度),求解器不会报错,只会给出一个荒谬的载流子统计结果——因为 27 K 下杂质几乎完全冻结,载流子浓度比室温低十几个数量级。曲线看起来「很平滑」,物理上完全错。
4. 小信号与瞬态机制:ACCoupled、HeavyIon、光注入凭什么共用一套求解循环
C-V 曲线、重离子入射、激光辐照看起来是三个不同任务,但它们在求解器内部走的是同一套抽象:先有一个自洽的直流工作点,再在它上面叠加一个外部激励——频域的正弦小信号、时域的电荷脉冲、或者一个光生载流子源项。理解了这套抽象,三类仿真的脚本结构就能互相迁移。
4.1 Mixed Mode 与 System 块:C-V 为什么要绕道电路
Device Diode { Electrode { ... } File { Grid="Diode_msh.tdr" Current="Diode_CV_1kHz.plt" Plot="Diode_CV_1kHz.tdr" } Physics { ... } } System { Diode diodesystem ("ElectrodeN"=front "ElectrodeP"=0) # 把器件电极接到电路节点 Vsource_pset vn (front 0) { dc=0 } # 一个直流电压源夹住器件 } File { Output="Diode_CV_1kHz.log" ACExtract="Diode_CV_AC_1kHz.plt" }纯器件模式里,电极电压由 Solve 直接指定;混合模式里,电极变成了电路节点,电压由外接的元件决定。C-V 必须走混合模式的原因在于:小信号电容的定义是「电荷对电压的导数」,你需要一个能同时施加直流偏置和交流扰动的边界条件。Vsource_pset 就干这件事,dc=0 给它一个直流工作点,交流扰动由后面的 ACCoupled 施加。
("ElectrodeN"=front "ElectrodeP"=0)这行的语义是电极名到电路节点的映射:front 是外部节点,0 表示固定在参考电位。名字写错不会报错,只会让某个电极悬空,结果是电容恒为零或者恒为某个常数值——这是 C-V 排查里排第一的怀疑对象。
4.2 ACCoupled 的频域线性化:电容是从导纳矩阵虚部里挖出来的
Solve { Coupled (Iterations=50) { Poisson } Coupled (Iterations=15) { Hole Poisson } Coupled (Iterations=15) { Electron Hole Poisson } Coupled (Iterations=15) { Electron Hole Poisson Contact } QuasiStationary ( InitialStep=1e-6 MaxStep=1e-2 MinStep=1e-7 Increment=2 Decrement=4 Goal { Parameter=vn.dc Voltage=100 } # 扫直流偏置到 100 V ) { ACCoupled ( StartFrequency=1e3 EndFrequency=1e3 NumberOfPoints=1 Decade # 单频点 1 kHz Iterations=15 Node (front) ACMethod=Blocked ACSubMethod("diodesystem")=ParDiSo ) { Poisson Electron Hole Contact Circuit } } }机制是这样的:在每个直流偏置点上,求解器把方程在解附近线性化,得到一个导纳矩阵 Y(ω);在小信号近似下,Y 的虚部除以角频率就是电容。所以 C-V 曲线实际上是「一串直流工作点上的线性化结果」,每个偏置点都要单独做一次 AC 求解。
StartFrequency 和 EndFrequency 都设成 1e3、NumberOfPoints = 1,表示只在 1 kHz 取一个点。对低频 C-V 来说这足够,因为测量本身的频率就是这么设定的;如果是做频率色散分析(比如看界面态响应),才需要扫多个频点,那时 NumberOfPoints 和 Decade 才有意义。
ACMethod = Blocked 和 ACSubMethod("diodesystem") = ParDiSo 是求解器层面的分工:Blocked 表示把耦合系统按物理块拆开求解,避免直接把器件方程和电路方程拼成一个巨型稠密矩阵;ParDiSo 指定子块用并行直接法。器件加电路的联合系统规模很容易上万,全耦合矩阵的内存占用会直接超出可用内存,分块是必须的。
4.3 HeavyIon:LET 波形怎么变成体电荷
Physics { HeavyIon ( Direction = (0,1) # 入射方向 Location = (200, 0) # 入射位置(μm) Time = 1e-9 # 入射时刻 Length = [ ... ] # 径迹长度分布 Wt_hi = [ ... ] # 径迹权重 LET_f = [0 8.7e-6 8.7e-6 0] # LET 随时间的分段线性波形 GaussianPicoCoulomb # LET 单位与分布形状 ) } 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 是这条语句的核心。它给出的是线性能量转移随时间变化的波形,[0 8.7e-6 8.7e-6 0]意味着在四个时间采样点上 LET 从 0 上升到峰值、保持、再回落到 0。求解器把这个波形转成单位体积的电子-空穴对产生率,作为连续性方程的源项加进去。GaussianPicoCoulomb 说明这个 LET 值对应的单位是 pC/μm 量级,且径迹在横向按高斯分布展开——这两个设定共同决定了注入的总电荷量。
时间尺度是最需要盯的地方。整个瞬态窗口只有 35 ns,而 MinStep 设到 1e-17、MaxStep 设到 1e-10,意味着求解器要在万亿分之一秒的粒度上推进。原因在于重离子径迹的产生和收集过程本身就在皮秒量级:载流子以饱和速度穿过微米级距离只需几个皮秒,脉冲前沿如果被步长跨过去,收集电荷的峰值会直接算错。MaxStep = 1e-10 是对「不能跨过脉冲上升沿」的硬约束。
Direction = (0,1) 和 Location 也要和网格对得上。入射位置如果落在电极或氧化层里,产生率会加到一个不该有载流子的区域,结果看起来「有瞬态响应」但形状完全不对。
4.4 OpticalGeneration 与 Traps:另外两类源项
激光辐照走的是光学求解器,它先算光在多层结构里的传播和吸收,再把吸收功率转成产生率:
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" ...))) ) )波长 0.8 μm 落在硅的吸收深度约 10 μm 量级,这个数值决定了光生载流子主要在哪一层产生。选错波长,产生率分布会整体偏移——表面产生和体产生对瞬态波形的贡献完全不同。WaveTSigma = 50 ps 是脉冲宽度,它和后面的 Transient MaxStep 必须匹配:脉冲宽 50 ps 而步长上限设 1 ns,等于用一把尺子量一根头发。
辐照损伤则完全是另一种建模方式,用陷阱替代微观缺陷:
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 是体浓度,脚本注释里那句Conc = Fluence * 1.1613透露了真实的建模思路:陷阱浓度是由辐照注量乘以一个产生率系数换算来的,不同注量对应不同浓度的缺陷。Randomize 给能级加随机扰动,模拟缺陷能级的离散分布,避免所有陷阱挤在同一个能级上产生不真实的复合峰。
eXsection 和 hXsection 是电子、空穴的俘获截面,单位 cm²。这两个参数的数量级直接决定陷阱是「复合中心」还是「陷阱电荷」:截面大、能级靠近禁带中央,主要贡献复合电流;截面小或能级靠近带边,更容易长期捕获电荷、改变电场分布。
5. 排查清单:五类让 Sentaurus 仿真静默出错的常见问题
真正难处理的不是报错,而是不报错。下面这几条是实际调试中最耗时间的,每一条都按「现象 → 原因 → 解决」拆开。
5.1 曲线跑出来了,但电流差三四个数量级
现象:I-V 曲线形状对,开启电压也对,就是电流绝对值比预期小 1e3 到 1e4。
原因:AreaFactor 没设,二维截面的单位深度电流被当成了总电流。或者反过来,后处理脚本里又乘了一次面积,变成重复缩放。
解决:把 AreaFactor 显式写在 Physics 块顶部并注释单位,后处理阶段只做一次缩放。仿真结果和实测对比前,先确认两边都是「总电流」还是「电流密度」,这一步不做,后面所有拟合都是无效功。
5.2 反偏扫到某个电压突然不收敛,步长一路掉到 MinStep
现象:正向区一路顺畅,反偏到接近击穿时步长被反复砍半,最后停在 MinStep 报「step too small」。
原因:Avalanche 模型的开启让电流对电压的敏感度陡增,而 MaxStep 还是正向区那套量级,Newton 一步跨过了拐点。另一种可能是 Eparallel 的方向设定和实际电场方向不符,雪崩项在错误的区域被触发。
解决:在预计击穿区前把 MaxStep 降一到两个数量级,同时打开 AvalDerivatives 让雪崩项参与导数计算;先关掉其他高阶模型(Auger、Band2Band)确认曲线形状,再逐个加回来,看是哪个模型让收敛域塌缩。
5.3 C-V 曲线是一条常数线或者恒为零
现象:AC 提取出来的电容在整个偏置范围内几乎不变,或者干脆是 0。
原因:三种可能——System 块里电极名到节点的映射写错,某个电极悬空;ACCoupled 的 Node 指定的不是真正加扰动的节点;或者直流工作点根本没扫起来(Goal 里的 Parameter 写成了不存在的变量名)。
解决:先看 log 里每个偏置点是否真的完成了 DC 收敛,再检查 Device 块的电极名和 System 块的字符串是否逐字符一致,最后确认 Node (front) 里的节点名和 Vsource 定义的一致。
5.4 瞬态第一步就崩,或者波形前半段是平的
现象:Transient 在 InitialTime 附近报错退出;或者跑完了但收集电荷的波形在脉冲到达前就开始上升。
原因:初始条件和直流解不一致——Transient 的起点应该是一个已经收敛的稳态解,如果前面没做 QuasiStationary 或者直流没收敛就进瞬态,第一步的残差会非常大。波形提前上升则通常是 HeavyIon 的 Time 设在了某个步长中间,求解器为了捕捉它自动缩步,但 Plot 采样点没覆盖到。
解决:瞬态前强制跑一遍稳态 Coupled 并确认收敛;把 MinStep 设到能分辨脉冲上升沿的量级,并显式指定 Plot 的 Time 采样点覆盖脉冲前后。
5.5 加了陷阱模型,结果反而「更理想」
现象:开启 Traps 之后,漏电流下降、亚阈值斜率变陡,看起来器件性能变好了。
原因:陷阱参数的单位或符号搞错。Conc 写成面密度而不是体密度,或者 EnergyMid 用了相对禁带中央而不是带边,导致陷阱能级落在错误位置,实际起的是「抽走载流子」的作用。界面 Charge 的符号也常错,正负号搞反会让耗尽区行为完全颠倒。
解决:先用单一能级、单一大截面做一个可解析验证的对照(比如只算复合电流),确认数量级对了再叠加多能级和随机化。Randomize 打开后要检查随机种子的可复现性,否则两次跑出来的曲线不同,会误以为是物理差异。
6. 设计取舍:网格、模型完备性与算力之间的那笔账
TCAD 仿真里没有「全都设到最准」这个选项,因为三样东西互相挤占:网格密度决定空间离散误差,模型完备性决定物理误差,时间/电压步长决定迭代误差,而三者的成本都落在同一份算力预算上。一个实用主义的排序是:先把网格做到结区和沟道处足够密、体区可以很疏,这一步的收益最大;再逐个加物理模型,每加一个都对比曲线差异,差异不显著的模型就是可以砍掉的;最后才去调步长,因为步长只影响能不能收敛,不改变收敛到的那个解。
| 配置项 | 加严的代价 | 漏掉时的典型后果 |
|---|---|---|
| 结区网格加密 | 内存与线性求解时间近似平方增长 | 击穿电压偏高,峰值电场被抹平 |
| Avalanche 模型 | 强非线性,收敛域收窄 | 反偏电流永远上不去,看不到击穿 |
| Auger 复合 | 高注入区多一项耦合 | 大电流段斜率偏小 |
| RelErrControl 收紧 | 每步迭代次数增加 | 曲线在拐点处出现台阶 |
| MaxStep 减小 | 总步数成倍增加 | 跨过脉冲前沿,峰值算错 |
我自己的习惯是给每个项目留一份「最小可复现配置」:只保留能跑出正确曲线形状的模型,其余全部注释掉,每一步加模型都单独存一版 plt 做对比。这样一旦某条曲线对不上,能立刻二分定位是物理问题还是数值问题。血泪经验是:不要把「跑完了」当成通过,Sentaurus 最擅长的就是在你什么都没察觉的时候,安静地给出一条漂亮但错误的曲线。从那以后我每次改完 Physics 块,都强制走一遍「关掉所有高阶模型 → 逐个加回 → 对比曲线」的流程,宁可多花半天,也不要在错误的结果上做一个月优化。希望帮到你。
本文还有配套的精品资源,点击获取