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 命令行工具数据流与文件组织 sprocess 工艺仿真 输入: _sprocess.cmd 输出: .tif / 工艺日志 sdevice 器件仿真 输入: .tif + _sdevice.cmd 输出: _des.plt / _des.tdr svisual 可视化 / 数据提取 输入: .tdr / .plt 输出: 图像 / 曲线 / 数据表 结构文件 结果文件 退出状态检查与日志判读 退出码 $? 0 = 成功 非0 = 失败/异常 echo $? 立即查看 日志关键字 "Finished" / "Error" "Warning" / "Aborted" grep 快速筛查 输出文件完整性 .plt / .tdr 是否存在 文件大小是否合理 ls -lh 检查

二、参数体系:从命令行选项到命令文件

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

这样就能在几分钟内定位哪些节点需要人工复查,而不是逐个打开日志。命令行工具的价值正在于此:把重复的仿真执行、文件组织和状态判断交给脚本,把人的精力留给物理分析和模型调整。

建议在项目初期就固定命名约定和目录结构,并在每个节点的日志末尾统一追加退出码。后期节点数量增加时,这套约定能显著降低排查成本。