仿书上的柱面结和平行平面结
柱面结击穿仿真
最近再搞柱面结+场板的仿真实验,刚好看到书上也提供了仿真实例,就用书上的参数来复现一下
主要参数:
漂移区掺杂浓度:3.8e14;P+表面掺杂浓度1e20,杂质为硼;
结宽度50um,结深5um;衬底宽度150um,厚度60。
目标:平行平面结击穿电压为520V,柱面结击穿为220V。
0.0阶段一
首先根据书上的参数,仿真出结构,跑一下平面结和环形结耐压,一切都很顺利,唯一不对的是平行平面结耐压居然有1000v,环形结耐压550v,所以肯定是哪里错了
看了一下结构,原来是衬底掺杂浓度设置错了(为0),所以耐压高了很多。之所以把这个写上来,是因为这个错误的经历还是有一点点用处的。
0.1阶段二
下一步就是把衬底掺杂调整回来,平行平面结的耐压正常了,但是环形结的耐压无法求解,死活不收敛。哎,之前用Medici的时候也是环形结耐压求解不收敛。
0.2阶段三
这一阶段是在想办法把环形结不收敛的问题解决掉。
改各种参数:减小sdevice的最大步长Maxstep, 改变Increment, Decrement,在电极上加大电阻等,无果。后来尝试了一下改变P+结深,从原来的5um变到10um,15um,20um,这时候奇迹出现了,10um,15um,20um的都可以正常求解出耐压,终于看见了一丝丝曙光。
0.3阶段四
这时候我猜测的是,会不会是因为5um结深的时候,p区附件掺杂浓度梯度太大,我网格不够细,或者有什么特殊的物理过程是我没有考虑到的。
于是我就开始疯狂细化P区附件网格,网格加到3w个,尝试大力出奇迹,结果证明不行,没有任何奇迹发生。环形结仿真又陷入了僵局。
0.4阶段五
这个时候想起来懒小木在他的live里提到过几个求解器的不同(Super, ParDiso, ILS),所以开始翻sdevice的manual。在第四章的Performing Numeric Experiment里面找,结果看到准静态扫描后(Quasistationary)后面是一个叫Continuation的扫描方法,介绍里面,非常巧的提到了这是一个专门为击穿等复杂物理过程设计的求解方法(complicated device phenomena such as breakdown or latchup)。
哦,这还等什么呀,我也没有往下继续找求解器了,直接看完这部分开始动切换Continuation扫描方法了。
0.5阶段六
在经过改写和除bug之后,终于跑出来了。(改写的过程中,看到SWB给的实例里,正好有个叫BVmethods的例子,里面就是各种求解BV的不同方法,也包含了Continuation,真的是好巧)
后记
后来又经过诸多尝试,才知道这次的收敛不过是偶然,不收敛才是常态o(╥﹏╥)o
sde代码
(define Sub_L 150)
(define Sub_H 60)
(define Jun_L @Jun_L@)
(define Jun_H @Jun_H@)
(define Pad 0)
(define Ex_Len 0)
(define Min_Mesh @Min_Mesh@)
(define Ref_Mesh (* @Ref_Mag@ Min_Mesh))
(define offset 0.8)
(define WideOfMesh @WideOfMesh@)
(sdegeo:create-rectangle (position (* -0.5 Sub_L) 0 0.0 ) (position (* 0.5 Sub_L) Sub_H 0.0 ) "Silicon" "Sub1" )
(sdegeo:create-rectangle (position (- (* -0.5 Jun_L) Ex_Len) -0.8 0) (position (+ (* 0.5 Jun_L) Ex_Len) 0 0) "Aluminum" "Pad" )
;(sdegeo:create-rectangle (position (+ (+ (* +0.5 Jun_L) Ex_Len) 0.8) -0.1 0) (position (- (+ (* +0.5 Jun_L) Ex_Len) (* 0.7 Ex_Len)) 0 0) "SiO2" "Oxi_L1" )
;(sdegeo:create-rectangle (position (* -1 (+ (+ (* +0.5 Jun_L) Ex_Len) 0.8)) -0.1 0) (position (* -1 (- (+ (* +0.5 Jun_L) Ex_Len) (* 0.7 Ex_Len))) 0 0) "SiO2" "Oxi_R1" )
;doping
(sdedr:define-constant-profile "ConstantProfileDefinition_Sub" "PhosphorusActiveConcentration" 3.8e14)
(sdedr:define-constant-profile-region "ConstantProfilePlacement_Sub" "ConstantProfileDefinition_Sub" "Sub1")
(sdedr:define-refeval-window "ImpLine_1" "Line" (position (* -0.5 Jun_L) 0 0) (position (* 0.5 Jun_L) 0 0))
(sdedr:define-analytical-profile-placement "AnalyticalProfilePlacement_1" "AnalyticalProfileDefinition_1" "ImpLine_1" "Both" "NoReplace" "Eval")
(sdedr:define-gaussian-profile "AnalyticalProfileDefinition_1" "BoronActiveConcentration" "PeakPos" 0 "PeakVal" 1e20 "ValueAtDepth" 3.8e14 "Depth" Jun_H "Gauss" "Factor" 0.8)
;Contact
(if (= Pad 0) (begin
(sdegeo:insert-vertex (position (* -0.5 Jun_L) 0 0))
(sdegeo:insert-vertex (position (* 0.5 Jun_L) 0 0))
))
(if (= Pad 1) (begin
(sdegeo:insert-vertex (position (- (* -0.5 Jun_L) Ex_Len) 0 0))
(sdegeo:insert-vertex (position (+ Ex_Len (* 0.5 Jun_L)) 0 0))
))
;P
(sdegeo:define-contact-set "P" 4.0 (color:rgb 1.0 0.0 0.0 ) "##" )
(sdegeo:set-contact (find-edge-id (position 0 0 0)) "P")
;N
(sdegeo:define-contact-set "N" 4.0 (color:rgb 0.0 1.0 0.0 ) "##" )
(sdegeo:set-contact (find-edge-id (position 0 Sub_H 0)) "N")
;mesh
(sdedr:define-refinement-size "RefinementDefinition_All_Bo" (* 2 Min_Mesh) (* 2 Min_Mesh) Min_Mesh Min_Mesh )
(sdedr:define-refinement-placement "RefinementPlacement_All" "RefinementDefinition_All_Bo" (list "material" "Silicon" ) )
(sdedr:define-refinement-function "RefinementDefinition_All_Bo" "PhosphorusActiveConcentration" "MaxTransDiff" 1)
(sdedr:define-refeval-window "RefEvalWin_Junc" "Rectangle" (position (* -1 (+ (* 0.5 Jun_L) (* WideOfMesh Jun_H))) 0 0) (position (+ (* 0.5 Jun_L) (* WideOfMesh Jun_H)) (* WideOfMesh Jun_H) 0))
(sdedr:define-refinement-size "RefinementDefinition_Junc" Ref_Mesh Ref_Mesh Ref_Mesh Ref_Mesh)
(sdedr:define-refinement-placement "RefinementPlacement_Junc" "RefinementDefinition_Junc" (list "window" "RefEvalWin_Junc" ) )
(sdedr:define-refinement-function "RefinementDefinition_Junc" "BoronActiveConcentration" "MaxTransDiff" 0.5)
(sde:build-mesh "snmesh" "" "n@node@_msh")
sdevice代码
#define _IMax_ 10e-9
File {
Grid = "@tdr@"
Plot = "BreakV_n@node@"
Current = "@plot@"
Output = "@log@"
}
Electrode {
{Name = "N" Voltage = 0 }
{Name = "P" Voltage = 0 }
}
Physics(Material =Silicon ) {
Fermi
Hydrodynamic(eTemperature)
EffectiveIntrinsicDensity( BandGapNarrowing(OldSlotboom) )
Mobility( DopingDep
eHighFieldsaturation( GradQuasiFermi )
hHighFieldsaturation( GradQuasiFermi )
Enormal )
Recombination(
SRH( DopingDep )
eAvalanche( Eparallel )
hAvalanche( Eparallel ) )
}
Plot {
eDensity hDensity
Current/vector eCurrent/vector hCurrent/vector
Potential SpaceCharge ElectricField
eMobility hMobility eVelocity hVelocity
Doping DonorConcentration AcceptorConcentration
}
Math{
Iterations=20
Notdamped=100
Extrapolate
AvalDerivatives
ErRef(Electron)=1.e10
ErRef(Hole)=1.e10
RelErrControl
BreakCriteria{ Current(Contact="N" AbsVal=_IMax_) }
CNormPrint
}
Solve {
* initial guess
Coupled(Iterations=100){ Poisson }
Coupled(Iterations=100){ Poisson Electron }
Coupled(Iterations=100){ Poisson Electron Hole }
* step2 :ramping vd
NewCurrentFile= "BreakV"
Continuation(
Name = "N" InitialVStep = 0.01
MinVoltage = 0 MaxVoltage = 1000
MinCurrent = 0 MaxCurrent = _IMax_
Iadapt = 3e-8
Increment = 1.41 Decrement = 2
MaxStep = @maxstep@
){Coupled {Poisson Electron Hole }}
}