
上周我把一个平面型功率二极管的Silvaco仿真结果和实测数据摆在一起反向击穿电压整整差了四十多伏。我一开始以为是雪崩模型参数没选对srh、auger、impact selb换了又换收敛曲线倒是挺漂亮击穿电压纹丝不动。最后实在没辙打开tonyplot把网格显示勾上才终于看明白问题冶金结附近的网格线间距拉得太大峰值电场被数值插值直接“抹平”雪崩击穿自然被推迟到了更高的电压。那次之后我做Silvaco二极管仿真网格优化时第一件事永远是想清楚哪里该密、哪里该稀而不是急着把x.mesh、y.mesh铺满整个结构。这篇就专门聊聊二极管仿真网格的参数设置思路和实操技巧适合刚接触Silvaco TCAD的学生也适合正在调器件结构、总感觉仿真结果“差口气”的工程师。1. 网格密度决定仿真精度的底层逻辑欠密区域怎么毁掉击穿电压1.1 一次反向击穿电压差40V的排查问题不在模型在网格先说我那个十微米宽、结深零点五微米的平面功率二极管。器件结构很简单P阳极区、N-漂移区、N衬底掺杂分布也是教科书级别的。按理说这种结构在Silvaco里跑击穿电压不应该出问题但结果就是和实测对不上。排查过程一开始完全是朝着错误方向走的。我怀疑是不是雪崩模型参数里某个系数设得不对于是把models语句里的impact selb参数来回调毫无变化又怀疑网格是不是太密导致收敛到伪解试着整体粗化了一倍网格结果击穿电压反而更离谱。直到某次我随手把网格显示打开才注意到一个问题在结深0.5微米附近y方向网格间距只有0.05微米左右而耗尽区在这个位置的电场梯度变化极其剧烈整个空间电荷区里满打满算只有三层网格。三层网格是什么概念在Silvaco的有限体积法框架下电场和载流子浓度都是通过网格节点之间的插值来逼近的。网格太少相当于用两点连直线去描述一条指数衰减曲线峰值被平均掉、陡峭被抹平。雪崩击穿依赖的是峰值电场和碰撞电离率的空间积分峰值一旦被歪曲击穿电压自然跑偏。后来我把冶金结附近的网格间距从0.05微米一步步压到0.002微米击穿电压从虚高的182V回落到实测的141V附近误差直接缩到3%以内。这给我留下的印象太深了——二极管仿真里网格永远不是背景板它本身就是计算精度的一部分。1.2 有限体积法对网格的一般要求物理量梯度决定网格步长Silvaco ATLAS求解的是泊松方程加上电子、空穴连续性方程这组偏微分方程组。数值方法上它先把连续的器件区域离散成一个个四边形网格单元然后把偏微分方程在每个网格节点附近转成代数方程再用Newton迭代或Gummel迭代来求解。这套方法的精度上限并不取决于你的物理模型有多高级而取决于你给求解器提供的物理量分辨率。说白了网格就是仿真世界的“像素”物理量在网格节点之间有值但在网格内部是不知道的。求解器默认用线性插值去近似网格点之间的物理量分布如果某个区域里电场或载流子浓度变化剧烈而网格太少插值出来的结果一定会失真。我习惯拿拍照做类比同一个场景一千像素和五千万像素拍出来的细节完全不是一个层级。PN结耗尽区里空间电荷密度、电场强度、载流子浓度在亚微米尺度内可能变化好几个数量级你就是把整个器件的网格都加密到0.1微米如果结区那几层网格不够密结果照样是糊的。更关键的一点是Silvaco的网格间距需要远小于物理量发生显著变化的特征长度。对二极管来说这个特征长度由掺杂浓度梯度和耗尽区宽度共同决定实际中往往是几十纳米到几百纳米的量级。很多初学者按照“整个结构撒一遍1微米网格”的思路去做反向特性勉强能看但正向压降、击穿电压这些对梯度敏感的参数就会明显失真。1.3 二极管里需要重点加密的三类区域既然网格分辨率不是均匀撒的那就要搞清楚二极管仿真中哪几个区域才是决定精度的“关键战场”。以我做过的高压整流二极管、PiN二极管、TVS结构为例下面这几个位置是网格优化时必须优先照顾的。第一冶金结和它两侧的耗尽区。这里是空间电荷密度和电场梯度最大的地方也是雪崩击穿的发生地。雪崩击穿电压对峰值电场的依赖是非线性的网格哪怕只是把峰值拉低百分之几击穿电压都可能偏差十几伏。所以冶金结附近必须用最密的网格且结两侧都要加密不只是结线本身那一个位置。第二阳极和阴极接触面附近的重掺杂浓度过渡区。这个区域载流子复合率、注入效率都很高直接决定正向压降和接触电阻的仿真精度。虽然这里的网格不需要像结区那样夸张但如果完全放任不管正向IV曲线的低压段会出现明显的非线性畸变。第三反偏时耗尽区可能扩展到的边界位置。对高压功率二极管来说反偏电压升高时耗尽区会向低掺杂漂移区深处不断扩展。很多人以为只要结区加密就够了结果耗尽区边缘跑到稀疏网格区电场峰值在数值上被“截断”击穿点位置也跟着漂移。网格控制线必须提前铺到耗尽区可能到达的范围而不是只围着自己的舒适区转。2. Silvaco网格构建参数逐个拆解从space.mult到ratio2.1 最小的网格框架x.mesh和y.mesh到底在做什么Silvaco ATLAS里构建网格的核心语句就是x.mesh和y.mesh两条。很多人第一次接触时会以为写一个y.mesh就够因为二极管结构看起来是“一维”的——掺杂只沿深度方向变化。但实际上Silvaco的数值求解器要求网格必须是完整的二维四边形网格哪怕x方向只有两个位置你也得把x方向的两条网格线写出来。少了x方向deckbuild会直接报错连求解都进不去。先看一个最小可运行的网格框架go atlas mesh space.mult1.0 x.mesh location0 spacing0.5 x.mesh location10 spacing0.5 y.mesh location0 spacing0.05 y.mesh location0.5 spacing0.002 ratio1.2 y.mesh location2.0 spacing0.05 ratio1.4 y.mesh location6.5 spacing0.3这个例子里x方向在0和10微米各放一条网格线间距0.5微米表示器件宽度10微米y方向从表面0微米开始到6.5微米结束中间在0.5微米处用0.002微米的间距加密。location是网格线的绝对位置spacing是该位置附近的网格间距ratio则是从这条网格线向外延伸时网格间距的放大倍数。需要理解的一点是x.mesh和y.mesh并不是“画格子”而是定义每一根网格线的位置和该处的局部间距。求解器拿到这些控制点之后会自动在相邻网格线之间生成过渡网格最终的网格疏密分布就是由这些控制点的spacing和ratio共同决定的。2.2 spacing、location、ratio的关系与配合写法这三个参数里spacing是局部精度的直接控制旋钮location是加密位置的锚点ratio是控制网格从密到疏过渡方式的“坡度”。举个例子在0.5微米处的冶金结上我设置spacing0.002微米ratio1.15。那么离开这条网格线后下一层网格间距大概就是0.002乘以1.15等于0.0023微米再下一层是0.00264微米以此类推按等比数列逐步放大。大约十几层之后间距就能从0.002微米平滑过渡到亚微米量级而不至于在某一个位置突然跳变。这里有一个经验区间值得强调ratio一般取1.1到1.5比较稳妥。比例太大会导致网格间距增长过快过渡区域出现“断层”数值上容易产生非物理的震荡比例太小则网格要经过很多层才能变疏白白浪费大量网格点求解变慢。我自己的习惯是在结区附近用1.1到1.2在离开敏感区后的过渡带用1.3到1.5。还有一个容易忽略的细节location可以配合注释在code里标注“这一条是结区边界”“这一条是空间电荷区扩展边界”后来回头调试时能省不少时间。TCAD仿真一旦搞起来deck文件里网格语句可能十几条没有标注简直是灾难。2.3 一维PN结也要写完整的二维网格框架刚才说过Silvaco不允许只有一维网格存在。很多初学者第一次写二极管仿真下意识只在y方向写了密密麻麻的网格线x方向一个location都没有结果跑起来直接报“missing mesh line in x direction”一类的错误。正确的做法是哪怕你做的确实是深度方向的一维PN结x方向也要定义至少两条网格线间距随意但别太小。x方向两条网格线之间的区域Silvaco会把它当成一个在x方向无限延展的平板结构来算物理上就是平行于表面的二极管家底这完全没问题。但如果你仿真的是带结终端保护环、场限环、或者台面刻蚀结构的功率二极管情况就不一样了。这类器件的电场分布是真正的二维分布终端区域在x方向上有明显变化这时x方向的网格也要像y方向一样认真控制。尤其是在保护环和主结之间的区域电场线弯曲得很厉害x方向网格不能放得太粗否则终端击穿电压就是仿给鬼看的。3. 二极管网格参数配置实操一套可直接套用的结构方案3.1 典型PN功率二极管结构参数与网格控制线布局理论扯了这么多直接上一套我能复现的实操配置。下面这个例子是常见的高压PN二极管结构P阳极区0.5微米峰值掺杂1e19每立方厘米N-漂移区5微米掺杂1e15每立方厘米N衬底区1微米掺杂1e18每立方厘米x方向宽度10微米。网格控制线的布局逻辑是这样的表面接触区和中段漂移区用宽松间距冶金结两侧用最密的网格离开结区后按比例逐步放大衬底与漂移区界面再补一层加密。完整的网格定义段如下# 全局网格间距乘数0.8表示整体加密20% mesh space.mult0.8 x.mesh location0 spacing0.5 x.mesh location10 spacing0.5 # y方向表面接触区 y.mesh location0 spacing0.02 # 结区上侧渐变加密0.45微米处开始 y.mesh location0.45 spacing0.002 ratio1.15 # 冶金结精确位置0.5微米最密网格 y.mesh location0.5 spacing0.001 ratio1.1 # 结区下侧渐疏0.6微米处开始 y.mesh location0.6 spacing0.005 ratio1.2 # 空间电荷区内部 y.mesh location1.2 spacing0.02 ratio1.35 # 漂移区中段 y.mesh location2.5 spacing0.08 ratio1.4 # 衬底界面附近 y.mesh location5.9 spacing0.2 ratio1.5 y.mesh location6.5 spacing0.1为什么要在0.45微米和0.6微米各放一条控制线而不是只在0.5微米放一条因为PN结两侧的电场分布都不均匀单靠结线上一个密点向上和向下的网格过渡会太快达不到需要的分辨率。两条控制线相当于在结区两侧各建了一个“加密缓冲区”让网格间距从最密值平滑地爬升到正常水平。这套网格跑下来整个结构大约会产生数千个网格点。对于做几微米到几十微米深度的二极管完全够用单次击穿求解在桌面工作站上也就是几十秒的事。3.2 从工艺仿真导入网格后的补刀REFINEBOX局域加密很多二极管仿真并不是在ATLAS里直接搭结构而是先用ATHENA跑完全部工艺步骤再通过结构文件导到ATLAS做电学仿真。工艺仿真的网格会根据氧化、扩散、注入这些步骤自动调整但它的网格分布是以“工艺热历史”为核心逻辑的和电学仿真的需求不完全一致。这时候REFINEBOX语句就能派上用场。它允许你在指定的矩形区域内重新按步长生成网格非常适合在导入网格之后做定点补密。比如上面那个结构如果导入后发现结区网格还是不够密可以在ATLAS里追加一条refinebox x.min0 x.max10 y.min0 y.max0.65 x.step0.5 y.step0.002这条语句的含义是在x方向0到10微米、y方向0到0.65微米的盒形区域内x方向步长0.5微米y方向步长0.002微米重新生成网格。它不会动区域外已有的网格因此非常适合“局部打补丁”。使用时唯一要注意的是step不要一上来就给太小。0.002微米在0.65微米深度内意味着三百多层网格如果区域还很大网格点数量会瞬间爆炸求解时间直接从秒级跳到小时级。我一般先把step给到预估值的两三倍在tonyplot里看效果不够再逐步收紧。3.3 用space.mult做多档扫描快速找敏感区域space.mult是网格定义段开头那个全局参数作用是整体缩放所有网格间距。space.mult小于1时网格变密大于1时网格变粗等于1时保持原位。这个参数是网格优化过程中性价比最高的工具没有之一。当你在扫描不同的掺杂浓度、漂移区厚度、结深时不需要为每个候选结构手工调整十几条y.mesh语句只要把space.mult从1.0换成0.7或者0.5就能在保持网格分布形态的前提下整体加密。我自己的操作习惯是先以space.mult1.0粗扫一批候选结构选出两三个性能指标接近目标的结构再用space.mult0.7和0.5分别精算对比击穿电压、正向导通压降等关键参数的变化趋势。如果0.7和0.5的结果相差很小说明网格密度已经够用了如果差距还很大那就要回到单个结构的网格布局上做定点加密而不是继续依赖全局参数。4. 网格收敛性测试与自适应网格怎么判断网格真的够了4.1 Grid Test的标准流程三组密度、两个指标、一次结论网格优化的最终目的是在误差可接受的前提下尽量少耗时。怎么判断误差可接受唯一靠谱的办法就是做网格收敛性测试也就是社区里常说的Grid Test。标准操作分三步。第一步保持器件结构和物理模型完全不变用同样的space.mult跑三组仿真推荐1.0、0.7、0.5。第二步记录每个方案下的关键电学指标对二极管来说主要看反向击穿电压和正向导通的压降也可以加一个零偏结电容作为辅助参考。第三步比较后两组结果。如果space.mult0.7和0.5之间的指标差异小于1%就认为网格已经收敛space.mult0.7那一档可以直接作为最终配置。我拿一次实际的扫参记录举个例子具体数值因器件而异但趋势判断方法是通用的网格方案space.mult网格点数反向击穿电压正向导通压降单点求解时间方案A1.0约2600158.3V0.67V约30s方案B0.7约5200162.6V0.64V约2min方案C0.5约10200163.1V0.63V约9min方案B和方案C的击穿电压只差0.3%正向压降差约1.5%这时就可以判断网格已经进入收敛平台方案B足以作为精度可靠的配置。如果方案A到方案B的变化很大而方案B到方案C又收敛了说明默认网格确实不够解决方案就是B档。4.2 自适应网格MGOALS的正确打开方式与适用边界Silvaco还提供了一类自适应网格手段核心是METHOD语句里加ADAPT参数再用MGOALS语句定义误差目标。典型写法如下method adapt newton mgoals n.points8000 curr.error1e-3它的工作逻辑是在迭代求解过程中不断评估局部物理量的误差如果发现某个区域误差超出MGOALS设定的目标就自动插入新的网格点然后再接着往收敛方向求解。从概念上讲这东西很“智能”等于让求解器自己决定哪里该加密。但我的实际体验是自适应网格在二极管仿真里不能无脑用。它适合的场景是做单点精修比如已经用手动网格跑通了一个器件想看某个偏置点附近峰值电场到底是多少可以用adaptive模式局部细化验证。它不适合的场景是全偏置IV扫描因为每个偏置点都可能触发不同的自适应细化网格点数量和分布随偏置改变最终IV曲线会出现不少细小的台阶反而不利于结果分析。另外自适应网格会显著放大求解时间。MGOALS里的n.points设得太大求解器会为了满足误差目标而疯狂加网格点有时候一个偏置点的收敛要等十分钟还不如静下心来把手动网格的关键位置调好。我的建议是手动网格永远是主力MGOALS只是补充校验手段。4.3 网格点数、迭代次数与求解时间的实际账本很多人对网格数量和求解时间之间的关系没有概念以为网格多了就是慢一点而已。实际上对于ATLAS这类求解非线性偏微分方程组的程序网格点数N和求解时间不是线性关系而是接近O(N^1.5)到O(N^2)的指数放大。原因并不复杂。Newton迭代过程中每个迭代步都要组装和求解一个规模与网格点数相关的Jacobian矩阵矩阵规模大了单次求解的时间会超线性增长。与此同时网格多了之后求解器为了保持数值稳定性往往需要更多迭代步数才能收敛。两个因素叠加在一起就会出现“网格翻一倍时间翻五倍”的情况。所以网格优化的本质不是无限加密而是把有限的网格预算投放到物理量梯度最剧烈的地方。同样是一万个网格点匀着撒满整个器件和集中在结区加耗尽区边缘计算出来的击穿电压可能差出百分之十几。这也是我反复强调要手工布置网格控制线、而不是依赖全局加密的原因。5. 我被Silvaco网格坑过的几件事与最终建议5.1 网格线与冶金结错位掺杂分布出现锯齿这是我最开始玩Silvaco时踩过的一个隐蔽坑。结构定义里我把P区和N-区的region边界设在了y0.5微米掺杂语句也对应做了定义但y.mesh网格线的控制点却放在了0.45和0.55微米没有一条正好落在0.5微米上。结果就是冶金结这个掺杂突变面没有和网格线对齐而是斜穿了一排网格单元。在数值模型里掺杂分布被离散成了跨网格的插值结面变成了一个“锯齿状”的过渡带。仿出来的电场分布曲线在结附近出现周期性抖动击穿特性的平滑度很不对劲。解决办法说穿了很简单网格控制线的location必须和region边界、掺杂突变面的位置严格对齐。建议在搭结构时先把region用变量或注释标清楚再回头写y.mesh确保结面处一定有一条网格线。凡是涉及材料界面、掺杂突变、电极接触边界网格线都必须老老实实落在边界上这是Silvaco网格优化的第一纪律。5.2 反向耗尽区扩展到稀疏网格区击穿点漂移另一个坑出现在做高压二极管的时候。结构是P阳极然后是低掺杂的N-漂移区再往下是N阴极。我一开始按照经验只在结区附近加密了网格N-漂移区中段和靠近N界面的地方网格都放得很粗。仿真时发现一个很奇怪的现象反向击穿位置不在PN结附近反而出现在了N区深处而且离N衬底界面越近越严重。后来把耗尽区宽度一算才明白这个二极管在接近击穿电压时耗尽区已经扩展到了漂移区中后段而那一带的网格间距大概有0.08微米电场梯度完全无法被准确分辨峰值被强行拉到了网格相对密一点的衬底边界。从那以后我做高压二极管网格布局时第一件先做的事情就是估算反偏条件下耗尽区的最大扩展范围然后在该范围内部署数条渐变的网格控制线。哪怕估算结果有点偏差也要在可能结东的区域留下几层中等密度的网格作为缓冲。对低掺杂漂移区100V附近的反偏耗尽区可能扩展到十几微米网格控制线必须跟着铺过去而不是只围着结区打转。5.3 判断网格方案是否合理的三板斧说了这么多踩坑经历最后总结三个我每次做完网格都过一遍的检查习惯。第一板斧在tonyplot里把网格显示打开和掺杂分布曲线叠在一起看。重点网格加密区是否覆盖了掺杂梯度大的区域、结面是否被网格线“骑”过、有没有明显的网格间距跳变。第二板斧把电场分布和碰撞电离率分布画出来看峰值位置是否落在加密区内部。如果电场峰值落在网格稀疏区那不管IV曲线收敛成什么样结论都不可信。第三板斧也是最快的验证方法跑两组不同space.mult的关键指标对比。如果1.0和0.7的结果差异巨大那没有任何理由相信1.0的结果是对的如果0.7和0.5差异很小则说明网格深度已经够用。这三步走完一版网格方案基本就能让人放心了。前阵子一个朋友问我Silvaco和另一款TCAD工具哪个好。我回他说工具都有各自的优势但不管你用哪款网格问题都是绕不过去的换工具解决不了网格没布置好的问题。就说Silvaco的二极管仿真网格参数设置看着不起眼实际却是决定结果可信度的那根定海神针。把结区加密、把耗尽区边界铺满、用space.mult做收敛测试这套方法论用熟之后你会发现自己对TCAD仿真的理解又深了一层。