Tool command language(Tcl)
4. 示例
介绍TCAD sentaurus特有的Tcl示例
4.1 Inspect: 抽取击穿电压
source util_ins.cmd
proj_load break.plt D
cv_create IcVc "D IcVc(4) x" "D IcVc(4) y"
set Ilevel 1e-8
Extract_BV IcVc $Ilevel
cv_display IcVc
cv_setCurveAttr IcVc "IcVc" \
red solid 3 circle 3 defcolor 1 defcolor
gr_setAxisAttr X {Collector Voltage (V)} 14 {} {} black 1 14 0 5 0
gr_setAxisAttr Y {Current (A)} 14 {} {} black 1 14 0 5 1
此示例“Inspect_ins.cmd”显示了如何在Inspect输入流中混合Tcl命令和Inspect命令,以从双击晶体管模拟结果中提取开路基极击穿电压。
提取不同的击穿电压:
1)BV_vmax定义为扫描期间获得的最大集电极电压
2)BV_Ilevel被定义为集电极电流超过某一值时的集电极电压
如果“Inspect”工具节点没有完成状态,既不是黄色,请首先运行该节点以生成结果。然后,单击“Run Selected Visualizer Nodes Together” 工具栏按钮以创建绘图。
首先,来源文件util_ins.cmd,提供击穿电压提取程序EXTRACT_BV:
source util_ins.cmd
其次,加载.plt文件并创建集电极I-V曲线
proj_load break.plt D
cv_create IcVc "D IcVc(4) x" "D IcVc(4) y"
最后,通过使用限流调用EXTRACT_BV来提取击穿电压
set Ilevel 1e-8
Extract_BV IcVc $Ilevel
击穿电压提取程序EXTRACT_BV在文件util_ins.cmd中定义
因此,Inspect节点返回从“DOE:”输出中提取的值:
DOE: BV_vmax 75.35
DOE: BV_Ilevel 40.91
DOE: Ilevel 1e-8
proc Extract_BV { Cname Ilevel } {
set VList [cv_getValsX $Cname]
set IList [cv_getValsY $Cname]
set vmax 0.0
set vi 0.0
foreach v $VList i $IList {
if { $v > $vmax } { set vmax $v }
if { $i >= $Ilevel && $vi == 0.0} { set vi $v}
}
ft_scalar BV_vmax $vmax
ft_scalar BV_Ilevel $vi
ft_scalar Ilevel $Ilevel
}
Inspect命令cv_getValsX 和cv_getValsY将Inspect曲线转换为Tcl列表,其中包含曲线的x或y值
Inspect命令ft_scalar打印提取的值并将其传递给Sentaurus Workbench.
4.2 Sentaurus Process: 抽取SiO2厚度
本示例sprocess_fps.cmd.演示了在Sentaurus Process命令文件中使用Tcl脚本
#--- 1D Grid definition ----------------------------------------------
line x location=0.0 spacing= 2<nm> tag=SiTop
line x location=0.5<um> spacing= 50<nm> tag=SiBottom
#--- Initial simulation domain ---------------------------------------
region silicon xlo=SiTop xhi=SiBottom
#--- Initialize the simulation ---------------------------------------
init concentration=1.0e15<cm-3> field=Boron wafer.orient=100
#--- Grid settings for automatic meshing in newly generated layers -
grid set.min.normal.size=3<nm> set.normal.growth.ratio.2d=1.4
#--- Growing screening oxide -----------------------------------------
gas_flow name=O2_1_N2_1 pressure=1<atm> \
flowO2=1.2<l/min> flowN2=1.0<l/min>
diffuse temperature=1000<C> time=40<min> gas_flow=O2_1_N2_1
grid remesh
#--- Measuring the oxide thickness -----------------------------------
select z=Boron
set LAYERS [layers]
puts "$LAYERS"
#->{ Top Bottom Integral Material }
#->{ -1.584176604347e-02 1.126859234306e-02 6.391490417248e+09 Oxide }
#->{ 1.126859234306e-02 5.000000000000e-01 4.360844257716e+10 Silicon }
set FirstColumn [list]
foreach Row $LAYERS {
lappend FirstColumn [lindex $Row 0]
}
set Tox [expr [lindex $FirstColumn 2] - [lindex $FirstColumn 1]]
puts "The thickness of the grown oxide is \
[format %.2f [expr 1e3*$Tox]] nm"
#-> The thickness of the grown oxide is 27.20 nm
puts "DOE: Tox $Tox"
Sentarurus Process接收到仿真命令后,Sentaurus Process Tcl函数层用于提取有关生成的层的信息作为列表。每个图层条目都是一个列表,包含了顶部和底部坐标、当前数据集的积分值(此处不研究这个),以及材料:
set LAYERS [layers]
puts "$LAYERS"
#->{ Top Bottom Integral Material }
#->{ -1.584176604347e-02 1.126859234306e-02 6.391490417248e+09 Oxide }
#->{ 1.126859234306e-02 5.000000000000e-01 4.360844257716e+10 Silicon }
为了提取氧化物厚度,Layers表被简化为一个简单的平面列表,由第一列也就是顶部坐标构成:
set FirstColumn [list]
foreach Row $LAYERS {
lappend FirstColumn [lindex $Row 0]
}
然后,通过减去第一层和第二层的顶部坐标来确定氧化物厚度。结果作为DOE:output打印到日志文件中,这样Sentaurus Workbench可以从输出中提取结果并将其添加到结果表中。
set Tox [expr [lindex $FirstColumn 2] - [lindex $FirstColumn 1]]
puts "The thickness of the grown oxide is \
[format %.2f [expr 1e3*$Tox]] nm"
#-> The thickness of the grown oxide is 27.20 nm
puts "DOE: Tox $Tox"
使用命令行选项-n运行Sentautus Process, 以在使用Tcl表达式时忽略语法检查,Tcl表达式使用尽在运行时可用的信息。