4. Sentaurus 命令行工具与作业提交基础
Sentaurus TCAD 的图形界面(如 Sentaurus Workbench、Sentaurus Visual)适合交互式探索,但真正用于批量仿真、参数扫描和集群作业提交的,是底层命令行工具。理解 sdevice、sprocess、svisual 等命令的参数体系、输入输出文件组织方式以及退出状态检查机制,是构建自动化仿真流程的前提。本节围绕这三个核心命令展开,说明它们各自读取什么、写出什么、如何判断一次运行是否成功。
一、三个核心命令的职责与输入输出
Sentaurus 的命令行工具遵循“输入文件 + 参数选项 → 输出文件 + 退出码”的统一模式,但每个工具的输入输出对象不同。
sprocess 负责工艺仿真,输入是工艺描述文件(通常为 _sprocess.cmd 或 sprocess_fps.cmd),输出是器件结构文件(.tif、_fps.tif)以及工艺日志。它把“做了什么工艺步骤”转换为“得到了什么掺杂分布和几何结构”。
sdevice 负责器件电学仿真,输入是器件结构文件(.tif)和器件描述文件(_sdevice.cmd),输出是电流-电压曲线(_des.plt)、内部物理量分布(_des.tdr)以及求解日志。它把“结构 + 物理模型 + 偏置条件”转换为“电学响应”。
svisual 负责可视化与数据提取,输入是 .tdr、.plt 等结果文件,输出是图像、曲线或提取后的数据表。它本身不参与物理求解,而是把已有结果转成可读形式。
三者的数据流关系可以用下面的信号链表示:工艺仿真产生结构,器件仿真消费结构并产生电学数据,可视化工具消费电学数据。理解这条链,才能正确组织文件命名和目录结构。
二、参数体系:从命令行选项到命令文件
Sentaurus 命令行工具的参数分为两类:一类是命令行选项,控制运行方式;另一类是命令文件内部的语句,控制物理仿真内容。两者不能混淆。
以 sdevice 为例,常用命令行选项包括:
sdevice _sdevice.cmd \
-1 \
-P 4 \
-O output_dir \
-logfile sdevice.log
其中 -1 表示单线程运行(调试时常用),-P 4 指定 4 个并行进程,-O 指定输出目录,-logfile 指定日志文件路径。这些选项不改变物理模型,只改变执行方式。
而 _sdevice.cmd 文件内部的 Physics、Math、Solve 等段落,才决定用哪些迁移率模型、是否开启雪崩、求解哪些偏置点。例如:
Physics {
Mobility( DopingDep HighFieldSaturation )
Recombination( SRH Auger )
}
Math {
Method = ILS
Extrapolate
}
Solve {
Poisson
Coupled { Poisson Electron Hole }
Quasistationary(
InitialStep=0.01 Increment=1.5
Decrement=2 MinStep=1e-5 MaxStep=0.1
Goal { Name="drain" Voltage=1.0 }
) { Coupled { Poisson Electron Hole } }
}
这段命令文件告诉 sdevice:使用掺杂依赖和高场饱和迁移率模型,开启 SRH 和俄歇复合,用 ILS 方法求解,从 0 V 扫描到漏极 1.0 V。命令行选项和命令文件内容各司其职,前者管“怎么跑”,后者管“跑什么”。
三、输入输出文件组织与命名约定
Sentaurus 默认采用“节点名 + 工具后缀”的命名方式。在 Sentaurus Workbench 中,每个仿真节点有唯一名称(如 n1、n2),对应文件为 n1_sprocess.cmd、n1_sdevice.cmd、n1_des.plt 等。手工命令行运行时,建议沿用类似约定,避免文件覆盖。
一个典型的单节点目录结构如下:
project/
├── n1_sprocess.cmd
├── n1_sprocess.log
├── n1_fps.tif
├── n1_sdevice.cmd
├── n1_des.log
├── n1_des.plt
├── n1_des.tdr
└── n1_svisual.cmd
关键原则是:输入文件与输出文件同目录但不同后缀,日志文件与命令文件同名但加 .log。这样在批量运行时,每个节点自成一套文件,互不干扰。
四、退出状态检查:判断一次运行是否成功
命令行工具运行结束后,Shell 会返回一个退出码(exit status),保存在特殊变量 $? 中。约定:0 表示成功,非 0 表示失败或异常。这是批量脚本中最可靠的判断依据。
sdevice n1_sdevice.cmd -logfile n1_des.log
if [ $? -ne 0 ]; then
echo "n1 sdevice failed, check n1_des.log"
exit 1
fi
但退出码为 0 并不绝对意味着物理结果合理。还需要检查日志中的关键字。常见判读方式:
grep -i "error" n1_des.log:查找错误信息;grep -i "aborted" n1_des.log:查找求解中止;grep -i "finished" n1_des.log:确认正常结束;ls -lh n1_des.plt n1_des.tdr:确认输出文件存在且大小合理。
如果 .plt 文件只有几百字节,通常说明扫描没有真正完成;如果 .tdr 缺失,说明求解在写结果前就中止了。这些现象比退出码更能反映实际问题。
sdevice 在遇到不收敛时,有时会写出部分结果并以非零码退出,有时会写出完整文件但日志中有大量 warning。因此退出码、日志关键字、输出文件三者要联合判断,不能只看其中一项。
五、批量提交中的实际组织方式
在集群上批量提交时,通常为每个参数组合生成一个节点目录,目录内放置该节点的命令文件和提交脚本。提交脚本的核心结构如下:
#!/bin/bash
#PBS -N n1_sdevice
#PBS -l nodes=1:ppn=4
#PBS -j oe
cd $PBS_O_WORKDIR
sdevice n1_sdevice.cmd -P 4 -logfile n1_des.log
echo "exit=$?" >> n1_des.log
把退出码追加到日志末尾,便于事后批量筛查。对于几十上百个节点,可以用一条循环快速检查:
for d in n*/; do
if grep -q "exit=0" "$d"*_des.log 2>/dev/null; then
echo "$d OK"
else
echo "$d CHECK"
fi
done
这样就能在几分钟内定位哪些节点需要人工复查,而不是逐个打开日志。命令行工具的价值正在于此:把重复的仿真执行、文件组织和状态判断交给脚本,把人的精力留给物理分析和模型调整。