说实话,我第一次在 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 改成 50nm,Fin 宽度从 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 关键尺寸、沟道掺杂峰值、表面应力值自动对比出来。误差在可接受范围内就继续,超了就回头查改动的影响。这套流程看起来原始,但比直接在原目录上反复修改靠谱得多——你不会陷入"改坏了想回退却找不到干净版本"的尴尬。
做完这一整套练习,我最深的体会是:工艺建模例程学习,本质上不是学一套命令,而是学一套"仿真实验"的思维。每一步工艺改动之前,先想清楚这个改动会影响哪个物理量、需要加密哪里的网格、最后要从结果里提取什么数据来验证。带着这种思维去看官方例程,你会惊讶地发现一个看似普通的脚本里,到处都藏着作者对工艺物理的理解。