简介:这份文档面向微电子、纳米电子与光电子器件方向的仿真学习者与工程人员,围绕Sentaurus TCAD工具的实际用法,整理了I-V曲线、C-V曲线、辐照损伤与重粒子入射、瞬态仿真等典型场景的语句与模型配置,帮助读者理解器件电学特性与辐照效应的仿真流程。资源包共1个docx文件,约16KB,内容以仿真语句、物理模型与求解设置为主,便于对照软件界面直接查阅与复用。文档中涉及电流电压File定义、Diode电容特性、HeavyIon重离子撞击、激光瞬态模型等具体模块,可帮助读者掌握网格、电极、物理模型、Math与Solve参数的搭配方式,并理解准静态、AC耦合与瞬态求解的差异。目前已有2030人学习,适合需要快速上手Sentaurus语句编写、排查仿真设置问题的中高级用户参考。
1. 从一份“各种语句sentaurus.docx”说起:TCAD 仿真到底能帮你省下多少流片费
如果你正在做功率器件、二极管或者探测器方向的课题,大概率绕不开 Sentaurus TCAD 这套工具。它不像 SPICE 那样给个网表就能跑,也不像某些开源仿真器那样装完就能点按钮。它更像一个需要你亲手写“配方”的厨房——网格、物理模型、求解策略、电极配置,每一步都得自己调。这份“各种语句sentaurus.docx”本质上就是一份命令语句合集,覆盖了 I-V 曲线、C-V 曲线、重离子撞击、激光瞬态和辐照损伤五类典型仿真场景。它不是教程,更像一个“语句字典”:当你需要写 sdevice 命令文件时,可以直接从里面找到对应模块的语法结构,改改参数就能用。适合已经装好 Sentaurus 环境、能跑通基础二极管仿真、但一遇到瞬态或辐照就不知道从哪下手的从业者。我见过太多人卡在“物理模型选错导致不收敛”或者“瞬态步长设太大结果全是震荡”这类问题上,这份文档至少能让你少走两三个月的弯路。
2. I-V 与 C-V 曲线仿真:从命令文件到收敛判据的完整拆解
2.1 直流 I-V 扫描的 File 与 Physics 配置逻辑
先看最基础的电流电压扫描。这份文档里给出的 File 段定义了四个关键输出:Grid 指向网格文件,Current 指向 .plt 曲线数据,Plot 指向 .tdr 场分布,Output 指向 .log 日志。很多人跑完仿真只看 .plt 里的曲线,结果发现电流值不对,回头查日志才发现是某个物理模型没激活。我一般会先把 Output 日志打开,确认没有 “Warning: Model not activated” 这类提示,再去分析曲线。
Physics 段是决定仿真精度的核心。文档里列出的迁移率模型组合——DopingDependence、HighFieldSaturation、EnormalCarrier、CarrierScattering——基本覆盖了从低场到高场、从体材料到反型层的迁移率退化。复合模型里 SRH 带 DopingDependence、Auger 带 Generation、Band2Band 用 Hurkx,这套组合在功率二极管反向漏电分析里很常见。EffectiveIntrinsicDensity 选 OldSlotboom 而不是默认的 OldSlotboom 或 Schenk,说明作者在窄带隙材料或者重掺杂区域遇到过带隙变窄导致的载流子浓度异常。
Math 段里的参数值得逐条看。Number_of_threads = 4 是并行求解的线程数,如果你机器核多可以往上调,但别超过物理核数。ExtrapolateDerivatives 和 AvalDerivatives 在击穿仿真里几乎是必开的,否则电压步进稍微大一点就发散。RelErrControl 控制相对误差,Iterations=15 和 Notdamped=60 是一对平衡参数:迭代次数给够,但阻尼步数不能太少,否则牛顿法在强非线性区容易震荡。BreakCriteria 里 Current maxval = 1e-8 表示当电极电流超过 10nA 时停止仿真——这个值在击穿分析里要小心,设太小会在预击穿区就中断,设太大又可能错过击穿拐点。
Solve 段的策略是典型的“先耦合泊松,再逐步加入载流子”。Coupled { Poisson } 先解电势,然后 Hole Poisson、Electron Hole Poisson 逐步加方程。QuasiStationary 里的 InitialStep = 1e-6、MaxStep = 0.01、MinStep = 1e-9 是一组比较保守的步长设置。Goal 里 Voltage=1000 表示扫描到 1000V,但实际器件击穿电压可能远低于此,所以 BreakCriteria 才是真正的终止条件。Plot 里的 Range = (0 1) Intervals=2 控制输出场分布的数量,跑大结构时别设太多,否则 .tdr 文件几个 G 就出去了。
# 典型 sdevice 命令文件结构(基于文档整理) File { Grid = "Diode_msh.tdr" Current = "Diode_IV.plt" Plot = "Diode_IV.tdr" Output = "Diode_IV.log" } Electrode { { Name="ElectrodeN" Voltage=0.0 } } Physics { AreaFactor = 1 Temperature = 300 Mobility (DopingDependence HighFieldSaturation EnormalCarrier CarrierScattering) Recombination (SRH(DopingDependence) Auger(withGeneration) Avalanche(UniBo Eparallel) Band2Band(Hurkx)) EffectiveIntrinsicDensity(OldSlotboom) } Math { Number_of_threads = 4 ExtrapolateDerivatives AvalDerivatives RelErrControl Iterations=15 Notdamped=60 BreakCriteria { Current(Contact="ElectrodeN" maxval=1e-8) } } 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 } } }提示:BreakCriteria 里的 maxval 单位是 A/um 还是 A 取决于 AreaFactor 设置。AreaFactor=1 时就是总电流,如果器件是功率管,实际面积可能是 1e-4 cm² 量级,这里要换算。
2.2 混合模式 C-V 仿真:AC 耦合与频率扫描的坑
C-V 曲线在二极管和 MOS 电容的表征里很关键。文档里给出的 Mixed Mode 方案是把器件定义成一个子电路,外面套一个电压源,然后用 ACCoupled 做小信号分析。Device 段里 File 的 Current 指向 Diode_CV_1kHz.plt,说明这是单频点 1kHz 的 C-V。System 段里 Diode diodesystem 把 ElectrodeN 映射到 front 节点,ElectrodeP 映射到 0 节点,Vsource_pset vn 给 front 节点加直流偏压。
Solve 段先做直流工作点,再做 QuasiStationary 扫描 vn.dc 到 100V。注意这里的 Increment=2 和 Decrement=4 是步长自适应参数:如果一步收敛太慢就减半步长,收敛太快就加倍。Goal 里 Voltage=100 是扫描终点,但实际电容在反偏下变化很小,所以 ACCoupled 里只取 StartFrequency=1e3、EndFrequency=1e3、NumberOfPoints=1,也就是单频点。ACMethod=Blocked 和 ACSubMethod("diodesystem")=ParDiSo 是求解器选择,Blocked 适合小规模电路,ParDiSo 是并行直接求解。
这里最容易翻车的地方是 AC 耦合的节点映射。如果 System 段里节点名和 Device 段里电极名对不上,仿真会直接报 “Node not found”。另外,ACExtract 输出的 .plt 文件里电容值是复数,实部是电容,虚部是电导,别只看实部就下结论。
# 混合模式 C-V 仿真核心片段 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 } 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 } } }注意:ACExtract 文件里的频率单位是 Hz,但有些版本输出的是角频率。跑完先看一眼表头,别把 2πf 当成 f 用。
3. 瞬态仿真两大场景:重离子撞击与激光辐照的语句实现
3.1 HeavyIon 模型:LET 波形与时间步长的匹配
重离子撞击仿真在空间辐射效应分析里是刚需。文档里给出的 HeavyIon 语句包含几个关键参数:Direction 是入射方向,Location 是入射位置,Time 是入射时刻,Length 是轨迹长度,Wt_hi 是时间权重,LET_f 是线性能量转移随时间的变化。GaussianPicoCoulomb 表示用高斯波形描述电荷沉积的时间分布。
LET_f = [0 8.7e-6 8.7e-6 0] 这个数组定义了一个梯形脉冲:从 0 上升到 8.7e-6,保持,再降回 0。单位是 pC/um 还是 fC/um 取决于版本,但数量级上 8.7e-6 对应的是典型重离子的 LET 值。Time = 1e-9 表示离子在 1ns 时刻入射。Length 留空表示默认值,通常是整个器件深度。
Solve 段里 Transient 的 InitialTime=0、FinalTime=35e-9、MinStep=1e-17、MaxStep=1e-10 是一组非常激进的步长。MinStep 到 1e-17 秒意味着要捕捉皮秒级的电荷沉积过程,MaxStep 到 1e-10 秒是为了在电荷收集阶段不丢细节。NewCurrentPrefix = "trans_" 给输出文件加前缀,避免覆盖直流结果。Plot 里的 Time 列表指定了输出场分布的时刻,0.5e-9、1e-9、2e-9、5e-9、10e-9 覆盖了从入射到收集的完整过程。
这里最大的坑是 HeavyIon 的 Location 和网格对齐。如果入射点落在网格单元边界上,电荷沉积会异常。我一般会先在网格文件里确认入射点坐标附近的网格密度,必要时在 Location 附近做局部加密。另外,LET_f 的数组长度必须和 Wt_hi 匹配,否则会报 “Dimension mismatch”。
# 重离子瞬态仿真核心语句 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 ) } 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 ) } }3.2 激光辐照:OpticalGeneration 与 WaveTime 的配合
激光瞬态仿真和重离子类似,但激励源换成了光。文档里 Optics 段用 OpticalGeneration 配合 ComputeFromMonochromaticSource,TimeDependence 里 WaveTime = (1e-9 1e-9) 和 WaveTSigma = 50e-12 定义了一个高斯光脉冲:峰值在 1ns,宽度 50ps。Scaling = 0 表示不做额外缩放。Excitation 里 Wavelength = 0.8 um、Intensity = 0.06 W/cm² 是典型的光源参数。
Window("L1") 定义了光照窗口,Origin = (200,0) 是窗口起点,XDirection = (1,0,0) 是光传播方向,Line(Dx=10) 表示沿 x 方向每 10um 一个采样点。Theta = 0 表示入射角为零。OpticalSolver 里 OptBeam 配合 LayerStackExtraction 做光束传播计算,ComplexRefractiveIndex 的 WavelengthDep(real imag) 表示折射率随波长变化,实部和虚部分别对应折射和吸收。
Solve 段和重离子类似,但 FinalTime 延长到 60e-9,因为光生载流子的收集时间通常比重离子长。这里容易忽略的是 Optics 段和 Physics 段的耦合:如果 Physics 里没有定义 OpticalGeneration 相关的复合模型,光生载流子会直接复合掉,结果看起来像没光照一样。我一般会在 Physics 里显式加上 SRH 和 Auger,并确认 OpticalGeneration 的 Scaling 不为零。
# 激光瞬态仿真核心语句 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)) ) ) ) ) ) Solve { NewCurrentPrefix = "trans_" Transient (InitialTime=0 FinalTime=60e-9 MinStep=1e-17 MaxStep=1e-10 ) { Coupled { Poisson Electron Hole Circuit } } }提示:WaveTSigma 是高斯脉冲的标准差,不是半高宽。如果实验数据给的是 FWHM,要除以 2.355 再填进去。
4. 辐照损伤建模:陷阱语句与界面电荷的写法
4.1 体陷阱与界面陷阱的语法差异
辐照损伤的核心是陷阱。文档里给出了体陷阱和界面陷阱两种写法。体陷阱在 Physics(material="Silicon") 里定义,用 Traps 关键字,每个陷阱包含类型(Acceptor/Donor)、能级位置(EnergyMid fromCondBand 或 fromValBand)、浓度(Conc)、随机化因子(Randomize)、电子和空穴俘获截面(eXsection、hXsection)。
Acceptor 陷阱在能级上半部,Donor 在下半部。EnergyMid=0.42 fromCondBand 表示距导带底 0.42eV,这是典型的辐照诱导深能级。Conc=2.3226E15 对应 1MeV 中子注量 1e14 cm⁻² 左右的缺陷浓度。Randomize=0.29 表示能级在 0.42eV 附近有 0.29eV 的随机分布,模拟缺陷能级的弥散。eXsection=9.5E-15、hXsection=9.5E-14 是俘获截面,单位 cm²,空穴截面比电子截面大一个量级,说明这个陷阱对空穴更敏感。
界面陷阱在 Physics(MaterialInterface="Oxide/Silicon") 里定义,用 Charge(Conc=1.5e11) 表示固定电荷,或者用 Traps 定义界面态。文档里注释掉的 FixedCharge Conc=5e10 和 Charge Conc=1.5e11 是两种不同写法:FixedCharge 是固定电荷,不参与载流子交换;Charge 是界面态电荷,会随偏压变化。辐照后界面态密度通常上升,所以用 Charge 更合适。
# 辐照损伤陷阱定义 Physics (material="Silicon") { Traps ( (Acceptor Level EnergyMid=0.42 fromCondBand Conc=2.3226E15 Randomize=0.29 eXsection=9.5E-15 hXsection=9.5E-14) (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 (MaterialInterface="Oxide/Silicon") { Charge(Conc=1.5e11) }注意:Conc 的单位是 cm⁻³,但有些版本要求填 cm⁻³ 还是 um⁻³ 取决于网格维度。二维仿真里通常用 cm⁻³,三维里要确认一下。
4.2 陷阱参数对 I-V 曲线的影响与验证方法
陷阱参数不是拍脑袋填的。Conc 通常由辐照注量和损伤因子算出来,文档注释里写了 #Conc=Fluence1.1613 和 #Conc=Fluence0.9,说明作者是根据注量乘以一个系数来估算缺陷浓度的。这个系数来自 SRIM 或类似工具的模拟结果,不同离子和能量下不一样。
验证陷阱参数是否合理,最直接的方法是跑一组不同注量下的 I-V 曲线,看漏电流是否随注量单调上升。如果漏电流不升反降,可能是陷阱类型搞反了:Acceptor 陷阱在 n 型材料里会补偿施主,导致载流子浓度下降,漏电流应该降低才对。如果目标是模拟辐照后漏电增加,应该用 Donor 陷阱在 p 型材料里,或者 Acceptor 在 n 型里但浓度不能太高。
另一个验证点是陷阱能级位置。EnergyMid 越靠近禁带中央,产生-复合电流越大。0.42eV 和 0.46eV 都在禁带中央附近,所以这两个 Acceptor 陷阱对漏电流贡献最大。Donor 陷阱在 0.36eV fromValBand,离价带较近,主要影响空穴俘获。跑完仿真后,可以在 .plt 文件里看 SRH 复合率的空间分布,确认陷阱活跃区域和预期一致。
5. 避坑与排查:Sentaurus 语句调试的五个血泪经验
5.1 不收敛:从日志里找第一现场
现象:仿真跑了几步就报 “Convergence failed”,或者电压卡在某个值不动。原因:最常见的是物理模型组合过强,比如同时开了 Avalanche 和 Band2Band 但步长太大。解决:先看 .log 文件里最后一步的残差,如果 Poisson 方程残差在 1e-3 量级就发散,说明电势初值太差。把 InitialStep 降到 1e-8,或者先用只有 Poisson 的 Coupled 跑一遍,再逐步加载流子方程。另一个技巧是打开 Notdamped 并适当增大,让牛顿法在早期多走几步阻尼。
5.2 电流异常:电极配置与 AreaFactor 的隐形陷阱
现象:I-V 曲线电流值比预期大几个量级,或者正反向电流对称。原因:AreaFactor 没设对。二维仿真里 AreaFactor 默认是 1um,如果实际器件宽度是 100um,电流要乘以 100。另外,电极的 Voltage 和 Current 边界条件搞反了也会导致异常。解决:先确认 Electrode 段里哪个电极是接地、哪个是偏压。跑一个零偏压的仿真,看电流是否接近零。如果不为零,检查电极接触是欧姆还是肖特基。
5.3 瞬态结果震荡:步长与电荷沉积时间的匹配
现象:重离子或激光瞬态仿真里,电流波形出现高频震荡。原因:MaxStep 太大,错过了电荷沉积的快速变化。重离子的电荷沉积时间在皮秒量级,如果 MaxStep 设到 1e-9,一个步长就跨过了整个沉积过程。解决:把 MaxStep 降到 1e-12 以下,MinStep 降到 1e-17。同时检查 HeavyIon 的 Time 和 Transient 的 InitialTime 是否对齐,如果离子在 1ns 入射但 InitialTime=0,前 1ns 的步长可以放宽,入射后再收紧。
5.4 陷阱不生效:材料名与区域匹配
现象:定义了陷阱但 I-V 曲线和没定义一样。原因:Physics(material="Silicon") 里的材料名必须和网格文件里的区域名完全一致。如果网格里写的是 “Si” 而不是 “Silicon”,陷阱不会生效。解决:用 tecplot 或 svisual 打开 .tdr 文件,查看区域名称。另外,界面陷阱的 MaterialInterface 写法要确认是 “Oxide/Silicon” 还是 “SiO2/Si”,不同版本默认名不一样。
5.5 输出文件过大:Plot 频率与场变量裁剪
现象:跑一个瞬态仿真,.tdr 文件几十个 G,硬盘直接爆了。原因:Plot 里默认输出所有场变量,而且每个时间点都存。解决:在 Plot 段里显式指定需要的变量,比如只留 eDensity、hDensity、Potential 和 Current/Vector。Time 列表只保留关键时间点,不要用 Range 输出连续场。另外,NoOverwrite 可以防止覆盖同名文件,但不会减小文件体积。
6. 进阶技巧:用语句模板批量跑参数扫描与结果验证
当你把单点仿真跑通之后,下一步通常是做参数扫描——比如改变陷阱浓度看漏电流变化,或者改变 LET 值看重离子瞬态响应。手动改命令文件再一个个跑太慢,我一般会用 shell 脚本生成多个 sdevice 命令文件,然后并行提交。
#!/bin/bash # 批量生成不同陷阱浓度的命令文件并提交 for conc in 1e15 2e15 5e15 1e16; do sed "s/Conc=2.3226E15/Conc=${conc}/g" Diode_IV_base.cmd > Diode_IV_${conc}.cmd sdevice Diode_IV_${conc}.cmd > Diode_IV_${conc}.log 2>&1 & done wait echo "All simulations finished."这段脚本的核心是 sed 替换。先把基础命令文件里的陷阱浓度替换成变量,生成新文件,然后后台提交。wait 确保所有进程结束后再输出提示。注意并行数不要超过机器核数,否则内存不够会直接 kill。
结果验证我一般分三步。第一步看 .log 里有没有 Warning 或 Error,特别是 “Model not activated” 和 “Convergence failed”。第二步用 svisual 或 tecplot 打开 .tdr,看电场和载流子浓度的空间分布是否合理——比如击穿时电场应该集中在结区,如果电场跑到电极下面说明网格有问题。第三步把 .plt 里的曲线和实验数据对比,如果趋势一致但绝对值差一个常数因子,优先检查 AreaFactor 和接触电阻。
从那以后我每次跑新结构,都强制先跑一个零偏压的平衡态仿真,确认电势和载流子浓度分布正常,再逐步加偏压和物理模型。这个习惯帮我省下了至少几十次“跑了一夜结果全错”的后悔药。希望帮到你。
本文还有配套的精品资源,点击获取