3. 自动化脚本语言基础

Sentaurus Workbench(SWB)本身是一个以 Tcl 为内嵌解释器的实验管理框架。用户在 SWB 中看到的每一个“工具节点”“参数扫描”“预处理/后处理动作”,最终都会被翻译成 Tcl 命令交给解释器执行。因此,掌握 Tcl 并不是为了写通用软件,而是为了能够直接操纵 SWB 的项目结构、参数变量和工具调用链。本节围绕四个核心问题展开:Tcl 在 SWB 中如何被调用、变量如何承载仿真参数、控制流如何驱动扫描与条件执行、命令执行机制如何把脚本动作落到具体工具上。

一、Tcl 在 SWB 中的执行位置

SWB 的工程目录中通常存在若干与 Tcl 相关的入口:项目级脚本(如 project.tcl 或工具节点下的 *.tcl)、工具命令模板(Command File)、以及预处理/后处理脚本。它们并不是同一层级的东西。项目级脚本在 SWB 加载工程时被解释,用于定义变量、节点关系和全局设置;工具命令模板则在具体工具运行时被展开,把变量替换为实际值后交给仿真器;预处理/后处理脚本在节点执行前后被调用,用于生成输入文件或解析输出。理解这三类入口的差异,是避免“脚本写了却不生效”的第一步。

SWB 与 Tcl 的交互遵循一个稳定的顺序:先由 SWB 建立变量表,再把变量表注入 Tcl 解释器,然后执行用户脚本,最后把脚本产生的命令或文件交给工具。这个顺序决定了脚本中能访问什么、不能访问什么。例如,在项目级脚本中可以直接读写 @ 变量,而在工具命令模板中则更多使用 @变量名@ 的替换形式。

SWB 中 Tcl 的三类入口与执行顺序 项目级脚本 project.tcl 定义变量 / 节点关系 工具命令模板 Command File @变量@ 替换后调用工具 预处理 / 后处理 pre / post 脚本 生成输入 / 解析输出 SWB 变量表(@参数@) 加载工程时建立 → 注入 Tcl 解释器 → 脚本读写 → 展开到工具命令 Tcl 解释器执行用户脚本 变量赋值 set / 控制流 if·for·foreach / 命令调用 exec·source·eval 脚本动作 → 生成命令或文件 → 交给具体工具节点 SDE / SDEVICE 结构编辑与器件仿真 SPROCESS / SENTAURUS 工艺与器件耦合 Inspect / 可视化 结果提取与绘图

二、变量:SWB 参数与 Tcl 变量的双层结构

在 SWB 中,“变量”有两个层次。第一层是 SWB 参数变量,写作 @Vd@、@Lg@、@Tox@ 这类形式,它们由 SWB 的变量表管理,可以在 GUI 中扫描、在实验矩阵中组合。第二层是 Tcl 自身的变量,用 set 定义,例如 set Vd 1.0。两者之间通过 @ 替换和 set 读取建立联系。常见做法是在项目级脚本中把 SWB 参数读入 Tcl 变量,便于后续计算:

# 读取 SWB 参数到 Tcl 变量
set Vd_val  @Vd@
set Lg_val  @Lg@
set Tox_val @Tox@

# 由参数派生新量(示例:计算栅氧电容面密度,单位 F/cm^2)
set eps_ox 3.9
set eps0   8.854e-14
set Cox [expr {$eps_ox * $eps0 / $Tox_val}]
puts "Cox = $Cox F/cm^2"

这里 expr 是 Tcl 的表达式求值命令,$ 用于取变量值,{} 用于把表达式整体作为一个参数传入,避免过早替换。需要特别注意的是,@Vd@ 的替换发生在 SWB 展开阶段,而不是 Tcl 运行时;如果变量名拼写错误,SWB 可能直接报“未定义变量”,而不是在 Tcl 中报错。因此,变量命名应尽量与 SWB 变量表保持一致,并在脚本开头集中读取,避免散落在各处。

三、控制流:驱动参数扫描与条件执行

Tcl 的控制流命令包括 if、for、foreach、while、switch。在 SWB 自动化中,最常用的是 foreach 和 if。前者用于遍历一组参数值,后者用于根据条件决定是否执行某个工具节点或某段后处理。

例如,当需要在一组偏置电压下批量提取特性时,可以这样组织:

# 遍历一组漏电压,逐个设置并调用提取流程
foreach Vd {0.1 0.5 1.0 1.5} {
    set Vd_val $Vd
    # 将当前值写回 SWB 变量(具体命令依 SWB 版本而定)
    # 这里以调用工具节点为例
    exec sdevice -v $Vd_val
    if {$Vd_val > 1.0} {
        puts "高偏置点:$Vd_val V,需检查击穿判据"
    } else {
        puts "低偏置点:$Vd_val V,正常提取"
    }
}

这段脚本体现了两个关键点:一是 foreach 的列表用 {} 包裹,元素之间以空格分隔;二是 if 的条件表达式放在 {} 中,比较运算符 > 在 Tcl 中需要写成实体或直接使用 > 字符,但在 HTML 中应转义为 >。实际在 SWB 中,更常见的做法不是用 exec 直接调用仿真器,而是通过 SWB 的节点机制触发,脚本只负责设置变量和判断条件。这样做的原因是 SWB 需要跟踪每个节点的状态、日志和依赖关系,绕过节点直接 exec 会丢失这些管理信息。

四、命令执行机制:从脚本到工具

Tcl 的命令执行遵循“命令名 + 参数列表”的统一形式。在 SWB 中,用户脚本能调用的命令大致分为三类:Tcl 内置命令(set、expr、if、foreach、proc 等)、SWB 扩展命令(用于操作工程、节点、变量,具体名称依版本而定)、以及外部命令(通过 exec 调用 sdevice、sprocess、sde 等)。

命令替换和变量替换是 Tcl 解析的两个核心动作。方括号 [] 表示命令替换,即先执行括号内的命令,再把结果作为外层命令的参数;美元符号 $ 表示变量替换。例如:

set nodes [list "sde" "sdevice" "inspect"]
set count [llength $nodes]
puts "共 $count 个工具节点:$nodes"

这里 [list ...] 先构造一个列表,[llength $nodes] 再计算长度。理解替换顺序,可以避免很多“为什么变量没展开”的问题。另一个常见机制是 proc 定义过程,把重复的提取逻辑封装起来:

proc extract_iv {bias_file out_csv} {
    if {![file exists $bias_file]} {
        puts "错误:找不到 $bias_file"
        return -1
    }
    # 调用 Inspect 或自定义解析逻辑
    exec inspect -f $bias_file -o $out_csv
    return 0
}

set rc [extract_iv "iv_bias.txt" "iv_result.csv"]
puts "提取返回码:$rc"

在 SWB 中,proc 通常放在项目级脚本或独立的 .tcl 文件中,通过 source 加载。这样可以把参数扫描、结果提取、日志检查等逻辑模块化,避免每个节点重复写相同代码。

在 SWB 中调试 Tcl 脚本时,优先使用 puts 输出中间变量,并观察 SWB 的日志窗口。若脚本在 GUI 中不报错但结果不对,多半是变量替换时机或节点依赖顺序的问题,而不是语法错误。

五、一个可复用的参数扫描片段

下面给出一个结构完整、可直接参考的参数扫描与结果记录片段。它假设 SWB 变量表中已有 @Lg@ 和 @Vd@,脚本遍历一组栅长,对每个栅长设置变量并记录返回状态。示例中的数值为教学假设值,实际使用时需替换为真实工艺与电学参数。

# 参数扫描示例:遍历栅长,记录每个点的执行状态
set Lg_list {0.02 0.03 0.05 0.08}
set log_file "scan_log.csv"
set fp [open $log_file w]
puts $fp "Lg_um,status,note"

foreach Lg $Lg_list {
    set Lg_val $Lg
    set status "OK"
    set note ""
    if {$Lg < 0.03} {
        set note "短沟道,注意 DIBL"
    }
    # 此处触发 SWB 节点执行或调用工具
    # exec sdevice ...
    puts $fp "$Lg,$status,$note"
}
close $fp
puts "扫描日志已写入 $log_file"

这段脚本的价值在于:它把“参数列表—逐点设置—条件判断—结果记录”串成了一条可检查的链路。运行后,打开 scan_log.csv 即可看到每个栅长对应的状态和备注,便于判断哪些点需要进一步检查。若某个点执行失败,日志中会留下记录,而不是被静默跳过。

六、常见问题与判断依据

在 SWB 中使用 Tcl 时,最常见的三类问题及判断方式如下。第一类是变量未定义:脚本报 can't read "xxx": no such variable,通常是因为 @变量@ 拼写与 SWB 变量表不一致,或变量在节点执行时尚未建立。第二类是替换时机错误:脚本中写了 $Vd 但实际想用的是 SWB 的 @Vd@,结果取到空值。第三类是命令路径问题:exec sdevice 报找不到命令,通常是因为 SWB 环境变量未正确继承,需要在脚本中显式设置路径或使用 SWB 提供的工具调用接口。

判断脚本是否真正生效,不能只看 GUI 是否报错。更可靠的做法是检查三处:SWB 日志窗口中是否出现脚本的 puts 输出;工具节点的输入文件是否被更新;后处理生成的 CSV 或图表是否包含预期的新数据点。三者一致,才能说明脚本从变量到命令再到结果的链路是通的。