☰
Sentaurus sdevice仿真模板详解:五种场景命令拆解与避坑指南
2026/10/26 7:05:18 网站建设 项目流程

简介:这是一份有关Sentaurus仿真软件常用命令与仿真设置的DOCX说明文档,主要面向微电子、纳米电子与光电子领域的器件仿真初学者和工程师,聚焦I-V曲线、C-V曲线、辐照损伤/重粒子入射及瞬态仿真四类典型应用。包体为1个docx文件,压缩包仅16KB,内容精炼,适合作为随查随用的语法速查资料。该资源已有2032人学习。相比于完整手册,它更突出可直接复用的命令骨架,方便快速搭建基础仿真流程。文中以Diode器件为例,完整给出File、Electrode、Physics、Solve等环节的配置示例,覆盖I-V扫描的QuasiStationary步长与电压参数、C-V仿真的ACCoupled混合模式扫频设置、HeavyIon重粒子入射的LET与位置定义,以及LaserIllumination激光瞬态的光学激发语句;同时涉及掺杂浓度、迁移率、SRH与Auger复合、雪崩产生等物理模型细节。读者可对照复制、修改并调试自己的Sentaurus项目,快速理解每条语句所在模块与作用,有效缩短仿真环境搭建和排错时间。

1. 从一份命令脚本,到五种器件仿真场景

做功率二极管仿真的人,大概都经历过这种切换:上午还在调 I-V 准静态扫描的电压步长,下午就要模拟重离子打进来瞬间的电流波形,第二天又得算 C-V 曲线,还要应付辐照之后的陷阱参数。不同物理场景在 Sentaurus 里对应完全不同的命令组织方式,但核心又是同一套 sdevice 语法。这份资料把 I-V、C-V、重离子瞬态、激光照射、辐照损伤五种场景的 sdevice 命令收在同一份文档里,基本就是一本可以直接抄的语句模板集。下面按“命令结构 → 直流与交流仿真 → 瞬态与辐照 → 踩坑 → 二次开发”的顺序拆解,想跑通 TCAD 仿真或者把它改造成自己项目的同学,可以直接照着参数改。

2. 技术栈与文件结构:sdevice 命令的五个块

2.1 一份 .cmd 文件的骨架

Sentaurus 的器件仿真由 sdevice 执行,入口是一个文本命令文件,通常叫xxx.cmd。这个文件不是写给人看的配置文件,而是一段按块组织的“仿真程序”,sdevice 从上往下逐块解析并执行。资料中所有场景都遵循同一个五块骨架: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 } } Physics { Temperature = 300 Mobility (DopingDependence eHighFieldSaturation hHighFieldSaturation) Recombination (SRH (DopingDependence) Auger (withGeneration)) EffectiveIntrinsicDensity (OldSlotboom) } Math { Pardiso Number_of_threads = 4 Iterations = 15 Notdamped = 60 Extrapolate AvalDerivatives RelErrControl } Solve { Coupled (Iterations = 50) { Poisson } Coupled (Iterations = 15) { Hole Poisson } Coupled (Iterations = 15) { Electron Hole Poisson } }

每个块的职责很清晰:File 声明四类文件的路径(网格、电流数据、绘图数据、日志);Electrode 定义电极名字和初始电压,名字必须和网格文件里的接触名一致;Physics 选择物理模型,决定这个器件用哪些方程描述;Math 配置求解器,包括迭代次数、线程数、是否开导数;Solve 编排整个仿真流程,从泊松方程初始化到后面的准静态扫描都在这里声明。实际项目里我习惯先写好 File 和 Electrode,再根据器件类型决定 Physics 选哪些模型,Math 和 Solve 通常是调参最多的地方。

2.2 输入输出文件体系

一个 sdevice 仿真跑完,会吐出至少四个文件:网格文件、plt 数据文件、tdr 绘图文件、log 日志。网格文件是输入,由结构仿真工具生成的掺杂和几何信息都封在.tdr里;Current = "xxx.plt"是电极电流随扫描变量的输出,I-V、C-V、瞬态电流波形都在这;Plot指向的 tdr 保存器件内部物理量分布,比如电场、载流子浓度、碰撞电离率;Output的 log 记录求解迭代过程,不收敛时第一件事就是翻它。

文件类型典型后缀作用
网格.tdr器件几何、掺杂分布,来自结构仿真
电流数据.plt电极电流、电压、电容等标量输出
绘图数据.tdr内部物理量场分布,用于可视化
日志.log迭代收敛过程、报错信息

资料里 I-V 部分还出现了Plot { Range = (0 1) Intervals = 2 }和Plot (FilePrefix="IV_" Time=(0.01; 0.05; 0.1; 0.5)),前者控制准静态扫描过程中保存内部场的电压区间,后者在指定电压点额外保存一份带前缀的 tdr 文件,方便看不同偏压下的电场和载流子分布变化。

2.3 三种命令组织方式

这份资料最实用的地方,是它把 Sentaurus 常见的三种命令编排方式都放在了一起。第一种是单器件直流仿真,File、Physics、Math、Solve 都平铺在最外层,适合 I-V 曲线和击穿电压扫描。第二种是 MixedMode 混合模式仿真,器件定义在Device块里,电路连接关系定义在System块里,适合 C-V 这类需要外部电压源和 AC 小信号激励的场景。第三种是瞬态仿真,Solve 块里不写 QuasiStationary,而是写 Transient,配合 HeavyIon、Optics 这些时间相关物理模型。

识别一个脚本属于哪种模式,看 Solve 块和 System 块就行。有QuasiStationary就是直流或准静态扫描;有ACCoupled且前面有System块就是混合模式小信号;有Transient就是瞬态。三种模式可以嵌套,比如 C-V 的先直流偏置再 AC 扫描,就是 QuasiStationary 包着 ACCoupled。理解这个层次之后,改脚本就不是搜索替换参数,而是知道每个参数在整个仿真链路的哪一层起作用。

3. 核心模块拆解:从 I-V 到 C-V 的完整链路

3.1 Physics 块:五个物理模型组的选择逻辑

I-V 仿真的准确性,七成由 Physics 块的模型选择决定。资料里这段 Physics 基本覆盖了功率二极管直流仿真需要用到的全部模型,按功能可以分成三组:迁移率组、复合组、禁带修正组。

Physics { AreaFactor = 1 Temperature = 300 Mobility ( DopingDependence eHighFieldSaturation hHighFieldSaturation Enormal CarrierCarrierScattering ) Recombination ( SRH (DopingDependence) Auger (withGeneration) Avalanche (UniBo Eparallel) Band2Band (Hurkx) ) EffectiveIntrinsicDensity (OldSlotboom) }

迁移率组里的DopingDependence考虑杂质散射对迁移率的抑制,高掺杂区必须开;eHighFieldSaturation和hHighFieldSaturation是电子和空穴的高场速度饱和,反向偏压大时载流子漂移速度不会无限增长,就靠这个模型限制;Enormal是界面垂直电场对迁移率的影响,MOS 类器件常用,二极管里保留也无妨。复合组里SRH (DopingDependence)是掺杂相关的复合中心复合,决定少子寿命;Auger (withGeneration)在高注入条件下主导,正向大电流时必须开;Avalanche (UniBo Eparallel)是碰撞电离模型,做击穿电压仿真时没有它,反向大电压下电流不会出现雪崩增长;Band2Band (Hurkx)是带间隧穿模型,主要影响反向漏电的软击穿特性。EffectiveIntrinsicDensity (OldSlotboom)处理重掺杂禁带变窄效应,直接修正本征载流子浓度,对正向导通压降影响明显。

这些模型不是越多越好。开一个模型就多一组方程和非线性项,收敛难度跟着涨。我一般先在低电压下把基础 I-V 跑通,再逐步加 Avalanche 和 Band2Band 做高压扫描,哪个模型导致不收敛就单独调它的参数,而不是一上来全开。

3.2 Solve 块:从泊松初始化到 1000V 准静态扫描

Solve 块是整个脚本的编排中枢。资料里先做了三次 Coupled 求解:第一次只解泊松方程,第二次加入空穴连续性方程,第三次电子空穴泊松全上。这种“逐步增加耦合方程”的做法是为了给非线性迭代一个好的初始猜测,直接跳到最后一步往往在起始点就不收敛。

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 } Plot (FilePrefix = "IV_" Time = (0.01; 0.05; 0.1; 0.5) NoOverwrite) } }

QuasiStationary的意思是:把电极电压从当前值逐步推到目标值 1000V,每一步都重解方程。InitialStep是第一步的电压增量,1e-6 伏起步,保证在最敏感的低压区不跳变;MaxStep = 0.01限制步长不超过 10 毫伏,因为雪崩击穿附近电流随电压变化极陡,步子太大直接越过击穿点;MinStep = 1e-9是步长的下限,到击穿点附近迭代不收敛时会自动缩步,缩到 1e-9 还不行就报错。BreakCriteria { Current (Contact = "ElectrodeN" maxval = 1e-8) }是个保护开关:某一步电极电流超过 1e-8 安培就停止扫描,防止击穿后电流指数增长把求解器拖垮。

里层Coupled { Hole Electron Poisson }每一步电压增量上要求解的非线性方程组。Plot (FilePrefix="IV_" Time=(0.01; 0.05; 0.1; 0.5))是在扫描到 10mV、50mV、100mV、500mV 这几点额外保存场分布图。这里有个常见误解:以为 Time 是时间,其实在 QuasiStationary 里它表示“扫描进度”的归一化位置,0.5 就是扫到 500V 附近。

3.3 C-V 的 MixedMode 与 AC 耦合

C-V 仿真不能用单器件模式直接跑,因为电容是小信号量,必须给器件叠一个交流激励,再测响应电流的相位和幅值。资料里用的是 MixedMode:器件定义在一个Device块里,外部电路定义在System块里,sdevice 把两者耦合在一起解。

Device Diode { Electrode { { Name = "ElectrodeN" } { Name = "ElectrodeP" } } 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 { Coupled (Iterations = 50) { Poisson } Coupled (Iterations = 15) { Hole Poisson } Coupled (Iterations = 15) { Electron Hole Poisson } 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 Iterations = 15 Node (front) ACMethod = Blocked ACSubMethod("diodesystem") = ParDiSo ) { Poisson Electron Hole Circuit } } }

System块里的Vsource_pset vn (front 0) { dc = 0 }定义了一个名为 vn 的电压源,正端接在电路节点 front 上,负端接地。Diode diodesystem ("ElectrodeN" = front "ElectrodeP" = 0)把器件 Diode 的两个电极映射到电路节点,这是一个容易翻车的地方:device 里电极叫 ElectrodeN,电路里必须存在同名映射,否则 sdevice 找不到端口。

ACCoupled的StartFrequency = 1e3和EndFrequency = 1e3表示只算单频点 1kHz 的交流响应。ACMethod = Blocked是分块求解策略,把电路方程和器件方程分开迭代;ACSubMethod("diodesystem") = ParDiSo是器件子块的线性求解器。ACExtract指定的文件会输出电容随直流偏压变化的数据,也就是 C-V 曲线。跑完这组命令,得到的不是传统的电流-电压关系,而是每个直流偏压对应的小信号电容,这正好是提取掺杂浓度和结耗尽层宽度的输入。

4. 瞬态与辐照场景:重离子、激光与陷阱模型

4.1 重离子入射:HeavyIon 的六个参数

单粒子效应仿真需要在某个时刻往器件里注入一股电子空穴对,模拟宇宙射线重离子穿过耗尽区时的电离轨迹。资料里的 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)是离子入射方向,垂直入射;Location = (200, 0)是入射点坐标,单位是微米,打在位置 200 微米处;Time = 1e-9是撞击时刻,单位秒,1 纳秒时粒子进入器件。LET_f是线性能量转移的电荷等效值,单位是 C/cm,数组里的每个值对应径迹上不同深度位置的线密度,这里[0 8.7e-6 8.7e-6 0]表示径迹中间段均匀沉积能量,两端衰减到零。GaussianPicoCoulomb说明电荷在径迹径向服从高斯分布,柱状半径由Wt_hi控制,空数组就表示用模型默认值。Length空数组意味着径迹贯穿整个器件。

重离子仿真必须配合瞬态求解才能看到电流脉冲:离子在 1e-9 秒注入非平衡载流子,器件在偏压下把这些载流子扫出,电极上就形成一个纳秒级的电流峰。这个电流峰的幅度和宽度,直接反映器件的单粒子翻转敏感性。

4.2 激光照射:Optics 块与高斯脉冲

脉冲激光是重离子辐照实验的替代手段,好处是位置可控、可重复。Sentaurus 里用 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)) ) ) ) ) )

Wavelength = 0.8 * um是 800 纳米波长,硅在这个波长下吸收系数适中,光可以穿透到耗尽区;Intensity = 0.06 * W/cm2是光强。TimeDependence决定激光脉冲的时间形状:WaveTime = (1e-9 1e-9)定义脉冲从 1 纳秒开始持续 1 纳秒,WaveTSigma = 50e-12是 50 皮秒的高斯上升沿,模拟一个近似方波的光脉冲。Window("L1")定义光照区域,以 (200,0) 为起点,Line (Dx = 10)是宽 10 微米的线状光斑,Theta = 0表示光束与 y 轴夹角为零。Scaling = 0关闭光强缩放,直接用给定强度计算产生率。

OptBeam是光束传播求解器,LayerStackExtraction会根据器件材料分层自动计算每层的吸收和反射,ComplexRefractiveIndex用的是随波长变化的复折射率。跑完得到的瞬态电流波形可以用来和重离子结果做对比,验证两种激励导致的电荷收集量是否一致。

4.3 辐照损伤:Traps 与 Fluence 换算

总剂量辐照会在氧化层和硅界面产生两类损伤:一是氧化层里积累正电荷,二是界面和硅体内产生深能级陷阱。Sentaurus 里前者用界面Charge表示,后者用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) ) } Physics (MaterialInterface = "Oxide/Silicon") { Charge (Conc = 1.5e11) }

每组陷阱的EnergyMid是能级位置,fromCondBand表示从导带底算起,fromValBand从价带顶算起;Conc是陷阱体积浓度,单位 cm⁻³;eXsection和hXsection是电子和空穴的俘获截面,单位 cm²,决定这个陷阱对载流子的复合效率。Randomize表示陷阱在空间上按给定比例随机分布,而不是均匀铺满,这更接近真实辐照损伤的离散团簇形态。

注释里写了# Conc = Fluence * 1.1613这类换算关系,说明陷阱浓度和辐照注量之间是线性的。做辐照效应仿真时,我一般不会直接改 Conc,而是先定义注量 Fluence,再用这个比例算陷阱浓度。界面Charge (Conc = 1.5e11)是氧化层固定电荷密度,单位 cm⁻²,它改变的是表面势和耗尽层宽度,对击穿电压和漏电的影响通常比体陷阱更直接——做总剂量仿真时这两个参数必须放在一起调。

5. 避坑记录:求解器、单位与时间步的五个教训

5.1 收敛问题:Avalanche 和 BreakCriteria

第一坑:加了Avalanche模型之后,电压扫到 200V 附近就开始不收敛,步长反复缩小还是报 “no convergence”。原因是碰撞电离项对载流子浓度的偏导数没有参与牛顿迭代,雅可比矩阵缺了关键的导数项。解决方法是把Math块里的AvalDerivatives打开,让雪崩产生率对电子和空穴密度求导,收敛性立刻改善。这是做击穿仿真最容易漏的一行。

第二坑:QuasiStationary扫到低压区就提前停住,日志里显示 “BreakCriteria 触发”,但器件明明没击穿。原因常是BreakCriteria里的电流阈值设得太小,或者把BreakCriteria写在了QuasiStationary外面导致它全程生效。解决方法是把BreakCriteria { Current (Contact = "ElectrodeN" maxval = 1e-8) }放进QuasiStationary块内部,并且确认阈值比正常漏电高一个量级。我一般先跑一遍不设阈值的扫描,看漏电基线是多少,再反推阈值设多少合适。

5.2 单位与时间步:看不见的放大和丢失

第三坑:重离子仿真出来的瞬态电流峰值比实验数据大两个数量级。最可能的原因是LET_f单位搞错了。Sentaurus 里 LET_f 单位是 C/cm,不是辐照领域常用的 MeV·cm²/mg。按硅的密度和电离能估算,1 MeV·cm²/mg 大约对应 1.04e-10 C/cm,资料里的 8.7e-6 C/cm 换算过来大概是 84 MeV·cm²/mg 的重离子。直接把文献里的 MeV·cm²/mg 数值填进去,等效能量会偏大近 10 倍。解决方法是统一换算后再填入。

第四坑:瞬态电流波形是平的,撞击瞬间的电流峰完全看不到。原因是瞬态求解的MaxStep设得太大,比如 1e-8 秒,离子在 1e-9 秒注入载流子,积分步长直接把这段快速变化跳过去了。解决方法是把MaxStep缩到 1e-10 秒甚至更小,MinStep给到 1e-17 用于收敛困难时刻,撞击时刻前后各留至少 10 个输出点。资料里Transient (InitialTime = 0 FinalTime = 35e-9 MinStep = 1e-17 MaxStep = 1e-10)就是一套验证过的配置。

5.3 网格与 MixedMode:参数对不上的排查

第五坑:ACCoupled报 “electrode not found” 或者节点电压始终为零。原因通常是System块里的端口名和Device块里的电极名没对应上。资料里Diode diodesystem ("ElectrodeN" = front "ElectrodeP" = 0)是器件到电路的映射,Vsource_pset vn (front 0)里的 front 必须和这个映射的电路节点同名,一字不差。另一个细节是陷阱Randomize会导致结果对网格敏感,Randomize 值越大越需要局部细网格,否则统计涨落会掩盖真实的电学特性变化。遇到加了 Randomize 之后结果抖动,先加密耗尽区网格,别急着改陷阱浓度。

6. 二次开发:把脚本改造成参数化批处理工具

6.1 用 Python 生成 .cmd 模板

五种仿真的脚本结构固定,变的只是电压范围、注量、粒子位置这些参数。直接复制改参数容易漏,我习惯把 .cmd 写成 Python 模板,用 f-string 或者 format 填充变量。比如 I-V 扫描的电压目标、C-V 的频点、重离子的入射位置都可以做成变量:

template = """File {{ Grid = "diode_msh.tdr" Current = "iv_{label}.plt" Output = "iv_{label}.log" }} Math {{ Number_of_threads = 4 AvalDerivatives }} Solve {{ Coupled (Iterations = 50) {{ Poisson }} QuasiStationary ( InitialStep = 1e-6 MaxStep = 0.01 MinStep = 1e-9 Goal {{ Name = "ElectrodeN" Voltage = {vmax} }} ) {{ Coupled {{ Electron Hole Poisson }} }} }} """ for vmax in [100, 500, 1000, 1500]: label = f"{vmax}v" with open(f"iv_{label}.cmd", "w") as f: f.write(template.format(label=label, vmax=vmax))

跑完一个电压点,就生成一个独立的 .cmd 文件,逐个提交 sdevice 执行。这样批量扫描击穿电压或者工艺角时,不用手工改脚本,也不会漏改某个参数。

6.2 从 .plt 提取数据并绘图

sdevice 输出的 .plt 是带注释头的文本表格,前两列通常是电压和电流。提取数据用 Python 过滤掉#和@开头行,再做对数坐标绘图,一个完整的仿真-分析闭环就出来了:

import matplotlib.pyplot as plt voltage, current = [], [] with open("iv_1000v.plt") as f: for line in f: if line.startswith("#") or line.startswith("@"): continue parts = line.split() if len(parts) >= 2: voltage.append(float(parts[0])) current.append(float(parts[1])) plt.semilogy(voltage, current) plt.xlabel("Voltage (V)") plt.ylabel("Current (A)") plt.savefig("iv_curve.png", dpi=150)

对重离子瞬态结果,把第一列换成时间、第二列换成电极电流,同样画出来就是单粒子瞬态波形。做参数扫描时,把所有 .plt 文件循环读一遍,就能画出一组对比曲线。

从那以后我每次拿到新工艺的网格文件,都会先写一个参数模板,把 Physics 块固定、把扫描范围做成变量,再挂上自动提取脚本,整个仿真链就从一个一个手点,变成了一条能反复重跑的流水线。资料里五种场景的组织方式在一起形成的对照关系,比任何单一脚本都有价值。希望这套拆解能帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询