半导体仿真这个领域,刚入行的时候最容易卡住的地方往往不是物理模型本身,而是工具链的搭建和第一个能跑通的案例。Silvaco Atlas 作为业界老牌的 TCAD 仿真工具,功能覆盖从工艺到器件的全流程,但它的学习曲线也确实不友好——命令行式的操作逻辑、分散的组件、动辄几百行的输入文件,让不少新手在装完软件之后就不知道该干什么了。这篇内容就是针对这个痛点来的:从环境配置到 DeckBuild 的基本操作,再到一个完整的 PN 结二极管仿真案例,把每一步为什么这么做、参数怎么来的、结果怎么看都讲清楚。不管你是微电子专业的学生,还是刚转行做器件仿真的工程师,跟着走一遍应该能建立起基本的仿真流程认知。
1. 先把工具链理清楚:Atlas 在整个仿真体系里扮演什么角色
1.1 Silvaco 全家桶的分工逻辑
很多人第一次打开 Silvaco 的安装目录会懵——DeckBuild、Atlas、Athena、TonyPlot、MaskViews、Utmost 一堆组件,到底该用哪个?这里先把关系理清楚。
Atlas 是核心的器件仿真引擎,它负责求解半导体方程——泊松方程、连续性方程、漂移扩散模型这些。你给它一个器件结构定义和偏压条件,它算出电流、电场、载流子浓度分布这些物理量。但 Atlas 本身不是一个能直接双击运行的图形化程序,它需要通过 DeckBuild 来驱动。
DeckBuild 是仿真流程的调度器,你可以把它理解成一个专门为 TCAD 设计的脚本编辑器和运行环境。你在 DeckBuild 里写输入文件(也就是常说的 deck),然后它调用 Atlas 去执行,执行完再调用 TonyPlot 来可视化结果。这个设计的好处是仿真流程可以完全脚本化,方便批量跑参数扫描和自动化。
Athena 是工艺仿真模块,负责模拟氧化、扩散、离子注入、刻蚀这些工艺步骤,输出的是器件的结构文件。Atlas 可以直接读取 Athena 生成的工艺结构,也可以自己通过区域定义来构建结构。对于新手来说,建议先从 Atlas 直接定义结构入手,因为工艺仿真的参数更多、收敛更困难,容易在还没理解器件物理之前就被工艺参数搞晕。
TonyPlot 是结果可视化工具,一维的浓度-深度曲线、二维的电场分布云图、三维的结构渲染都靠它。它支持导出数据到文本文件,方便后续用 Python 或 MATLAB 做二次处理。
提示:安装的时候建议把 DeckBuild 和 TonyPlot 的快捷方式放到桌面,Atlas 没有独立的 GUI 入口,必须通过 DeckBuild 调用。
1.2 为什么选择 PN 结二极管作为第一个案例
PN 结是半导体器件的"Hello World",这个说法一点不夸张。原因有三:
第一,物理图像清晰。PN 结的工作原理——耗尽区形成、内建电势、正向注入、反向击穿——这些概念在教科书里讲得很透,仿真结果可以和理论计算直接对照,方便验证仿真设置是否正确。
第二,结构简单但覆盖核心操作。一个 PN 结的仿真涉及了 Atlas 最常用的几个模块:网格定义(Mesh)、区域定义(Region)、电极定义(Electrode)、掺杂定义(Doping)、物理模型选择(Models)、求解方法设置(Method)、偏压扫描(Solve)。这些操作在后续做 MOSFET、BJT、HEMT 的时候都会反复用到,只是复杂度不同。
第三,收敛性好。PN 结的仿真在默认参数下基本都能收敛,不像一些异质结器件或者击穿仿真那样需要反复调 Method 和参数。对新手来说,先跑通一个能出结果的案例,比卡在收敛问题上反复试错要友好得多。
1.3 安装环节最容易忽略的几个细节
Silvaco 的安装在 Windows 和 Linux 下略有不同,这里以 Windows 环境为例说几个容易踩坑的地方。
许可证配置。Silvaco 用的是 FlexLM 许可证管理,安装完成后需要设置环境变量指向 license 文件。常见的问题是环境变量SILVACO_LICENSE_FILE或者LM_LICENSE_FILE没有设置正确,导致 DeckBuild 启动时报 "Cannot find license" 错误。检查方法是打开命令行,输入echo %SILVACO_LICENSE_FILE%看路径是否指向了正确的 license 文件。如果公司或学校提供的是浮动许可证,还需要确认网络能通到 license server。
安装路径不要有中文和空格。这个问题在 Windows 下特别常见。Silvaco 的很多脚本内部用的是绝对路径拼接,如果路径里有中文或者空格,会出现文件找不到或者解析错误。建议装在C:\Silvaco或者D:\SILVACO这种纯英文无空格的路径下。
环境变量 PATH 的配置。安装程序一般会自动添加,但有时候会被其他软件的安装覆盖掉。确认bin目录在 PATH 里,否则 DeckBuild 调用 Atlas 的时候会报 "atlas.exe not found"。
TonyPlot 的显示问题。在高分屏或者多显示器环境下,TonyPlot 的界面可能会出现字体模糊或者窗口位置异常。解决办法是右键 TonyPlot 快捷方式,在"兼容性"选项卡里设置"替代高 DPI 缩放行为",选择"应用程序"。
2. DeckBuild 的操作逻辑:不是 IDE,是仿真流程的编排器
2.1 输入文件的基本结构
DeckBuild 的输入文件(deck)本质上是一个按顺序执行的命令列表。Atlas 从上到下逐行读取,遇到一个命令就执行一个。这个执行模型很重要,因为它决定了你不能像写 C 程序那样随意跳转——deck 是线性的。
一个典型的 Atlas deck 包含以下几个部分,按执行顺序排列:
go atlas # 启动 Atlas 仿真器 mesh ... # 定义网格 region ... # 定义区域 electrode ... # 定义电极 doping ... # 定义掺杂 material ... # 材料参数(可选) models ... # 物理模型选择 method ... # 数值求解方法设置 solve init # 求解初始状态 solve ... # 偏压扫描 save ... # 保存结果 log ... # 记录电学特性 quit # 退出每一行的语法格式是命令 参数=值 参数=值 ...,注释用#开头。命令可以缩写,比如go atlas可以写成go at,但为了可读性建议写全。
注意:deck 文件不要用 Windows 记事本编辑,因为记事本会在文件开头加 BOM 字符,Atlas 解析时会报错。用 DeckBuild 自带的编辑器或者 Notepad++、VS Code 这类工具。
2.2 网格定义:仿真精度和速度的平衡点
网格是 Atlas 仿真的基础,它决定了在哪些位置求解方程。网格越密,结果越精确,但计算量也越大。新手最容易犯的错误是全局用很密的网格,导致仿真跑几个小时甚至跑不动。
Atlas 的网格定义用的是mesh语句,支持x.mesh和y.mesh分别定义横向和纵向的网格线位置,以及spacing参数控制局部密度。
mesh space.mult=1.0 x.mesh loc=0.0 spac=0.5 x.mesh loc=1.0 spac=0.02 x.mesh loc=2.0 spac=0.5 y.mesh loc=0.0 spac=0.01 y.mesh loc=0.5 spac=0.05 y.mesh loc=1.0 spac=0.5这里的逻辑是:在 PN 结界面附近(x=1.0 附近)用密集网格(spac=0.02 微米),远离结区的地方用稀疏网格(spac=0.5 微米)。纵向同理,在结深附近加密。
space.mult是一个全局的网格密度乘数,默认值是 1.0。调试阶段可以设成 0.5 加快仿真速度,最终出结果的时候再改回 1.0 或者更大。
网格设计的经验法则:
- 在耗尽区宽度范围内至少保证 10-20 个网格点
- 在浓度梯度大的地方(比如 PN 结界面)加密
- 在电极接触附近适当加密,因为电流集中
- 在远离结区的衬底部分可以很稀疏
2.3 区域和电极定义:告诉 Atlas 器件长什么样
区域定义用region语句,通过指定矩形的对角坐标来确定。Atlas 的坐标系原点在左上角,x 向右为正,y 向下为正,单位是微米。
region num=1 material=Silicon x.min=0.0 x.max=2.0 y.min=0.0 y.max=1.0这行定义了一个 2μm × 1μm 的硅区域。如果是多层结构,就用多个 region 语句,每个指定不同的 material 和坐标范围。
电极定义用electrode语句,可以指定电极的名称、位置和类型:
electrode name=anode x.min=0.0 x.max=0.5 y.min=0.0 y.max=0.0 electrode name=cathode x.min=1.5 x.max=2.0 y.min=1.0 y.max=1.0这里 anode 定义在顶部左侧,cathode 定义在底部右侧。电极的位置必须落在区域边界上,否则 Atlas 会报错。
提示:电极的
x.min和x.max如果相等,表示是一个点电极;如果不等,表示是一个面电极。面电极的电流分布更均匀,适合做功率器件仿真。
2.4 掺杂定义:PN 结的核心参数
掺杂是 PN 结的灵魂。Atlas 支持多种掺杂定义方式:均匀掺杂(uniform)、高斯分布(gaussian)、误差函数分布(erfc)、以及从文件读取(来自 Athena 的工艺仿真结果)。
对于手工定义的 PN 结,最常用的是高斯分布和均匀掺杂的组合:
doping region=1 uniform conc=1e15 type=n doping region=1 gaussian conc=1e20 peak=0.05 char=0.02 type=p doping region=1 gaussian conc=1e20 peak=0.95 char=0.02 type=n第一行是衬底掺杂,n 型,浓度 1e15 cm⁻³。第二行是 p 型高斯掺杂,峰值浓度 1e20 cm⁻³,峰值位置在 y=0.05μm,特征长度 0.02μm。第三行是 n 型高斯掺杂,峰值在 y=0.95μm。
char参数控制掺杂分布的陡峭程度,值越小分布越陡。对于典型的离子注入掺杂,char 在 0.01-0.05μm 之间比较合理。
掺杂设置的注意事项:
- 峰值浓度不要超过硅的固溶度极限(约 1e21 cm⁻³),否则会出现物理上不合理的载流子统计
- 高斯分布的峰值位置要在网格加密的范围内,否则掺杂分布会被网格截断
- 如果同时定义了 uniform 和 gaussian 掺杂,Atlas 会将它们叠加,注意不要重复定义
3. 第一个 PN 结仿真:从 deck 编写到结果验证
3.1 完整的输入文件逐行拆解
下面是一个可以直接运行的 PN 结二极管仿真 deck,我把它拆成几个部分逐行解释。
go atlas # --- 网格定义 --- mesh space.mult=1.0 x.mesh loc=0.0 spac=0.1 x.mesh loc=0.5 spac=0.01 x.mesh loc=1.0 spac=0.1 y.mesh loc=0.0 spac=0.005 y.mesh loc=0.1 spac=0.01 y.mesh loc=0.5 spac=0.05 y.mesh loc=0.9 spac=0.01 y.mesh loc=1.0 spac=0.005 # --- 区域定义 --- region num=1 material=Silicon x.min=0.0 x.max=1.0 y.min=0.0 y.max=1.0 # --- 电极定义 --- electrode name=anode top electrode name=cathode bottom # --- 掺杂定义 --- doping region=1 uniform conc=1e15 type=n doping region=1 gaussian conc=5e19 peak=0.05 char=0.02 type=p doping region=1 gaussian conc=1e20 peak=0.95 char=0.02 type=n # --- 物理模型 --- models srh auger bgn fldmob print # --- 求解方法 --- method newton trap maxtrap=10 # --- 初始求解 --- solve init # --- 零偏压保存 --- save outf=pn_zero.str # --- 正向 IV 扫描 --- log outf=pn_forward.log solve vanode=0.0 vstep=0.05 vfinal=1.0 name=anode log off # --- 反向 IV 扫描 --- log outf=pn_reverse.log solve vanode=0.0 vstep=-0.1 vfinal=-5.0 name=anode log off # --- 保存最终结构 --- save outf=pn_final.str # --- 可视化 --- tonyplot pn_zero.str -set pn_plot.set tonyplot pn_forward.log -set iv_plot.set quit网格部分:x 方向在 0.5μm 处加密(spac=0.01),因为这里没有结,其实可以更稀疏。y 方向在 0.05μm 和 0.95μm 附近加密,对应两个掺杂峰值的位置。这个网格设计保证了结区有足够的解析度。
掺杂部分:衬底是 n 型 1e15,顶部 p 型高斯掺杂峰值 5e19,底部 n 型高斯掺杂峰值 1e20。这样形成的 PN 结在 y=0.05μm 附近,冶金结面在 p 型和 n 型浓度相等的位置。
模型部分:srh是 Shockley-Read-Hall 复合模型,auger是俄歇复合,bgn是带隙窄化,fldmob是场相关迁移率。这四个模型是硅器件仿真的标配。print参数让 Atlas 在求解过程中输出详细信息,方便调试。
求解方法:newton是牛顿迭代法,trap是载流子输运的梯形积分方法,maxtrap=10限制最大陷阱数。对于 PN 结这种简单结构,默认的 newton 方法基本都能收敛。
3.2 正向特性仿真:从 0V 扫到 1V
正向扫描用的是solve vanode=0.0 vstep=0.05 vfinal=1.0 name=anode。这行命令的意思是:从阳极电压 0V 开始,每次增加 0.05V,一直加到 1.0V。
log outf=pn_forward.log和log off之间的所有 solve 结果都会被记录到 log 文件里。这个 log 文件是文本格式的,包含每个偏压点下的阳极电流、阴极电流、以及一些内部变量。
正向 IV 的理论预期是:在低偏压(<0.3V)下电流很小,因为注入的载流子浓度远低于平衡态;在 0.5-0.7V 之间电流指数上升;在 1V 左右电流达到 mA 量级。如果仿真结果偏离这个趋势,说明模型或者掺杂设置有问题。
常见问题排查:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 电流始终为 0 | 电极没接触好 | 检查 electrode 语句的位置是否在区域边界上 |
| 电流不随电压变化 | 掺杂类型搞反了 | 检查 type=n 和 type=p 是否与预期一致 |
| 电流过大(mA 级 at 0.1V) | 掺杂浓度太低 | 检查 conc 值是否合理 |
| 仿真不收敛 | 网格太粗或步长太大 | 减小 vstep 或加密网格 |
3.3 反向特性仿真:击穿电压的初步观察
反向扫描从 0V 扫到 -5V,步长 -0.1V。对于掺杂浓度 1e15 的衬底,理论击穿电压在几十伏量级,所以 -5V 还远没到击穿。这个扫描的目的是观察反向漏电流和结电容特性。
反向电流的理论值应该在 pA 到 nA 量级(取决于结面积和少子寿命)。如果仿真出来的反向电流是 μA 甚至 mA 量级,说明有漏电机制没考虑——可能是 SRH 复合参数设置不当,或者表面复合没处理。
提示:如果要仿真击穿,需要加入
impact selb模型(Selberherr 碰撞电离模型),并且把反向电压扫到击穿点附近。击穿仿真的收敛比较困难,建议用method newton trap配合较小的电压步长。
3.4 用 TonyPlot 看结果:哪些图必须看
仿真跑完之后,TonyPlot 会自动打开(如果 deck 里有 tonyplot 命令)。对于 PN 结,以下几张图是必须看的:
能带图。TonyPlot 里选择 "Band Diagram",可以看到导带底、价带顶和费米能级随深度的变化。平衡态下,费米能级应该是平的,导带和价带在结区弯曲,弯曲量等于内建电势。如果费米能级不平,说明平衡态求解没收敛。
载流子浓度分布。选择 "Carrier Concentration",可以看到电子和空穴浓度随深度的变化。在耗尽区,载流子浓度应该比掺杂浓度低几个数量级。在中性区,多数载流子浓度等于掺杂浓度。
电场分布。选择 "Electric Field",可以看到耗尽区的电场峰值。对于突变结,电场分布是三角形的;对于线性缓变结,是抛物线形的。电场峰值的位置应该在冶金结面附近。
IV 曲线。TonyPlot 可以直接画 log 文件里的 IV 数据。正向曲线应该是指数上升的,反向曲线应该是饱和的。在半对数坐标下,正向曲线的斜率对应理想因子。
Net Doping。这张图显示净掺杂浓度(Nd - Na)随深度的变化,可以直观地看到 PN 结的位置和耗尽区的范围。
4. 从跑通到跑对:参数校准和常见陷阱
4.1 理想因子为什么不是 1
教科书上说 PN 结的理想因子 n=1(扩散电流主导)或 n=2(复合电流主导)。但实际仿真出来的 IV 曲线,在低偏压区往往 n≈2,在高偏压区 n≈1,中间有一个过渡区。
这个现象的原因是:低偏压下,耗尽区的 SRH 复合电流占主导,理想因子接近 2;高偏压下,中性区的扩散电流占主导,理想因子接近 1。如果你的仿真结果在整个范围内都是 n=1,可能是 SRH 复合模型没生效,或者少子寿命设得太长。
检查方法:在 TonyPlot 里画log(I) vs V曲线,取低偏压段(0.1-0.3V)的斜率,计算n = q/(kT) * dV/d(lnI)。如果 n 接近 2,说明复合电流主导;如果接近 1,说明扩散电流主导。
4.2 串联电阻的影响
在实际器件中,中性区的电阻和接触电阻会形成串联电阻,导致高偏压下的 IV 曲线偏离指数关系,变成线性。仿真中如果发现 0.8V 以上的电流增长变慢,可能是串联电阻在起作用。
Atlas 中可以通过设置电极的接触电阻来模拟这个效应:
electrode name=anode top resist=1e-6resist参数的单位是 Ω·cm²。对于典型的金属-半导体接触,接触电阻在 1e-6 到 1e-4 Ω·cm² 之间。
4.3 网格收敛性验证
网格收敛性是仿真可信度的基础。验证方法是:把网格加密一倍,重新跑仿真,比较 IV 曲线。如果两条曲线几乎重合,说明网格已经足够密;如果差异明显,说明还需要加密。
具体操作:把space.mult从 1.0 改成 0.5(网格加密一倍),重新跑一遍。比较两次的 IV 曲线,如果电流差异小于 5%,可以认为网格收敛了。
注意:网格加密会显著增加仿真时间。对于二维 PN 结,网格点数从 1000 增加到 4000,仿真时间可能增加 10 倍以上。所以要在精度和速度之间找平衡。
4.4 温度参数的设置
Atlas 默认的仿真温度是 300K。如果要仿真不同温度下的特性,用models temp=xxx设置。温度会影响本征载流子浓度、迁移率、SRH 复合速率等参数。
对于 PN 结,温度升高会导致正向压降减小(约 -2mV/K),反向漏电流增大(约每 10K 翻一倍)。这些趋势可以用来验证温度模型的正确性。
5. 从 PN 结到更复杂的器件:下一步该学什么
5.1 双极晶体管(BJT)的仿真思路
BJT 可以看成是两个背靠背的 PN 结,但仿真复杂度高一个量级。关键区别在于:BJT 需要同时定义发射区、基区、集电区三个掺杂区域,而且基区宽度很窄(通常 < 1μm),对网格精度的要求更高。
BJT 仿真的核心是 Gummel 图——把集电极电流和基极电流随基极-发射极电压的变化画在半对数坐标上。Gummel 图的斜率可以提取理想因子,两条曲线的交点对应电流增益为 1 的点。
5.2 MOSFET 的仿真要点
MOSFET 仿真的难点在于栅氧化层的处理。Atlas 中可以用region material=SiO2定义氧化层区域,然后在氧化层和硅的界面处定义栅电极。关键参数包括氧化层厚度、栅长、沟道掺杂浓度。
MOSFET 仿真的核心输出是转移特性(Id-Vg)和输出特性(Id-Vd)。转移特性的亚阈值摆幅(SS)是衡量开关性能的关键指标,理论极限是 60mV/dec(室温下)。
5.3 功率器件的特殊考虑
功率器件(如功率二极管、IGBT、功率 MOSFET)的仿真需要特别关注击穿电压和导通电阻的折中。击穿仿真需要加入碰撞电离模型,而且收敛非常困难,通常需要逐步增加反向电压,每一步都保存结果,以便在击穿点附近细化扫描。
功率器件的网格设计也有特殊要求:漂移区通常很厚(几十到几百微米),需要用非均匀网格,在结附近加密,在漂移区中部稀疏。
5.4 仿真与实验的对照方法
仿真的最终目的是指导实验或者解释实验现象。对照方法包括:
- IV 曲线对照:把仿真得到的 IV 曲线和实验测量的 IV 曲线画在同一张图上,比较开启电压、理想因子、反向漏电流等参数。
- CV 曲线对照:仿真可以得到结电容随电压的变化,和实验的 CV 测量结果对照,可以提取掺杂浓度和结面积。
- 参数提取:从仿真结果中提取少子寿命、迁移率、接触电阻等参数,和实验提取的值比较,验证模型的准确性。
如果仿真和实验偏差较大,首先检查掺杂分布和几何尺寸是否准确,然后检查物理模型是否适用,最后考虑是否有实验中没有考虑的效应(如表面态、界面态)。
6. 一些让我少走弯路的实操习惯
6.1 文件命名和版本管理
仿真项目会产生大量文件:deck 文件、log 文件、str 文件、set 文件。如果没有好的命名习惯,一周之后就分不清哪个文件对应哪个参数了。
我的习惯是用器件名_参数_日期的格式,比如pn_1e15_1e20_20240115.in。每次修改参数就另存一个新文件,不要在原文件上改。这样虽然文件多,但回溯起来很方便。
6.2 调试阶段的快速迭代
调试阶段不要一上来就跑完整的 IV 扫描。先用solve init求解平衡态,然后solve vanode=0.1跑一个点,看能不能收敛。如果能收敛,再逐步增加电压点。这样可以在几秒钟内发现问题,而不是等几分钟跑完整个扫描才发现不收敛。
6.3 保存中间结果
在每个关键步骤之后都save一个 str 文件。比如平衡态保存一个,0.5V 保存一个,1.0V 保存一个。这样如果后续仿真出问题,可以从中间状态重新开始,不用从头跑。
6.4 用 TonyPlot 的 set 文件固化视图
TonyPlot 的 set 文件保存了视图设置(坐标轴范围、显示的物理量、颜色映射等)。把常用的视图设置保存成 set 文件,每次打开新结果时直接加载,可以节省大量调整视图的时间。
创建 set 文件的方法:在 TonyPlot 里调整好视图,然后 File > Save Set。下次用tonyplot xxx.str -set xxx.set直接加载。
6.5 记录仿真日志
每次仿真都记录:日期、deck 文件名、修改了什么参数、结果是否符合预期、遇到的问题。这个习惯在跑参数扫描的时候特别有用,因为很容易忘记哪个参数对应哪个结果。我一般用一个简单的文本文件记录,格式是日期 | 文件名 | 参数变化 | 结果摘要 | 备注。
仿真工具的学习从来不是一蹴而就的,PN 结只是起点。真正让我对 Atlas 的理解产生质变的,是反复修改掺杂分布和网格密度,观察结果如何变化,然后和理论预期对照。这个过程很枯燥,但每一次"为什么这个结果和我想的不一样"的追问,都会让你对器件物理和数值方法有更深的理解。