ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Silvaco TCAD实战:从示例库到SiC MOSFET自定义仿真全流程

Silvaco TCAD实战:从示例库到SiC MOSFET自定义仿真全流程 1. 从示例库切入DeckBuild实战的起点选择1.1 为什么我不建议一上来就手搓代码刚接触Silvaco TCAD那会儿我跟很多人一样觉得从零开始写一个仿真输入文件才叫“真本事”。结果折腾了两天连一个最基础的MOS结构都没跑通报错信息翻来覆去就是那几句查手册也查不出所以然。后来一位做器件仿真的前辈跟我说了句话我记到现在“DeckBuild的示例库不是给你抄的是给你改的。”这句话点醒了我。Silvaco的示例库examples目录里存放了大量经过验证的输入文件覆盖了从基础二极管、BJT到先进FinFET、SiC MOSFET等各种结构。这些文件不是随便写的每一个都经过了工艺校准和物理模型验证能跑通说明你的环境配置、求解器设置、材料参数至少在一个可用的基准线上。从示例库切入有三个实打实的好处。第一你能快速建立一个“能跑通”的参照系知道什么样的代码结构是合法的、什么样的参数范围是合理的。第二示例文件里往往包含了大量注释这些注释是原厂工程师留下的经验比任何教程都直接。第三当你后续自定义设计遇到收敛问题时可以随时回退到示例文件做对比排查快速定位是结构问题、模型问题还是数值问题。我现在的习惯是每接手一个新器件类型先花半小时把示例库里相关的deck全部浏览一遍挑一个最接近的作为起点然后在这个基础上做增量修改。这样做的好处是你始终有一个“已知能工作”的版本作为锚点不会在调试的海洋里迷失方向。1.2 示例库的结构与快速检索方法Silvaco的示例库通常安装在$SILVACO/examples目录下按器件类型和仿真类型分门别类。以Atlas仿真为例常见子目录包括atlas、atlas_examples、mixedmode等。每个子目录下又有更细的分类比如atlas下面会有diodes、mosfets、bipolar、optoelectronic等。快速检索的方法其实很简单但很多人不知道。在DeckBuild的交互界面里你可以直接用look命令查看示例文件的内容用copy命令把示例文件复制到你的工作目录。比如# 在DeckBuild命令行中执行 look $SILVACO/examples/atlas/mosfets/nmos_ex01.in copy $SILVACO/examples/atlas/mosfets/nmos_ex01.in my_nmos.in更高效的方式是结合系统命令做关键词搜索。比如你想找所有涉及SiC材料的示例grep -rl Silicon Carbide\|SiC\|4H-SiC $SILVACO/examples/atlas/ | head -20这个命令会列出所有包含SiC相关关键词的示例文件路径。找到目标文件后再用look命令查看具体内容。我通常会同时打开三四个相关示例对比它们在结构定义、模型选择、求解策略上的异同这样能快速建立起对某一类器件的仿真直觉。注意示例库中的文件路径可能因Silvaco版本和安装方式不同而有差异。如果你找不到$SILVACO环境变量可以在DeckBuild中用system echo $SILVACO命令确认实际安装路径。1.3 从示例到自定义的第一步理解Deck的文件结构一个标准的Atlas输入文件deck通常由以下几个部分组成顺序不能乱网格定义Mesh Definition用mesh、x.mesh、y.mesh等语句定义仿真区域的几何网格。区域定义Region Definition用region语句划分不同材料区域。电极定义Electrode Definition用electrode语句定义接触电极的位置和类型。掺杂定义Doping Definition用doping语句定义掺杂分布可以是均匀掺杂、高斯掺杂或来自文件。材料与模型定义Material Model Definition用material和models语句设定材料参数和物理模型。求解方法定义Method Definition用method语句设定数值求解方法。求解与输出Solve Output用solve语句执行具体仿真用save、log、extract等语句输出结果。理解这个结构之后你再看示例文件就不会觉得是一团乱麻了。每个部分各司其职修改的时候也清楚该动哪里。比如你想把硅基NMOS改成SiC MOSFET主要改的是材料定义、掺杂参数和模型选择网格和电极结构可以保留大部分。我个人的经验是在修改示例文件之前先复制一份原始文件作为备份然后在副本上操作。每次只改一个变量改完立刻跑一遍看结果。这样即使出错你也能明确知道是哪个改动导致的。很多人喜欢一次性改一大堆参数结果跑不通了根本不知道是哪个参数的问题只能全部回退重来效率极低。2. 自定义设计的核心从结构定义到模型选择2.1 网格划分的取舍精度与收敛的平衡网格划分是TCAD仿真中最容易被忽视、但又最影响结果质量和收敛性的环节。我见过太多人直接套用示例文件的网格结果要么仿真跑得极慢要么关键区域精度不够导致结果失真。网格划分的核心原则是在物理量变化剧烈的区域加密在变化平缓的区域稀疏。对于MOSFET来说沟道区域、结附近、栅氧化层下方是重点加密区域对于功率器件来说耗尽区边缘、碰撞电离发生区域需要加密。以SiC MOSFET为例一个典型的网格定义片段如下mesh space.mult1.0 x.mesh loc0.0 spac0.1 x.mesh loc2.0 spac0.01 x.mesh loc4.0 spac0.1 y.mesh loc0.0 spac0.005 y.mesh loc0.05 spac0.001 y.mesh loc0.5 spac0.05这里spac参数控制的是网格间距。space.mult是全局网格倍增因子一般设为1.0调试时可以临时调大以加快仿真速度。实操心得当你遇到“仿真发散”或“不收敛”的问题时第一个应该检查的就是网格。把关键区域的网格加密一倍很多时候问题就解决了。但要注意网格太密会导致矩阵规模急剧增大仿真时间可能从几分钟变成几小时。我的做法是先用粗网格跑通确认物理模型和结构没问题后再逐步加密网格做最终验证。另一个容易被忽视的点是网格的渐变率。相邻网格的尺寸比不要超过3:1否则数值误差会显著增大。Silvaco的网格生成器会自动处理这个问题但如果你手动定义网格一定要留意。2.2 材料参数与物理模型的选择逻辑Silvaco内置了丰富的材料数据库硅、锗、砷化镓、碳化硅、氮化镓等常见半导体材料都有默认参数。但默认参数不一定适合你的具体应用场景尤其是对于SiC这种多晶型材料4H-SiC和6H-SiC的参数差异很大。以4H-SiC为例关键材料参数包括参数典型值说明禁带宽度3.26 eV温度依赖性强电子迁移率900 cm²/V·s各向异性空穴迁移率120 cm²/V·s各向异性热导率4.9 W/cm·K远高于硅临界击穿场强3 MV/cm约硅的10倍在Atlas中你可以用material语句覆盖默认参数material material4H-SiC user.groupsemiconductor \ eg3003.26 affinity3.7 permittivity9.7 \ mun900 mup120物理模型的选择更需要谨慎。对于SiC MOSFET必须开启的模型包括场 dependent迁移率模型fldmob、SRH复合模型srh、以及碰撞电离模型impact。如果要做击穿分析还需要开启selb自洽击穿模型。models srh fldmob impact selb print注意模型不是开得越多越好。每多开一个模型方程组的非线性程度就增加一分收敛难度也随之上升。我的原则是只开当前分析必需的模型。做输出特性分析时碰撞电离模型可以不开做击穿分析时再把它加上。2.3 掺杂分布的设定技巧掺杂分布直接影响器件的电学特性是自定义设计中最需要仔细调整的部分。Silvaco支持多种掺杂定义方式均匀掺杂doping uniform conc1e17 n.type高斯掺杂doping gauss conc1e20 peak0.05 char0.02 n.type误差函数掺杂doping erfc conc1e20 peak0.0 char0.05 n.type来自文件doping fileprofile.txt对于离子注入形成的掺杂分布高斯分布是最常用的近似。peak参数指定峰值位置char参数指定特征长度与注入能量和离子种类相关。如果你有实际的SIMS二次离子质谱数据用doping file方式导入是最准确的。# 典型的源漏注入掺杂定义 doping gauss conc5e19 peak0.05 char0.02 n.type doping gauss conc1e20 peak0.0 char0.01 n.type实操心得掺杂浓度不要设得过于极端。我见过有人把源漏掺杂设到1e22结果仿真直接发散。实际上半导体中掺杂浓度的物理上限大约在1e21左右超过这个值杂质能级会展宽成杂质带简单的掺杂模型就不再适用了。一般源漏掺杂设在1e19到1e20之间就足够了。另外掺杂分布的梯度也很重要。如果掺杂浓度在很小的距离内变化了几个数量级网格必须足够密才能准确解析。这也是为什么结附近需要加密网格的原因。3. 完整实操流程从零搭建一个SiC MOSFET仿真3.1 环境准备与文件组织在开始之前先确认你的Silvaco环境已经正确安装。在DeckBuild中执行system echo $SILVACO system ls $SILVACO/examples/atlas/如果能看到示例目录列表说明环境没问题。接下来建立自己的工作目录system mkdir -p ~/silvaco_work/sic_mosfet cd ~/silvaco_work/sic_mosfet我习惯把每个项目单独放在一个目录下目录名用器件类型命名方便后续查找。在项目目录下我会再建几个子目录decks存放输入文件results存放仿真结果logs存放运行日志。这样文件不会乱后续做参数扫描时也容易管理。3.2 从示例文件出发复制与初步修改找到最接近的示例文件。对于SiC MOSFET可以先用硅基MOSFET示例作为起点copy $SILVACO/examples/atlas/mosfets/nmos_ex01.in sic_mosfet_v1.in用编辑器打开sic_mosfet_v1.in开始逐步修改。第一步改材料定义把硅改成4H-SiC# 原文件中的硅材料定义 # material materialSilicon # 修改为4H-SiC material material4H-SiC user.groupsemiconductor \ eg3003.26 affinity3.7 permittivity9.7 \ mun900 mup120 nc3001.7e19 nv3002.5e19第二步改掺杂参数。SiC的掺杂激活率远低于硅室温下大部分杂质未电离。在Atlas中可以通过doping语句的activate参数来模拟这一效应或者直接使用较低的激活浓度# 源漏区域掺杂考虑不完全激活 doping gauss conc1e20 peak0.05 char0.02 n.type activate0.3第三步改模型定义。SiC MOSFET需要开启不完全电离模型incompletemodels srh fldmob incomplete print3.3 网格与结构参数的调整SiC的临界击穿场强是硅的10倍这意味着在相同耐压下SiC器件的漂移区可以做得更薄、掺杂更高。但这也意味着电场分布更加集中网格需要更密。# 调整网格定义 mesh space.mult1.0 x.mesh loc0.0 spac0.05 x.mesh loc1.0 spac0.005 x.mesh loc3.0 spac0.05 y.mesh loc0.0 spac0.002 y.mesh loc0.1 spac0.0005 y.mesh loc1.0 spac0.02 y.mesh loc5.0 spac0.1这里我把栅氧化层附近y0到0.1微米的网格间距设到了0.5纳米因为SiC MOSFET的栅氧化层通常很薄约50纳米需要足够密的网格来解析隧穿效应。注意网格加密后仿真时间会显著增加。如果只是做初步验证可以先用较粗的网格跑通确认结构和模型没问题后再加密网格做最终仿真。我通常会用两套网格一套粗网格用于快速迭代一套细网格用于最终结果输出。3.4 求解策略与收敛调试SiC MOSFET的仿真收敛难度比硅器件大得多主要原因是非线性程度更高。求解策略的调整至关重要method newton trap maxtrap10 solve init solve vgate0.0 solve vgate1.0 solve vgate2.0 solve vgate3.0这里用了newton和trap混合方法。newton方法收敛快但稳定性差trap方法稳定性好但收敛慢。混合使用可以兼顾两者。maxtrap10限制最大陷阱步数防止在某个电压点卡死。如果遇到不收敛可以尝试以下策略减小电压步长把solve vgate1.0改成solve vgate0.5分两步走。切换求解方法从newton换成gummel或者用block方法。增加迭代次数用method itlimit50增加最大迭代次数。使用ramp语句solve vgate0.0 vstep0.1 vfinal5.0 namegate让求解器自动控制步长。# 更稳健的求解策略 method newton trap maxtrap10 itlimit50 solve init solve vgate0.0 solve vgate0.5 solve vgate1.0 solve vgate1.5 solve vgate2.0实操心得仿真发散时不要急着改模型或结构。先检查是不是电压步长太大了。我遇到过很多次把步长减半问题就解决了。另外solve init这一步很重要它先求解平衡态给后续的偏压求解提供一个好的初始猜测。如果solve init都不收敛那说明结构或掺杂定义有问题需要回头检查。3.5 结果提取与可视化仿真跑通后用TonyPlot查看结果save outfsic_mosfet_v1.str tonyplot sic_mosfet_v1.str在DeckBuild中可以用extract语句提取关键参数extract nameVth x.val from curve(vgate, id) where y.val1e-6 extract nameGm max(curve(vgate, gd)) extract nameIon max(curve(vgate, id))这些提取出来的参数可以直接用于后续的优化和对比。我习惯把每次仿真的关键参数记录在一个表格里方便追踪不同设计版本之间的差异。版本Vth (V)Ion (A/μm)Gm (S/μm)备注v12.11.2e-43.5e-5初始版本v21.81.5e-44.2e-5调整沟道掺杂v32.31.1e-43.1e-5增加漂移区厚度4. 常见问题与排查技巧实录4.1 仿真发散从表象到根因的排查路径仿真发散是TCAD用户遇到最多的问题没有之一。发散的表现形式有很多种求解器报错退出、结果出现非物理的负值、电流电压曲线出现剧烈振荡等。排查发散问题我总结了一个“从外到内”的排查路径第一步检查网格。网格太粗或渐变率太大是最常见的发散原因。把关键区域的网格加密或者用mesh space.mult0.5全局加密试试。第二步检查掺杂。掺杂浓度是否超过了物理合理范围掺杂梯度是否太陡把掺杂浓度降低一个数量级试试。第三步检查模型。是否开启了不必要的模型模型参数是否合理尝试只保留最基本的srh模型看是否能收敛。第四步检查求解策略。电压步长是否太大求解方法是否适合当前问题尝试用method gummel替代method newton。第五步检查结构。电极是否接触到了正确的区域材料界面是否定义清楚用TonyPlot查看结构图确认几何没有问题。实操心得我习惯在deck中加一句output con.band val.band把能带信息输出到日志里。当仿真发散时查看日志中最后几步的能带值如果出现了异常大的值比如超过禁带宽度几个数量级说明数值已经失控需要回退到更小的电压步长。4.2 收敛速度慢性能优化的几个实用手段仿真能跑通但速度太慢是另一个让人头疼的问题。一个SiC MOSFET的击穿仿真如果网格设置不当跑一整天都有可能。以下是我常用的几个加速手段手段一合理使用space.mult。在调试阶段把space.mult设为2.0甚至3.0网格数量会减少到原来的1/4到1/9仿真速度大幅提升。确认没问题后再改回1.0做最终仿真。手段二分步求解。不要一次性把电压加到目标值而是分多个步骤逐步加。每一步的结果作为下一步的初始猜测收敛会快很多。手段三使用autostep。Atlas的autostep功能可以自动调整电压步长在容易收敛的区域用大步长在难收敛的区域用小步长。method newton trap autostep solve vgate0.0 vstep0.1 vfinal5.0 namegate手段四并行计算。如果你的机器有多核可以在启动Atlas时指定线程数system atlas -mt 4 sic_mosfet_v1.in注意并行计算的效果取决于问题的规模和矩阵求解器的效率。对于小规模问题并行反而可能因为通信开销而变慢。一般来说网格节点数超过10万时并行加速效果才比较明显。4.3 结果异常如何判断仿真结果是否可信仿真跑通了结果也出来了但结果可信吗这是比收敛更高级的问题。我判断结果可信度的方法主要有三个方法一物理合理性检查。电流密度是否超过了材料的理论极限电场强度是否超过了击穿场强载流子浓度是否超过了掺杂浓度如果出现明显违反物理规律的结果说明仿真有问题。方法二网格收敛性验证。把网格加密一倍重新跑一遍。如果结果变化在5%以内说明网格已经收敛结果可信。如果变化很大说明网格还不够密。方法三与解析模型对比。对于简单结构可以用解析公式估算关键参数与仿真结果对比。比如MOSFET的阈值电压可以用Vth Vfb 2φf Qdep/Cox估算。如果仿真结果与解析估算相差太远需要检查模型和参数设置。# 提取阈值电压并与解析估算对比 extract nameVth_sim x.val from curve(vgate, id) where y.val1e-6 # 解析估算Vth_analytical ...实操心得我习惯在仿真日志中记录每次运行的关键参数和结果建立一个“仿真档案”。当后续遇到类似问题时可以快速查阅之前的记录看看当时是怎么解决的。这个习惯帮我节省了大量重复排查的时间。4.4 常见问题速查表问题现象可能原因排查方法解决方案仿真立即报错退出语法错误或文件路径错误检查日志第一行报错信息修正语法确认文件路径solve init不收敛结构或掺杂定义有误用TonyPlot查看结构检查电极位置和掺杂区域偏压扫描中途发散电压步长太大或模型太复杂查看发散前最后一步的日志减小步长简化模型电流出现负值网格太粗或掺杂梯度太陡加密网格重新仿真加密关键区域网格仿真速度极慢网格太密或模型太多检查网格节点数和模型列表粗网格调试精简模型结果与预期不符材料参数或模型参数有误与解析模型对比校准材料参数检查模型5. 从单次仿真到参数化设计进阶思路5.1 用循环实现参数扫描单次仿真只能得到一个设计点的结果实际工程中往往需要扫描多个参数。DeckBuild支持用loop语句实现参数扫描loop steps5 assign namevdrain n.value0.1*$loop solve vdrain$vdrain save outfsic_mosfet_vd_$loop.str l.end这个循环会扫描5个漏极电压值每次保存一个结果文件。后续可以用TonyPlot批量加载这些文件对比不同偏压下的特性。更复杂的扫描可以用嵌套循环实现比如同时扫描栅压和漏压loop steps5 assign namevgate n.value1.0*$loop loop steps5 assign namevdrain n.value0.5*$loop solve vgate$vgate vdrain$vdrain save outfsic_mosfet_vg${vgate}_vd${vdrain}.str l.end l.end注意嵌套循环的仿真时间会成倍增加。5×5的扫描就是25次仿真如果每次仿真需要10分钟总共就是4个多小时。建议先用粗网格做快速扫描找到感兴趣的区域后再用细网格做精细扫描。5.2 结果数据的批量处理仿真产生的数据文件多了之后手动处理效率很低。我通常用Python脚本批量提取关键参数import os import re def extract_params(log_file): with open(log_file, r) as f: content f.read() vth re.search(rVth\s*\s*([\d.e-]), content) ion re.search(rIon\s*\s*([\d.e-]), content) return { Vth: float(vth.group(1)) if vth else None, Ion: float(ion.group(1)) if ion else None } results [] for f in os.listdir(logs): if f.endswith(.log): params extract_params(os.path.join(logs, f)) params[file] f results.append(params) for r in results: print(f{r[file]}: Vth{r[Vth]}, Ion{r[Ion]})这个脚本会遍历logs目录下的所有日志文件提取阈值电压和开态电流并打印出来。你可以根据需要扩展这个脚本加入更多的参数提取和数据分析功能。5.3 设计优化的迭代流程参数扫描的最终目的是优化设计。一个典型的优化流程是定义目标比如“在击穿电压不低于1200V的前提下导通电阻尽可能小”。确定变量比如漂移区掺杂浓度、漂移区厚度、沟道长度。扫描范围根据物理直觉和文献数据确定每个变量的合理范围。执行扫描用DeckBuild的循环功能批量仿真。分析结果用Python或Excel分析数据找出最优设计点。验证优化对最优设计点做精细仿真确认性能达标。这个流程可能需要迭代多次每次根据上一轮的结果缩小扫描范围逐步逼近最优解。实操心得优化过程中不要只盯着一个目标参数。比如你在优化导通电阻时也要关注击穿电压和阈值电压的变化。很多时候导通电阻的降低是以击穿电压的下降为代价的。我习惯在扫描时同时记录多个参数用多目标优化的思路来权衡。6. 一些踩过的坑和最后的建议6.1 版本兼容性问题Silvaco的不同版本之间deck的语法和模型参数可能会有细微差异。我遇到过好几次在旧版本上跑得好好的deck换到新版本就报错。最典型的是模型名称的变化比如某些版本中fldmob改成了fldmob.param或者某些材料参数的默认值发生了变化。我的建议是在deck开头加一行注释记录这个deck是在哪个版本上验证过的。换版本时先用示例库中的对应文件做一次基准测试确认新版本的行为没有大的变化再迁移自己的deck。# Deck verified on Silvaco Atlas 5.28.1.R # Last modified: 2024-01-156.2 日志文件的重要性很多人跑完仿真只看结果图不看日志文件。这是一个坏习惯。日志文件中包含了大量的诊断信息每一步的收敛情况、迭代次数、残差大小、警告信息等。当仿真出现问题时日志文件是第一手排查资料。我习惯在deck中把日志输出级别调到最高output verbose这样日志中会记录每一步的详细信息。虽然日志文件会变大但排查问题时非常有用。仿真跑通后可以把日志级别调回正常减少文件大小。6.3 保持deck的可读性最后说一个容易被忽视但很重要的点deck的可读性。很多人写deck时喜欢把所有语句堆在一起不加注释不留空行。过了一个月再回头看自己都看不懂了。我的做法是每个功能块之间加空行关键参数加注释说明为什么选这个值deck开头写一个简短的说明记录这个deck的用途、作者、日期和版本。# # SiC MOSFET Output Characteristics Simulation # Author: [your name] # Date: 2024-01-15 # Version: 1.0 # Description: Simulates Id-Vg and Id-Vd curves # for a 1200V 4H-SiC MOSFET # # --- Mesh Definition --- mesh space.mult1.0 ...这些习惯看起来不起眼但长期来看能帮你节省大量时间。尤其是当你需要回顾几个月前的仿真时一份清晰、有注释的deck能让你快速回忆起当时的思路和参数选择的理由。仿真这件事说到底是一个不断迭代、不断逼近的过程。没有一次就能完美的deck也没有永远不出问题的仿真。重要的是建立一套自己的排查方法和记录习惯让每次踩坑都变成经验积累。我到现在还会遇到新的收敛问题但有了这套方法排查起来心里有底不会慌。
返回列表