简介:Sentaurus TCAD Device User Guide 是面向集成电路器件仿真学习者与工程技术人员的一手官方手册,对应 Synopsys Sentaurus Device P-2019.03 版本,适合需要系统掌握 TCAD 工具流程、器件建模与电学特性分析的中高级读者。文档围绕软件功能、器件结构创建与网格划分、仿真流程组织及结果解读展开,可帮助读者理解 Sentaurus Device 在微电子、纳电子与光电器件设计中的实际用法,并建立从结构建模到性能评估的完整认知。压缩包内共 1 个 PDF 文件,大小约 7.85MB,单册结构便于按章节查阅,也适合作为案头参考。该指南已有 3816 人学习,说明其在 TCAD 入门与进阶查阅中具有较高关注度。对于希望减少摸索成本、快速定位工具概念与仿真方法的读者,这份官方文档能提供较完整的术语体系、功能说明与操作框架,是开展器件仿真与结果分析时值得常备的参考资料。
1. 一份 2019 版的器件手册,翻之前先想清楚要拿它干什么
接手一个器件标定任务,最让人头疼的情况是仿真在 Vg 快到阈值时突然中断,日志最后一行只留下step too small。我第一次用 Sentaurus TCAD Device 跑 Id-Vg 就卡在这里,翻了两天手册才在 BreakCriteria 那一节找到原因。这份 P-2019.03 版的 Device User Guide 就是做这件事的:它把命令文件里每一个段、每一个模型开关、参数文件到底谁覆盖谁,都按顺序讲清楚了,是集成电路器件仿真里绕不开的案头参考。
它适合三类人:已经在跑 sdevice 命令文件、但遇到收敛或结果异常时不知道该查哪一节的人;从其他 TCAD 工具转过来、需要把旧写法映射到新命令结构的人;带学生做器件课题、需要一份能逐条对照的规范的人。它不适合当入门教程从第一页读到最后一页——八百多页里真正决定一次仿真能不能跑通的,集中在 File 段、Physics 段和 Solve 段这三处。
2. 结构读入与材料映射:File 段、电极、异质结三处对齐
2.1 File 段是第一个必须看明白的地方
很多人把.tdr拖进命令文件就开跑,跑出来的电流比预期小两个数量级,回头才发现掺杂根本没有读进来。File 段负责把网格、掺杂、输出这几件事绑在一起,写错一个键,后面的 Physics 写得再细也没有用。
File { Grid = "@tdr@" Doping = "@doping@" Plot = "@tdrdat@" Current = "@plot@" Output = "@log@" Parameter = "models.par" }Grid指向网格化之后的器件结构,通常是结构编辑器或工艺仿真导出的 TDR 文件。Doping是可选项:如果结构文件里已经带了掺杂分布,这一行可以不写;只有掺杂来自独立文件时才需要。Plot是场分布输出,做截面图、能带图都靠它;Current是电学曲线输出,Id-Vg、Id-Vd 这类数据落在这里;Output是日志,排查问题第一眼看的就是它。Parameter指定参数文件,不写就退回安装目录的默认参数库。
@tdr@这种写法来自工作台预处理器的变量替换。在图形界面的工作台里跑没问题,一旦改成手工命令行,必须换成真实文件名,否则程序会去找一个名字就叫@tdr@的文件,然后报一个和网格无关的错,很容易误导排查方向。
提示:File 段里的相对路径是相对运行目录,不是相对命令文件所在目录。切换工作目录跑同一条命令,最容易出现「结构找不到、掺杂读成零」的假故障。
2.2 电极段与接触类型:写不写 Barrier 是两回事
电极名字必须和结构里的接触名逐字一致,大小写也算。器件结构里叫gate、命令文件里写Gate,程序不会报错,只会告诉你这个电极没有连上任何接触,然后仿真在第一步就停在泊松方程上。
Electrode { { Name="source" Voltage=0.0 } { Name="drain" Voltage=0.0 } { Name="gate" Voltage=0.0 Workfunction=4.6 } { Name="substrate" Voltage=0.0 } }Voltage是初始偏置,并不是扫描的起点——真正的扫描从 Solve 段开始。Workfunction只对欧姆接触的功函数差有意义,写它相当于在电极上叠一个内建电势偏移。想做成肖特基接触,就要写Barrier,此时接触势垒由势垒高度决定,欧姆接触不要写这个参数。
接触类型一旦搞反,I-V 曲线的形状会完全不同:本该是欧姆的源漏写成了肖特基,低电流区会多出一段指数型上升,看起来像界面态,其实是接触模型用错了。这类问题的特征是曲线整体平移而不是局部畸变,判断的时候先看低偏压区。
2.3 材料、区域与异质结:名字对了,参数才找得到
Sentaurus Device 里的材料名和区域名是从结构侧继承下来的。结构编辑器里定义Silicon,命令文件里写Physics(Material="Silicon")才匹配;写成小写silicon,这一段整段失效且不报错——这是手册里反复强调、但实际使用中仍然经常踩的地方。
异质结的处理分两种情况。突变结在界面上材料直接切换,参数按两侧各自材料取,界面处需要足够细的网格和合适的界面模型;渐变结则需要结构里带组分场(mole fraction),材料参数按组分实时插值。
| 结类型 | 结构侧需要的数据 | 命令文件侧重 | 常见错误 |
|---|---|---|---|
| 突变异质结 | 界面两侧材料分区清楚 | 界面网格加密、界面模型 | 界面网格过粗,隧穿/热电子发射算不准 |
| 渐变异质结 | 组分场随位置连续变化 | 材料参数自动按组分插值 | 结构里缺组分场,参数退化成纯材料 |
| 三元/四元材料 | 每个节点的组分值 | 复合、迁移率按组分取值 | 只给一个平均组分,忽略分布 |
三元和四元半导体这一块,手册讲得比较细:组分不仅影响带隙,还会牵动电子亲和势、迁移率、有效质量。实际使用中,如果结构里的组分场缺失,参数文件会按默认的二元材料给值,曲线看上去「能跑通」,但物理上已经偏了,这种错误最难发现,因为日志里没有任何异常。
3. 物理模型的分层覆盖:四层作用域与参数文件的搜索顺序
3.1 同一个模型写在四个位置,谁生效
命令文件里写 Physics 的地方不止一处:全局 Physics、按材料分的 Physics、按区域分的 Physics、按界面分的 Physics,还有 Electrode 段里的电极级参数。它们不是简单叠加,而是按作用域从宽到窄逐层覆盖。
| 作用域 | 典型写法 | 覆盖关系 |
|---|---|---|
| 全局 | Physics { ... } | 最低,垫底 |
| 材料 | Physics(Material="Silicon") | 覆盖全局 |
| 区域 | Physics(Region="channel") | 覆盖材料 |
| 材料界面 | Physics(MaterialInterface="Silicon/Oxide") | 只作用于界面 |
| 区域界面 | Physics(RegionInterface="ch/ox") | 只作用于指定界面,最具体 |
| 电极 | Electrode段里的参数 | 只作用于该电极 |
Physics { Fermi EffectiveIntrinsicDensity( OldSlotboom ) Recombination( SRH(DopingDependence) Auger ) Mobility( DopingDependence HighFieldSaturation ) } Physics( Material="Silicon" ) { Mobility( Enormal ) } Physics( Region="channel" ) { Mobility( Enormal Lombardi ) }上面这段的含义是:全局打开费米统计、带隙窄化、SRH 与俄歇复合、浓度相关迁移率加高场饱和;在硅材料上额外叠加法向场相关迁移率;在沟道区域再细化为 Lombardi 模型。区域级覆盖材料级,所以沟道里最终用的是 Lombardi,而器件其他硅区用 Enormal。
这种写法有一个陷阱:如果Region="channel"里的区域名在结构中不存在,这一段会被静默忽略,程序不报错,仿真仍然能跑完,但沟道里少了模型,亚阈值斜率会明显偏大。判断方法是打开日志里的模型清单,逐个核对实际生效的模型名,而不是只看命令文件写了什么。
3.2 参数文件的搜索顺序与生成副本
Physics 段只负责「打开哪些模型」,具体数值来自参数文件。手册给的搜索顺序是:先找命令文件里Parameter指定的文件,找不到再按安装环境配置的搜索路径去找默认参数库,最后才回落到程序内置值。
这个顺序带来的直接后果是:改了参数却没生效,八成是命令文件里压根没写Parameter,程序一直在读默认库。我一般会在工程目录下复制一份参数库,把Parameter = "models.par"固定指向它,这样每次改参数都能确认改的是正在生效的那一份。
手册里「生成参数文件副本」那一节的思路很简单:不要直接改安装目录下的默认库,复制出来放到工程目录,只保留需要改的条目,其余靠继承。好处是升级软件版本时默认库可以整体替换,自己的改动不受影响。
File { Parameter = "models.par" # 工程目录下的自定义参数文件 } Physics( Material="Silicon" ) { # 需要改的材料参数在参数文件里覆盖,命令文件只保留模型开关 }参数文件里按材料、区域、界面分别定义数值块。同名参数如果出现多次,后加载的覆盖先加载的,所以命名参数集的顺序就有意义:先加载基础集,再加载针对某个工艺或某个器件的修正集,最后生效的是修正值。实际项目里我通常准备两套:一套跟工艺相关的固定值,一套做敏感性分析用的扰动值,靠命令行切换文件而不是改文件内容。
3.3 Auto-Orientation 与晶向:容易被忽略的一层参数
同一个器件里,不同区域的晶向可能不同——沟道顶部和侧壁、不同晶面的衬底。传统做法是给每个区域单独指定晶向,再在参数文件里为每个晶向准备一套迁移率参数,区域一多就很容易漏。
Auto-Orientation 这一节要解决的就是这件事:打开这一层之后,程序按结构里的晶向信息自动选对应的参数集,不需要手工为每个区域写Physics(Region=...)的迁移率覆盖。手册里配套还讲了平滑处理,用来避免晶向在区域交界处切换时参数突变造成收敛问题。
打开之前有两个前提要确认:结构里每个区域都带了晶向信息,参数库里也具备对应晶向的数据。缺任何一个,打开之后不会报错,只会静默按默认晶向算,结果是某些区域迁移率偏低,曲线整体对不上却找不到原因。我一般会先关掉它跑一遍基线,再打开对比,差值超过预期才回头查结构。
4. 混合模式仿真:把器件当元件接进 SPICE 网表的写法
4.1 System 段:电路与物理器件的接口
混合模式的本质是把一个网格化器件当成电路里的一个元件,让它在电路方程里同时受外部节点电压约束。System 段负责描述这个电路拓扑,Device 段负责描述那个物理器件本身。
System { Vsource_pset vg (gate 0) { dc = 0.0 } Vsource_pset vd (drain 0) { dc = 1.0 } Resistor_pset rd (drain dint) { resistance = 50 } # 物理器件实例:端口顺序对应 Device 段电极顺序 TCAD_DEVICE dut (dint gate 0 0) { File = "@tdr@" } } Device "dut" { Electrode { { Name="drain" Voltage=0.0 } { Name="gate" Voltage=0.0 } { Name="source" Voltage=0.0 } { Name="bulk" Voltage=0.0 } } Physics { ... } File { ... } }Vsource_pset、Resistor_pset这类带_pset后缀的元件是混合模式的原生写法,参数块里的dc、resistance分别对应直流值和阻值。物理器件的实例化关键字在不同版本示例里略有差异,有的直接写器件类型名,稳妥的做法是照安装目录下那份混合模式示例的结构抄,只改文件名和端口顺序。
端口顺序是最容易出错的地方:实例那行的(dint gate 0 0)必须和 Device 段里电极出现的顺序一一对应,节点0是全局地。顺序错一位,栅压会加到漏上,曲线看起来「能动」,但物理上毫无意义。
4.2 网表语法:注释、续行、单位后缀
混合模式支持直接引用 SPICE 网表,语法沿用通用 SPICE 约定。手册里专门列了这几条,因为每一条都对应过实际翻车。
* rc 负载示例,* 开头是注释 .include "models.sp" .param vdd=1.2 rload d vdd 1k cload d 0 1f星号开头整行是注释;行首加+表示续行;.include用于引入外部网表,路径相对运行目录;.param定义参数,后面可以引用表达式。
单位后缀是重点:f是 1e-15,p是 1e-12,n是 1e-9,u是 1e-6,m是 1e-3,k是 1e3,meg才是 1e6。写1m想要一兆欧,实际得到的是 1 毫欧,电路里等于短路,仿真能跑完但结果全错。这个坑几乎每个从 SPICE 转过来的人都踩过一次。
4.3 从单器件命令文件改成多器件:分段复用与命名约定
单器件命令文件里 File 段、Electrode 段、Physics 段、Solve 段是平铺的。改造成混合模式时,Physics、Electrode、File 要收进各自的 Device 段,Solve 段则交给整个系统求解。
实际改造我一般按这个顺序走:先把单器件命令文件备份一份,确认它单独能跑通并且曲线正确;再把 Electrode 和 Physics 分别包进Device "名字" { }里;最后在 System 段里加电源和物理器件实例。每一步都单独跑一次,曲线应当和单器件版本一致,直到加了电路元件之后才出现差异。
文件命名也有约定:混合模式下每个物理器件的输出会按器件名加后缀区分,日志里也会标出是哪个器件哪一步。这个约定在多器件电路里非常有用,出问题时能直接定位到是哪一个管子发散,而不是对着一整个系统的残差发呆。
注意:混合模式里如果某个节点只连了电容、没有直流通路,直流工作点求解会直接失败。手册在「节点初始化」那一节给的办法是先给节点一个初值,或者加一个大阻值电阻到地,让直流通路存在。
5. 准静态与瞬态的收敛排查:五类翻车现场逐条拆
5.1 准静态扫描:Goal、步长与 BreakCriteria 的配合
准静态扫描是 Id-Vg、Id-Vd 这类曲线的默认做法:把某个电极电压从当前值逐步推到目标值,每一步解一次耦合方程。写法看着简单,参数配合不好就会在半路断掉。
Solve { Poisson Coupled { Poisson Electron Hole } Quasistationary( InitialStep = 1e-3 MinStep = 1e-8 MaxStep = 0.05 Goal { Name="gate" Voltage=1.5 } BreakCriteria { Current(Contact="drain" AbsVal=1e-3) } Plot { Range=(0 0.7) Intervals=20 } ) { Coupled { Poisson Electron Hole } } }InitialStep是第一次尝试的电压增量,MaxStep是上限,MinStep是不再细分的最小步长。Goal指定推到哪个电极、推到多少伏。BreakCriteria是提前终止条件:漏电流超过 1 mA 就停,避免在强导通区浪费算力,也避免电流过大导致发散。
Plot块控制存点密度,Range=(0 0.7)表示在 0 到 0.7 V 区间内均匀存 20 个点。区间外的点按求解器自己的步长存,所以经常出现亚阈值区点很稀、线性区点很密的情况,画出来的曲线在拐弯处有明显折角。想要亚阈值区平滑,要么单独设一段 Range,要么把 MaxStep 压小。
5.2 瞬态:InitialStep、MaxStep 与输出文件
瞬态扫描的难点在时间步。开关瞬间电流变化率极大,初始步长给大了,第一步就发散;给得太小,跑到稳态要几个小时。
Transient( InitialTime = 0 FinalTime = 1e-8 InitialStep = 1e-13 MaxStep = 1e-11 MinStep = 1e-17 NewCurrentFile = "trans" ) { Coupled { Poisson Electron Hole } }InitialStep建议从特征时间的千分之一量级起步,MaxStep控制在特征时间的百分之一以内。NewCurrentFile让瞬态曲线单独输出到一个文件,不至于和前面的准静态数据混在一起,后处理时省很多事。
瞬态跑飞最常见的原因不是步长,而是电路里缺了限制电流的元件。物理器件直接接理想电压源,开关瞬间电流理论上无穷大,求解器只能不断压步长,压到 MinStep 就报错。加一个串联小电阻或者寄生电容,问题往往立刻消失。
5.3 五类翻车现场:现象、原因、解决
第一类:曲线在阈值附近突然断开。现象是 Id-Vg 在某一点之后没有数据点,日志最后一行提示步长过小。原因通常是 MaxStep 太大加上没有开外推,求解器在电流指数上升段一步跨太远。解决办法是把 MaxStep 压到 0.02 以下,在 Quasistationary 里加外推选项,同时确认亚阈值区有足够存点。
第二类:日志报不收敛,但曲线前半段是好的。现象是仿真跑到某个偏置后反复迭代最后退出,残差曲线在某个量级上打转。原因多半是网格:结附近或者高场区网格太粗,电场梯度算不准。解决办法是先看电场分布图定位热点,再对那块区域局部加密重跑,不要全局加密,否则算力吃不消。
第三类:低偏压电流比实测大一个数量级。现象是亚阈值区整体上移。原因可能是掺杂没有正确读入、激活率没设、或者带隙窄化模型开得过头。排查顺序是先看结构里的掺杂截面,再看日志里实际生效的模型清单,最后才怀疑参数值。
第四类:混合模式直流工作点解不出来。现象是第一步就失败,提示某个节点电压无解。原因是电路里存在悬空节点或者纯电容节点,直流下没有直流通路。解决办法是给节点加初值,或者并一个大阻值电阻到地,让直流通路成立。
第五类:改了参数文件但结果一点没变。现象是反复调参曲线纹丝不动。原因基本是两个:命令文件里没写 Parameter 指向自定义文件,或者参数条目写在了错误的作用域块里(比如把区域参数写进了材料块)。解决办法是在日志里搜参数加载记录,确认程序读的是哪个文件、哪些条目被覆盖。
6. 日志核验与网格加密:判断一次仿真能不能信的三个动作
曲线画出来好看不代表结果可信。我现在的习惯是每次出图之前强制走三个动作,这套流程是从一次返工里逼出来的:当时一组 Id-Vd 曲线怎么调都和实测差 15%,最后发现是漏极接触处网格太粗,电流被低估,白改了两周模型参数。
第一个动作是核对终端电流。日志里会逐步打印各电极的电流,把源、漏、衬底三者的电流加起来,量级上应当接近零。如果残差明显,说明求解没有真正收敛,曲线再平滑也不能用。
第二个动作是看电荷守恒。在Plot里加上电荷相关的量,扫描结束后检查栅电荷随栅压的变化是否单调。出现跳变或者回折,通常是某个偏置点求解失败后被跳过,曲线中间其实断了一截。
第三个动作是网格加密对比。把关键区域(结、沟道、界面)的网格加密一档重跑同一条扫描,两条曲线的偏差应当在小电流区小于一个可接受的比例。偏差大的区域就是网格敏感区,后续所有结论都要在那个区域加密后重做一遍。
import pandas as pd # .plt 是 ASCII 表格,跳过开头的元信息行后按列读取 df = pd.read_csv("n1_des.plt", sep=r"\s+", skiprows=1, engine="python") cols = [c for c in df.columns if "Voltage" in c or "Current" in c] print(df[cols].head()) # 检查相邻点电压增量是否均匀,突增说明中间有求解失败被跳过 dv = df["gate OuterVoltage"].diff().abs() print(dv.nlargest(5))这段脚本的作用不是画图,是查数据完整性:电压增量出现异常大值,说明中间有偏置点没解出来,曲线被「接」了过去。字段名随版本
本文还有配套的精品资源,点击获取