# BJT Is Saturation current temperature dependence singularity

So, I am currently looking at the ways transistors change their parameters with temperature according to SPICE for a thorough investigation of synthesizer VCO exponential converter. Particularly, the Is saturation according to this SPICE description varies with temperature like this:

What troubles me is the 1/(T1-T0) term in the exponent. Say, the saturation current is measured at 25 degrees celsius, then, when we try to determine the Is at that temperature we get Exp[1/0], which is an obvious singularity. At temperatures slightly lower than 25 degrees this term is zero, at temperatures slightly higher it tends to infinity. What am I understanding wrong here or is the formula just wrong? If so, what's the right one?

• The units of the equation cited don't make sense. The units should cancel in the expression within the exp() function. And they do not in the case you show. However, this is the equation I'm familiar with and the units do cancel in it:$$I_{\text{SAT}\left(T\right)}=I_{\text{SAT}\left(T_\text{nom}\right)}\cdot\left[\left(\frac{T}{T_\text{nom}}\right)^{3}e^{\frac{E_g}{k}\cdot\left(\frac{1}{T_\text{nom}}-\frac{1}{T}\right)}\right]$$
– jonk
Commented Apr 10, 2022 at 3:53
• What I provided follows from ideas related to entropy. When system 1 gives energy $\text{d}U$ to system 2 the loss diminishes the available states in system 1 and increases the available states in system 2. The net change in entropy of system (1 + 2) is $\text{d}S= \frac{\partial \,S_1}{\partial U}\left(-\text{d}U\right) + \frac{\partial \,S_2}{\partial U}\text{d}U$. Set $\frac{\partial \,S}{\partial U} = \frac{1}{T}$. Now $\text{d}S= \left(\frac1{T_{_2}} - \frac1{T_{_1}}\right)\text{d}U$. Search for the Boltzmann Factor in the context of statistical thermodynamics.
– jonk
Commented Apr 10, 2022 at 4:02
• What I learned much from is Ian Getreu's "Modeling the Bipolar Transistor.". It was originally published via Tektronix. But Ian (and a friend of mine and I who get a little mention in the book) worked to make it available again. (I get nothing from the sales. Ian is the only recipient other than Lulu if you make a purchase.) The book is unique in its coverage, my opinion. There's nothing like it, elsewhere.
– jonk
Commented Apr 10, 2022 at 16:30
• Ian's book gets the equation right. It's also chock-full, listing out pretty much all of the relevant papers (about 75 of them) that went into creating the models. It covers the derivations as well as how to develop test procedures to measure various parameters. It does not cover statistical thermodynamics, though. For that, there are other references.
– jonk
Commented Apr 10, 2022 at 16:32
• @Kubahasn'tforgottenMonica It is worth every penny. That's why I worked so hard to get it re-published. I had a copy from when I worked at Tek. But I wasn't going to give my copy away!!! I wanted some way to allow others to gain access to it. Ian worked with Tektronix and they gave him the rights. And that launched the effort. Once in a while, Ian writes to me to say he "owes me lunch." ;) I went with him to Barrie Gilbert's funeral more than a year ago.
– jonk
Commented Apr 14, 2022 at 0:44

The documentation simply got it wrong. It's old and probably nobody cared enough to fix it, assuming they spotted the mistake. The units don't work out, the possibility of a 0 in the denominator shouldn't be there either. There's no singularity.

According to Berkley SPICE 3f5 source code, the equation should read:

\begin{aligned} V_T(T) &= T \frac{k}{q(1{\rm\,V})} \\ I_S(T) &= I_S(T_0) \left[\frac{T}{T_0}\right]^3 \exp \left[ \frac{E_g}{V_T(T)} \left(\frac{T}{T_0} - 1\right) \right]. \end{aligned}

The code involved, edited for readability, taken from src/lib/dev/bjt/bjttemp.c, is:

vt = here->BJTtemp * CONSTKoverQ;
ratlog = log(here->BJTtemp/model->BJTtnom);
ratio1 = here->BJTtemp/model->BJTtnom -1;
factlog = ratio1 * model->BJTenergyGap/vt + model->BJTtempExpIS*ratlog;
factor = exp(factlog);


The 1V factor isn't written explicitly in the source code, but is required to get the units correct. Numerically it makes no difference. Multiplying by 1 is a no-op, not even worth putting in the source code. Back then, compilers might have had trouble optimizing such a multiplication-by-one out.

Reorganizing things a bit:

\begin{aligned} I_S(T) &= I_S(T_0) \left[\frac{T}{T_0}\right]^3 \exp \left[ \frac{E_g q (1{\rm\,V})}{k T} \left(\frac{T}{T_0} - 1\right) \right] \\ &= I_S(T_0) \left[\frac{T}{T_0}\right]^3 \exp \left[ \frac{E_g q (1{\rm\,V})}{k} \left(\frac{1}{T_0} - \frac{1}{T}\right) \right] \\ \end{aligned}

Where, from src/include/const.h and src/lib/dev/bjt/bjtsetup.c we get:

\begin{aligned} q &= 1.6021918\cdot{10}^{-19}{\rm\,C} \\ k &= 1.3806226\cdot{10}^{-23}{\rm\,J\cdot K^{-1}} \\ E_g &= 1.11{\rm\,eV} \\ \end{aligned}

This explains the "mysterious" $$\E_g\cdot q(1{\rm\,V})\$$ product in the formula: it converts $$\E_g\$$ customarily given in electron-Volts to Joules, to match the SI units of the Boltzmann constant value used.

In SI units, the formula becomes, simply:

\begin{aligned} I_S(T) &= I_S(T_0) \left[\frac{T}{T_0}\right]^3 \exp \left[ \frac{E_g}{k} \left(\frac{1}{T_0} - \frac{1}{T}\right) \right], \\ \end{aligned}