# Sentaurus TCAD 筆記 ###### tags: TCAD [toc] ## 參數輸出語法 * 適用工具:sprocess * snmesh、svisual 與 sdevice 似乎都不能使用此語法。 有時你會希望自動輸出某界面的座標,以作為後續模擬參數。例如說你設定了五層磊晶結構,就至少有四個界面座標,如 A/B/C/D/E。此外你想要在接下來的 sprocess 中,於C區設定更細緻的網格(refinebox)。這時你可能就會想要知道 B/C 界面座標,以及 C/D 界面座標。 ![](https://i.imgur.com/0CVK6dZ.png) ``` set A [expr -@BF_Thick@-@AB_Thick@-@GR_Thick@-@CH_Thick@-@ML_Thick@] set B [expr @Sub_Thick@+@BF_Thick@+@AB_Thick@+@GR_Thick@+@CH_Thick@+@ML_Thick@] set C [expr -@BF_Thick@-@AB_Thick@-@GR_Thick@] set D [expr -@BF_Thick@-@AB_Thick@] set E [expr -@BF_Thick@] set F [expr $C-@CH_Thick@] puts "DOE: Xmin [format %.2f $A]" puts "DOE: Thickness [format %.2f $B]" puts "DOE: GRTop [format %.2f $C]" puts "DOE: ABTop [format %.2f $D]" puts "DOE: ABBottom [format %.2f $E]" puts "DOE: ChTop [format %.2f $F]" set W [expr @W0@] puts "DOE: Width $W" ``` 上述程式碼中的 ``` set A [expr -@BF_Thick@-@AB_Thick@-@GR_Thick@-@CH_Thick@-@ML_Thick@] ``` 意思就是將`A`設定為後方的數字,接著再將它輸出到 swb 平台中。 ``` puts "DOE: Xmin [format %.2f $A]" ``` 這是說,將它命名為`Xmin`,並且其格式為浮點數(`%.2f`),並將數值保留至小數點以下第二位。輸出成功就會出現在 swb 參數列表後面。 ![](https://i.imgur.com/piRJ0sh.png) ## 邏輯判斷語法 * 適用工具:sprocess、sdevice * snmesh 不能使用此語法。 * 不太確定這是不是 [tcl 語法](https://zh.wikibooks.org/zh-tw/Tcl_編程/簡介)。 如果想要在 SWB 設定「開啟」或「關閉」某物理模型,那麼就可以在 sdevice 中設定如下語法: ![](https://i.imgur.com/pzYo7nC.png) ``` #if "@Tunneling@" == "Hurkx" #define _B2BTunnelModel_ Band2Band(Model=Hurkx) #define _B2BTunnelMath_ NoSRHperPotential #elif "@Tunneling@" == "E1" #define _B2BTunnelModel_ Band2Band(Model=E1) #define _B2BTunnelMath_ NoSRHperPotential #elif "@Tunneling@" == "E1_5" #define _B2BTunnelModel_ Band2Band(Model=E1_5) #define _B2BTunnelMath_ NoSRHperPotential #elif "@Tunneling@" == "E2" #define _B2BTunnelModel_ Band2Band(Model=E2) #define _B2BTunnelMath_ NoSRHperPotential #else #define _B2BTunnelModel_ #define _B2BTunnelMath_ #endif ``` 其中可以看到在 `#else` 之後,我們是將 `_B2BTunnelModel_` 定義為空白,這其實就是「關閉此模型」的意思。 ## 自動對「*.plt」進行數值處理並輸出結果 很多時候你需要變化某個參數,觀察元件電性的變化,例如崩潰電壓隨倍增層濃度的變化。如果需要手動去找最佳結構參數,這時就會需要這種自動化功能。 ![](https://i.imgur.com/kkfNOBi.png) 上圖就是自動讀取模擬完之後的 IV 數據,並自行萃取最大電壓`Vmax`、崩潰電壓`Vb`、崩潰電阻`Rb`與擊穿電壓`Vpt`。做法就是使用 inspect tool——上圖那台綠色畫面的測量儀器。 ``` source /home/mbelab/TCAD/r06943183/APD/util_ins.cmd proj_load IV_n@previous@_des.plt D cv_create IVdata "D anode OuterVoltage" "D anode TotalCurrent" Extract_IV IVdata proj_load NetActive/n@node|-3@_NetActive.plx D2 cv_create ConcData "D2 NetActive x" "D2 NetActive y" Extract_NetActive ConcData @ML_Conc@ @GRTop@ @CH_Thick@ script_exit ``` 其中的程式碼如上所示。其格式為(詳見 inspect_ug.pdf): ``` command {arg def_value} ``` 1. 第一行是指載入我事先寫好的函數(語法詳見 [Tcl 編程/簡介](https://zh.wikibooks.org/zh-tw/Tcl_編程/簡介)),其絕對路徑為`/home/mbelab/TCAD/r06943183/APD/util_ins.cmd`。 ``` source /home/mbelab/TCAD/r06943183/APD/util_ins.cmd ``` 2. 載入我們想要讀取的數值檔`IV_n@previous@_des.plt`,至於後面的`D`則是它載入後的代稱、名字。 ``` proj_load IV_n@previous@_des.plt D ``` 3. 建立一個名為`IVdata`的`(x,y)`陣列,其`x`為`"D anode OuterVoltage"`,而`y`則是`"D anode TotalCurrent"`。其中`"D anode OuterVoltage"`意思為「`D`數值檔中,位於`anode`資料類別中的`OuterVoltage`資料」,`y`的意義可以此類推。 ``` cv_create IVdata "D anode OuterVoltage" "D anode TotalCurrent" ``` 4. 最後就是將上述名為`IVdata`的`(x,y)`陣列,輸入最初我讀取進來的函數庫中的`Extract_IV`函數。 ``` Extract_IV IVdata ``` ### Tcl: Exract_IV ``` proc Extract_IV { Cname } { set VList [cv_getValsX $Cname] set IList [cv_getValsY $Cname] set vmax 0.0 set imax 0.0 foreach v $VList i $IList { if { $v < $vmax } { set vmax $v set imax $i } } set fvmax [format {%.2f} [expr $vmax]] set fimax [format {%.2e} [expr abs($imax)]] ft_scalar Vmax $fvmax ft_scalar Imax $fimax } ``` ### Tcl: Extract_NetActive ``` proc Extract_NetActive { Cname MLC} { set XList [cv_getValsX $Cname] set CList [cv_getValsY $Cname] set ConcJunction 1e14 foreach Conc $CList Position $XList { if { $Conc < $ConcJunction } { set pnjunction $Position } if { $Conc > $MLC } { set mulchjunction $Position break } } set MLthick [format {%.2f} [expr abs($mulchjunction - $pnjunction)]] ft_scalar MLThick $MLthick } ``` ## 輸出物質參數檔 在終端機輸入底下指令。 ``` sdevice -P:Si3N4 model_Si3N4.par & ``` 其中的 `&` 是指在「背景」執行的意思,但即便這指令沒有在背景執行好像也沒差。 ## 界面擴散設定 ``` ##----------------------------------------- ## InP / InGaAs ##----------------------------------------- pdbSetSwitch InP_InGaAs Zinc Surf.Recomb.Model Constant Default pdbSetDouble InP_InGaAs Zinc Transfer 1e4 pdbSetDouble InP_InGaAs Zinc Segregation 1 ``` 如果是 InGaAsP,原理應該一樣。 ## 電荷層濃度設定 在 sprocess_cmd 階段,需要小於 0.1 um 的 charge layer 設定,這樣之後在 snmesh 時,才能用 -3.7 開始來覆蓋濃度 ``` Analyticalprofile "ChargeLayerDoping" { Reference = "Charge" ReferenceElement { Element = Line [ (-3.7 0) (-3.7@Width@) ] Direction = negative } EvaluateWindow { Element = Rectangle [ (-3.7 0) (@GRTop@ @Width@) ] } LocalReplace #NotEvalLine Replace } ``` ## 多邊形網格區域(polygon) Definition {} ![](https://i.imgur.com/E7VigvA.png) ![](https://i.imgur.com/z34KzPG.png) Placements {} ![](https://i.imgur.com/yg3yGe8.png) ## 覆蓋自己設計的濃度分佈(Snmesh) ### 原則、注意事項 1. 讀取 NetActive.csv 2. 用 TCAD/translation.py,轉成 NetActive.plx(之後會補上 Python 程式碼說明) 3. 注意到其標題必須改為 `"DopingConcentration"`,而不是 `x` `y`。 4. 最後一行還要加上 `20 6.6666e17`,不然會因為少一個數據而使濃度變為零。 ### Refinement 的 value 屬性意義與設定 ``` RefineFunction = MaxTransDifference(Variable = "Dataset name", Value = value | vector | tensor) ``` 上述語法中的 `value` 指的是節點之間的最大濃度差;一但高於此濃度,就必須建立新的節點,以降低各節點之間的濃度差。這「差值」到底是由 log 的變化來看,還是以 asinh 的變化來看,就要看 datexcodes.txt。 > The transformation applied to the values used in the refinement functions (linear, logarithmic, arsinh) is defined in the datexcodes.txt file for each Variable (see Utilities User Guide, Variables on page 2). 例如: ``` DopingConcentration { label = "net impurity concentration" symbol = "N" unit = "cm^-3" factor = 1.0e+12 precision = 4 interpol = arsinh material = Semiconductor mincol = 1.0e10 maxcol = 1.0e20 alter1 = Net alter2 = 115 property ( "floops" ) = "NetActive" } ``` 這就是以 arcsinh 來算。也是可以改成 log 或 linear,底下就以 log 為例。 > Interpolation mode (linear, log, or arsinh; default linear). ``` Variables { DopingConcentration { label = "net impurity concentration" symbol = "N" unit = "cm^-3" factor = 1.0e+12 precision = 4 interpol = log material = Semiconductor mincol = 1.0e10 maxcol = 1.0e20 alter1 = Net alter2 = 115 property ( "floops" ) = "NetActive" } } ``` ![](https://i.imgur.com/BAyXCRh.png) 上左圖為 log,右圖為 asinh,可見 log 值+1時,asinh 值+2,差不多。 ### 總結:整體步驟 1. 藉 `sprocess_fps.cmd` 中的 `SetPlxList {NetActive}`,讀取出 `nXXXX_NetActive.plx`。 2. 藉 Filezilla,將該 `.plx` 傳至 `python/TCAD/DopingPlx/raw_data` 中。 3. 藉 `DopingPlx/translation.py`,將該 `.plx` 轉為容易平移座標的 `.csv`,之後再製作新的 `.plx` 檔,存於 `/new_data` 4. 此時,Python 已自動於最後一行加上 `20 6.6666e17` 5. 將 `/new_data/nXXXX_NetActive.plx` 傳送回TCAD資料夾中,在實驗專案目錄下的 `/data` 中。 ## 漸變層成分設定 ### Single MoleFraction ![](https://i.imgur.com/Pgl2ajB.png) 設定該層主要 Molefraction,例如底下的 0.33 與 0.7。 ``` Physics(Region="Grading"){ Molefraction( XFraction=0.33 YFraction=0.7 ) } ``` ### Linear MoleFraction ![](https://i.imgur.com/QJf3viu.png) * 大致跟 **Single MoleFraction** 設定方法相同。 * 另外需要設定「中間點」去連接從兩側界面延伸的莫耳分率線性變化。 * 底下的 `#` 符號並不是評論(comment),而是邏輯判斷用的**語法識別詞**。 ``` Physics(Region="Grading"){ Molefraction( XFraction=0.33 YFraction=0.7 #if "@Grading@" == "Ideal" Grading( (RegionInterface = ( "Multiplication" "Grading" ) XFraction=0.0 Grdistance=0.072) (RegionInterface = ( "Absorption" "Grading" ) XFraction=0.47 Grdistance=0.028) (RegionInterface = ( "Multiplication" "Grading" ) YFraction=0.0 Grdistance=0.072) (RegionInterface = ( "Absorption" "Grading" ) YFraction=1.0 Grdistance=0.028) ) ) } ``` ### Step-graded MoleFraction ![](https://i.imgur.com/3SZyWrK.png) #### sprocess_fps.cmd 在 **sprocess_ug.pdf** 中的 **region** 指令說明有提到: > Create a new material MySilicon, and then change the material of a region named bulk to MySilicon without changing the data: ``` mater name= MySilicon new.like= Silicon add region name= bulk MySilicon change.material !zero.data ``` 因此,作法為先沉積一層 InGaAsP,並賦予其區域名稱,之後再建立新物質名稱,然後將該區域的物質改為新物質。以此類推。 ``` ### 沈積 InGaAsP deposit material= InGaAsP type= anisotropic rate= 1<um/min> time= 0.05<min> \ fields.values= [MoleFractionFields InGaAsP 0.3 0.65] suppress.remesh \ region.name= Grading1 ;# X: Gallium, Y: Arsenic ### 建立新物質,命名為 MyInGaAsP1 mater name= MyInGaAsP1 new.like= InGaAsP add ### 將 Grading1 區域物質改為上述新物質,但不更改其相關屬性。 region name= Grading1 MyInGaAsP1 change.material !zero.data # 底下以此類推 deposit material= InGaAsP type= anisotropic rate= 1<um/min> time= 0.04<min> \ fields.values= [MoleFractionFields InGaAsP 0.3 0.65] suppress.remesh \ region.name= Grading2 ;# X: Gallium, Y: Arsenic mater name= MyInGaAsP2 new.like= InGaAsP add region name= Grading2 MyInGaAsP2 change.material !zero.data deposit material= InGaAsP type= anisotropic rate= 1<um/min> time= 0.03<min> \ fields.values= [MoleFractionFields InGaAsP 0.3 0.65] suppress.remesh \ region.name= Grading3 ;# X: Gallium, Y: Arsenic mater name= MyInGaAsP3 new.like= InGaAsP add region name= Grading3 MyInGaAsP3 change.material !zero.data ``` #### snmesh_msh.cmd 裡頭有些關於 Material 的選項,記得新增上述新物質。 ``` Refinement "ChargeLayer_Back" { Reference = "SuperDense" RefineWindow = Rectangle [ (-3.625 -1) (-3.617 @Width@) ] RefineWindow = material ["InP", "InGaAsP", "MyInGaAsP1", "MyInGaAsP2", "MyInGaAsP3"] } ``` #### datexcodes.txt 必須在 local directory 裡的 datexcodes.txt 新增物質別名,讓軟體辨識出 `MyInGaAsP` 其實就是 `InGaAsP`,詳見 **utilities_ug.pdf**。 ``` Materials { InGaAsP, MyInGaAsP1, MyInGaAsP2, MyInGaAsP3 { ! mole dependence: In(1-x)Ga(x)As(y)P(1-y) label = "InGaAsP" group = Semiconductor color = #d6a666, #c62c2c alter2 = 135 } } ``` #### sdevice_des.cmd 主要是 RegionInterface 上的介面區域名稱以及 Grading MoleFraction。 ``` ### 緊鄰倍增層的 Grading 是 3號。 Physics(RegionInterface="Multiplication/Grading3"){ _Ther_ } ### 緊鄰吸收層的 Grading 是 1號。 Physics(RegionInterface="Grading1/Absorption"){ _Ther_ } ### 設定三層莫耳分率 #if "@Grading@" == "Ideal" #elif "@Grading@" == "3L" Physics(Region="Grading1"){ Molefraction( XFraction=0.372 YFraction=0.792 ) } Physics(Region="Grading2"){ Molefraction( XFraction=0.196 YFraction=0.417 ) } Physics(Region="Grading3"){ Molefraction( XFraction=0.05875 YFraction=0.125 ) } #else Physics(Region="Grading1"){ Molefraction( XFraction=0.33 YFraction=0.7 ) } Physics(Region="Grading2"){ Molefraction( XFraction=0.33 YFraction=0.7 ) } Physics(Region="Grading3"){ Molefraction( XFraction=0.33 YFraction=0.7 ) } #endif # In0.67 Ga0.33 As0.7 P0.3 In(1-x)Ga(x)As(y)P(1-y) # In0.53 Ga0.47 As In(1-x)Ga(x)As ``` ## 自動繪製一條 cutline 並儲存 ![](https://i.imgur.com/5fIwbOD.png) 例如說,我們想要觀察中央區電場隨著偏壓上升而變化的情形。我們可以在 sdevice 後面新增一個 svisual tool,然後輸入底下程式碼。 ``` # 設定 cutline 位置 set Y [expr 1.5] # 載入 *.tdr 檔 set mydata2D [load_file n@node|-1@_des.tdr] # 建立一個新的 plot(會自動開啟 svisual) set myplot2D [create_plot -dataset $mydata2D] # 在 y= $Y 處,自動繪製一條垂直於 y 軸的切線 set mydata1D [create_cutline -plot $myplot2D -type y -at $Y] # 將名稱為 X 與 ElectricField 的資料儲存至 "Tcl_Cutlines/exp@experiment@_ElectricField_@Vanode@.csv" 中。 # 其中 @experiment@ 為實驗編號(swb 最左側)。 export_variables {ElectricField X} \ -dataset $mydata1D -filename "Tcl_Cutlines/exp@experiment@_ElectricField_@Vanode@.csv" -overwrite exit ``` ### 存放路徑設定 上面的資料是存放在 `Tcl_Cutlines` 之中。這資料夾必須事先手動建立,否則會出現錯誤訊息。另外可以同時存放多組數據,例如 `{DopingConcentration ElectricField ConductionBandEnergy X}`。 ### 參數設定 這裡的範例有用到 `@experiment@` 以及 `@node|-1@` 的參數,之所以可以這樣使用,是因為我們是在 swb 工作平台中執行此工具腳本(svisutal tool script)。然而如果想要在 svisual 中直接執行該腳本,那麼這會出現錯誤,因為無法讀取 `@node|-1@` 等參數。 ![](https://i.imgur.com/tS4l4ij.png) ## 自動繪製多條 cutline 並儲存 1. 這是自動繪製多條 cutlines 並輸出 *.csv 的 *.tcl 檔。 2. 其寫法是需要開啟 svisual 並按下左側「Tcl」按鈕以執行 *.tcl 檔,而不是在 swb 中建立的 svisual tool 中執行。原因是底下的 *.tdr 檔名並不屬於參數形式。 3. 輸出的 `"Cutlines/$x.csv"` 是屬於 load_file 目錄之中的,應該是只能使用相對路徑(relative path)。 4. 在讀取資料前,要先手動新建 /Cutlines 資料夾,否則會有錯誤。 5. 底下有個 `-points {-6.5 $x -3 $x}`,不清楚為什麼會失效。這是為什麼我將那行無效化(加上#)的原因。其呈現出來的 cutline 總是在 y=0,也就是說 $x=0。仍須進一步測試。 ``` # Load TDR file. set mydata2D [load_file n67_des.tdr] # Create new plot. set myplot2D [create_plot -dataset $mydata2D] set N 240 set x1 10.9 set x2 12.1 for {set a 0} {$a < $N} {incr a} { set x [expr {$x1 + $a * double($x2 - $x1) / $N}] set mydata1D [create_cutline -plot $myplot2D -type y at $x] #set mydata1D [create_cutline -plot $myplot2D -type free -points {-6.5 $x -3 $x}] #puts $x export_variables {DopingConcentration X} -dataset $mydata1D -filename "Cutlines/$x.csv" -overwrite } set x1 10 set x2 14 for {set a 0} {$a < $N} {incr a} { set x [expr {$x1 + $a * double($x2 - $x1) / $N}] set mydata1D [create_cutline -plot $myplot2D -type y at $x] # 底下這行無法正常執行,原因不明。 #set mydata1D [create_cutline -plot $myplot2D -type free -points {-6.5 $x -3 $x}] #puts $x export_variables {DopingConcentration X} -dataset $mydata1D -filename "Cutlines/$x.csv" -overwrite } ``` 此外,我也在 python 建立了 /TCAD/translation.py,用來平移擴散後的 NetActive.plx。 ## 模擬收斂問題 ### How does the high-field saturation mobility model affect the convergence of my simulation? > You can chose between several driving forces when simulating the saturation mobility in high electric fields with Sentaurus Device. The most natural choice is the projection of the total electric field on the current flow direction. This option is activated with the option Eparallel of the keyword HighFieldSaturation. Unfortunately, this option is prone to severe convergence problems. The reason is mainly that the electric field and the current are strongly interdependent. Moreover, in the channel of a MOSFET, you typically have a large (gate-controlled) electric field orthogonal to the main current flow and a smaller (drain-controlled) parallel electric field. The smallest numeric noise can mix the two components and, therefore, the driving force for the high-field saturation model may vastly change from one vertex to another, altering the current flow, which in turn alters the direction of the electric field – a highly unstable situation. Sentaurus Device 有非常多種可模擬大電場下之飽和遷移率的模型,而這主要是設定有效電場的模型。其中,最自然的選擇就是 Eparallel driving model。這種模型取總電場平行於電流方向上的分量。不過這通常會導致嚴重的收斂問題。主要是因為電場跟電流有著極為密切的關係,除此之外,以 MOSFET 通道為例,通常垂直與平行通道方向之電場數量級差很多,因為演算之數值誤差會「混合」這兩個分量,所以這種 Eparallel 模型會使得每個節點上的 driving force變化許多,進而改變電流方向,又接著改變電場分量,所以會造成極為不穩定的情況。 > A more stable choice is to select the electric field parallel to the nearest silicon–oxide interface. This option is activated with the keywords `HighFieldSaturation(EparallelToInterface)`. As long as the current mainly flows parallel to the interface, this is a very good choice. However, for many modern technologies, the current tends to spread out when entering or exiting the source and drain regions. A common example of this is technologies using ultrashallow source and drain extensions. After the current spreads out, the flow is no longer parallel to the interface, and this option may result in an incorrect prediction of the current, by as much as 5–15%. If you know the direction of the current flow, you also can provide a vector that is then used to evaluate the parallel electric field, independent of the orientation of the nearest interface. For example, if the current flow is mainly along the x-axis, specify EparallelToInterface (Direction = (1 0 0)) in the Math section. 其中一個折衷的辦法,就是只考慮平行於 silicon-oxide 界面上的電場,可以使用 `HighFieldSaturation(EparallelToInterface)` 指令來啟動這模型。只要大部分的電流都平行於界面,那基本上這就是個很好的模型。然而,目前最新科技通常會使得 source/drain 的電流以「向外散開,向內吸入」的方式進入與離開。例如說目前的 ultrashalow source and drain extensions。電流散開之後,電流就不再平行於界面,而這模型可能會帶來將近 5-15 % 的誤差。因此,如果你知道電流的方向,那麼你也可以設定用來計算平行電場分量之方向向量,而不再只是單純地與最鄰近的界面平行的方向。例如說,如果你覺得電流主要是沿著 x 軸在流動,那麼可以在 Math section 設定 `EparallelToInterface` (Direction = (1 0 0))。 > The most widely used driving force is the gradient of the quasi-Fermi potential. Often, it is equivalent to the parallel electric field, but it is numerally more stable. This option is activated with the keywords `HighFieldSaturation(GradQuasiFermi)`. However, even with this option, convergence can be poor. The problem often arises from locations where the gradient of the quasi-Fermi potential is steep or noisy, or changes abruptly, which may occur when the mesh is inappropriate, for example, when small mesh elements are next to coarse ones. Making the mesh more uniform often helps in such situations. 最常用的 driving force 是 quasi-Fermi potential 的梯度模型。通常這跟平行電場模型是一樣的,但它的演算法比較穩定。可以用 `HighFieldSaturation(GradQuasiFermi)` 選項來啟動它。不過,即便如此,還是可能會造成收斂問題。這是因為通常 quasi-Fermi potential 的梯度都非常的陡峭,變化得太過劇烈或是非常的不平滑,而這往往切得比較不好的網格所造成的。 > In some cases, however, even with a good mesh, convergence is poor. At times, the problem originates in regions with a low carrier concentration where the relative error of the densities can be high, which in turn can result in noisy gradients. These regions typically do not contribute much to the overall terminal currents, so enforcing a tighter accuracy may unduly slow down the simulation. However, you need to ensure that the low densities do not spoil the convergence. This is the basic idea of yet another set of driving-force options. 但在有些時候,即便網格切得很好,還是沒辦法收斂。有時是因為低載子濃度的區域的濃度相對誤差都滿高的,而這會進一步導致 quasi-Fermi potential 的誤差變得滿大的。因為這些區域通常對總電流的貢獻並不是很顯著,所以算得太準反而會讓模擬跑得更慢。不過,你確實需要確認一下這些低密度是不是導致發散。 > By setting `RefDens_eGradQuasiFermi_EparallelToInterface` and `RefDens_hGradQuasiFermi_EparallelToInterface` in the Math section, you can use a driving force that interpolates between the gradient of the quasi-Fermi potential and the electric field parallel to the interface. The value of the parameters define the local carrier density at which the gradual transition occurs. For example, if the value is set to 1e12, the gradient of the quasi-Fermi potential is used where the carrier concentration is well above 1012 cm-3, and the electric field parallel to the interface is used where the carrier concentration is well below 1012 cm-3. Typically, a value of 1e12 will not alter the terminal currents but may well improve convergence. At times, you may need to use higher values of 1e14–1e16 to obtain good convergence, but you should compare the terminal currents for different settings (as far as they converge) to ensure that the error from the mixing in of the `EparallelToInterface` driving force is still acceptable. 除此之外,也可藉由設定 `RefDens_eGradQuasiFermi_EparallelToInterface` 與 `RefDens_hGradQuasiFermi_EparallelToInterface` 來使用「內插 `GradQuasiFermi` 與 `Eparallel`」的 driving force 模型。該參數定義了 gradual transition 發生的局域載子濃度。例如說,如果設定為 1e12,那麼當載子濃度高於 1e12,就使用 `GradQuasiFermi` model,反之則使用 `Eparallel` model。通常 1e12 並不會影響到總電流,但仍能改善收斂問題。有時甚至需要用到 1e14 ~ 1e16 以獲得更好的收斂,但要留意不同設定所得到的電流是否一致,以確定 `Eparallel` driving force 帶來的誤差仍可接受。 > As variations to this interpolation scheme, you also can interpolate between the gradient of the quasi-Fermi potential and the electric field with the Math parameters RefDens_eGradQuasiFermi_ElectricField and RefDens_eGradQuasiFermi_ElectricField. 另一種內插法是 `QausiGradFermi` 與 電場本身,可使用 `RefDens_eGradQuasiFermi_ElectricField` 與 `RefDens_eGradQuasiFermi_ElectricField` 參數來設定。 > Another option to improve convergence is to damp out the driving force in regions with low carrier concentrations. This damping feature is activated by setting the Math parameters `RefDens_eGradQuasiFermi_Zero` (for electrons) and `RefDens_hGradQuasiFermi_Zero` (for holes) to a positive value. If set to, for example 1e10, the driving force is damped in regions where the respective carrier concentration is less than 1010 cm-3. 還有一種方法改善收斂,就是在低濃度的地方逐漸忽略 driving force。可以藉由 `RefDens_eGradQuasiFermi_Zero` (for electrons) and `RefDens_hGradQuasiFermi_Zero` (for holes) 設定,將它們設定為正值即可。例如說,如果設定為 1e10,那麼在 1e10 濃度以下的地方就不會用到 driving force。 > A final physically sound alternative is to use the hydrodynamic transport model. In this case, Sentaurus Device computes the local carrier temperature, which in turn can be used as the driving force. This option is activated with the keywords `HighFieldSaturation(CarrierTempDrive)`. In some cases, the runtime penalty by solving the additional carrier temperature equation is overcompensated by better convergence. > > In summary, if you encounter convergence problems that are due to the high-field saturation mobility model in conjunction with the GradQuasiFermi option: * Ensure that the mesh in the channel region is sufficiently fine and uniform. * Consider switching to EparallelToInterface. If the error in terminal currents is too high, consider an interpolated driving force by setting the `RefDens_e/hGradQuasiFermi_ElectricField` parameters to 1e12 or higher. * Consider damping the driving force by setting the `RefDens_e/hGradQuasiFermi_Zero` parameter to 1e10 or higher. * Finally, consider switching to the hydrodynamic transport model. 還有一個在物理上可行的做法,就是使用 hydrodynamic transport model。這時 sdevice 會計算局域載子溫度,接著並用來計算 driving force。可以藉由 `HighFieldSaturation(CarrierTempDrive)` 來開啟它。有時會因為有比較好的收斂而改善通常 HT model 算太慢的現象。總之,如果你在使用 `GradQuasiFermi` 時遇到了收斂問題。那麼你可以: 1. 確保通道的網格足夠細緻與均勻 2. 考慮改成 `EparallelToInterface` 3. 如果 terminal currents 誤差實在很大,那麼可考慮將 `RefDens_e/hGradQuasiFermi_ElectricField` 設定為 1e12 或者更高。 4. 設定 `RefDens_e/hGradQuasiFermi_Zero` 到 1e10 或者更高以忽略在低於該濃度時的 driving force 計算 5. 最後可以考慮改用 hydrodynamic transport model。 ### 常見模擬參數之意義 * `HighFieldSaturation(GradQuasiFermi)` * `RefDens_hGradQuasiFermi_Zero`:低於其值則忽略 damp 有效電場 * `RefDens_eGradQuasiFermi_EparallelToInterface`:高於其值則使用 `GradQuasiFermi`,低於則 `EparallelToInterface`。 * `RefDens_eGradQuasiFermi_ElectricField`:高於其值則使用 `GradQuasiFermi`,低於則 `Eparallel` ### External resistor method 這方法很有用,但是非常慢。 > 簡單來說,只是在元件上串聯一個電阻。 但因為我們設定 $R=V_b/I_b$,所以在 `InnerVoltage` 到達 $V_b$ 時,`OuterVoltage` 會是兩倍的崩潰電壓。而在那之前,因為電流實在是很小,所以外接電阻分配到的分壓並沒有追到元件分壓,使得大部分分壓都會正常地落在元件上。設定方法為,先在其中一個電極設定電阻,如下所示。 ![](https://i.imgur.com/WgehJVn.png) ``` Electrode { { Name= "substrate" Voltage= 0.0 } #if "@BVmethod@" == "resistor" { Name= "anode" Voltage= 0.0 Resistor= @R@} #else { Name= "anode" Voltage= 0.0 } #endif } ``` 設定好之後其實就大功告成了。不過此時因為你只能夠控制某電極的電位,而在其中一個電極電位被設定為 `Voltage=0.0` 的情況下,這相當於設定兩電極(`anode`與`substrate`)之間的電壓,即「元件與電阻」的總跨壓。因此,倘若元件開始崩潰,電流開始爆增,那麼「元件與電阻」的總跨壓將會變得非常大。因此如果將後續的模擬目標電壓設定為-50V 或甚至是 -100V,那因為元件分到的跨壓一定比較小,所以很可能沒達到目標。因此這時需要將最後的目標電壓設定得高一點,通常我都設定-500到-1000。有時為了更加準確而會設定為-2000。 ## Trap 設定(sdevice) > Another available species is the fixed charge, which is a trap fully occupied by either electrons or holes. Therefore, its charge stays constant throughout the entire simulation and does not depend on electrical bias conditions. **Electron–hole recombination through such a trap is not allowed.** This type of trap uses the `FixedCharge` keyword for a trap specification. ### Recombination & Generation rate 基本上它們都遵守 SRH recombination rate: $$R_\text{SRH}=\frac{np-n_i^2}{\tau_{p0}(n+n_1)+\tau_{n0}(p+p_1)}$$ 但是沒辦法在 sdevice 用 `SRHRecombination( Integrate( Semiconductor ) )` 觀察到這些特地、額外設定的 trap 造成的 SHR recombination rate,反而必須使用: ``` CurrentPlot { eGapStatesRecombination( Integrate( Semiconductor ) ) eGapStatesRecombination( Integrate( Region="Absorption" ) ) eGapStatesRecombination( Integrate( Region="Multiplication" ) ) hGapStatesRecombination( Integrate( Semiconductor ) ) hGapStatesRecombination( Integrate( Region="Absorption" ) ) hGapStatesRecombination( Integrate( Region="Multiplication" ) ) } ``` 才能夠看見這些 trap 的貢獻。 ### Trap-assisted tunneling 這些 Trap 預設並沒有 trap-assisted tunneling 效果。換言之,即便之前設定了 `Physics{Recombination(SRH(ElectricField(Lifetime=Hurkx)))}`,也不會讓 trap 有此效應。這需要額外設定: ``` Physics(Region="Absorption"){ Traps(eNeutral Level fromMidBandGap EnergyMid=@Eti@ Conc=1e15 eXsection=@eXsec@ hXsection=@hXsec@ SpatialShape=Gaussian SpaceMid=(@PosX@, 1.5) SpaceSig=(@Lx@, 1e3) Tunneling(Hurkx) ) } ``` 上面的`Tunneling(Hurkx)`就是 trap-assisted tunneling 效應。 ### Lifetime 雖然 lifetime 滿足底下公式: $$\tau_{n,p}\equiv\frac{1}{\sigma_{n,p} v_{n,p} N_t}$$ 但是沒辦法直接使用`eLifetime`與`hLifetime`觀察,需要手動將上述數據相乘。 ![](https://i.imgur.com/owQQShM.png) 不過這方法沒辦法看出 Field-enhancement factor $\Gamma$。 ![](https://i.imgur.com/ixtk0Ex.png) ## Fixed Charge 設定 ![](https://i.imgur.com/GhZhgDe.png)