
说实话我第一次在 Sentaurus 的 examples 目录里翻到 FinFET 工艺建模例程时差点被脚本开头那几十行line语句劝退。当时我已经能跑通简单的平面 MOS 工艺仿真觉得不就是换个结构嘛结果一上手才发现FinFET 的难点根本不在多画一个鳍而在于整个仿真思路都被尺度改变了。这篇笔记是我自己那轮学习过程的复盘把我踩过的坑、后来想明白的机制、以及从例程里真正学到的工艺建模方法论都整理出来。适合刚把平面器件跑熟、准备往三维器件走的人也适合那些已经能跑通例程、但总觉得我只是在敲命令行的初学者。我尽量不写那种照着命令敲一遍就能出图的流水账而是把每段脚本为什么要这样写、背后对应真实工艺里的哪一步、改参数时容易把哪里改坏都讲清楚。1. 为什么我建议从官方例程而不是从文献截面开始1.1 FinFET 的尺度变化直接把二维轴对偁仿真的老路堵死了平面 MOS 工艺仿真里很多问题可以在二维截面下处理因为器件沿沟道宽度方向基本是均匀的网格只要照顾纵向的源漏和栅介质方向就行。FinFET 一出事情就变了鳍立起来之后沟道在三个方向上都有几何和掺杂的变化栅极包裹鳍的三面源漏区还要考虑抬升外延和侧墙。这意味着你必须切换到真正的三维仿真而三维仿真的网格数量比二维涨的不是一倍两倍是数量级的差距。官方例程在这里给我的第一个启发就是它没有傻乎乎地把整个器件切成完整三维来跑。它利用了对称性只仿真半个鳍甚至四分之一结构通过设置对称边界条件来等效完整的器件。这不仅是省时间的问题更是能不能在合理内存里把网格做得足够密的问题。你可以把这件事类比成拍证件照只需要拍半张脸再镜像物理过程是对称的仿真域砍半结果不变成本直接降低。我见过不少初学者一上来就想复现一个完整的 3D FinFET结果网格文件几百 MB跑一个退火步骤就要几个小时。官方例程用很小的结构单元把流程跑通这个选择本身就是工艺仿真里最重要的工程决策之一不是所有物理都在关键区域仿真域要够用就好。1.2 官方例程到底在教哪三件事这个 FinFET 例程表面上是在教怎么把工艺步骤写进脚本实际上它想让你掌握三样东西。第一工艺步骤的先后逻辑。Sentaurus Process 里的每一步比如deposit、etch、diffuse、implant对应的是真实 Fab 里的一道工序。例程把从衬底准备、硬掩膜沉积、Fin 刻蚀、牺牲氧化、栅介质生成、多晶硅/金属栅填充、侧墙沉积、源漏外延到快速退火的完整流程串了起来。你敲完一遍等于在脑子里过了一遍 FinFET 的标准制造流程这是工艺仿真的核心价值。第二物理模型的选择意识。同样是氧化脚本里可以只做几何上的材料生长也可以用氧化动力学模型让生长速率随温度、时间和氧气浓度变化同样是退火可以选择只做掺杂扩散也可以打开应力耦合。例程在每个环节用了什么样的模型暗示了那个环节里哪些物理是不能忽略的。这种模型敏感度的感觉靠看 PPT 学不会只有自己跑多了才知道。第三结果的查看与校验。例程跑完之后会在当前目录留下一系列.tdr结构文件和掺杂分布数据怎么用 Sentaurus Visual 切截面、看 profile、检查网格质量这套流程决定你能不能发现仿真出了 bug。很多人能跑通但不会看结果最后把网格已经穿透的错误结构当成了仿真结果这就是没有学会第三件事。2. 把例程脚本拆开看FinFET 是怎么一步步长出来的2.1 初始网格与硬掩膜结构误差从这里开始累积拿官方 FinFET 例程来说通常第一步是用line语句在 x、y、z 三个方向定义初始网格然后声明衬底材料、晶体取向再用init初始化。这个阶段看起来只是准备工作却是整轮仿真误差的第一个来源。原因很简单工艺仿真里的结构演化不是无限细分的。网格的疏密决定了结构边界的形状尤其是后续刻蚀和各向异性氧化发生时如果网格在关键区域不够细鳍的侧壁就会变成锯齿形状。例程里在鳍中心、鳍边缘和栅介质界面处把网格加密到纳米级间距而在衬底深处用大间距网格这个设计本身就是工艺仿真的标准写法。我在学习时犯过的错误是为了追求精度把整个仿真域都设成细网格结果内存爆掉跑一步要一个小时。后来才理解正确做法是只在物理量变化剧烈的区域Fin 本体、氧化层、掺杂结附近加密衬底和远离器件的地方保持粗网格。例程里每个line语句的位置不是随便写的都对应一个后续结构的关键位置。然后是硬掩膜。FinFET 的 Fin 不是直接光刻胶刻出来的通常要先沉积氮化硅或者氮氧化硅作为硬掩膜再用光刻定义出 Fin 的宽度最后刻蚀硬掩膜、再刻蚀硅。例程里用deposit沉积氮化硅层然后定义一个掩膜图形区域用各向异性刻蚀把氮化硅开出窗口。这一步要特别注意刻蚀的方向性和刻蚀深度控制。各向异性刻蚀在侧壁方向刻蚀速率极低才能保证掩膜侧壁垂直一旦写成各向同性刻蚀硬掩膜边缘会被掏空后续硅刻蚀的形貌就全乱了。2.2 Fin 刻蚀与牺牲氧化决定鳍形貌的关键几步硬掩膜开好窗之后就要刻蚀硅形成 Fin。这一步例程里通常用各向异性硅刻蚀刻蚀深度就是 Fin 的高度。这里有个必须搞清楚的细节刻蚀结束后的 Fin 侧壁并不是完美的垂直平面会有一定的锥角还可能有刻蚀损伤层。真实工艺里会在刻蚀后做一次牺牲氧化sacrificial oxidation把受损的硅表面氧化掉一层然后用湿法腐蚀把氧化层去掉让侧壁变得更光滑、角落更圆润。在仿真脚本里牺牲氧化体现为一次较短的diffuse命令气氛是氧气或水汽温度通常在 850 到 950 度之间时间很短。氧化过程中硅被消耗氧化层生长出来这个过程在三维网格上产生体积膨胀每消耗 1 单位硅大约生成 2.2 单位氧化硅对网格质量是个考验。例程在氧化那一步前后往往会插入了网格重划分或者refinebox的更新目的就是让新生长的氧化层里有足够的网格层数来描述界面。我自己的体会是Fin 的底部转角是最容易出问题的地方。原本垂直的侧壁和水平的衬底表面形成凹角氧化层在这里生长时应力集中如果网格不够细界面会出现异常的尖角。结果就是你导出结构后看到 Fin 底角像被啃了一口和真实器件的圆润底角完全不像。所以学这个例程时务必把每一步结束后的结构都导出来看一眼尤其是 Fin 刻蚀后和牺牲氧化后这两个时间点对比一下形貌你会对工艺演化和网格的相互作用有非常直观的认识。2.3 栅叠层、侧墙与源漏抬升形貌和材科的密集交互牺牲氧化层去掉之后接着就是真正的栅介质生长。FinFET 的典型做法是先生长一层极薄的界面氧化层再沉积高 k 介质比如 HfO2最后填充金属栅或掺杂多晶硅。把这个过程拆成命令来看非常有意思。界面氧化层用氧化气氛下的短时间退火来模拟厚度只有纳米级这要求界面附近的网格要足够细不然氧化层连一个网格都撑不起来界面的电容和后续掺杂分布都会被扭曲。HfO2 这类高 k 材料不是长出来的是deposit沉积上去的材料参数里可以设置它的介电常数、能带参数这些会在后续器件仿真中直接使用。栅极材料如果是多晶硅还会涉及栅掺杂和功函数问题如果是金属栅材料类型和功函数也必须在工艺仿真阶段就定义好否则到了器件仿真阶段电极属性会缺胳膊少腿。然后是侧墙。侧墙的作用是隔开栅极和源漏区在 FinFET 工艺里通常用氮化硅沉积加各向异性回蚀来实现。这个结构的几何形状对后续器件的寄生电容影响很大所以例程里对它形状的仿真精度要求不低。侧墙做成之后源漏区要做抬升外延raised S/D在 Fin 的顶部和侧壁长一层外延硅。仿真里这步其实就是一次定向沉积但要注意外延层和原有衬底的界面必须共格材料属性连续。如果沉积的网格太粗外延层会和下面硅层之间产生假的小台阶掺杂分布和应力分布都会被污染。2.4 快速退火掺杂、应力和形貌在同一段话里互相影响工艺脚本走到这一步看起来就该收尾了其实最复杂的物理往往集中在最后的激活退火。源漏注入之后杂质是晶格间隙中的非激活状态必须通过快速热退火RTA或者尖峰退火让杂质进入替位位置并激活。例程里的退火命令可能只有短短一行diffuse temperature... time...但这一行背后是扩散模型、缺陷模型、激活模型的综合作用。FinFET 源漏区通常是带 tilt 角度的注入打进去的在三维的 Fin 结构里注入角度会造成阴影效应一个鳍会挡住另一个鳍的侧壁导致鳍内外两侧掺杂不对称。退火时注入损伤带来的瞬态增强扩散TED会让杂质扩散得比稳态模型预测得更远。同时侧墙氮化硅和栅叠层在退火温度下会产生热应力应力又会反过来影响扩散速率和硅的能带结构。真正完整的例程在这些地方通常会暗示你哪些模型被打开、哪些被简化。我在反复跑例程之后形成的经验是退火结束后不要只看杂质分布一定要顺带看应力分布。很多时候你的器件仿真跑出来的迁移率比预期低不是器件物理模型设错了而是工艺仿真阶段把应力状态算错了。例程的意义就在于给你一个标准答案告诉你在这样一套工艺条件下应力大概长什么样后续改工艺时才有个对照基准。3. 跑完例程别急着庆祝结果文件里值得深挖的四类信息3.1 结构形貌Fin 的顶宽、底宽和侧壁角度很多人跑完例程看到 Sentaurus Visual 里出来一个三维鳍就说成了。我劝你把心态换成质检员先量尺寸。用剖面工具沿着 Fin 的横截面切开分别测顶宽、中宽、底宽和高度。这几个数的重要性在于它们决定了后续器件仿真里 Fin 的静电控制能力。同样标称 7nm 的 Fin如果仿真出来的顶宽是 5nm、底宽是 11nm那这个器件的阈值特性和漏电会和理想矩形 Fin差很多。我在例程学习时发现即使完全照着脚本跑不同网格密度下量出来的 Fin 宽度也会有零点几纳米的差异。这不是 bug而是离散化误差的体现。你要做的是记录这个误差范围知道自己这套仿真对 Fin 尺寸的分辨率极限是多少。另外要重点看侧壁角度。理想工艺希望侧壁接近 90 度但实际刻蚀往往产生 87 到 89 度的微微倾斜。这个角度在版图级可能无所谓但在 FinFET 这种尺度下它直接影响有效沟道宽度计算和栅对沟道的包裹程度。例程跑出来的角度如果和脚本里的刻蚀参数预期不符多半是掩膜侧壁已经失配或者刻蚀的各向异性比设错了。3.2 掺杂分布剂量、结深和阴影效应结构只是骨架掺杂才是器件的血肉。在 FinFET 这个尺寸下我建议你至少检查三类掺杂信息。第一类是沟道区的掺杂浓度峰值它直接决定栅的耗尽特性和阈值电压。Sentaurus 例程的沟道掺杂通常是几次注入加退火的综合结果你要看峰值位置是否在预期深度有没有因为退火时间过长而跑到不该去的地方。第二类是源漏结深尤其是 Fin 侧壁方向的横向扩散量。Fin 本来就窄如果源漏杂质的横向扩散越过栅边缘太多有效沟道长度就被缩短了泄漏上升。第三类是 Fin 内侧和外侧的掺杂不对称。由于注入角度和相邻 Fin 的遮挡内侧掺杂可能明显少于外侧。例程里如果用了有 tilt 的注入这个不对称现象会出现在结果里。你可以沿着 Fin 宽度方向取一条 profile 看看这就是三维工艺仿真相对于二维仿真最核心的信息增量。提取掺杂分布我推荐用 Sentaurus Visual 的一维 cut 功能沿着沟道方向、垂直沟道方向各切几次把 dopant 浓度曲线导出来对比。不要只盯着三维彩色图看彩色图适合找趋势不适合定数值。3.3 应力场被忽略但直接影响迁移率的量我在学这个例程之前对工艺仿真里的应力基本无视觉得那是机械仿真的事。直到后来做器件仿真时发现必须给迁移率模型提供应力信息否则模型中电子迁移率的应变修正根本没有输入。这时候才回头重视工艺脚本里的应力计算。FinFET 里应力的来源很多Fin 刻蚀后的侧壁受损层会产生局部应力栅介质沉积会在沟道表面产生应力氮化硅侧墙会因为沉积工艺的不同而呈现拉应力或压应力源漏外延层和衬底之间的晶格失配也会产生应力。这些应力叠加在沟道里最终会成为器件仿真时迁移率模型的数据源。例程里侧墙这一步从工艺角度看是在做几何结构从应力的角度看其实是在给沟道施压。你把计算结果里的 stress 分量调出来看看通常会看到沟道附近有非常明显的应力梯度。如果你后续跑 sdevice 时发现迁移率对工艺条件非常敏感但你又没在工艺仿真阶段打开应力模型那问题往往就出在这里。3.4 器件端口的预备检查电极和边界不匹配的隐患既然这个例程的名字是工艺建模很多人会在工艺仿真结束后直接就把结构导到器件仿真里用。但我建议在动手之前先做一次电极和边界的核对。工艺仿真脚本里通常会预留或者后来添加contact定义把栅极、源、漏的电极区域标出来。如果你在工艺阶段没有定义电极到了器件仿真阶段即使物理模型再准也没法施加电压边界条件。另一个容易出错的地方是边界条件与对称性设置之间的配合。例程为了省时间只仿了半个结构那么侧面边界应当是 Neumann 边界法向梯度为零而不是 Dirichlet 边界。如果你在后续器件仿真中忘了这一点把截断的侧面当成一个实际绝缘表面结果就会和全结构仿真对不上。这个检查只花五分钟但能替你在器件仿真阶段省下两天排查时间。4. 我复现例程时踩过的三个坑4.1 3D 网格负体积凹角处的致命折叠第一次跑 FinFET 例程跑到牺牲氧化那一步突然报了负体积错误我当时第一反应是脚本里的模型参数有问题。后来排查到最后才发现这是三维网格在凹角处发生折叠导致的Fin 底部转角处氧化层在水平和垂直两个方向同时膨胀界面附近的网格节点被挤得越过了相邻节点形成了体积为负的单元。解决思路其实在例程里已经给了暗示在氧化步骤之前重新调整网格让材料界面的网格节点尽量贴合界面同时把氧化层生长方向的网格留够余量。我自己后续总结出的实用做法是在 Fin 底部转角区域用一个refinebox把加密区域稍微扩大一点不要精确卡在理论界面上给界面移动留出缓冲。另外可以把氧化气氛改成更温和的条件先跑通比如把水汽氧化改成干氧氧化速率降低界面移动变慢网格有更充分的时间适应。这个坑给我的教训是工艺仿真的网格策略不是一次性定死的而是随工艺步骤动态调整的。官方例程的脚本里每一步之间的重新划分网格命令看起来像是多余动作实际上是避免网格负体积的关键操作。4.2 ambient 和 gas flow 设置一秒钟学会半个月记不住Sentaurus Process 里做氧化和退火时气氛条件的写法让我这种粗心的人至少坑过两三次。氧化氛围需要在diffuse命令里把气体种类和分压写清楚比如ambient O2表示干氧。很多人包括我在内一开始图省事直接写diffuse temperature... time...不写 ambient系统默认气氛是惰性的结果氧化层根本没有长出来后面整个结构全错了。比这更隐蔽的是把gas flow和ambient混着用。我记得有一次想模拟炉管氧化写了gas flow语句想控制流量但没仔细查版本对语法格式的要求结果系统始终读不到气氛成分氧化的厚度比预期少了一半。排查了半天才发现是变量名的定义位置和单位对不上。这类问题谈不上技术深度纯粹是工具熟练度问题。我的建议是跑例程之前先把安装目录里自带的 1D 氧化示例脚本翻出来对照把ambient、pressure、gas flow的写法当成模板背下来不要自己凭记忆创造语法变体。4.3 结果和论文对不上的第一排查清单你按例程跑出来的 Fin 宽度跟论文扫描电镜图里的 Fin 宽度总是差那么几个纳米。这种情况我遇到过很多次也曾经怀疑是不是模型不够高级。排查到最后绝大多数情况都出在以下几个基础环节。第一单位。不同版本和不同关键字里长度单位可能是微米也可能是纳米你肉眼读出来的数字对不上实际是差了一千倍。第二网格分辨率。窄 Fin 的拐角处如果只有两层网格形貌被离散化拉宽了测出来自然偏大。第三刻蚀参数。脚本里的各向异性刻蚀thickness数值不一定等于最终结构深度因为还要叠加掩膜消耗和过刻蚀量。第四也是我后来才意识到的校准文件的差异。工艺仿真里很多模型参数来自校准文件calibration set不同版本默认校准文件不一样跑出来的形貌和掺杂分布就会有系统偏差。遇到论文对不上的情况先对照这份清单按层级排查多数问题用不着调整高级物理模型就能解决。5. 把例程改造成自己的工艺仿真平台5.1 参数化脚本改尺寸前先改网格例程跑通之后自然就会想改成自己的器件尺寸比如 Fin 高度从 40nm 改成 50nmFin 宽度从 8nm 改成 6nm。我最初的冲动是直接改刻蚀深度和掩膜宽度结果跑出来结构各种奇怪。后来才发现一个问题改了工艺参数就得同步改网格策略。Fin 变细之后原本在 Fin 宽度方向上的 5 个网格点会变得更密如果网格点间距不变网格数量下降Fin 形貌的分辨率就变差了Fin 变高之后垂直方向的网格步长也需要重新分配否则刻蚀深度内的网格总量不足侧壁形貌会失真。所以我强烈建议你在例程脚本的基础上做参数化改造在脚本开头定义一堆变量比如set fin_width 0.006、set fin_height 0.04然后所有line、etch thickness、refinebox的范围都引用这些变量。这样每次改尺寸只要改变量网格自动跟着变结构的一致性有保证。我当时把官方例程脚本改成参数化版本后做尺寸扫描方便了很多。比如我要看 Fin 高度从 30 到 50nm 对器件短沟道特性的影响只需循环改一个变量每一轮工艺仿真都是完整可复现的流程。这种能力才是学习例程最大的回报从照着敲命令变成了拥有一套自己的工艺建模工具。5.2 从工艺结果到器件仿真网格需要二次加工工艺仿真的网格是跟着工艺演化走的它里面掺杂和应力分布的分辨率很高但网格单元的形状和排列未必适合器件仿真。一个典型问题是工艺仿真里栅介质层可能只有两层网格这在描述掺杂和氧化层厚度时够用但在器件仿真里求解载流子输运方程时需要至少三层以上网格来解析量子效应和反型层。另一个问题是工艺仿真里为了照顾氧化层在硅体内部生成了许多不必要的三角形障碍状单元这会增加 sdevice 的计算负担。所以我的习惯是工艺仿真结束之后不直接拿它的网格跑器件而是导出掺杂、应力和形貌信息然后在结构编辑器里重新划分器件网格。具体操作可以是用sde把工艺结构读进来按照器件仿真需要的物理模型重新设置网格密度和区域再生成新的.tdr文件。这个过程刚开始有点繁琐但做几次之后你就能体会到它的好处工艺仿真和器件仿真解耦两边可以独立优化网格。这也是官方 FinFET 例程里通常会把工艺和器件分开成多个脚本的原因不是懒得分是工程上就该这么干。5.3 以例程为基准建立自己的校准流程官方例程的另一个价值是它本身可以当校准基准。比如你往脚本里加了一个新的工艺条件或者换了一种高 k 材料的参数怎么判断结果是变好了还是变坏了把改动前后的结果和例程默认结果并排放在 Sentaurus Visual 里对比是最直观的方法。我自己的做法是保留一份例程的原始输出作为黄金参考每次改工艺模型或参数之前先复制一份完整输出目录改完之后再写个简单的对比脚本把 Fin 关键尺寸、沟道掺杂峰值、表面应力值自动对比出来。误差在可接受范围内就继续超了就回头查改动的影响。这套流程看起来原始但比直接在原目录上反复修改靠谱得多——你不会陷入改坏了想回退却找不到干净版本的尴尬。做完这一整套练习我最深的体会是工艺建模例程学习本质上不是学一套命令而是学一套仿真实验的思维。每一步工艺改动之前先想清楚这个改动会影响哪个物理量、需要加密哪里的网格、最后要从结果里提取什么数据来验证。带着这种思维去看官方例程你会惊讶地发现一个看似普通的脚本里到处都藏着作者对工艺物理的理解。