简介:Sentaurus 仿真应用文档围绕微电子器件仿真展开,面向需要掌握 I-V、C-V 曲线计算、辐照损伤与重粒子入射模拟、瞬态仿真等技能的器件设计人员与科研学习者。文档以具体命令脚本和物理模型配置为主线,覆盖电流电压特性分析、Diode 电容特性提取、重离子撞击与激光辐照瞬态过程等典型场景,并给出 Electrode、Physics、Math、Solve 等关键模块的实用写法,包括 Mobility、Recombination、Avalanche、Band2Band 等物理模型参数设置,以及 AC 耦合扫描、重离子入射时间与 LET 定义、激光光斑参数配置等细节。这些内容可直接对照修改用于自己的仿真工程,帮助减少命令报错和参数调优时间。压缩包内为 1 个 docx 文件,整体仅 16KB,内容精炼、便于查阅。该资源已有 2032 人学习,适合正在使用 Sentaurus 进行器件特性仿真或需要参考命令模板的初学者与进阶用户。
1. 从一段二极管命令流说起:Sentaurus SDevice仿真能直接复现什么
拿到这份名为“各种语句sentaurus”的文档,里面是几段被复制得七零八落的 SDevice 命令流,中英文笔记混排,代码片段里还夹着“电容III”这种一半标题一半批注的痕迹。第一次看的人多半想先找完整工程文件,但这类资料里最值钱的恰恰是命令流本身——它把 Sentaurus 最常用的五类仿真都覆盖到了:I-V 准静态扫描、C-V 混合模式小信号分析、重离子单粒子效应、激光照射瞬态、辐照损伤陷阱模型。只要按 File、Physics、Math、Solve 四段拆开读,一段二极管的 I-V 模板就能扩展成一套完整的器件仿真流程,这也是这篇笔记要带着你做的事。
这套资源适合正在跑 TCAD 仿真、需要复现论文里的 I-V/C-V 曲线,或者要做单粒子效应与辐照损伤评估的工程师和学生。命令流本身不复杂,真正的门槛在三点:物理模型开哪些、收敛参数怎么配、陷阱参数和辐照注量怎么换算。下面直接从 SDevice 命令流的骨架讲起,每段都会落到能直接改的参数上。
2. SDevice命令流的骨架:File、Physics、Math块怎么协同
2.1 输入文件按四段读:文件、电极、物理、数值
SDevice 的输入文件(常以 .cmd 结尾)结构其实非常固定,一个完整仿真最少包含 File、Electrode、Physics、Math、Solve 五个块。很多人把命令流当成“配置清单”逐行读,那样容易陷进细节;我更习惯把它看成一个数据流水线:File 声明谁来、Electrode 定义边界、Physics 决定物理规律、Math 控制怎么算、Solve 编排求解顺序。
File { Grid = "Diode_msh.tdr" Current = "Diode_IV.plt" Plot = "Diode_IV.tdr" Output = "Diode_IV.log" } Electrode { { Name = "ElectrodeN" Voltage = 0.0 } { Name = "ElectrodeP" Voltage = 0.0 } }File 块里的四个字段各司其职:Grid 指定从网格工具导出的网格文件,这是整个仿真的几何基础;Current 是电流电压数据的输出文件,也是后面画 I-V 曲线要用的数据源;Plot 输出的是 tdr 格式的场分布快照,用来在可视化工具里看电势、载流子浓度、电场这些量;Output 是运行日志,收敛性诊断基本全靠它。Electrode 块则把电极名和初始电压绑在一起,这里的 Voltage = 0.0 只是求解起点,真正的扫描电压在 Solve 块的 QuasiStationary 里定义。
刚开始复现别人命令流时,常见问题就是把 Grid 名称写错,或者 Current 文件名和后续提取数据的脚本对不上。我一般会在跑之前先确认一遍 .tdr 网格文件确实存在,并且电极名和网格里的电极标签完全一致——Electrode 块里的 Name 不匹配会在运行一开始就报错,这个错很基础,但翻车率相当高。
2.2 Physics物理模型:哪些必须开,哪些到高压再开
Physics 块是整个命令流里“物理味道”最浓的地方,也是最容易无脑照抄的地方。原文档里的这段配置基本覆盖了功率二极管仿真最常用的一组模型:
Physics { Temperature = 300 AreaFactor = 1 Mobility ( DopingDependence HighFieldSaturation Enormal CarrierCarrierScattering ) Recombination ( SRH (DopingDependence) Auger (withGeneration) Avalanche (UniBo Eparallel) Band2Band (Hurkx) ) EffectiveIntrinsicDensity (OldSlotboom) }逐项拆开说。Mobility 里的 DopingDependence 是掺杂浓度相关的迁移率退化,几乎所有硅器件都要开;HighFieldSaturation 描述高电场下的速度饱和效应,做高压反向扫描时不能省;Enormal 是界面法向电场对迁移率的影响,MOS 结构里常用;CarrierCarrierScattering 是载流子间散射,在高注入条件下(比如正向导通大电流)影响明显。Recombination 这一组里,SRH 和 Auger 是复合的基础模型,做功率二极管都必须保留;Avalanche (UniBo Eparallel) 是雪崩电离模型,反向击穿仿真必须开,这就是为什么这条命令流能扫到 1000V;Band2Band (Hurkx) 是带间隧穿模型,如果只做常规击穿仿真可以不开,但涉及隧道电流或超结器件时就得加上。
EffectiveIntrinsicDensity (OldSlotboom) 是禁带变窄模型,重掺杂区的载流子浓度计算会受影响。文档里还有一处笔误:HighFieldSaturation 写成了 hHighFieldSaturation,SDevice 里模型名拼错会直接报 unknown model,复制粘贴外部资料时一定要注意这种细节。
2.3 Math与收敛参数:Pardiso、迭代上限与自动停机
Math 块决定了非线性方程组怎么被求解,这也是 Sentaurus 仿真最容易被当成“玄学”的部分。原文档的配置是典型的二维器件仿真设置:
Math { CylindricalMethod = Pardiso Number_of_threads = 4 Extrapolate AvalDerivatives RelErrControl Iterations = 15 Notdamped = 60 BreakCriteria { Current (Contact = "ElectrodeN" maxval = 1e-8) } }CylindricalMethod = Pardiso 指定用 Pardiso 直接求解器处理柱坐标下的稀疏矩阵,这是二维器件仿真最稳的选择;Number_of_threads = 4 开多线程加速,注意这个参数只在部分求解路径生效,不是所有版本都吃满。Extrapolate 表示每步扫描用上一步的解做外推初始猜测,能显著减少高电压段的迭代次数。AvalDerivatives 这个参数容易被忽略,它把雪崩产生项对载流子的导数计入 Jacobian 矩阵,代价是每步计算量增加,但对击穿点附近的收敛性帮助极大——开与不开,在曲线快拐弯的地方表现完全是两种结果。
Iterations = 15 是单个偏置点允许的牛顿迭代次数上限,超过就认为这一步不收敛;Notdamped = 60 限制的是未阻尼迭代步的数量,这个值偏大说明求解器允许更激进的步长推进。BreakCriteria 是一个很实用的自动停机条件:当电极电流超过 maxval = 1e-8 时整个扫描终止,防止击穿后电流指数增长、后续偏置点全部白算。做高电压扫描时我一般会在 BreakCriteria 里再补一条电压上限,双保险。
3. 把I-V曲线跑通:QuasiStationary扫描与收敛参数调整
3.1 Solve块的启动序列:逐级耦合的物理含义
Solve 块的前几行常被当成固定套路,其实里面的顺序是有讲究的:
Solve { Coupled (Iterations = 50) { Poisson } Coupled (Iterations = 15) { Hole Poisson } Coupled (Iterations = 15) { Electron Hole Poisson } }第一次 Coupled 只解 Poisson 方程,得到只含电势的初始解;第二步把空穴连续性方程耦合进来;第三步才把电子、空穴两个连续性方程和 Poisson 方程全耦合。这样从易到难逐步加载方程,本质上是给非线性系统一个合理的“热身”过程。如果一上来就直接全耦合,高阻器件的初始猜测离真实解太远,牛顿迭代很容易发散。做二极管的静态仿真时,这个三段式启动是稳定收敛的常见做法,我基本不改,只有在器件结构特别复杂、初始猜测困难时才会把第一步的 Iterations 放大到 100。
第一次接触 SDevice 的人往往会问为什么还要分步,直接全耦合不是更快吗?实际跑一遍高电压反向扫描就知道,全耦合在低压段也许没问题,但到几百伏之后每一步都在跟迭代上限拉扯,反而更慢。分步启动多花的那几次求解时间,在整体扫描里可以忽略不计。
3.2 QuasiStationary参数:步长上限与目标电压的配合
QuasiStationary 是 I-V 扫描的核心,参数全挤在一对花括号里:
QuasiStationary ( InitialStep = 1e-6 MaxStep = 0.01 MinStep = 1e-9 Goal { Name = "ElectrodeN" Voltage = 1000 } Plot { Range = (0 1) Intervals = 2 } ) { Coupled { Electron Hole Poisson } }InitialStep = 1e-6 表示第一步只加 0.000001V 电压,保证从零偏置起步时足够稳;MaxStep = 0.01 是步长上限,电压每步最多增加 10mV;MinStep = 1e-9 是步长下限,如果当前偏置点反复无法收敛、步长缩到这个值仍然不行,求解器就会放弃并报错。Goal 里的 Voltage = 1000 定义扫描终点,Name 指定要加压的电极。Plot 块里的 Range = (0 1) 表示从扫描起点到终点取相对坐标,Intervals = 2 则要求输出两个中间状态快照。
这组参数的调整逻辑其实很直观:MaxStep 越大扫描越快,但在击穿电压附近越容易翻车。做高压二极管反向扫描时,我一般会把 MaxStep 压到 5e-3 甚至 1e-3,代价是多跑几十个偏置点,换来的是不会在雪崩区跳步。InitialStep 的作用是让第一步别跨太大,一般不用动,除非你确认零偏置附近高度非线性。
3.3 可直接改的二极管IV命令流模板
把前面几段拼起来,就是一份可以实际运行的二极管 I-V 仿真命令流,我整理成了带注释的完整版本:
# Diode_IV.cmd File { Grid = "Diode_msh.tdr" Current = "Diode_IV.plt" Plot = "Diode_IV.tdr" Output = "Diode_IV.log" } Electrode { { Name = "ElectrodeN" Voltage = 0.0 } { Name = "ElectrodeP" Voltage = 0.0 } } Physics { Temperature = 300 Mobility (DopingDependence HighFieldSaturation) Recombination ( SRH (DopingDependence) Auger (withGeneration) Avalanche (UniBo Eparallel) EffectiveIntrinsicDensity (OldSlotboom) ) } Math { CylindricalMethod = Pardiso Number_of_threads = 4 Extrapolate AvalDerivatives RelErrControl Iterations = 15 Notdamped = 60 BreakCriteria { Current (Contact = "ElectrodeN" maxval = 1e-8) } } Plot { eDensity hDensity eCurrent/Vector hCurrent/Vector Current/Vector Potential ElectricField/Vector SpaceCharge eMobility hMobility eVelocity hVelocity DopingConcentration DonorConcentration AcceptorConcentration SRHRecombination AugerRecombination AvalancheGeneration eAvalanche hAvalanche TotalRecombination } 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 } ) { Coupled { Electron Hole Poisson } } }这段模板里值得注意的几个点:Plot 块集中输出了电场、载流子密度、复合率和雪崩产生率的空间分布,方便后面用可视化工具直接看击穿位置;BreakCriteria 的 maxval = 1e-8 会在电流达到 10nA 时停住,防止击穿后数值溢出;Avalanche 模型和 AvalDerivatives 是配套的,只开前者不开后者,在击穿点附近收敛会明显变差。拿到别人的命令流时,我通常会先把自己的模型裁剪到最小可跑版本,确认能复现一条基线 I-V 后,再逐个加模型看差异,这样比直接全量跑更容易定位问题。
4. C-V与瞬态仿真:混合模式AC分析、重离子与激光单粒子效应
4.1 Device/System混合模式:为什么C-V仿真要接外部电路
C-V 仿真不能像 I-V 那样直接在电极上加直流电压来扫描,因为电容本质上是交流小信号量,需要在直流工作点上叠加一个正弦扰动再提取电荷响应。原文档的做法是把二极管放进一个 System 块里,用外部电压源驱动,这就是所谓的混合模式仿真:
Device diode { File { Grid = "Diode_msh.tdr" Current = "Diode_CV_1kHz.plt" Plot = "Diode_CV_1kHz.tdr" } Physics { # 与 I-V 仿真相同的物理模型 } Plot { } # 混合模式:把二极管封装成电路元件 System { Vsource_pset vn (front 0) { dc = 0 } } } File { Output = "Diode_CV_1kHz.log" ACExtract = "Diode_CV_AC_1kHz.plt" }System 块里 Vsource_pset vn (front 0) 定义了一个名为 vn 的电压源,正端接二极管的 front 电极,负端接地,dc = 0 表示直流工作点从 0V 开始。这里的 front 是 Device 内部的一个电极标签,要和 Device 里定义的电极对应上。混合模式的关键区别在于:不再是直接控制电极电压,而是通过外部电压源的参数(比如 vn.dc)来间接控制器件状态,这样才能把电路方程的交流小信号路径打通。ACExtract 指定了提取交流分析结果的输出文件,跑完 C-V 后可以从这里直接拿到电容值。
之前有人问能不能不用 System 块,直接在 Device 层用 ACCoupled 做 CV。纯器件模式下交流激励确实也能加,但没法模拟真实测试电路里的源阻抗和负载,结果和实际测量的 CV 曲线经常对不上。做功率二极管的 C-V 仿真,混模是更贴近实验的做法。
4.2 ACCoupled与ACMethod=Blocked:小信号参数怎么设
C-V 扫描的核心在 Solve 块里的 QuasiStationary 和 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 } ) { ACCoupled ( StartFrequency = 1e3 EndFrequency = 1e3 NumberOfPoints = 1 Decade Iterations = 15 Node (front) ACMethod = Blocked ACSubMethod ("diodesystem") = ParDiSo ) { Poisson Electron Hole Contact Circuit } } }有几点和 I-V 命令流明显不同。Goal 里用的是 Parameter = vn.dc 而不是 Name = "ElectrodeN",说明扫描对象是外部电压源的直流参数;Voltage = 100 表示从 0 扫到 100V。ACCoupled 里的 StartFrequency 和 EndFrequency 都是 1e3,配合 NumberOfPoints = 1 表示只算 1kHz 这一个频点,这正是二极管 C-V 测试的常用频率。Node (front) 指明交流小信号注入节点,必须和 System 块里电压源正端接的器件电极一致。ACMethod = Blocked 选择分块求解交流方程,ACSubMethod ("diodesystem") = ParDiSo 是交流小信号电路方程组的并行直接求解器。
这里最容易踩的坑是 Node 名写错。如果 Node (front) 里的名字跟网格电极名或者 System 块里的连接点不一致,仿真器要么报找不到节点,要么把信号加到了错误的电极上,CV 曲线就变成一条横线。做混合模式仿真前,我每次都会先在 log 里确认器件电极列表和 System 网络节点名完全对应。
4.3 重离子入射:HeavyIon的LET与高斯脉冲设置
单粒子效应仿真用的是带时间项的瞬态求解,重离子入射由 Physics 块里的 HeavyIon 命令描述:
Physics { HeavyIon ( Direction = (0, 1) Location = (200, 0) Time = 1e-9 Length = [ ] Wt_hi = [ ] LET_f = [0 8.7e-6 8.7e-6 0] GaussianPicoCoulomb ) }Direction = (0, 1) 表示粒子沿截面坐标的 y 方向入射,Location = (200, 0) 是入射点坐标,决定了径迹穿过器件的位置;Time = 1e-9 是入射时刻,通常放在瞬态扫描开始后一小段时间,这样能清楚看到入射前的稳态和入射后的响应分离。LET_f 是沿径迹的线性能量传输分布,单位是 pC/um,这里的 [0 8.7e-6 8.7e-6 0] 描述了一个在径迹中部均匀、两端过渡到零的分布。GaussianPicoCoulomb 表示电荷沉积在时间和空间上都采用高斯分布,电荷量以皮库仑计。
需要说明的是,Length 和 Wt_hi 在文档里留空,实际精细仿真时这里要填具体的径迹长度和径向宽度参数,默认值只适合定性评估。LET 的单位换算里有一个常见的坑:文献里粒子 LET 常用 MeV·cm²/mg,而 SDevice 的 HeavyIon 模型用 pC/um,硅中 1 pC/um 大致对应约 10 MeV·cm²/mg 这一数量级。换算错误会让沉积电荷差一个量级,单粒子翻转仿真结果完全没有参考意义。我每次跑新粒子种类前,都会先按这个换算关系校验一遍 LET 输入。
4.4 激光激励:Optics模块的波长、窗口与光斑
激光照射瞬态仿真的激励源在 Optics 块里定义,原文档给了很完整的参数:Wavelength = 0.8 * um,Intensity = 0.06 * W/cm2,窗口名称 L1,Origin 在 (200, 0)。这个 0.8um 波长比较微妙,它在硅里吸收深度大约十几微米,适合模拟近表面能量沉积,和重离子的浅层径迹有类似效果。WaveTime = (1e-9 1e-9) 定义了激光脉冲的时间窗口,WaveTSigma = 50e-12 表示高斯脉冲的 sigma 是 50ps,这是个相当短的激光脉冲。Thera = 0 是入射角,从正 y 轴方向计算;Line (Dx = 10) 定义了光束的截面半宽。
瞬态扫描部分的设置和重离子仿真几乎一样,只是 FinalTime 更长:
Solve { NewCurrentPrefix = "trans_" Transient ( InitialTime = 0 FinalTime = 60e-9 MinStep = 1e-17 MaxStep = 1e-10 ) { Coupled { Poisson Electron Hole Circuit } } }FinalTime = 60e-9 表示总仿真时长 60ns,足以观察到光生载流子的扩散和复合过程。MinStep = 1e-17 是亚飞秒级别的时间步,这是为了分辨激光脉冲上升沿和载流子产生瞬间的物理过程;MaxStep = 1e-10 限制了最大步长,保证在 50ps 的脉冲宽度里至少有几个采样点。NewCurrentPrefix = "trans_" 让每次瞬态扫描的电流波形写到带前缀的文件里,避免多次扫描相互覆盖。跑这种瞬态仿真时,我一般会先在 log 里确认每个时间步都收敛良好,如果出现步长反复回缩的情况,优先检查是不是激光强度过大导致载流子产生率过高。
5. 辐照损伤模拟与常见坑:陷阱参数换算与收敛排查
5.1 体陷阱与位移损伤:Acceptor/Donor能级参数表
辐照损伤在 Sentaurus 里通过 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) # Conc = Fluence * 1.1613 (Acceptor Level EnergyMid = 0.46 fromCondBand Conc = 1.8E15 Randomize = 0.23 eXsection = 5E-15 hXsection = 5E-14) # Conc = Fluence * 0.9 (Donor Level EnergyMid = 0.36 fromValBand Conc = 1.8E15 Randomize = 0.31 eXsection = 3.23E-13 hXsection = 3.23E-14) ) }三个陷阱能级分别是导带下 0.42eV 和 0.46eV 的两个受主型能级,以及价带上 0.36eV 的一个施主型能级。能级位置决定了陷阱在带隙中的电荷状态,EnergyMid 后面的数字必须配合 fromCondBand 或 fromValBand 一起读,前者表示从导带底往下量,后者表示从价带顶往上量,搞反了能级位置就全错了。Conc 是陷阱体浓度,单位 cm⁻³;eXsection 和 hXsection 分别是电子和空穴的俘获截面,这两个量决定了复合速率和载流子寿命。Randomize 控制掺杂浓度涨落,模拟实际材料中的局域不均匀性,一般取 0.2~0.3。
原文档注释里直接写了换算关系:Conc = Fluence * 1.1613,这类系数是辐照引入率。辐照注量单位是 cm⁻²,陷阱体浓度单位是 cm⁻³,必须乘以一个等效损伤引入深度才能换算,不考虑这一点就把文献注量直接当浓度用,结果会离谱。
5.2 界面固定电荷与陷阱:Oxide/Silicon界面的处理
除了体陷阱,辐照还会在氧化层和硅的界面积累固定电荷,文档里这一行很典型:
Physics (MaterialInterface = "Oxide/Silicon") { # Traps (FixedCharge Conc = 5e10) Charge (Conc = 1.5e11) }注意 Physics 的修饰对象是 MaterialInterface,而不是 material,这决定了电荷加在哪个位置。被注释掉的 Traps (FixedCharge Conc = 5e10) 是一种做法:把固定电荷作为陷阱能级加入模型,它会参与载流子俘获释放的计算;当前使用的 Charge (Conc = 1.5e11) 是另一种做法:直接把固定电荷密度 1.5e11 cm⁻² 加进泊松方程。对纯界面电荷效应来说,用 Charge 命令更直接、收敛更稳;但如果需要研究界面态的俘获动力学,就得用 Traps (FixedCharge)。
这里有一个很隐蔽的坑:两条命令分别写在不同的 Physics 作用域里,如果粘贴命令流时把 Charge 放进了 material = "Silicon" 的块里,界面电荷就不会生效,而且仿真不报错,IV 曲线完全不变。排查这种问题最容易忽略,我每次都是先检查 Physics 块的作用域声明。
5.3 常见坑与排查:现象、原因、解决
这一节把这套命令流最常见的五个翻车场景整理成排查对照,都是我实际跑仿真时遇过或替别人排查过的。
第一个坑:反向扫描到高电压段电流曲线突然跳变或不收敛。现象是 log 里 Notdamped 计数快速上升,步长反复缩到 MinStep 附近,曲线出现台阶或直接发散。原因是雪崩电离模型开了但 AvalDerivatives 没开,击穿点附近 Jacobian 矩阵不准确,或者 MaxStep 太大跳过了关键拐点。解决方法是打开 AvalDerivatives,把 MaxStep 从 0.01 降到 5e-3,如果还不行,就在预估击穿电压附近加密偏置点。
第二个坑:重离子瞬态波形出现负电流或高频毛刺。现象是粒子入射后几十皮秒内波形剧烈震荡,甚至出现非物理的负电流。原因是径迹附近网格太粗,载流子浓度梯度无法被网格分辨,或者瞬态 MaxStep 太大。解决办法是在 Location 附近局部加密网格,把瞬态 MaxStep 降到 1e-11,同时核对 Direction 和 Location 是否与网格坐标一致。
第三个坑:陷阱浓度照抄文献但仿真结果完全对不上。现象是迁移率和少子寿命跟参考文献差一个量级。原因多是把注量当浓度直接用了,忽略换算系数。解决办法是按文档里的 Conc = Fluence * 1.1613 换算,跑完先用少子寿命或暗电流做个交叉验证。
第四个坑:混合模式 CV 曲线是一条水平直线。现象是电容值不随电压变化。原因是 Node 名称和 System 块里的节点名不一致,交流小信号根本没注入器件。解决办法是确认 Node (front) 与 Vsource_pset 正端连接名一致,ACMethod = Blocked 配合 ACSubMethod = ParDiSo。
第五个坑:界面电荷命令写了但结果没变化。现象是加电荷前后 IV 曲线几乎重合。原因是 Charge 写在了 material = "Silicon" 块里,而不是 MaterialInterface = "Oxide/Silicon" 块里。解决办法是把命令挪到正确的 Physics 作用域,并在网格里确认确实存在 Oxide/Silicon 界面。
提示:排查收敛问题优先看 .log 文件里的迭代历史和步长演变,比盯着曲线猜原因高效得多。
6. 进阶用法:把单一命令流模板改成批量仿真脚本
6.1 用Python生成多组辐照注量的命令流
辐照损伤仿真很少只跑一个注量点。手动改 .cmd 再逐个运行很容易改错,尤其 Conc 这个值在文件里出现多次时。我习惯写一个 Python 脚本做批量生成:
import os fluence_list = [1e10, 1e11, 1e12, 1e13] # 辐照注量,单位 1/cm^2 template = open("diode_iv_rad.cmd").read() for flu in fluence_list: conc = flu * 1.1613 # 按文档给出的引入率换算体浓度 cmd = template.replace( "Conc=2.3226E15", f"Conc={conc:.4E}" ) cmd = cmd.replace("diode_iv_rad", f"diode_f{flu:.0e}") fname = f"diode_f{flu:.0e}.cmd" with open(fname, "w") as f: f.write(cmd) os.system(f"sdevice {fname}")这段脚本的核心是用字符串替换把占位浓度换成每个注量对应的值,同时把输出文件名也一并换掉,避免多个仿真互相覆盖。需要注意 replace 默认替换全部匹配项,如果命令流里有多个陷阱能级、又想只改其中一个,最好在模板里给目标行加一个唯一标记,比如临时把浓度写成 Conc=REPLACE_ME,这样批量生成时不会误伤其他陷阱。脚本里 os.system 直接调用 sdevice 是线性串行跑,注量点多的时候可以改成 subprocess 并行,或者把生成的文件排队交给集群调度器。
从那以后我每次做辐照系列仿真都强制走一遍这个流程:先用最小注量跑通基线,再批量生成、批量提取,绝不在原命令流上手改参数,这习惯帮我挡掉了不少低级错误。
6.2 提取plt曲线的三个关键点
批量跑完后,从 plt 文件提取数据也有固定套路。Current 文件里保存的是扫描过程中电压和电流的对应关系,可以直接在可视化工具里导出成 CSV,但批量场景下脚本处理更快。读数据时注意三点:第一,plt 的文本格式里通常有表头说明列名,按空格切分前先跳过注释行;第二,多段扫描的数据会附加额外标识,提取时按电极名过滤;第三,混合模式仿真的电流值对应的是外部电压源支路,列名和纯器件模式不同。只要把这三点处理好,几行 Python 就能把十几组仿真的 I-V 或 C-V 曲线一次性提出来画在一起对比。希望这些拆解过的命令流和排错习惯能帮到你,至少让你下次拿到类似文档时,不用再从零摸索一遍。
本文还有配套的精品资源,点击获取