//
// VBIC95 Model Definition
//
// Release 1.1.5, Jul 28, 1996
//
// 1.1.5 updates: Jul 28, 1996
// Dependence of Irbp on Vbci added to "branch currents"
// Itf/Itr renamed Itfi/Itri to avoid name conflicts
// Resistor collapse and code bypass condition
// changed from par==0 to par<=0
// Branch current and charge dependencies separated
// for self-heating and no self-heating
// Depletion charge and avalanche routines that provide
// derivatives for self-heating added
// Self-heating solver and examples added (HBT)
// Extra external node added for self-heating to allow
// coupling of thermal models between devices
//
// 1.1.4 updates: Qbe diffusion term made equivalent to SGP (divide by qb)
// Solver example including excess phase added
// (Icc separated into Itzf|Itxf and Itzr for this)
// Error in sgp_to_vbic95 in PTF to TD translation fixed
//
// 1.1.3 updates: Ith bug fixed and Igc term added
// BFN exponent added to 1/f noise
// RTH default changed to zero
// parameter aliases added
//
// 1.1.2 updates: EAI bug fixed in PE/PC/PStemperature mapping
// single->double precision in decomp/solve/vbict/QCDEPL
// scale changed to vscale in solver to avoid name conflict
// avalanche model added, element Igc
// initialization changed in solver
// AC solver and AC and temperature tests added
// missing term in derf_Vrci added
// potential numerical problem in Irci fixed
//
// 1.1.1 updates: VJ->V bug fixed in qj definition
// potential numerical problems with ITF fixed
// typo derf_Vcci fixed to derf_Vrci in FORTRAN code
//
//
// Equivalent Circuit Network:
//
// | |
// -(->)- (^) and (v) are voltage controlled current sources (arrow gives
// | | reference direction for current flow), key letter I
//
// + - | +
// -||- and = are voltage controlled charge sources (+/- signs
// | - give reference polarity), key ketter Q
//
// -(=>)- are current controlled flux sources (arrow gives
// reference direction for flux), key letter F
//
// o are nodes
//
// resistors are depicted as voltage controlled current sources for
// generality (also, this is true if self-heating is modeled)
//
//
// -----------------------------------------------------------------------------
// | |
// | BE/BC extrinsic o s o c |
// | overlap capacitances | | |
// | not shown | | |
// | (v) Irs (v) Ircx |
// | | | |
// | | | |
// | ---------o---- si | |
// | | | | | |
// | | + | | | |
// | | Qbcp = (v) Ibcp | |
// | | - | | | |
// | | | | | |
// | Iccp (^) bp o---+----(<-)----+--------------------o cx |
// | | | | Irbp | | |
// | | - | | | | |
// | | Qbep = (^) Ibep | (v) Irci |
// | | + | | | | |
// | | | | | | |
// | ---------+---- | ----+--------o ci |
// | | | | | | |
// | | - | | | - | |
// | | Qbcx = Ibc (^) = Qbc | |
// | | + | -Igc | | + | |
// | bx| | | | | |
// | b o----(->)----o---+----(->)----+-------+---o bi (v) Itzf|Itxf|
// | Irbx | | Irbi | | | -Itzr |
// | | | + | | + | |
// | Ibex (v) = Qbex Ibe (v) = Qbe | |
// | Thermal Network | | - | | - | |
// | dt | | | | | |
// | ---------o--------- ----+--------------------+---+--------o ei |
// | | | | | |
// | | | | + | |
// | (^) Ith (v) Irth = Qcth (^) Ire |
// | | | | - | |
// | | | | | |
// | ---------o--------- o e |
// | tl |
// | |
// | Excess Phase Network |
// | xf1 |
// | ---------o----(=>)----o xf2 |
// | | | Flxf | |
// | | | + | |
// | (^) Itzf = Qcxf (v) Itxf |
// | | | - | |
// | | | | |
// | ---------o------------- |
// | gnd |
// | |
// -----------------------------------------------------------------------------
//
//
// NOTES:
// Below the underscore character ("_") means partial differentiation,
// so y_x means the partial derivative of y(x,...) with respect to x.
// Comments are C++ style, from // to end of line.
// Continuation is \ as last non-white space character on a line
// (except comments).
// cpp directives are included, process with "cpp -B -P".
// Blocks are delimited by {} brackets for clarity.
// "fwd" and "rev" are for forward and reverse, respectively.
// "b-e", "b-c" and "s-c" are for base-emitter, base-collector and
// substrate-collector, respectively.
// All temperatures are in C.
// Units are volts, amperes, ohms, farads, seconds.
// Conditionals are added as
// if ( expression ) {
// } elif ( expression ) {
// } else {
// }
// and are used to detect node collapse and to bypass
// calculations for efficiency. Node collapse is identified by the
// construct "collapse(n1,n2)". The actual handling of this will be
// simulator specific.
// Temperature mappings are written as being from TNOM to the device
// temperature. Parameters that are temperature dependent are written
// at TNOM as XXX@TNOM where XXX is the "usual" parameter name.
//
// Macros: qj(V,P,M,FC,A) normalized junction depletion charge
// V = junction applied voltage
// P = junction built-in potential
// M = junction grading coefficient
// FC = fraction of P at which numerical switch is made
// A = corner/smoothing coefficient for single piece model
// Note: the qj model is used in the base charge qb
// formulation, and so must have a reference such that
// qj(V=0)=0.
// psibi(P,EA,Vtv,rT) built-in potential as a function of temperature
// P = built-in potential at TNOM
// EA = activation energy (can differ from bandgap)
// Vtv = thermal voltage
// rT = ratio Tdev/TNOM in K
// The SPICE model is in error for high temperatures
// as it can give negative psibi. The model below has the
// proper physical behavior.
// avalm(V,P,M,AV1,AV2) (weak) avalanche multiplication factor
// V = junction applied voltage
// P = junction built-in potential
// M = junction grading coefficient
// AV1 = avalanche paramater 1
// AV2 = avalanche parameter 2
//
// **********
// ********** Implementation Notes:
// **********
// ********** 1. In SABER log is log10, so use ln for log below
// ********** 2. In simulators that use SPICE-like algorithms, initialize
// ********** as per SGP (SPICE Gummel-Poon) model for Vbei and Vbci,
// ********** and with zero for other branches. Use pnjlim for all
// ********** junctions (including parasitic), and also for Vbcx,
// ********** which must me calculated from Vbci-Vrci.
// ********** 3. For simplicity and efficiency, the Igc and Ibc elements
// ********** can be combined, but to do this the combined element
// ********** depends on Vbei and Vbci, not just the latter as
// ********** Ibc does, so the appropriate entries must be stamped.
// ********** 4. For the self-heating version, limiting should be used
// ********** for the change in local temperature between NR iterations.
// ********** The local temperature rise should also not be less than
// ********** zero, and values that drive the absolute temperature
// ********** of a device to a low value (or negative, in K) will cause
// ********** numerical problems. There is no standard pnjlim-like
// ********** function for limiting self-heating, so you will need to
// ********** provide one.
// **********
//
begin macro psibi ( P, EA, Vtv, rT ) {
psiio = 2.0 * Vtv * log \
( exp ( 0.5 * P / Vtv ) - exp ( - 0.5 * P / Vtv ) )
psiin = psiio * rT - 3.0 * Vtv * log ( rT ) - EA * ( rT - 1.0 )
psibi = psiin + 2.0 * Vtv * log ( 0.5 * \
( 1.0 + sqrt ( 1.0 + 4.0 * exp ( - psiin / Vtv ) ) ) )
}
begin macro qj ( V, P, M, FC, A ) {
if ( A <= 0.0 ) {
//
// SPICE regional depletion capacitance model
//
dvh = V - FC * P
if ( dvh > 0.0 ) {
qlo = P * ( 1.0 - ( 1.0 - FC ) ^ ( 1.0 - M ) ) / ( 1.0 - M )
qhi = dvh * ( 1.0 - FC + 0.5 * M * dvh / P ) / \
( ( 1.0 - FC ) ^ ( 1.0 + M ) )
} else {
qlo = P * ( 1.0 - ( 1.0 - V / P ) ^ ( 1.0 - M ) ) / ( 1.0 - M )
qhi = 0.0
}
qj = qlo + qhi
} else {
//
// Single piece depletion capacitance model
//
// Based on c=1/(1-V/P)^M, with sqrt limiting to make it
// C-inf continuous (and computationally efficient), with
// added terms to make it monotonically increasing (which
// is physically incorrect, but avoids numerical problems
// and kinks near where the depletion and diffusion
// capacitances are of similar magnitude), and with appropriate
// offsets added to that qj(V=0)=0.
//
dv0 = - P * FC
mv0 = sqrt ( dv0 * dv0 + A )
vl0 = 0.5 * ( dv0 - mv0 ) + P * FC
q0 = - P * ( 1.0 - vl0 / P ) ^ ( 1.0 - M ) / ( 1.0 - M )
dv = V - P * FC
mv = sqrt ( dv * dv + A )
vl = 0.5 * ( dv - mv ) + P * FC
qlo = - P * ( 1.0 - vl / P ) ^ ( 1.0 - M ) / ( 1.0 - M )
qj = qlo + ( 1.0 - FC ) ^ ( - M ) * ( V - vl + vl0 ) - q0
}
}
begin macro avalm ( V, P, M, AV1, AV2) {
//
// Kloosterman/de Graaff weak avalanche model
//
vl = 0.5 * ( sqrt ( ( P - V ) ^ 2 + 0.01 ) + ( P - V ) )
avalm = AV1 * vl * exp ( - AV2 * vl ^ ( M - 1.0 ) )
}
begin model definition {
// cpp definitions for constants and switches
#undef SELF-HEATING // use undef to switch off SELF-HEATING
#undef EXCESS-PHASE // use undef to switch off EXCESS-PHASE
#define KB 1.380662E-23 // Boltzmann's constant, J/K
#define QQ 1.602189E-19 // magnitude of electronic charge, C
#define TABS 2.731500E+02 // 0 degrees C in degrees K
// extern definitions, for variables from simulator
extern {
TAMB // ambient temperature of chip
FREQ // frequency, for AC and noise analyses
SCALE // scaling factor (default=1.0)
}
// external nodes that must be connected in circuit netlist
external nodes {
#ifdef SELF-HEATING
c b e s dt tl // Local temperature nodes added for SELF-HEATING.
// dt is local temperature rise, tl is local
// temperature, for single device self-heating
// connect tl to ground in the netlist.
// For wafer-level multi-device coupled electrothermal
// simulation connect tl nodes with thermal resistances
// that model heat flow between adjacent devices and to
// ambient. For more than single-pole thermal
// impedance model set CTH to zero, RTH to a large
// value, and connect the more complex local thermal
// network model between dt and tl.
#else
c b e s
#endif
}
// internal nodes, this information is implicit in branch
// voltage/current/charge/flux definitions below
internal nodes {
#ifdef EXCESS-PHASE
cx ci bx bi ei si bp xf1 xf2
#else
cx ci bx bi ei si bp
#endif
}
branch voltages {
// name = V(n1) - V(n2) where voltage is measured from node n1 to node n2
Vbe = V(b ) - V(e ) // extrinsic b-e voltage
Vbc = V(b ) - V(c ) // extrinsic b-c voltage
Vbei = V(bi ) - V(ei ) // intrinsic b-e voltage
Vbex = V(bx ) - V(ei ) // side b-e voltage
Vbci = V(bi ) - V(ci ) // intrinsic b-c voltage
Vrcx = V(c ) - V(cx ) // voltage across RCX
Vrci = V(cx ) - V(ci ) // voltage across RCI
Vrbx = V(b ) - V(bx ) // voltage across RBX
Vrbi = V(bx ) - V(bi ) // voltage across RBI
Vre = V(e ) - V(ei ) // voltage across RE
Vrs = V(s ) - V(si ) // voltage across RS
Vbep = V(bx ) - V(bp ) // parasitic b-e voltage (pnp polarity)
Vbcp = V(si ) - V(bp ) // parasitic b-c voltage (pnp polarity)
Vrbp = V(cx ) - V(bp ) // voltage across RBP
#ifdef SELF-HEATING
delT = V(dt ) - V(tl ) // voltage across RTH, local temperature rise
// measured with respect to ground (ambient)
#endif
#ifdef EXCESS-PHASE
Vcxf = V(xf1) - V(0 ) // voltage across excess-phase capacitor
Vrxf = V(xf2) - V(0 ) // voltage across excess-phase resistor Itxf
#endif
}
branch currents {
// NOTE: the dependencies listed below are for convenience, they are in
// fact implicit in the equations for the branch currents and charges of
// the model. If the SELF-HEATING model is used, then all branch
// currents and charges depend on all branch voltages, through the local
// temperature rise delT. This is not shown below. Of course, the matrix
// stamp becomes much more dense (less sparse) with SELF-HEATING.
// name from n1 to n2 dependencies on branch voltages
#ifdef SELF-HEATING
#ifdef EXCESS-PHASE
Itxf from ci to ei Vrxf,delT // forward transport current
#else
Itzf from ci to ei Vbei,Vbci,delT // forward transport current
#endif
Itzr from ei to ci Vbei,Vbci,delT // reverse transport current
Ibe from bi to ei Vbei,delT // intrinsic b-e current
Ibex from bx to ei Vbex,delT // side b-e current
Ibc from bi to ci Vbci,delT // intrinsic b-c current
Igc from ci to bi Vbei,Vbci,delT // c-b weak avalanche current
Ircx from c to cx Vrcx,delT // RCX element
Irci from cx to ci Vbci,Vrci,delT // RCI element
Irbx from b to bx Vrbx,delT // RBX element
Irbi from bx to bi Vrbi,Vbei,Vbci,delT // RBI element
Ire from e to ei Vre,delT // RE element
Irs from s to si Vrs,delT // RS element
Iccp from bx to si Vbep,Vbcp,Vbci,delT // parasitic transprt I
Ibep from bx to bp Vbep,delT // parasitic b-e current
Ibcp from si to bp Vbcp,delT // parasitic b-c current
Irbp from cx to bp Vrbp,Vbep,Vbci,delT // RBP element
Ith from tl to dt Vbei,Vbci,Vrcx,Vrci,Vrbx,Vrbi,Vre,Vbep,Vbcp \
Vrbp,Vrs,Vbex,delT
// thermal power generation
Irth from dt to tl delT // thermal resistance RTH
#else
#ifdef EXCESS-PHASE
Itxf from ci to ei Vrxf // forward transport current
#else
Itzf from ci to ei Vbei,Vbci // forward transport current
#endif
Itzr from ei to ci Vbei,Vbci // reverse transport current
Ibe from bi to ei Vbei // intrinsic b-e current
Ibex from bx to ei Vbex // side b-e current
Ibc from bi to ci Vbci // intrinsic b-c current
Igc from ci to bi Vbei,Vbci // c-b weak avalanche current
Ircx from c to cx Vrcx // RCX element
Irci from cx to ci Vbci,Vrci // RCI element
Irbx from b to bx Vrbx // RBX element
Irbi from bx to bi Vrbi,Vbei,Vbci // RBI element, it gets the
// Vbe/ci dependence through qb
Ire from e to ei Vre // RE element
Irs from s to si Vrs // RS element
Iccp from bx to si Vbep,Vbcp,Vbci // parasitic transport current
Ibep from bx to bp Vbep // parasitic b-e current
Ibcp from si to bp Vbcp // parasitic b-c current
Irbp from cx to bp Vrbp,Vbep,Vbci // RBP element, it gets the
// Vbep and Vbci dependence
// through qbp
#endif
#ifdef EXCESS-PHASE
Itzf from 0 to xf1 Vbei,Vbci // fwd transport zero phase
Itxf from xf2 to 0 Vrxf // fwd transport excess-phase
Ilxf from xf1 to xf2 // excess-phase inductor, which
// is the formulation variable
// for this element and so is
// not dependent on any branch
// voltages
#endif
}
branch charges { // charges give currents Q_t
// name from n1 to n2 dependencies on branch voltages
Qbeo from b to e Vbe // extrinsic b-e overlap charge
Qbco from b to c Vbc // extrinsic b-c overlap charge
#ifdef SELF-HEATING
Qbe from bi to ei Vbei,Vbci,delT // intrinsic b-e charge
Qbex from bx to ei Vbex,delT // side b-e charge
Qbc from bi to ci Vbci,delT // intrinsic b-c charge
Qbcx from bi to cx Vbci,Vrci,delT // b-c/epi charge
Qbep from bx to bp Vbep,Vbci,delT // parasitic b-e charge
Qbcp from si to bp Vbcp,delT // parasitic b-c charge
Qcth from dt to tl delT // thermal capacitance CTH
#else
Qbe from bi to ei Vbei,Vbci // intrinsic b-e charge
Qbex from bx to ei Vbex // side b-e charge
Qbc from bi to ci Vbci // intrinsic b-c charge
Qbcx from bi to cx Vbci,Vrci // b-c/epi charge
Qbep from bx to bp Vbep,Vbci // parasitic b-e charge
Qbcp from si to bp Vbcp // parasitic b-c charge
#endif
#ifdef EXCESS-PHASE
Qcxf from xf1 to 0 Vcxf // excess-phase capacitance
#endif
}
#ifdef EXCESS-PHASE
branch fluxes { // fluxes give voltages F_t
// name from n1 to n2 dependencies on branch currents
Flxf from xf1 to xf2 Ilxf // excess-phase inductor
}
#endif
parameter list {
// name default
TNOM 2.7E+01 // nominal measurement temperature of parameters
RCX@TNOM 0.0 // extrinsic coll resistance
RCI@TNOM 0.0 // intrinsic coll resistance
VO@TNOM 0.0 // epi drift saturation voltage
GAMM@TNOM 0.0 // epi doping parameter
HRCF 1.0 // high current RC factor
RBX@TNOM 0.0 // extrinsic base resistance
RBI@TNOM 0.0 // intrinsic base resistance
RE@TNOM 0.0 // emit resistance
RS@TNOM 0.0 // subs resistance
RBP@TNOM 0.0 // parasitic base resistance
IS@TNOM 1.0E-16 // transport saturation current
NF@TNOM 1.0 // fwd emission coefficient
NR@TNOM 1.0 // rev emission coefficient
FC 0.9 // fwd bias depletion capacitance limit
CBEO 0.0 // extrinsic b-e overlap capacitance
CJE@TNOM 0.0 // b-e zero bias capacitance
PE@TNOM 0.75 // b-e built-in potential
ME 0.33 // b-e grading coefficient
AJE -.5 // b-e capacitance smoothing factor
CBCO 0.0 // extrinsic b-c overlap capacitance
CJC@TNOM 0.0 // b-c intrinsic zero bias capacitance
QCO 0.0 // epi charge parameter
CJEP@TNOM 0.0 // b-c extrinsic zero bias capacitance
PC@TNOM 0.75 // b-c built-in potential
MC 0.33 // b-c grading coefficient
AJC -.5 // b-c capacitance smoothing factor
CJCP@TNOM 0.0 // s-c zero bias capacitance
PS@TNOM 0.75 // s-c built-in potential
MS 0.33 // s-c grading coefficient
AJS -.5 // s-c capacitance smoothing factor
IBEI@TNOM 1.0E-18 // ideal b-e saturation current
WBE 1.0 // portion of IBEI from Vbei, 1-WBE from Vbex
NEI 1.0 // ideal b-e emission coefficient
IBEN@TNOM 0.0 // non-ideal b-e saturation current
NEN 2.0 // non-ideal b-e emission coefficient
IBCI@TNOM 1.0E-16 // ideal b-c saturation current
NCI 1.0 // ideal b-c emission coefficient
IBCN@TNOM 0.0 // non-ideal b-c saturation current
NCN 2.0 // non-ideal b-c emission coefficient
AVC1 0.0 // b-c weak avalanche parameter 1
AVC2@TNOM 0.0 // b-c weak avalanche parameter 2
ISP@TNOM 0.0 // parasitic transport saturation current
WSP 1.0 // portion of ICCP from Vbep, 1-WSP from Vbci
NFP 1.0 // parasitic fwd emission coefficient
IBEIP@TNOM 0.0 // ideal parasitic b-e saturation current
IBENP@TNOM 0.0 // non-ideal parasitic b-e saturation current
IBCIP@TNOM 0.0 // ideal parasitic b-c saturation current
NCIP 1.0 // ideal parasitic b-c emission coefficient
IBCNP@TNOM 0.0 // non-ideal parasitic b-c saturation current
NCNP 2.0 // non-ideal parasitic b-c emission coefficient
VEF 0.0 // fwd Early voltage, zero means infinity
VER 0.0 // rev Early voltage, zero means infinity
IKF 0.0 // fwd knee current, zero means infinity
IKR 0.0 // rev knee current, zero means infinity
IKP 0.0 // parasitic knee current, zero means infinity
TF 0.0 // fwd transit time
QTF 0.0 // variation of TF with base-width modulation
XTF 0.0 // coeff. of TF bias dependence
VTF 0.0 // coeff. of TF dependence on Vbc
ITF 0.0 // coeff. of TF dependence in Ic
TR 0.0 // rev transit time
TD 0.0 // fwd excess-phase delay time
KFN 0.0 // b-e flicker noise constant
AFN 1.0 // b-e flicker noise exponent
BFN 1.0 // b-e flicker noise 1/f dependence
XRE 0.0 // temperature exponent of emit resistance
XRB 0.0 // temperature exponent of base resistance
XRC 0.0 // temperature exponent of coll resistance
XRS 0.0 // temperature exponent of subs resistance
XVO 0.0 // temperature exponent of VO
EA 1.12 // activation energy for IS
EAIE 1.12 // activation energy for IBEI
EAIC 1.12 // activation energy for IBCI/IBEIP
EAIS 1.12 // activation energy for IBCIP
EANE 1.12 // activation energy for IBEN
EANC 1.12 // activation energy for IBCN/IBENP
EANS 1.12 // activation energy for IBCNP
XIS 3.0 // temperature exponent of IS
XII 3.0 // temperature exponent of IBEI/IBCI/IBEIP/IBCIP
XIN 3.0 // temperature exponent of IBEN/IBCN/IBENP/IBCNP
TNF 0.0 // temperature coefficient of NF
TAVC 0.0 // temperature coefficient of AVC2
RTH 0.0 // thermal resistance
CTH 0.0 // thermal capacitance
// End of parameter list.
}
parameter aliases {
// This section lists parameter aliases, primarily for paramaters
// that contain the number 0 (zero) or the letter O.
TNOM: TN0M, TREF
VO: V0
CBEO: CBE0
CBCO: CBC0
QCO: QC0
XVO: XV0
// End of parameter aliases.
}
temperature mappings {
// This section defines mappings of temperature dependent parameters.
// Note that with SELF-HEATING these mappings must be done at each
// bias calculation, and cannot be relegated to preprocessing, because
// the "voltage" for the local temperature rise delT must be taken
// into account.
#ifdef SELF-HEATING
Tdev = TAMB + TABS + delT // device temperature (K), with delT
#else
Tdev = TAMB + TABS // device temperature (K)
#endif
Tini = TNOM + TABS // TNOM in K
Vtv = KB * Tdev / QQ // thermal voltage
rT = Tdev / Tini // ratio Tdev/TNOM in K
RCX = RCX@TNOM * rT ^ XRC // temperature mapping
RCI = RCI@TNOM * rT ^ XRC // of resistances is
RBX = RBX@TNOM * rT ^ XRB // according to mobility
RBI = RBI@TNOM * rT ^ XRB // variation, which
RE = RE@TNOM * rT ^ XRE // should be same in
RS = RS@TNOM * rT ^ XRS // emit/coll & base/subs
RBP = RBP@TNOM * rT ^ XRC // Note: RBP is in coll
// Note: the following differs from the standard SPICE temperature
// mappings for IS/ISE/BF. This is for two reasons. First,
// the base current is formulated directly in terms
// of ideal and non-ideal currents rather than in terms of current
// gain BF/transport current and non-ideal current. Second,
// particularly for HBTs, using the bandgap in the first-order
// theory expression for how IS should change with temperature often
// gives a poor model. To properly track IS and beta (both low and
// moderate bias) over temperature there is an activation energy
// in the first-order model that is (slightly) different from the bandgap,
// and is different for all of IS, IBEI and IBEN.
// 01/26/94: the b-e and b-c components show slightly different behavior
// over temperature, so "activation energies" have been introduced for
// ideal and non-ideal components of b-e, b-c and s-c junctions. This
// allows separate fitting of forward and reverse beta curves over
// temperature.
IS = IS@TNOM * ( rT ^ XIS * exp ( - EA * ( 1.0 - rT ) / Vtv ) )\
^ ( 1.0 / NF@TNOM )
ISP = ISP@TNOM * ( rT ^ XIS * exp ( - EA * ( 1.0 - rT ) / Vtv ) )\
^ ( 1.0 / NFP )
IBEI = IBEI@TNOM * ( rT ^ XII * exp ( - EAIE * ( 1.0 - rT ) / Vtv ) )\
^ ( 1.0 / NEI )
IBEN = IBEN@TNOM * ( rT ^ XIN * exp ( - EANE * ( 1.0 - rT ) / Vtv ) )\
^ ( 1.0 / NEN )
IBCI = IBCI@TNOM * ( rT ^ XII * exp ( - EAIC * ( 1.0 - rT ) / Vtv ) )\
^ ( 1.0 / NCI )
IBCN = IBCN@TNOM * ( rT ^ XIN * exp ( - EANC * ( 1.0 - rT ) / Vtv ) )\
^ ( 1.0 / NCN )
IBEIP = IBEIP@TNOM * ( rT ^ XII * exp ( - EAIC * ( 1.0 - rT ) / Vtv ) )\
^ ( 1.0 / NCI )
IBENP = IBENP@TNOM * ( rT ^ XIN * exp ( - EANC * ( 1.0 - rT ) / Vtv ) )\
^ ( 1.0 / NCN )
IBCIP = IBCIP@TNOM * ( rT ^ XII * exp ( - EAIS * ( 1.0 - rT ) / Vtv ) )\
^ ( 1.0 / NCIP )
IBCNP = IBCNP@TNOM * ( rT ^ XIN * exp ( - EANS * ( 1.0 - rT ) / Vtv ) )\
^ ( 1.0 / NCNP )
// Linear temperature mappings for NF/NR and AVC2
// Note: this is an undesirable type of temperature mapping,
// as it cannot be done "in-place" because it does not have the
// properties P(T1->T2->T3)=P(T1->T3) and P(T1->T2->T1)=P(T1).
// For this model it is best to always map from P@TNOM.
NF = NF@TNOM * ( 1.0 + TNF * ( Tdev - Tini ) )
NR = NR@TNOM * ( 1.0 + TNF * ( Tdev - Tini ) )
AVC2 = AVC2@TNOM * ( 1.0 + TAVC * ( Tdev - Tini ) )
// Temperature mappings for built-in potentials
PE = psibi ( PE@TNOM, EAIE, Vtv, rT )
PC = psibi ( PC@TNOM, EAIC, Vtv, rT )
PS = psibi ( PS@TNOM, EAIS, Vtv, rT )
// zero-bias capacitance temperature mappings come directly from the
// first-order theory for p-n junction capacitance as:
CJE = CJE@TNOM * ( PE@TNOM / PE ) ^ ME
CJC = CJC@TNOM * ( PC@TNOM / PC ) ^ MC
CJEP = CJEP@TNOM * ( PC@TNOM / PC ) ^ MC
CJCP = CJCP@TNOM * ( PS@TNOM / PS ) ^ MS
// Temperature mappings for epi parameters
GAMM = GAMM@TNOM * ( rT ^ XIS * exp ( - EA * ( 1.0 - rT ) / Vtv ) )
VO = VO@TNOM * rT ^ XVO
// End of temperature mappings.
}
parameter checks {
// This section defines constraints on model parameters. This is not
// done in SPICE at present, but it should be an integral part
// of a model, so is included here. This does not mean it can or will
// be enforced/implemented in any particular simulator.
0.0 <= RCX
0.0 <= RCI
0.0 <= VO
0.0 <= GAMM
0.0 <= HRCF
0.0 <= RBX
0.0 <= RBI
0.0 <= RE
0.0 <= RBP
0.0 <= IS
0.0 < NF
0.0 < NR
0.0 <= CBEO
0.0 <= CJE
0.0 < PE
0.0 <= CBCO
0.0 <= CJC
0.0 <= CJEP
0.0 < PC
0.0 <= CJCP
0.0 < PS
0.0 <= IBEI
0.0 <= WBE <= 1.0
0.0 < NEI < NEN
0.0 <= IBEN
0.0 <= IBCI
0.0 < NCI < NCN
0.0 <= IBCN
0.0 <= AVC1
0.0 <= AVC2
0.0 <= ISP
0.0 <= WSP <= 1.0
0.0 < NFP
0.0 <= IBEIP
0.0 <= IBENP
0.0 <= IBCIP
0.0 < NCIP < NCNP
0.0 <= IBCNP
0.0 <= VEF
0.0 <= VER
0.0 <= IKF
0.0 <= IKR
0.0 <= IKP
0.0 <= TF
0.0 <= TR
#ifdef EXCESS-PHASE
0.0 < TD
#endif
0.0 <= KFN
0.0 < AFN
0.0 < BFN
0.0 <= XRE
0.0 <= XRB
0.0 <= XRC
0.0 <= XRS
#ifdef SELF-HEATING
0.0 <= RTH
0.0 <= CTH
#endif
// End of parameter checks.
}
equations {
// This section defines branch currents, charges. and fluxes as functions
// of the branch voltages, currents, and model parameters.
// First some bias-independent calculations
if ( VEF <= 0.0 ) {
IVEF = 0.0
} else {
IVEF = 1.0 / VEF
}
if ( VER <= 0.0 ) {
IVER = 0.0
} else {
IVER = 1.0 / VER
}
if ( IKF <= 0.0 ) {
IIKF = 0.0
} else {
IIKF = 1.0 / IKF
}
if ( IKR <= 0.0 ) {
IIKR = 0.0
} else {
IIKR = 1.0 / IKR
}
if ( IKP <= 0.0 ) {
IIKP = 0.0
} else {
IIKP = 1.0 / IKP
}
if ( VO <= 0.0 ) {
IVO = 0.0
} else {
IVO = 1.0 / VO
}
if ( HRCF <= 0.0 ) {
IHRCF = 0.0
} else {
IHRCF = 1.0 / HRCF
}
if ( VTF <= 0.0 ) {
IVTF = 0.0
} else {
IVTF = 1.0 / VTF
}
if ( ITF <= 0.0 ) {
IITF = 0.0
slTF = 1.0
} else {
IITF = 1.0 / ITF
slTF = 0.0
}
#ifdef EXCESS-PHASE
if ( TD <= 0.0 ) {
LEP = 0.0
CEP = 0.0
} else {
LEP = TD / 3.0
CEP = TD
}
#endif
// Calculate normalized depletion charges
qdbe = qj ( Vbei, PE, ME, FC, AJE ) // b-e depletion charge
qdbex = qj ( Vbex, PE, ME, FC, AJE ) // b-e depletion charge (side)
qdbc = qj ( Vbci, PC, MC, FC, AJC ) // b-c depletion charge
qdbep = qj ( Vbep, PC, MC, FC, AJC ) // parasitic b-e deplt'n charge
// Note that b-c and parasitic b-e
// junctions are taken to have same
// built-in potential and grading coeff.
qdbcp = qj ( Vbcp, PS, MS, FC, AJS ) // parasitic b-c deplt'n charge
// Transport currents and qb
Itfi = IS * ( exp ( Vbei / ( NF * Vtv ) ) - 1.0 ) // fwd ideal
Itri = IS * ( exp ( Vbci / ( NR * Vtv ) ) - 1.0 ) // rev ideal
q1z = 1.0 + qdbe * IVER + qdbc * IVEF // proper q1
q1 = 0.5 * ( sqrt ( ( q1z - 0.0001 ) ^ 2 + 0.0001 * 0.0001 ) \
+ q1z - 0.0001 ) + 0.0001 // 1e-4 limit
q2 = Itfi * IIKF + Itri * IIKR
qb = 0.5 * ( q1 + sqrt ( q1 * q1 + 4.0 * q2 ) ) // no limiting
Itzr = Itri / qb // static rev
Itzf = Itfi / qb // static fwd
#ifdef EXCESS-PHASE
Flxf = LEP * Ilxf // flux in Lxf
Qcxf = CEP * Vcxf // charge in Cxf
Itxf = Vrxf // ex-ph fwd
#endif
// Transport currents and qb of the parasitic, to give Iccp
Itfp = ISP * ( WSP * exp ( Vbep / ( NFP * Vtv ) ) \
+ ( 1.0 - WSP ) * exp ( Vbci / ( NFP * Vtv ) ) - 1.0 )
Itrp = ISP * ( exp ( Vbcp / ( NFP * Vtv ) ) - 1.0 )
q2p = Itfp * IIKP // only fwd part
qbp = 0.5 * ( 1.0 + sqrt ( 1.0 + 4.0 * q2p ) )// no Early effect
Iccp = ( Itfp - Itrp ) / qbp // parasitic transport I
// Currents in resistors, with nodes collapsed for zero resistance
// Note that RBI, RCI and RBP are modulated
if ( RCX <= 0.0 ) {
collapse ( c , cx )
} else {
Ircx = Vrcx / RCX
}
if ( RCI <= 0.0 ) {
collapse ( cx, ci )
Kbci = 0.0
Kbcx = 0.0
} else { // modified Kull quasi-sat model
Vbcx = Vbci - Vrci
Kbci = sqrt ( 1.0 + GAMM * exp ( Vbci / Vtv ) )
Kbcx = sqrt ( 1.0 + GAMM * exp ( Vbcx / Vtv ) )
rKp1 = ( Kbci + 1.0 ) / ( Kbcx + 1.0 )
Iohm = ( Vrci + Vtv * ( Kbci - Kbcx - log ( rKp1 ) ) ) / RCI
derf = IVO * RCI * Iohm / ( 1.0 + 0.5 * IVO * IHRCF * \
sqrt ( Vrci * Vrci + 0.01 ) )
Irci = Iohm / sqrt ( 1.0 + derf * derf )
}
if ( RBX <= 0.0 ) {
collapse ( b , bx )
} else {
Irbx = Vrbx / RBX
}
if ( RBI <= 0.0 ) {
collapse ( bx, bi )
} else {
Irbi = Vrbi * qb / RBI // simple qb modulation model for now,
// other models to be defined.
// Irbi=Irbi(Vrbi,Vbei,Vbci) because
// qb =qb ( Vbei,Vbci)
}
if ( RE <= 0.0 ) {
collapse ( e , ei )
} else {
Ire = Vre / RE
}
if ( RS <= 0.0 ) {
collapse ( s , si )
} else {
Irs = Vrs / RS
}
if ( RBP <= 0.0 ) {
collapse ( cx, bp )
} else {
Irbp = Vrbp * qbp / RBP // Irbp=Irbp(Vrbp,Vbep) because
// qbp = qbp( Vbep)
}
// b-e and b-c components of base current of intrinsic device
Ibe = WBE * \
( IBEI * ( exp ( Vbei / ( NEI * Vtv ) ) - 1.0 ) \
+ IBEN * ( exp ( Vbei / ( NEN * Vtv ) ) - 1.0 ) )
Ibex = ( 1.0 - WBE ) * \
( IBEI * ( exp ( Vbex / ( NEI * Vtv ) ) - 1.0 ) \
+ IBEN * ( exp ( Vbex / ( NEN * Vtv ) ) - 1.0 ) )
Ibc = ( IBCI * ( exp ( Vbci / ( NCI * Vtv ) ) - 1.0 ) \
+ IBCN * ( exp ( Vbci / ( NCN * Vtv ) ) - 1.0 ) )
// Parasitic b-e current, with calculation bypass for efficiency
// Emission coefficients are same as for intrinsic b-c, as they
// are the same junction
if ( IBEIP <= 0.0 && IBENP <= 0.0 ) {
Ibep = 0.0
} else {
Ibep = IBEIP * ( exp ( Vbep / ( NCI * Vtv ) ) - 1.0 ) \
+ IBENP * ( exp ( Vbep / ( NCN * Vtv ) ) - 1.0 )
}
// Parasitic b-c current, with calculation bypass for efficiency.
// This element should normally never be of importance, but is
// included to detect incorrect biasing, a useful task.
if ( IBCIP <= 0.0 && IBCNP <= 0.0 ) {
Ibcp = 0.0
} else {
Ibcp = IBCIP * ( exp ( Vbcp / ( NCIP * Vtv ) ) - 1.0 ) \
+ IBCNP * ( exp ( Vbcp / ( NCNP * Vtv ) ) - 1.0 )
}
// b-c weak avalanche current
if ( AVC1 <= 0.0 ) {
Igc = 0.0
} else {
Igc = ( Itzf - Itzr - Ibc ) * avalm ( Vbci, PC, MC, AVC1, AVC2 )
}
// Charge elements, Qbe diffusion charge is not split at present
// This is the only place where C-inf continuity is broken, as the
// SPICE forward transit time bias dependence, which includes "if"
// conditions, is used
sgItf = 0.0
if ( Itfi > 0.0 ) {
sgItf = 1.0
}
rItf = Itfi * sgItf * IITF
tff = TF * ( 1.0 + QTF * q1 ) * \
( 1.0 + XTF * exp ( Vbci * IVTF / 1.44 ) \
* ( slTF + ( rItf / ( rItf + 1.0 ) ) ^ 2 ) * sgItf )
Qbe = CJE * qdbe * WBE + tff * Itfi / qb
Qbex = CJE * qdbex * ( 1.0 - WBE )
Qbc = CJC * qdbc + TR * Itri + QCO * Kbci
Qbcx = QCO * Kbcx
Qbep = CJEP * qdbep + TR * Itfp
Qbcp = CJCP * qdbcp // no diffusion charge
Qbeo = CBEO * Vbe // extrinsic b-e overlap charge
Qbco = CBCO * Vbc // extrinsic b-c overlap charge
#ifdef SELF-HEATING
// Thermal power generation must be done by summing I*V over all
// non-energy storage elements of the electrical model
if ( RTH <= 0.0 ) {
collapse ( dt , tl )
} else {
Ith = Ibe * Vbei + Ibc * Vbci \
+ ( Itzf - Itzr ) * ( Vbei - Vbci ) \
+ Ibep * Vbep + Ibcp * Vbcp + Iccp * ( Vbep - Vbcp ) \
+ Ircx * Vrcx + Irci * Vrci + Irbx * Vrbx \
+ Irbi * Vrbi + Ire * Vre + Irbp * Vrbp \
+ Irs * Vrs + Ibex * Vbex - Igc * Vbci
// Simple linear thermal resistance and capacitance, could be
// made nonlinear if necessary
Irth = delT / RTH
Qcth = CTH * delT
}
#endif
// End of equations.
}
noise {
// This section defines noise current generators, in A^2/Hz, which
// (for noise analyses) are connected in parallel with the linearized
// (small-signal) element. NOTES: noise models are a function of
// defined branch currents, and derivatives of branch currents w.r.t.
// defined branch voltages, indicated by an underscore "_". Device
// temperature "Tdev" and simulation frequency "FREQ" are from
// temperature section and simulator (defined as extern), respectively.
Itzf: 2.0 * QQ * Itzf // Itzf shot noise
Ibe: 2.0 * QQ * Ibe \ // Ibe shot noise
+ KFN * Ibe ^ AFN / FREQ ^ BFN // and 1/f noise
Ircx: 4.0 * KB * Tdev * Ircx_Vrcx // RCX thermal noise
Irci: 4.0 * KB * Tdev * Irci_Vrci // RCI thermal noise
Irbx: 4.0 * KB * Tdev * Irbx_Vrbx // RBX thermal noise
Irbi: 4.0 * KB * Tdev * Irbi_Vrbi // RBI thermal noise
Ire: 4.0 * KB * Tdev * Ire_Vre // RE thermal noise
Irs: 4.0 * KB * Tdev * Irs_Vrs // RS thermal noise
Iccp: 2.0 * QQ * Iccp // Iccp shot noise
Ibep: 2.0 * QQ * Ibep \ // Ibep shot noise
+ KFN * Ibep ^ AFN / FREQ ^ BFN // and 1/f noise
Irbp: 4.0 * KB * Tdev * Irbp_Vrbp // RBP thermal noise
// End of noise equations.
}
// End of model definition.
}