2. Sentaurus Workbench项目工程化

Sentaurus Workbench(SWB)不只是一个图形化的仿真启动器,它本质上是一个实验管理系统。当项目从“一个人跑一个器件”扩展到“多人维护几十组参数、上百个 split 时”,工程化程度直接决定结果是否可复现、可追溯。本节围绕四个相互咬合的层面展开:目录结构、实验管理、参数化扫描、版本控制与协作规范。

一、项目目录结构:让路径本身携带语义

SWB 项目以 .swb 文件为入口,但真正承载工程信息的是它周围的目录树。一个可维护的项目建议采用如下布局(示例名 nmos_vdsweep):

nmos_vdsweep/
├── nmos_vdsweep.swb          # 项目主文件,记录节点、参数、工具流
├── gtree.dat                 # 实验树/参数组合定义
├── nodes/                    # 每个 split 的独立工作目录
│   ├── n1_1/  n1_2/  n2_1/ ...
├── lib/                      # 共享的 SDE/SDEVICE 命令文件与材料库
│   ├── sde_dvs.cmd
│   ├── sdevice_des.cmd
│   └── models.par
├── tools/                    # 工具配置、版本锁定文件
├── results/                  # 导出的 IV/CV 曲线、图片、报告
└── docs/                     # 实验说明、变更记录、评审结论

关键原则有三条。第一,命令文件放 lib/,节点目录只保留差异。SWB 的 @parameter@ 机制会在运行时把变量替换进命令文件,因此同一份 sdevice_des.cmd 可服务所有 split,避免复制粘贴导致的版本漂移。第二,nodes/ 下目录名与实验树节点一一对应,便于用脚本批量提取结果。第三,results/ 与 docs/ 分离,前者是机器产物,后者是人写的判断依据,二者混放会让“哪条曲线对应哪次评审”变得不可查。

二、实验管理:用 gtree 组织变量与 split

SWB 的实验管理核心是 gtree(实验树)。每个变量在 gtree 中定义取值列表,SWB 自动做笛卡尔积生成节点。例如定义:

Vg   = 0.0 0.5 1.0 1.5
Vd   = 0.05 1.0
Lg   = 0.045 0.065

则生成 4×2×2 = 16 个节点。这里必须区分两类变量:扫描变量(进入 gtree,产生 split)与固定参数(写在命令文件或 models.par 中,不产生 split)。把不该扫描的量放进 gtree,会让节点数指数膨胀;把该扫描的量写死,则实验失去意义。工程上建议在 docs/ 中维护一张“变量登记表”,记录变量名、物理含义、单位、取值范围、是否扫描、默认值,作为团队共识。

节点命名建议采用“变量缩写+序号”的稳定规则,例如 vg0p5_vd1p0_lg45,这样即使 gtree 顺序调整,结果目录仍可被脚本按名解析,而不是依赖节点编号。

三、参数化扫描:从变量到可判读的结果

参数化扫描的价值不在于“跑得多”,而在于扫描维度与判读指标一一对应。以 NMOS 输出特性为例,扫描 Vg 与 Vd,目标指标是饱和电流 Id_sat、阈值电压 Vth、跨导 gm。SWB 在每个节点运行 SDEVICE 后,可通过 svisual 或 inspect 提取这些量,并写入 results/ 下的汇总文件。

实际操作中,参数替换依赖命令文件中的占位符,例如在 sdevice_des.cmd 中写:

Electrode {
  { Name="gate" Voltage=@Vg@ }
  { Name="drain" Voltage=@Vd@ }
}

SWB 在节点运行时将 @Vg@、@Vd@ 替换为 gtree 中的具体值。扫描完成后,用脚本把各节点 Id 提取出来,按 (Vg, Vd) 组织成二维表,即可判断:Vd 增大时 Id_sat 是否如预期上升、Vth 随 Lg 缩短是否发生 roll-off。若某节点因收敛失败无结果,应在汇总表中显式标记为“未收敛”,而不是静默跳过——静默跳过会让后续拟合误用缺失数据。

SWB 项目工程化:目录、实验树与参数扫描数据流 项目目录结构 nmos_vdsweep.swb gtree.dat lib/ (共享命令文件) nodes/ (各 split 工作区) tools/ (版本锁定) results/ (曲线与汇总) docs/ (变量登记与评审) 命令文件集中,节点只存差异 实验树 gtree Vg = 0.0 0.5 1.0 1.5 Vd = 0.05 1.0 Lg = 0.045 0.065 → 4 × 2 × 2 = 16 节点 扫描变量进 gtree 固定参数写命令文件 节点名: vg0p5_vd1p0_lg45 参数替换与运行 sdevice_des.cmd: Voltage=@Vg@ Voltage=@Vd@ 节点运行时替换为 Vg=0.5, Vd=1.0 提取指标: Id_sat / Vth / gm 未收敛节点显式标记 结果汇总与判读 按 (Vg, Vd) 组织二维表 → 观察 Id_sat 随 Vd 上升趋势 对比不同 Lg 的 Vth → 判断短沟道 roll-off 是否出现 缺失数据标记“未收敛”,避免拟合误用

四、版本控制与团队协作规范

SWB 项目纳入 Git 时,最大的坑是把节点目录和二进制结果一起提交。正确做法是:.swb、gtree.dat、lib/、tools/、docs/ 纳入版本控制;nodes/ 下的运行产物、results/ 中的大文件通过 .gitignore 排除,只提交汇总后的 CSV 或关键曲线图。这样仓库保持轻量,且每次提交对应的是“实验定义”而非“实验垃圾”。

协作规范建议明确以下几条:

  • 分支策略:main 只保留已验证的实验定义;每个新实验从 main 拉出 exp/xxx 分支,评审通过后合并。
  • 提交信息:必须写明“改了什么变量、为什么改、预期影响”,例如 gtree: Lg 增加 0.032nm 点,用于评估 roll-off 拐点。
  • 工具版本锁定:在 tools/ 中记录 Sentaurus 版本号与补丁级别,避免不同成员用不同版本跑出不可比结果。
  • 结果评审:每次合并前,在 docs/ 中附上关键曲线与结论,评审人确认“数据支持结论”后才合并。
常见错误:多人同时修改同一个 .swb 或 gtree.dat 并直接覆盖。SWB 的图形界面不会自动合并冲突,一旦覆盖,实验树可能丢失节点定义。规范做法是修改前先 git pull,修改后立即提交,冲突时以文本方式手工合并 gtree 行。