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:

Is temperature dependence in SPICE

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?

  • 3
    \$\begingroup\$ 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]$$ \$\endgroup\$
    – jonk
    Apr 10, 2022 at 3:53
  • 3
    \$\begingroup\$ 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. \$\endgroup\$
    – jonk
    Apr 10, 2022 at 4:02
  • 2
    \$\begingroup\$ 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. \$\endgroup\$
    – jonk
    Apr 10, 2022 at 16:30
  • 1
    \$\begingroup\$ 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. \$\endgroup\$
    – jonk
    Apr 10, 2022 at 16:32
  • 2
    \$\begingroup\$ @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. \$\endgroup\$
    – jonk
    Apr 14, 2022 at 0:44

1 Answer 1


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} $$

just as jonk had commented.

  • \$\begingroup\$ Thank you very much! Is there, by any chance, a good modern SPICE documentation with models description? Only things I have found are the original SPICE2 paper and this documentation I linked in my post, which is not only sparse, but, apparently, is also wrong. \$\endgroup\$
    – sx107
    Apr 10, 2022 at 12:40
  • \$\begingroup\$ The only authoritative documentation is the papers where the models were published. There may be books but I doubt they are comprehensive enough. Basically, if you want to implement SPICE that’s practical, there’s no easy all-in-one source. \$\endgroup\$ Apr 10, 2022 at 13:10
  • 2
    \$\begingroup\$ @sx107 I learned using this book: books.google.com/books/about/… . Most of the basics are covered in Chapter 2. I had to go through that chapter several times until I got the jist of it. However, that chapter lays the foundation for the rest of the book so after it makes sense then the rest of the book is much easier to digest. \$\endgroup\$
    – Ste Kulov
    Apr 11, 2022 at 7:40
  • \$\begingroup\$ @SteKulov That’s a good text. More practical than paper-scrounging if you’re not at an academic institution with access to papers. \$\endgroup\$ Apr 11, 2022 at 13:46
  • \$\begingroup\$ @SteKulov Thank you very much! Would definitely take a look. \$\endgroup\$
    – sx107
    Apr 14, 2022 at 0:05

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.