Incomplete Ionization
Jump to navigation
Jump to search
Referece: R. C. Jaeger and F. H. Gaensslen, “Simulation of Impurity Freezeout through Numerical Solution of Poisson’s Equation and Application to MOS Device Behavior,” IEEE Trans. Electron Devices, Vol. ED-27, pp. 914-920, May 1980.
Call this procedure to model incomplete ionization
#MUST CALL WITH ALL DOPANTS AT ONCE i.e.: IncompleteIonization "Boron Arsenic" #ONLY 1 N-TYPE AND 1 P-TYPE EACH ALLOWED proc IncompleteIonization {dopants} { #think about: don't really need "Na" or "Nd", bc Doping=Na or Doping=Nd in most cases pdbSetBoolean Silicon IncIon 1 set nloop_yn 0 set ploop_yn 0 foreach dopant $dopants { if {[pdbGetString $dopant Type] == "Ntype"} { set nloop_yn 1 set Ed0 [pdbGetDouble $dopant Ed0] #solution add name=deltaEd solve const val = ($Ed0-(3.100e-8)*((Nd)^(1.0/3.0))+(200.0*((T)^(-(1.00)))-(0.66)));# the units are wrong here set deltaEd $Ed0 solution add name=Ndplus solve const val = "(Nd/(1.0+2.0*exp((nQFL-(Ec)+$deltaEd)/Vt)))" #solution name=Doping solve const val = "((Doping)-(Nd)+(Ndplus))" } if {[pdbGetString $dopant Type] == "Ptype"} { set ploop_yn 1 set Ea0 [pdbGetDouble $dopant Ea0] #solution add name=deltaEa solve const val = ($Ea0-(3.037e-8)*((Na)^(1.0/3.0))+(200.0*((T)^(-(0.95)))-(0.88))) set deltaEa $Ea0 solution add name=Naplus solve const val = "(Na/(1.0+4.0*exp((Ev+$deltaEa-(pQFL))/Vt)))" #solution name=Doping solve const val = "((Doping)-(-(Na)+(Naplus)))" } puts "Incomplete Ionization of $dopant Complete." } if {($nloop_yn && $ploop_yn)} { puts "GOOD. YOU HAVE CODED FOR 1 PTYPE AND 1 NTYPE" solution name=Doping solve const val = "((Ndplus) - (Naplus))" #SetContacts } else {puts "error: YOU HAVE NOT CODED FOR THIS DOPING SITUATION!!!"} }
warnings
You must have Na and Nd defined as solution variables, i.e.:
solution add name=Na const val="1.0e15" solution add name=Nd const val="1.0e21*exp(-x*x/1e-6)
You must have your band terms defined
solution add name=Ec, Ev, nQFL, pQFL...
You must have these dopant-dependent properties defined in the pdb:
proc AddArsenic {} { mater add name = Arsenic pdbSetString Arsenic Type "Ntype" #For Incomplete Ionization (ref: Sze) pdbSetDouble Arsenic Ed0 0.049;#donor impurity level } proc AddBoron {} { mater add name = Boron pdbSetString Boron Type "Ptype" #For Incomplete Ionization (ref: Sze) pdbSetDouble Boron Ea0 0.045;#acceptor impurity level } AddBoron; Add Arsenic
You must have Vt defined as a solution variable, and also T, if you want to use the T-dependent impurity level option (units are messed up right now).
solution add name=Vt,T const
You must call this procedure with all dopants at once, i.e.:
IncompleteIonization "Boron Arsenic"
Only 1 n-type and 1 p-type dopant each work in this procedure. i.e do NOT do:
IncompleteIonization "Boron Arsenic Phosphorus";#THIS IS BAD