Richardson, Carey, and Mulvaney formulated the five species
phosphorus diffusion model[46,33] described by the differential
equation system in (5.4) - (5.8). In
these equations ,
,
,
,
and
represent the concentrations of
substitutional phosphorus, the silicon interstitials, vacancies,
phosphorus-vacancy, and phosphorus-interstitial pairs, respectively.
The according MDL input deck can be structured into
// Parameters
Parameter<double> k_for_e = 1.0e-14; // [cm^3/s]
Parameter<double> k_for_f = 1.0e-14;
Parameter<double> k_bi = 1.0e-10;
Parameter<double> k_rev_e = 10.; // [1/s]
Parameter<double> k_rev_f = 12.;
Parameter<double> Dv = - 1.0e-10; // [cm^2/s]
Parameter<double> Di = - 1.0e-09;
Parameter<double> De = - 1.0e-13;
Parameter<double> Df = - 2.0e-13;
Parameter<double> Veq = 1.0e14; // [1/cm^3]
Parameter<double> Ieq = 1.0e14;
Parameter<double> VIeq = 1.0e14 * 1.0e14;
Example 5.2: Global parameter declarations
Instance PromisNTSetup = PairDiffInitModel;
NewModel PairDiffInitModel : PromisNTSetupModel {
evaluate {
:inputPBF = "$COMPILE";
:outputPBF = "$OUTPUT";
:endTime = "$ENDTIME";
:stepTime = "$STEPTIME";
:quantityList = "P_Pair_Quantities";
:chargeStateTable = "P_Pair_Charge_States";
:processTemperature = "PairDiffTemperatureModel";
:deviceSetup = "P_Pair_Diff_DeviceSetup";
:diffusionModel["Si"] = "Promis";
:diffusionModel["Ambient"] = "Promis";
:boundaryModel["Ambient"]["Si"] = "Promis";
}
}
NewModel PairDiffTemperatureModel : ProcessTemperatureModel {
evaluate {
:temp = 1173.0;
}
}
Example 5.3: Simulator setup for the five species pair diffusion model
NewModel P_Pair_Quantities : QuantityListModel {
evaluate {
:quantity["P"] = {{ P }};
:quantity["V"] = {{ V }};
:quantity["I"] = {{ I }};
:quantity["E"] = {{ E }};
:quantity["F"] = {{ F }};
}
}
NewModel P_Pair_Charge_States : ChargeStateTableModel {
evaluate {}
}
Example 5.4: Quantity setup for the five species pair diffusion model
NewModel P_Pair_Diff_DeviceSetup : DeviceSetupModel {
evaluate {
:segmentPreProcessingSetup ["Si"] = "SiSegmentPreProcessingSetup";
:segmentCoefficientSetup ["Si"] = "SiCoefficient";
:segmentPostProcessingSetup["Si"] = "SiSegmentPostProcessingSetup";
:segmentPreProcessingSetup ["Ambient"] = "AmbientPreprocessingSetup";
:segmentCoefficientSetup ["Ambient"] = "AmbientCoefficient";
:segmentPostProcessingSetup["Ambient"] = "AmbientPostprocessingSetup";
:boundaryCoefficientSetup["Ambient"]["Si"] = "P_Pair_BoundarySetup";
}
}
Example 5.5: Device setup for the five species pair diffusion model
NewModel SiSegmentPreProcessingSetup : SegmentPreProcessingSetupModel {
basicSetup {
:quantityInitialization["P"] = "Zero_Init";
:quantityInitialization["V"] = "Zero_Init";
:quantityInitialization["I"] = "Zero_Init";
:quantityInitialization["E"] = "Zero_Init";
:quantityInitialization["F"] = "Zero_Init";
}
evaluate {
call basicSetup;
:quantityInitialization["V"] = "VI_Init";
:quantityInitialization["I"] = "VI_Init";
}
}
NewModel AmbientPreprocessingSetup : SegmentPreProcessingSetupModel {
evaluate { call basicSetup; }
}
NewModel SiSegmentPostProcessingSetup : SegmentPostProcessingSetupModel {
setup {
:quantityPostprocessing["P"] = "No_Post";
:quantityPostprocessing["V"] = "No_Post";
:quantityPostprocessing["I"] = "No_Post";
:quantityPostprocessing["E"] = "No_Post";
:quantityPostprocessing["F"] = "No_Post";
}
evaluate { call setup; }
}
NewModel AmbientPostprocessingSetup : SiSegmentPostProcessingSetup {
evaluate { call setup; }
}
Example 5.6: Pre- and postprocessing setup
NewModel SiCoefficient : CoefficientSetupModel {
evaluate {
:alpha["P"]["P"] = "Uno_alpha"; :alpha["V"]["V"] = "Uno_alpha";
:alpha["I"]["I"] = "Uno_alpha"; :alpha["E"]["E"] = "Uno_alpha";
:alpha["F"]["F"] = "Uno_alpha";
:a["V"]["V"] = "V_a"; :a["I"]["I"] = "I_a";
:a["E"]["E"] = "E_a"; :a["F"]["F"] = "F_a";
:gamma["P"] = "P_gamma"; :gamma["V"] = "V_gamma";
:gamma["I"] = "I_gamma"; :gamma["E"] = "E_gamma";
:gamma["F"] = "F_gamma";
}
}
NewModel AmbientCoefficient : CoefficientSetupModel {
evaluate {
:alpha["P"]["P"] = "Uno_alpha"; :alpha["V"]["V"] = "Uno_alpha";
:alpha["I"]["I"] = "Uno_alpha"; :alpha["E"]["E"] = "Uno_alpha";
:alpha["F"]["F"] = "Uno_alpha";
}
}
NewModel P_Pair_BoundarySetup : BoundaryCoefficientSetupModel {
evaluate {
:dirichlet2["V"] = 1.0e14; :dirichlet2["I"] = 1.0e14;
:dirichlet2["P"] = 5.0e20; :dirichlet2["E"] = 5.0e19;
:dirichlet2["F"] = 4.16666e19;
}
}
Example 5.7: Coefficient setup
NewModel Zero_Init : QuantityInitializationModel {
evaluate {
:Cown = 0.0;
}
}
NewModel VI_Init : QuantityInitializationModel {
evaluate {
:Cown = 1.0e14;
}
}
NewModel No_Post : QuantityPostprocessingModel {}
Example 5.8: Quantity initialization and postprocessing
NewModel Uno_alpha : CoeffModel_alpha {
evaluate { :Coeff = 1.; }
}
// Coefficients for P related equation
NewModel P_gamma : CoeffModel_gamma {
evaluate {
:Coeff = - ::k_for_e * :P * :V + ::k_rev_e * :E -
::k_for_f * :P * :I + ::k_rev_f * :F;
:dCoeffd_P = - ::k_for_e * :V - ::k_for_f * :I;
:dCoeffd_V = - ::k_for_e * :P;
:dCoeffd_I = - ::k_for_f * :P;
:dCoeffd_E = ::k_rev_e;
:dCoeffd_F = ::k_rev_f;
}
}
// Coefficients for V related equation
NewModel V_a : CoeffModel_a {
evaluate { :Coeff = ::Dv; }
}
NewModel V_gamma : CoeffModel_gamma {
evaluate {
:Coeff = - ::k_for_e * :P * :V + ::k_rev_e * :E -
::k_bi * ( :V * :I - ::VIeq );
:dCoeffd_P = - ::k_for_e * :V;
:dCoeffd_V = - ::k_for_e * :P - ::k_bi * :I;
:dCoeffd_I = - ::k_bi * :V;
:dCoeffd_E = ::k_rev_e;
}
}
// Coefficients for I related equation
NewModel I_a : CoeffModel_a {
evaluate { :Coeff = ::Di; }
}
NewModel I_gamma : CoeffModel_gamma {
evaluate {
:Coeff = - ::k_for_f * :P * :I + ::k_rev_f * :F -
::k_bi * ( :V * :I - ::VIeq );
:dCoeffd_P = - ::k_for_f * :I;
:dCoeffd_V = - ::k_bi * :I;
:dCoeffd_I = - ::k_for_f * :P - ::k_bi * :V;
:dCoeffd_F = + ::k_rev_f;
}
}
Example 5.9: Coefficient Models (part 1)
// Coefficients for E related equation
NewModel E_a : CoeffModel_a {
evaluate { :Coeff = ::De; }
}
NewModel E_gamma : CoeffModel_gamma {
evaluate {
:Coeff = ::k_for_e * :P * :V - ::k_rev_e * :E;
:dCoeffd_P = ::k_for_e * :V;
:dCoeffd_V = ::k_for_e * :P;
:dCoeffd_E = - ::k_rev_e;
}
}
// Coefficients for F related equation
NewModel F_a : CoeffModel_a {
evaluate { :Coeff = ::Df; }
}
NewModel F_gamma : CoeffModel_gamma {
evaluate {
:Coeff = ::k_for_f * :P * :I - ::k_rev_f * :F;
:dCoeffd_P = ::k_for_f * :I;
:dCoeffd_I = ::k_for_f * :P;
:dCoeffd_F = - ::k_for_f;
}
}
Example 5.10: Coefficient Models (part 2)
The simulation results depicted in Fig. 5.3,
Fig. 5.4, and Fig. 5.5 show the expected
formation of the flat point defect profiles in the inner device regions
determined by their reaction term
in
the according equations (5.4) and (5.5).
The formation of the sharp gradients of the defect concentrations near the
surface induced by the Dirichlet boundary conditions and the coupling
with the equations for the phosphorus, phosphorus-interstitial, and
phosphorus-vacancy pair profiles in term is responsible for the creation of
the phosphorus plateau, kink, and tail. The resulting profiles perfectly
coincide with the results obtained by the authors of this pair diffusion
model.