Incomplete Ionization: Difference between revisions

From Flooxs
Jump to navigation Jump to search
(New page: 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. El...)
 
(No difference)

Latest revision as of 19:02, 28 January 2010

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