2日目(様々なサンプルプログラムとsdeの構築)

はじめにちょっとした小技など

マニュアルをみる

Sentaurus のマニュアルはインストールされたdirectoryの下にあります。

/home/software/synopsys/sentaurus/M_2016.12-SP2/tcad/M-2016.12-SP2/manuals/PDFManual/

evince /home/software/synopsys/sentaurus/M_2016.12-SP2/tcad/M-2016.12-SP2/manuals/PDFManual/front.pdf


WorkbenchのマニュアルやSentaurus Structure Editor やSentaurus Device をよく使います。

クリックすると詳しいマニュアルが出てくるので辞書代わりに使ってください。

manual.png

プロジェクトのCleanup

たとえば、最初のexampleで二つのノードを実行した後

5wb.png

myexampleフォルダの中身は

[atlaspc7] ~/work/Silicon/TCAD/Sentaurus/tutorials/myexample % ls 
IV_-10_150_30_circuit_des.sav  gcomments.dat     n1_dvs.err  n4_000000_des.tdr  n4_des.log   sde_dvs.cmd
IV_-10_150_30_des.sav          gexec.cmd         n1_dvs.log  n4_000001_des.tdr  n4_des.out   sde_dvs.prf
IV_-20_150_30_circuit_des.sav  gtree.dat         n1_dvs.out  n4_000002_des.tdr  n4_des.plt   sdevice_des.cmd
IV_-20_150_30_des.sav          gtree.dat.backup  n1_dvs.sta  n4_000003_des.tdr  n4_des.sta   sdevice_des.prf
SVisualTcl.log                 gvars.dat         n1_msh.cmd  n4_000004_des.tdr  n4_des.tdr   usrdefvars.dat
SVisualTcl.log.BAK             n1_bnd.tdr        n1_msh.log  n4_000005_des.tdr  pp1_dvs.cmd
cmlog.txt                      n1_dvs.cmd@       n1_msh.tdr  n4_des.err         pp4_des.cmd

こんな感じ。ほとんどは中間ファイルなのでgitにアップロードしたり、人に渡すときはいらない。

NodeのCleanup

クリーンナップしたいノードで右クリック --> Cleanup Node Output そうすると中間ファイルが消えてノードが白くなる。

プロジェクトのCleanup

メニューの Project->Operation->Clean up そうすると中間ファイルが全部消えます。

プロジェクトを人に渡すときはこれをやってからtar.gzで圧縮して送ると親切。

ただしこれだけだと、*.savや*.logファイルは消えないので、

rm -f *.sav *.log *.BAK

をするともっと親切。

ワークベンチを使わない方法(Batch Tools)

そもそも sde や sdevice, svisualなどはコマンドラインで使えます。preprocessが終わっていればそのままnXX_dvs.cmdなどが実行できます。

cd ~/work/Silicon/TCAD/Sentaurus/tutorials/myexample
sde -e -l n1_dvs.cmd

そのほか、

spp : プロジェクトのpre-processを走らせるコマンド

gsub : jobをスケジューラにサブミットするコマンド

gjob : 一つのjobつまり一つのnodeを走らせる方法

gcleanup : projectをクリーンアップする方法(クリーンアップに関しては次の章を参照)

gtclsh : tclスクリプトを実行するコマンド

などなど

例えば、

cd ~/work/Silicon/TCAD/Sentaurus/tutorials/myexample
spp . 
gjob -verbose -job 1 .
gjob -verbose -job 4 .

とすることでmyexampleの node 1とnode 4が実行される。

構造を見たいときは、

svisual  n1_msh.tdr 

色々見やすくしたりドープ量のプロットを見たりして遊んでみてください。

一度行った動作は、tcl (スクリプト言語)として logに残ります。

右下のSaveボタンで保存しておくと次回はそのtclスクリプトを実行するだけで同じプロットが作れます。

例えば、以下のファイルをコピーして実行してみてください。

cp /home/kojin/work/Silicon/TCAD/Sentaurus/tutorials/myexample/drawdoping.tcl .
 
svisual drawdoping.tcl

以下の図が得られるはずです。

drawdoping.png

圧縮済みのプロジェクトを読み込む方法

既に作られたプロジェクトは、directoryをコピーするか、もしくはtar.gzでもらうとそのままワークベンチで開くことが出来ます。

cd ~/work/Silicon/TCAD/Sentaurus/tutorials
mkdir tar_src
cd tar_src
cp /home/kojin/work/Silicon/TCAD/Synopsys/tutorials/Simple2D.tar.gz .
swb&

ここでワークベンチを立ち上げるとSimple2D.tar.gzと言うファイルを直接読み込むことが出来ます。

読み込んだ場所のSimple2D.tar.gzをダブルクリックします。

selecttar.png

どうやって開くか聞かれるのでSave Asで好きなところに保存します。

unpacking.png

例えば以下の様にするとtutorial以下に直接 Simple2D というプロジェクトのdirectory が出来ます。

saveselect.png:
saveselect.png

OKをおすとSimple2DというDirectoryが開かれた状態になります。


opened.png

このプログラムは次回以降も使います。

最初のsdeだけ走らせてみてください (node 27)。svidualでできた構造を確認してみてください。

半導体構造の構築 (sde)

2次元の構造

先ほど作ったSimple2Dの例で構造の作り方を見てみましょう。以下のファイルを開いてください。

~/work/Silicon/TCAD/Sentaurus/tutorials/Simple2D/Simple2D_dvs.cmd

中身を見て何をやっているのかを理解してみましょう。

(何となくわかるかと思いますが、わからないところは聞いてください。)

3次元の構造

cd ~/work/Silicon/TCAD/Sentaurus/tutorials/tar_src
cp /home/kojin/work/Silicon/TCAD/Synopsys/tutorials/Simple3D.tar.gz .

swb&

上でやったように、Simple3D のプロジェクトを保存してみてください。

とりあえず node 1 を走らせて見てください。

svidual を使って n1_msh.tdrを開いてできた構造を確認してみてください。

Pixel3D_dvs.cmdの解説

まずは長さや厚み等の定義

(sde:clear)

(define TSUB 150.0 )

(define Lpixel_pitchX 50.0)
(define LNplus_sizeX 30.0)

(define Lpixel_pitchY 50.0)
(define LNplus_sizeY 30.0)


(define NX @NX@)
(define NY @NY@)


(define LX (* NX Lpixel_pitchX))
(define LY (* NY Lpixel_pitchY))

(define Dop_PSub 1e12)
(define Dop_Nplus 1e19)
(define Dop_PPlus 1e+19)
(define Nplus_Depth 0.8)

3Dのデバイスを製作するにはいろんな方法があります。ここではデバイスエミュレーションという方法を紹介します。gdsファイルを読み込んだりいろんなことができるからです。

プロセスシミュレーションほど細かい指定はできませんが、deposit やetchingが可能です。

まずは、マスクを作っていきます。

基本的には list と呼ばれる数字の配列で (x0 y0 x1 y1 x2 y2 x3 y3) のように点(x,y)を作り直線で結んだ形になります。

(define nplist (list))

(
do ((i 0 (+ i 1))) ((>= i NY))
(
do ((j 0 (+ j 1))) ((>= j NX))
(define ff (list
(+ (* j Lpixel_pitchX) (* 0.5 (- Lpixel_pitchX LNplus_sizeX)))
(+ (* i Lpixel_pitchY) (* 0.5 (- Lpixel_pitchY LNplus_sizeY)))
(+ (* j Lpixel_pitchX) (* 0.5 (+ Lpixel_pitchX LNplus_sizeX)))
(+ (* i Lpixel_pitchY) (* 0.5 (- Lpixel_pitchY LNplus_sizeY)))
(+ (* j Lpixel_pitchX) (* 0.5 (+ Lpixel_pitchX LNplus_sizeX)))
(+ (* i Lpixel_pitchY) (* 0.5 (+ Lpixel_pitchY LNplus_sizeY)))
(+ (* j Lpixel_pitchX) (* 0.5 (- Lpixel_pitchX LNplus_sizeX)))
(+ (* i Lpixel_pitchY) (* 0.5 (+ Lpixel_pitchY LNplus_sizeY)))
))
(set! nplist (append nplist (list ff)))
)
)
(sdepe:generate-mask "MaskNplus" nplist )

何を作っているのか見当は付きますか? NX x NY のピクセルマトリックスを作っていてそれぞれのピクセルにNplusのサイズの正方形をlistにしてそこから generate-maskでマスクを作っています。。


(sdegeo:create-cuboid (position 0 0 0) (position LX LY TSUB) "Silicon" "Substrate")
(sdepe:pattern "mask" "MaskNplus" "polarity" "dark" "material" "Resist" "thickness" 1 "type" "aniso" "algorithm" "sweep" )

(sdeio:save-tdr-bnd (get-body-list) "n@node@_pat0_Res_bnd.tdr")

ここで実際にものを置いていきます。最初のsdegeo:create-cuboidは直方体を作っています。

そこに先ほど作ったMaskNplusというのをpatterningしています。N+のドープをするためにドープしたくない部分をレジストで覆います。

sdepe:patternというのは

"mask" : マスクを指定

"polarity" : dark or lightを指定します。半導体プロセスと一緒でlightのマスクはマスク部分が透明、darkはマスク以外の部分が透明のマスクです。

"material" : patterningをするマテリアルです。今回はレジスト

"type" : iso or anisoの選択です。したが平らなのであまり関係ないですが、下図のような違いがあります。

"algorithm" : 表面のoffsettingのアルゴリズム。 anisoの場合は sweepのみ。

ISO_ANISO.png

n1_pat0_Res_dvs.tdr というファイルがある出来ていると思うのでSVidualで確認してみる。

n1_pat0.png

(sdedr:define-gaussian-profile "Nplus" "PhosphorusActiveConcentration" "PeakPos" 0  "PeakVal" Dop_Nplus "ValueAtDepth" Dop_PSub "Depth" Nplus_Depth "Gauss"  "Factor" 0.8)

(sdepe:implant "Nplus" "flat")

(entity:delete (find-material-id "Resist"))

(sdeio:save-tdr-bnd (get-body-list) "n@node@_pat1_rmRes_bnd.tdr")

ここで先ほど作ったレジストの形にimplantを作成しています。

sdedr:define-gausian-profile でガウス分布に従うリンのドープを設定しています。

引数は大体想像がつくと思いますが、FunctionとFactorは側面の形状を決めています。

implantを作った後はresistを取っ払ってしまっています。ここまでのデバイスを n1_pat1_rmRes_bnd.tdrに保存しています。

見てみるとresistが消えています。ドープをしましたがこれはメッシュを切るまでわかりません...

最後の(sde:build-mesh "snmesh" " " "n@node@_msh") saveの直前に書いて残りをコメントアウトすれば見れるかもしれません。

n1_pat1.png n1_pat2_msh.png

(define hh (entity:copy (find-mask "MaskNplus")))
(sde:attrib-remove hh "maskname")
(generic:add hh "maskname" "MaskContAl")
(sde:offset-mask "MaskContAl" -10)


(sdepe:pattern "mask" "MaskContAl" "polarity" "light" "material" "Aluminum" "thickness" 0.5 "type" "aniso" "algorithm" "sweep" )

(sdeio:save-tdr-bnd (get-body-list) "n@node@_pat2_DCcont_bnd.tdr")

ここではAlとN+のコンタクトを作っています。本当はもう一度マスクを作ればよいのですが、面倒なのでMaskNplusを10um小さくした新しいマスク MaskContAl を製作して同様にpatternを作っています。

ここまでの様子はn1_pat2_DCcont_bnd.tdrで見られます。

n1_pat2.png

(sdepe:fill-device "material" "Oxide")

(sdeio:save-tdr-bnd (get-body-list) "n@node@_pat3_OxFill_bnd.tdr")

コンタクト以外の部分は酸化膜で覆っておきましょう。

n1_pat3_OxFill_bnd.tdrで確認できます。(見やすいようにZ軸を10倍スケールしてます。)

n1_pat3.png

(define gg (entity:copy (find-mask "MaskNplus")))
(sde:attrib-remove gg "maskname")
(generic:add gg "maskname" "MaskTopAl")
(sde:offset-mask "MaskTopAl" 5.0)
(sdepe:pattern "mask" "MaskTopAl" "polarity" "light" "material" "Aluminum" "thickness" 0.5 "type" "aniso" "algorithm" "sweep" )

(sdeio:save-tdr-bnd (get-body-list) "n@node@_pat4_Al_bnd.tdr")

トップのアルミもマスクの再利用で作ります。N+より5umほど大きなアルミを作ってます。

結果はn1_pat4_Al_bnd.tdr で見れます。

n1_pat4.png

(sdepe:fill-device "material" "Oxide")

(sdeio:save-tdr-bnd (get-body-list) "n@node@_pat5_OxFill_bnd.tdr")

こちらも酸化膜をFillしておきます。

n1_pat5.png

(bool:unite (find-material-id "Oxide"))
(bool:unite (find-material-id "Aluminum"))
(sde:separate-lumps)
(sdeio:save-tdr-bnd (get-body-list) "n@node@_pat6_Unite_bnd.tdr")

上の図で二段階にAlや酸化膜をpatterningしたので二つの別のパーツになってしまっています。

これを一つにするのが bool:unite というコマンドです。結果はこんな感じです。

n1_pat6.png

ここまでで構造体はできました。

ここからはシミュレーションに必要なコンタクトとn+以外のドープを行っていきます。

まずは表面のn+電極です。

;;  making contact for Electrode
(
do ((i 0 (+ i 1))) ((>= i NY))
(
do ((j 0 (+ j 1))) ((>= j NX))
(sde:add-material (find-body-id
(position (+ (* j Lpixel_pitchX) (* 0.5 Lpixel_pitchX))
(+ (* i Lpixel_pitchY) (* 0.5 Lpixel_pitchY))
(+ TSUB 0.1)))
"Aluminum" (string-append "RAl" (number->string j) (number->string i)))
(sdegeo:define-contact-set (string-append "NplusElec" (number->string j)
(number->string i)) 4 (color:rgb 1 0 0 ) "##")
(sdegeo:set-current-contact-set (string-append "NplusElec" (number->string j) (number->string i)) )
(sdegeo:set-contact-boundary-faces (find-region-id (string-append "RAl" (number->string j) (number->string i)))
)
)
)

(sdeio:save-tdr-bnd (get-body-list) "n@node@_pat7_ContNp_bnd.tdr")

見ると大体何をやっているかわかると思います。電極になる部分の一点を指定してfind-body-idをしてそれをcontact-setしています。

SVidualではマジェンダに表示されるので確認してみてください。

n1_pat7.png

;; doping for backside
(sdedr:define-refeval-window "RefEval_PBack" "Rectangle" (position 0 0 0) (position LX LY 0))
(sdedr:define-gaussian-profile "DopPBack" "BoronActiveConcentration" "PeakPos" 0 "PeakVal" Dop_PPlus "ValueAtDepth" Dop_PSub "Depth" 5 "Gauss" "Factor" 0.8)
(sdedr:define-analytical-profile-placement "Place_PBack" "DopPBack" "RefEval_PBack" "Both" "NoReplace" "Eval")

ここでは裏面にp+をドープしています。これもガウス分布でドープしています。

;; making contact for backside 
(sdegeo:define-contact-set "PBack" 4 (color:rgb 1 0 0 ) "##")
(sdegeo:set-current-contact-set "PBack")
(sdegeo:set-contact-faces (find-face-id (position 0.1 0.1 0)))

(sdeio:save-tdr-bnd (get-body-list) "n@node@_pat8_ContBack_bnd.tdr")

ドープした裏面をバイアスをかけるための電極に設定しています。

下側に電極ができたのを確認してみてください。

n1_pat8.png

;;(entity:delete (find-material-id "Aluminum"))

シミュレーション自体にはAlは必要ないので消してしまってもよいのですが、あってもよいのでここはコメントアウトしています。

;; doping for substrate
(sdedr:define-constant-profile "ConstantProfileDefinition_1" "BoronActiveConcentration" Dop_PSub)
(sdedr:define-constant-profile-material "ConstantProfilePlacement_1" "ConstantProfileDefinition_1" "Silicon")
;; mesh refinement for
(sdedr:define-refinement-size "RefinementDefinition_1" (* 0.1 LX) (* 0.1 LY) (/ TSUB 20.0) 0.5 0.5 0.5 )
(sdedr:define-refinement-placement "RefinementPlacement_1" "RefinementDefinition_1" (list "material" "Silicon" ) )
(sdedr:define-refinement-function "RefinementDefinition_1" "DopingConcentration" "MaxTransDiff" 1)

シリコン層にホウ素をドープしてその後メッシュを切っています。この切り方はシミュレーションの早さにもつながるので最適化が必要です。

;(sdegeo:translate-selected (get-body-list) (transform:translation (gvector (- 0 (* 0.5 LX)) (- 0 (* 0.5 LY)) 0)) #f 0)
;(sdegeo:translate-selected (get-drs-list) (transform:translation (gvector (- 0 (* 0.5 LX)) (- 0 (* 0.5 LY)) 0)) #f 0)

(sde:build-mesh "snmesh" " " "n@node@_msh")

translate-selectedは、軸をしふとさせるコマンドです。真ん中のピクセルの中心を(0,0)にしたいときはこれをやる必要があります。

(ただし、Alをremoveしていないと電極がシフトしない問題があります。ちょっとよくわかっていません。)

以上で完成です。最終的にこんなものが出来上がります。 n1_msh.tdrというファイルです。

n1_msh.png

GDSファイルの読み込み

トランジスタとメタル構造

GDSファイルを読み込むことは難しくはないが、GDSの情報はあくまでも二次元のマスクなので(上の例で散々作ったMask)これを発展させてちゃんとした構造にする必要がある。


cd ~/work/Silicon/TCAD/Sentaurus/tutorials/tar_src
cp ~kojin/work/Silicon/TCAD/Synopsys/tutorials/LOAD_GDS.tar.gz .
swb&

前の例と同様にLGAD_GDSというプロジェクトを作って実行してみてください。

SDEとSPROCESSの例が両方入っていますが、SDEの方を実行してみてください。

GDSファイルを読んでいる場所はここです。

(define GDSFILE "TCAD_PIXEL_v3.gds")
(define CELLNAME "TCAD_PIXEL_v3")
(define LAYERNAMES (list 'PWELL 'POLY 'ACT 'NO_PW 'NPLUS 'CONT 'PW_LVT 'MET1 'VIA1 'MET2 'VIA2 'MET3 'VIA3 'MET4 'ULENS 'PD1 'PD2 'SN1 'SN2 'SN3 ))
(define LAYERNUMBERS (list '1:0 '8:0 '9:0 '17:82 '32:0 '34:0 '35:0 '40:0 '41:0 '42:0 '43:0 '44:0 '49:0 '50:0 '89:0 '92:82 '93:0 '94:0 '94:43 '94:95 ))

(sdeicwb:gds2mac "gds.file" GDSFILE "cell" CELLNAME "layer.names" LAYERNAMES "layer.numbers" LAYERNUMBERS "sim3d" (list 0 -6000 6000 0) "scale" 1.0e-3 "domain.name" "SIM3D" "mac.file" "TCAD_PIXEL")

(read-layout-init-domain "TCAD_PIXEL_SIM3D.mac" #f "SIM3D")

GDSファイルにはマスクの数だけLAYERが入っています。その番号と名前をアサインしていって、最終的にそのマスクの点情報を.macファイルに書き出しているだけです。

GDSファイルを開ける人は見るとこんな感じになっています。

2018-06-25.png

その後はひたすらこのマスクをもとに構造体を作っていきます。

(define TSUB 7.0)

(sdepe:add-substrate "material" "Silicon" "thickness" TSUB "region" "substrat")

(sdepe:pattern "mask" "ACT" "polarity" "light" "material" "Resist" "thickness" 1 "type" "aniso" "algorithm" "sweep" )

(sdepe:etch-material "material" "Silicon" "depth" 0.420 "taper-angle" 5)

(entity:delete (find-material-id "Resist"))

(sdepe:fill-device "material" "Oxide" "height" (+ TSUB 0.008))


(sdepe:pattern "mask" "POLY" "polarity" "light" "material" "PolySilicon" "thickness" 0.3 "type" "aniso" "algorithm" "sweep" )

(sdepe:depo "material" "dummy" "thickness" 0.03 "type" "iso" "algorithm" "lopx")
(sdepe:etch-material "material" "dummy" "depth" 0.03 "type" "aniso")

もう何をやっているのか大体わかってきたかと思います。

最終的にはこんなものが出来上がってきます。

load_gds.png

ここまで終わったら演習問題 Tutorial4thTCADDay2Question をやってみてください。

(参考) HPK 6th mask の構造

以上のことを組み合わせるとHPKのセンサーもかなりちゃんと再現できます。


cd ~/work/Silicon/TCAD/Sentaurus/tutorials/tar_src
cp /home/kojin/work/Silicon/TCAD/Synopsys/tutorials/HPK6th3D.tar.gz .
swb&

同じように走らせるとstructureができる。

構造を作るのにも、電場シミュレーションにもかなり時間がかかるので実際にこれを使うには構造を簡易化する必要がある。

hpk3d.png

-- Koji Nakamura - 2020-05-15

  • manual.png:

Topic attachments
I Attachment History Action SizeSorted ascending Date Who Comment
PNGpng 3tarinclude.png r1 manage 2.0 K 2020-05-15 - 08:41 KojiNakamura  
PNGpng unpacking.png r1 manage 3.3 K 2020-05-16 - 13:11 KojiNakamura  
PNGpng 2tarinclude.png r1 manage 3.6 K 2020-05-15 - 08:41 KojiNakamura  
PNGpng saveselect.png r1 manage 4.6 K 2020-05-16 - 13:11 KojiNakamura  
PNGpng 1tarinclude.png r1 manage 10.8 K 2020-05-15 - 08:41 KojiNakamura  
PNGpng selecttar.png r1 manage 17.0 K 2020-05-16 - 13:11 KojiNakamura  
PNGpng 5wb.png r1 manage 29.1 K 2020-05-15 - 08:41 KojiNakamura  
PNGpng 4openedproj.png r1 manage 30.9 K 2020-05-15 - 08:41 KojiNakamura  
PNGpng opened.png r1 manage 47.5 K 2020-05-16 - 13:11 KojiNakamura  
PNGpng drawdoping2.png r1 manage 89.2 K 2020-05-15 - 10:30 KojiNakamura  
PNGpng drawdoping.png r1 manage 94.0 K 2020-05-15 - 10:33 KojiNakamura  
PNGpng manual.png r1 manage 182.3 K 2020-05-16 - 14:40 KojiNakamura  

This topic: Main > TCADSimulationInformation > Tutorial4thTCADWorkshop > Tutorial4thTCADDay2
Topic revision: r4 - 2020-05-21 - AtlasjSilicon
 
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2022 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback