
简介这份资源面向光刻工艺工程师、半导体器件研发人员及微纳加工方向的高校师生提供一套可用于光刻工艺模拟与优化的仿真工具帮助在设计阶段预测分辨率限制、光学邻近效应、剂量效应及显影后图案形态从而减少试错成本。压缩包共796个文件约12.6MB以hpp头文件、afm字体度量文件、png图像、py脚本、svg矢量图、h与c源码、ttf字体及少量dll、exe可执行文件为主兼顾源码编译与直接运行两种使用方式另含mat数据、cmake构建脚本与说明文档便于二次开发与结果复现。目前已有1115人学习下载适合希望深入理解光刻仿真流程、开展工艺参数迭代与缺陷分析的读者参考也可作为课程设计或科研项目的工具基础。1. 光刻仿真软件下载之后一个工艺工程师的劝退与劝进你拿到一个叫“光刻仿真软件___下载.zip”的压缩包双击解压里面大概率是一堆源码、Makefile、示例配置和一份读起来像天书的 README。别急着删也别急着跑。这东西不是装完就能出图的商业 EDA它更像一套光学化学数值计算的实验台你得自己接线、调参、看波形。它解决的核心问题是在流片之前用数值方法预测光刻胶上的二维甚至三维轮廓从而判断工艺窗口够不够、OPC 修正有没有效果、EUV 下的随机效应会不会把关键尺寸打穿。适合谁适合工艺整合、OPC 工程师、计算光刻方向的研究生以及想从版图直接跳到“曝光后长什么样”的版图工程师。不适合只想点“Run”就出报告的人。下面我按“拿到包之后怎么活下来”的顺序把选型、编译、跑通、调参、避坑和进阶验证一次讲透。2. 先搞清楚你手里这套光刻仿真软件到底算哪一类2.1 从标题里的“下载.zip”反推它大概率不是商业套件商业光刻仿真工具通常以安装包License 服务器形式交付不会叫“___下载.zip”。这个命名方式暗示它更可能是学术组或开源社区流出的源码包常见形态有三种基于严格耦合波分析RCWA的电磁场求解器、基于传输矩阵法TMM的快速薄膜计算、以及基于元胞自动机或水平集方法的光刻胶显影模拟。你解压后先看目录结构有src/、include/、examples/、Makefile或CMakeLists.txt基本就是 C/C 或 Fortran 的数值代码如果全是.py和requirements.txt那就是 Python 封装。这一步决定了你后面是跟编译器打架还是跟包管理器打架。常见做法是先别读源码先找examples/里最小的那个输入文件看它需要哪些参数。光刻仿真的输入通常分四块光源参数波长、数值孔径 NA、部分相干因子 sigma、掩模描述版图 GDSII 或简单线条、光刻胶堆栈厚度、折射率 n、消光系数 k、显影模型阈值、对比度、扩散长度。把这四块对应到配置文件里你就能判断这套软件到底覆盖了哪一段。很多“下载.zip”只做其中一段比如只算空间像光强分布不做显影那你得自己接后续步骤。2.2 三类主流光刻仿真路线的选型理由与边界第一类是严格电磁场仿真代表方法是 RCWA。它把掩模和光刻胶堆栈切成很多薄层每层做傅里叶展开解特征值问题。优点是能算亚波长结构的近场衍射适合 EUV 和先进 DUV 的掩模三维效应。缺点是内存和 CPU 随周期数平方增长跑一个完整 3D 结构动辄几小时到几天。第二类是薄掩模近似标量衍射用傅里叶光学算空间像速度快适合快速评估 NA 和 sigma 的影响但线宽小于波长一半时误差明显。第三类是光刻胶显影模型常见的是 Dill 模型加 Mack 显影速率公式把曝光后的酸浓度转成显影速率再用水平集推进表面。你手里的包如果同时包含这三段那就是一套完整链路如果只有一段你得清楚它不能单独回答“最终 CD 是多少”。我一般会先跑一个已知解析解的案例来验证代码正确性。比如零级衍射效率、或者简单正弦光栅的 RCWA 结果跟文献对一下。如果对不上先别怀疑物理先查单位波长是 nm 还是 umNA 是数值还是角度光刻胶厚度是 nm 还是 A。单位错一位结果差千倍这是血泪经验。2.3 拿到包之后的最小验证流程不要一上来就编译整个项目。先看examples/里有没有预置的输入输出对。如果有直接跑那个例子看输出和参考结果差多少。如果没有自己造一个最简单的一维线条/空间案例波长 193nmNA 0.85sigma 0.5掩模是 100nm 线/100nm 空光刻胶厚度 100nm折射率 1.7。这个案例在多数标量或 RCWA 代码里都能跑。跑通之后把 NA 从 0.85 改到 0.93看空间像对比度是否下降这是符合物理直觉的。如果没下降说明代码里的 NA 没生效或者你改错了参数位置。这一步的产出不是“结果多准”而是“链路通不通”。链路通了你才有资格谈调参和精度。3. 在 Linux 下把源码包编译成可执行文件命令、依赖与常见报错3.1 编译环境准备与依赖安装绝大多数光刻仿真源码包依赖三类库线性代数BLAS/LAPACK 或 Intel MKL、傅里叶变换FFTW、以及可能的 HDF5 或 NetCDF 用于输出。在 Ubuntu 22.04 上我一般先装基础编译链和这些库sudo apt update sudo apt install -y build-essential cmake gfortran \ libblas-dev liblapack-dev libfftw3-dev libhdf5-dev如果你看到Makefile里写了-lmkl说明它期望 Intel MKL。没有 MKL 的话可以把-lmkl换成-lblas -llapack但性能会降。注意不要混用 MKL 和系统 BLAS否则链接阶段会出现符号重复。这一步的坑在于很多老代码写死了-lfftw3但实际用的是 FFTW2 的 API编译会报undefined reference to fftw_create_plan。解决办法是装libfftw3-dev后在代码里把 FFTW2 调用改成 FFTW3或者直接找fftw2兼容包。我一般会先grep -r fftw_ src/看它用的是哪版 API。3.2 用 CMake 或 Makefile 构建参数怎么改如果包里有CMakeLists.txt标准流程是mkdir build cd build cmake .. -DCMAKE_BUILD_TYPERelease -DUSE_MKLOFF make -j$(nproc)CMAKE_BUILD_TYPERelease一定要开光刻仿真里大量矩阵运算Debug 模式能慢 5 到 10 倍。USE_MKL这种选项看代码里有没有对应宏没有就别乱传。如果是纯Makefile先看make help或直接读Makefile开头的变量。常见变量有CC、FC、FFLAGS、LDFLAGS。我一般会先make -n看它实际执行什么命令确认没有奇怪的-marchnative导致在别的机器上跑不了。如果编译报错relocation R_X86_64_32S against ... can not be used when making a shared object说明它想编共享库但代码没加-fPIC。在CFLAGS和FFLAGS里加上-fPIC重新编译即可。3.3 跑通第一个例子输入文件与输出解读假设编译出了litho_sim可执行文件先找输入文件。常见输入格式是文本键值对或 JSON。我以文本为例./litho_sim -i examples/line_space_193nm.cfg -o output/输入文件里通常有这些段[source] wavelength 193 na 0.85 sigma 0.5 [mask] type line_space pitch 200 cd 100 [resist] thickness 100 n 1.70 k 0.02 [developer] model mack threshold 0.3 contrast 8.0跑完之后输出目录里一般有aerial_image.dat空间像光强、resist_profile.dat显影后轮廓。用gnuplot或 Python 画一下import numpy as np import matplotlib.pyplot as plt data np.loadtxt(output/aerial_image.dat) x data[:, 0] I data[:, 1] plt.plot(x, I) plt.xlabel(Position (nm)) plt.ylabel(Intensity (a.u.)) plt.title(Aerial Image) plt.savefig(aerial.png, dpi150)看空间像的对比度最大值和最小值之差除以最大值加最小值。193nm、NA 0.85、sigma 0.5 下100nm 线/空通常对比度在 0.6 到 0.8 之间。如果低于 0.5要么 NA 没生效要么 sigma 设错了。再看显影轮廓的侧壁角Mack 模型下通常 80 到 88 度。如果侧壁垂直得像刀切可能是阈值设得太低显影速率曲线太陡。这一步的产出是一张能看的图以及一组能跟文献大致对上的数值。对不上不要紧先确认趋势对。4. 光刻仿真必调参数NA、sigma、折射率与显影阈值怎么设4.1 光源参数NA 和 sigma 的物理含义与扫描方法NA 决定分辨率极限近似公式CD_min k1 * lambda / NA。193nm 下 k1 取 0.35NA 0.85 对应约 80nm 极限。你把 NA 从 0.85 提到 0.93极限降到约 73nm但焦深会急剧下降。仿真里怎么体现焦深看不同 defocus 下的空间像对比度。我一般会做一组扫描NA 固定defocus 从 -100nm 到 100nm步长 20nm画对比度曲线。曲线下降越快焦深越小。sigma 影响的是部分相干性sigma 越小相干性越强空间像振铃越明显sigma 越大越接近非相干对比度下降但工艺窗口更稳。常见做法是 sigma 取 0.3 到 0.7 之间先进节点会用偶极子或四极子照明那需要改光源形状文件不是简单改一个数。参数扫描的代码可以写成循环for na in 0.80 0.85 0.90 0.93; do for sigma in 0.3 0.5 0.7; do sed -i s/^na .*/na $na/ examples/line_space_193nm.cfg sed -i s/^sigma .*/sigma $sigma/ examples/line_space_193nm.cfg ./litho_sim -i examples/line_space_193nm.cfg -o output_na${na}_sig${sigma}/ done done跑完把每个目录里的对比度算出来画成热力图。你会看到高 NA 加低 sigma 对比度高但焦深差低 NA 加高 sigma 对比度低但焦深好。这就是工艺窗口的雏形。4.2 光刻胶堆栈折射率 n、k 与厚度的影响光刻胶的折射率 n 和消光系数 k 随波长变化193nm 下常见值 n1.70k0.02 左右。但不同胶号差异很大比如化学放大胶在曝光后 n 会变。仿真里如果只给一个常数 n那算的是曝光前状态。更细的模型会分曝光前和曝光后两层。厚度影响驻波效应光在胶内反射形成驻波导致侧壁波浪形。你把厚度从 100nm 改到 110nm驻波节点位置移动侧壁形状会变。我一般会扫厚度 80 到 120nm步长 5nm看 CD 变化。如果 CD 随厚度剧烈波动说明驻波严重实际工艺里需要加底部抗反射涂层BARC。仿真里可以加一层 BARCn 约 1.6k 约 0.3厚度约 40nm再看波动是否减小。4.3 显影模型Mack 模型四个参数怎么标定Mack 显影速率公式是R R_max * (a1) * (1-m)^a / (a (1-m)^a) R_min其中 m 是归一化酸浓度R_max 是最大显影速率R_min 是最小显影速率a 是对比度参数。常见做法是R_min 取 0.1 到 1 nm/sR_max 取 100 到 1000 nm/sa 取 5 到 20。阈值 m_th 通常取 0.3 到 0.5。这四个参数决定侧壁角和 CD。你把 a 从 8 改到 15侧壁更陡但显影时间窗口变窄。标定方法找一组实验数据不同曝光剂量下的 CD用仿真扫剂量拟合出最接近的 a 和 m_th。没有实验数据的话就按文献典型值设然后看趋势是否合理。注意Mack 模型假设显影是各向同性的实际显影可能有表面抑制效应那需要更复杂的模型比如 Notch 模型或改进的 Mack 模型。你手里的包如果只支持 Mack那就别指望它预测 10nm 以下的线边缘粗糙度。4.4 数值参数网格步长、截断阶数与收敛性检查光刻仿真里数值参数比物理参数更容易翻车。RCWA 的截断阶数 N 决定傅里叶展开保留多少项。N 太小能量不守恒N 太大内存爆。我一般从 N10 开始每次加 5看衍射效率变化小于 1% 就停。网格步长 dx 通常取波长的 1/20 到 1/50193nm 下约 4 到 10nm。dx 太大边缘模糊dx 太小计算时间线性增长。收敛性检查是同一组物理参数N 和 dx 各加倍结果变化小于 2%就认为收敛。这一步没有捷径只能扫。我见过有人用 N5 跑 EUV结果完全不对还以为是物理模型错了。黑匣子不可怕可怕的是不检查收敛就信结果。5. 避坑与排查光刻仿真下载包最常见的五类翻车5.1 编译通过但运行时报“Segmentation fault”现象make成功一跑就 segfault没有更多信息。原因通常是数组越界或未初始化指针。光刻仿真里常见的是网格数超过预分配大小或者输入文件里某个参数没读到导致除零。解决用gdb跑gdb --args ./litho_sim -i input.cfg然后run看崩在哪一行。如果是 Fortran 代码编译时加-fcheckall -gC/C 加-fsanitizeaddress -g。重新编译后再跑会直接告诉你哪一行越界。我一般会先检查输入文件里所有必填项是否都有值尤其是数组维度相关的参数。5.2 空间像对比度始终为 1 或 0现象画出来的光强分布要么全亮要么全暗没有干涉条纹。原因掩模周期设成了 0 或无穷大或者光源波长和网格不匹配导致采样不足。解决确认pitch大于cd且pitch小于计算窗口。如果pitch等于计算窗口傅里叶变换会出问题。另外检查波长和 dx 的关系dx 必须小于 lambda/(2*NA)否则空间像欠采样。193nm、NA 0.85 下dx 要小于约 113nm实际取 5nm 左右。如果 dx 设成 200nm那肯定全糊。5.3 显影轮廓出现锯齿或台阶现象侧壁不是光滑曲线而是一格一格的。原因水平集或元胞自动机方法的网格分辨率不够或者显影时间步长太大。解决把显影模拟的网格步长减半时间步长也减半。如果还是锯齿检查显影速率公式里的 m 是否在 0 到 1 之间超出范围会导致速率跳变。我一般会在显影代码里加一行m max(0.0, min(1.0, m))做钳位。另外输出轮廓的采样点如果太少画出来也会像台阶那是后处理问题不是物理问题。5.4 换一台机器结果就变了现象同样的输入在 A 机器上 CD100nm在 B 机器上 CD105nm。原因编译器优化级别不同导致浮点运算顺序变化或者 BLAS 库不同。光刻仿真里大量矩阵乘法不同 BLAS 实现OpenBLAS vs MKL vs 参考 BLAS结果会有微小差异经过非线性显影模型放大后变成几纳米 CD 差。解决固定编译器和 BLAS 版本用-O2而不是-Ofast因为-Ofast会开快速数学牺牲精度。如果必须跨机器把关键中间结果空间像输出成文件后续步骤从文件读避免重复计算。我一般会在 README 里写清楚“本结果基于 gcc 11.4 OpenBLAS 0.3.20”。5.5 输入文件里单位不统一导致结果差千倍现象CD 算出来是 0.1nm 或 10000nm。原因波长用 nm厚度用 um或者 NA 用角度值。解决在输入文件里显式写单位比如wavelength_nm 193thickness_nm 100。如果代码不支持带单位的键就在 README 里记下来。我一般会做一个单位检查脚本读输入文件把所有长度量转成 nm打印出来确认数量级合理。193nm 波长、100nm 厚度、200nm 周期这些数字应该在同一个数量级附近。如果看到 0.000193 或 193000那就是单位错了。6. 进阶验证用一维线条/空间案例反推工艺窗口6.1 用焦点-曝光矩阵FEM看工艺窗口跑通单点之后最有价值的进阶用法是扫焦点和曝光剂量画 FEM 图。曝光剂量在仿真里通常体现为阈值 m_th 的倒数或者直接改曝光时间。我一般固定 NA 和 sigma扫 defocus 从 -150nm 到 150nm步长 30nm扫剂量从 0.8 到 1.2 倍基准步长 0.05。每个组合跑一次记录 CD。然后画 CD 等值线图横轴剂量纵轴焦点。合格区域是 CD 在目标值 ±10% 以内的区域。这个区域的面积就是工艺窗口。面积越大工艺越稳。193nm 干法下100nm 线条的窗口通常很小可能只有 ±5% 剂量和 ±50nm 焦点。如果你跑出来窗口特别大先检查是不是显影阈值设得太宽松导致 CD 对剂量不敏感。6.2 用 Python 后处理批量结果并画图批量跑完会有几十个输出目录。写个脚本统一读import os import numpy as np import matplotlib.pyplot as plt def read_cd(path): data np.loadtxt(os.path.join(path, resist_profile.dat)) # 假设第一列是 x第二列是高度找高度过零点的位置 x data[:, 0] h data[:, 1] # 简单找左右边缘高度从正变负 edges [] for i in range(1, len(h)): if h[i-1] 0 and h[i] 0: edges.append(x[i]) if len(edges) 2: return edges[-1] - edges[0] return np.nan results [] for d in os.listdir(output_scan): if d.startswith(defocus): cd read_cd(os.path.join(output_scan, d)) results.append((d, cd)) for name, cd in results: print(name, cd)这个脚本的关键是边缘检测逻辑。实际轮廓可能不是理想阶跃需要插值找过零点。我一般用scipy.interpolate做线性插值精度更高。画 FEM 图时用contourf填色contour画等值线标出目标 CD 的 ±10% 线。这张图拿给工艺整合看比一堆数字直观得多。6.3 一个具体技巧用已知解析解验证 RCWA 代码如果你手里的包是 RCWA最可靠的验证是算一个已知解析解的结构。比如一维正弦光栅周期远大于波长时零级透射效率应接近 1。或者算一个均匀薄膜的反射率跟传输矩阵法结果对比。我一般会写一个小脚本生成均匀薄膜的 RCWA 输入厚度从 0 到 200nm 扫看反射率振荡周期是否等于 lambda/(2n)。如果周期不对说明折射率或波长单位错了。这个技巧帮我省过很多次 debug 时间。另一个技巧是能量守恒检查所有衍射级效率之和应等于 1无吸收或小于 1有吸收。如果大于 1说明截断阶数不够或者代码有 bug。6.4 我踩过的最深的一个坑早年我拿到一个光刻仿真包跑出来的 CD 总是比实验大 20nm。我调了所有物理参数都不对最后发现是显影模型里的m_th定义反了代码里 m 是未曝光区域的酸浓度我当成曝光区域了。改过来之后CD 立刻对上。从那以后我养成了一个习惯每拿到一个新包先跑一个极端案例——全曝光和全不曝光看输出是否符合预期。全曝光应该完全显影全不曝光应该完全不显影。如果这个都反了后面所有参数扫描都是白费。这个习惯帮我快速判断一个包值不值得深入。希望帮到你。本文还有配套的精品资源点击获取