Update to release version 504.7 now with selfheating

This commit is contained in:
dwarning 2009-02-22 11:56:48 +00:00
parent 1935e00ff3
commit 9c7e45b1d7
11 changed files with 378 additions and 123 deletions

View File

@ -809,23 +809,23 @@ analog begin
// Following code is an intermediate solution: // Following code is an intermediate solution:
// ****************************************** // ******************************************
//if(flsh == 0 || rth < `MIN_R) begin if(flsh == 0 || rth < `MIN_R) begin
// I(br_sht) <+ Vrth/`MIN_R; I(br_sht) <+ Vrth/`MIN_R;
//end else begin end else begin
// I(br_sht) <+ Vrth/rth-pterm `P(spectre:gmin="add"); I(br_sht) <+ Vrth/rth-pterm `P(spectre:gmin="add");
// I(br_sht) <+ ddt(cth*Vrth); I(br_sht) <+ ddt(cth*Vrth);
//end end
// ****************************************** // ******************************************
// For simulators having no problem with V(br_sht) <+ 0.0 // For simulators having no problem with V(br_sht) <+ 0.0
// with external thermal node, follwing code may be used. // with external thermal node, follwing code may be used.
// This external thermal node should remain accessible. // This external thermal node should remain accessible.
// ******************************************** // ********************************************
if(flsh == 0 || rth < `MIN_R) begin //if(flsh == 0 || rth < `MIN_R) begin
V(br_sht) <+ 0.0; // V(br_sht) <+ 0.0;
end else begin //end else begin
I(br_sht) <+ Vrth/rth-pterm `P(spectre:gmin="add"); // I(br_sht) <+ Vrth/rth-pterm `P(spectre:gmin="add");
I(br_sht) <+ ddt(cth*Vrth); // I(br_sht) <+ ddt(cth*Vrth);
end //end
// ******************************************** // ********************************************
// Noise sources // Noise sources

View File

@ -469,9 +469,9 @@ module hic2_full (c,b,e,s,tnode);
inout c,b,e,s,tnode; inout c,b,e,s,tnode;
electrical c,b,e,s,ci,ei,bp,bi,si; electrical c,b,e,s,ci,ei,bp,bi,si;
electrical xf1,xf2,xf3,xf4; electrical xf1,xf2,xf3,xf4;
electrical tnode; electrical tnode;
electrical n1,n2; electrical n1,n2;
//Branch definitions //Branch definitions
branch (b,bp) br_bbp_i; branch (b,bp) br_bbp_i;
@ -1558,20 +1558,18 @@ begin : Load_sources
I(br_sht) <+ V(br_sht)/rth-pterm; I(br_sht) <+ V(br_sht)/rth-pterm;
I(br_sht) <+ ddt(cth*V(br_sht)); I(br_sht) <+ ddt(cth*V(br_sht));
end end
// ****************************************** // ******************************************
// For simulators having no problem with V(br_sht) <+ 0.0 // For simulators having no problem with V(br_sht) <+ 0.0
// with external thermal node, follwing code may be used. // with external thermal node, follwing code may be used.
// Note that external thermal node should remain accessible // Note that external thermal node should remain accessible
// even without self-heating. // even without self-heating.
// ******************************************** // ********************************************
//if(flsh == 0 || rth < `MIN_R) begin //if(flsh == 0 || rth < `MIN_R) begin
// V(br_sht) <+ 0.0; // V(br_sht) <+ 0.0;
//end else begin //end else begin
// I(br_sht) <+ V(br_sht)/rth-pterm; // I(br_sht) <+ V(br_sht)/rth-pterm;
// I(br_sht) <+ ddt(cth*V(br_sht)); // I(br_sht) <+ ddt(cth*V(br_sht));
//end //end
// ******************************************** // ********************************************
// NQS effect // NQS effect

View File

@ -1,10 +1,40 @@
Verilog-A implementation of the Mextram Bipolar Transistor Model,
Verilog-A implementation of the Philips Mextram (level 504.6) model. including variants of the Mextram model released by Delft University.
Copyright (c) 2002-2005 Delft University of Technology (TUD). Copyright (c) 2006 Delft University of Technology
All rights reserved. Licensed under the Educational Community License version 1.0
Permission to modify the code and to distribute modified code is
granted, provided the file with the copyright notice is retained,
and a notice that the code was modified is included.
This Original Work, including software, source code, documents, or other related items,
is being provided by the copyright holder(s) subject to the terms of the Educational
Community License. By obtaining, using and/or copying this Original Work, you agree that
you have read, understand, and will comply with the following terms and conditions of
the Educational Community License:
Permission to use, copy, modify, merge, publish, distribute, and sublicense this Original
Work and its documentation, with or without modification, for any purpose, and without fee
or royalty to the copyright holder(s) is hereby granted, provided that you include the
following on ALL copies of the Original Work or portions thereof, including modifications
or derivatives, that you make:
The full text of the Educational Community License in a location viewable to users of the
redistributed or derivative work.
Any pre-existing intellectual property disclaimers, notices, or terms and conditions.
Notice of any changes or modifications to the Original Work, including the date the
changes were made.
Any modifications of the Original Work must be distributed in such a manner as to avoid
any confusion with the Original Work of the copyright holders.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
The name and trademarks of copyright holder(s) may NOT be used in advertising or publicity
pertaining to the Original or Derivative Works without specific, written prior permission.
Title to copyright in the Original Work and any associated documentation will at all times
remain with the copyright holders.

View File

@ -8,32 +8,72 @@ begin // Currents and sharges
Vb2e1 = TYPE * V(b2, e1); Vb2e1 = TYPE * V(b2, e1);
Vb1e1 = TYPE * V(b1, e1); Vb1e1 = TYPE * V(b1, e1);
Vb1b2 = TYPE * V(b1, b2); Vb1b2 = TYPE * V(b1, b2);
Vb1c1 = TYPE * V(b1, c1);
Vbc1 = TYPE * V(b, c1);
`ifdef SUBSTRATE `ifdef SUBSTRATE
Vsc1 = TYPE * V(s, c1); Vsc1 = TYPE * V(s, c1);
`endif `endif
Vc1c2 = TYPE * V(c1, c2); Vc1c2 = TYPE * V(c1, c2);
Vee1 = TYPE * V(e, e1); Vee1 = TYPE * V(e, e1);
Vbb1 = TYPE * V(b, b1); Vbb1 = TYPE * V(b, b1);
Vcc1 = TYPE * V(c, c1);
Vbe = TYPE * V(b, e); Vbe = TYPE * V(b, e);
Vbc = TYPE * V(b, c); Vbc = TYPE * V(b, c);
/* RvdT, 03-12-2007, voltage differences
associated with distributed parasitic collector.
Evaluated taking values of resistances into account:
in case of vanishing resistance corresponding node
is not addressed: */
if (RCBLX > 0.0)
begin
if (RCBLI > 0.0)
begin
Vc4c1 = TYPE * V(c4, c1);
Vc3c4 = TYPE * V(c3, c4);
end
else
begin
Vc4c1 = 0 ;
Vc3c4 = TYPE * V(c3, c1);
end
end
else
begin
if (RCBLI > 0.0)
begin
Vc4c1 = TYPE * V(c4, c1);
Vc3c4 = 0 ;
end
else
begin
Vc4c1 = 0 ;
Vc3c4 = 0 ;
end
end
Vb1c4 = Vb1b2 + Vb2c2 - Vc1c2 - Vc4c1 ;
Vcc3 = - Vbc + Vbb1 + Vb1c4 - Vc3c4 ;
Vbc3 = Vbc + Vcc3 ;
`ifdef SUBSTRATE
Vsc4 = Vsc1 - Vc4c1 ;
Vsc3 = Vsc4 - Vc3c4 ;
`endif
// Exponential bias terms // Exponential bias terms
`expLin(eVb2c2,Vb2c2 * VtINV) `expLin(eVb2c2,Vb2c2 * VtINV)
`expLin(eVb2e1,Vb2e1 * VtINV) `expLin(eVb2e1,Vb2e1 * VtINV)
`expLin(eVb1e1,Vb1e1 * VtINV) `expLin(eVb1e1,Vb1e1 * VtINV)
`expLin(eVb1c1,Vb1c1 * VtINV) `expLin(eVb1c4,Vb1c4 * VtINV)
`expLin(eVb1b2,Vb1b2 * VtINV) `expLin(eVb1b2,Vb1b2 * VtINV)
`expLin(eVbc1,Vbc1 * VtINV) `expLin(eVbc3,Vbc3 * VtINV)
`ifdef SUBSTRATE `ifdef SUBSTRATE
`expLin(eVsc1,Vsc1 * VtINV) `expLin(eVsc1,Vsc1 * VtINV)
`endif `endif
`expLin(eVbc1VDC,(Vbc1 - VDC_T) * VtINV) `expLin(eVbc3VDC,(Vbc3 - VDC_T) * VtINV)
`expLin(eVb1c1VDC,(Vb1c1 - VDC_T) * VtINV) `expLin(eVb1c4VDC,(Vb1c4 - VDC_T) * VtINV)
`expLin(eVb2c2VDC,(Vb2c2 - VDC_T) * VtINV) `expLin(eVb2c2VDC,(Vb2c2 - VDC_T) * VtINV)
`expLin(eVb2c1VDC,(Vb2c1 - VDC_T) * VtINV) `expLin(eVb2c1VDC,(Vb2c1 - VDC_T) * VtINV)
@ -164,22 +204,22 @@ begin // Currents and sharges
Ib1_s = XIBI * Ibf0 * (eVb1e1 - 1.0); Ib1_s = XIBI * Ibf0 * (eVb1e1 - 1.0);
`expLin(tmpExp,Vb2e1 * VtINV / MLF) `expLin(tmpExp,Vb2e1 * VtINV / MLF)
Ib2 = IBF_TM * (tmpExp - 1.0) + GMIN * Vb2e1; Ib2 = IBF_TM * (tmpExp - 1.0) + GMIN * Vb2e1;
`expLin(tmpExp,0.5 * Vb1c1 * VtINV) `expLin(tmpExp,0.5 * Vb1c4 * VtINV)
Ib3 = IBR_TM * (eVb1c1 - 1.0) / Ib3 = IBR_TM * (eVb1c4 - 1.0) /
(tmpExp + exp(0.5 * VLR * VtINV)) + (tmpExp + exp(0.5 * VLR * VtINV)) +
GMIN * Vb1c1; GMIN * Vb1c4;
// Iex, Isub (XIex, XIsub) // Iex, Isub (XIex, XIsub)
g1 = If0 * eVb1c1; g1 = If0 * eVb1c4;
g2 = 4.0 * eVb1c1VDC; g2 = 4.0 * eVb1c4VDC;
nBex = g1 / (1.0 + sqrt(1.0 + g1)); nBex = g1 / (1.0 + sqrt(1.0 + g1));
pWex = g2 / (1.0 + sqrt(1.0 + g2)); pWex = g2 / (1.0 + sqrt(1.0 + g2));
Iex = (1.0 / BRI_T) * (0.5 * IK_TM * nBex - IS_TM); Iex = (1.0 / BRI_T) * (0.5 * IK_TM * nBex - IS_TM);
`ifdef SUBSTRATE `ifdef SUBSTRATE
Isub = 2.0 * ISS_TM * (eVb1c1 - 1.0) / Isub = 2.0 * ISS_TM * (eVb1c4 - 1.0) /
(1.0 + sqrt(1.0 + 4.0 * (IS_TM / IKS_TM) * eVb1c1)); (1.0 + sqrt(1.0 + 4.0 * (IS_TM / IKS_TM) * eVb1c4));
Isf = ISS_TM * (eVsc1 - 1.0); Isf = ISS_TM * (eVsc1 - 1.0);
`endif `endif
@ -189,7 +229,8 @@ begin // Currents and sharges
XIsub = 0.0; XIsub = 0.0;
`endif `endif
if (EXMOD == 1) begin if (EXMOD == 1)
begin
Iex = Iex * Xext1; Iex = Iex * Xext1;
@ -197,32 +238,36 @@ begin // Currents and sharges
Isub = Isub * Xext1; Isub = Isub * Xext1;
`endif `endif
Xg1 = If0 * eVbc1; Xg1 = If0 * eVbc3;
XnBex = Xg1 / (1.0 + sqrt(1.0 + Xg1)); XnBex = Xg1 / (1.0 + sqrt(1.0 + Xg1));
XIMex = XEXT * (0.5 * IK_TM * XnBex - IS_TM) / BRI_T; XIMex = XEXT * (0.5 * IK_TM * XnBex - IS_TM) / BRI_T;
`ifdef SUBSTRATE `ifdef SUBSTRATE
XIMsub = XEXT * 2.0 * ISS_TM * (eVbc1 - 1.0) / XIMsub = XEXT * 2.0 * ISS_TM * (eVbc3 - 1.0) /
(1.0 + sqrt(1.0 + 4.0 * IS_T / IKS_T * eVbc1)); (1.0 + sqrt(1.0 + 4.0 * IS_T / IKS_T * eVbc3));
Vex_bias = XEXT * (IS_TM / BRI_T + ISS_TM) * RCC_TM; Vex_bias = XEXT * (IS_TM / BRI_T + ISS_TM) * RCCxx_TM;
`else `else
XIMsub = 0.0; XIMsub = 0.0;
Vex_bias = XEXT * (IS_TM / BRI_T) * RCC_TM; Vex_bias = XEXT * (IS_TM / BRI_T) * RCCxx_TM;
`endif `endif
Vex = Vt * (2.0 - ln( Vex_bias * VtINV)); Vex = Vt * (2.0 - ln( Vex_bias * VtINV));
vdif = Vbc1 - Vex; vdif = Vbc3 - Vex;
`max_hyp0(VBex, vdif, 0.11); `max_hyp0(VBex, vdif, 0.11);
Fex = VBex /(Vex_bias + (XIMex + XIMsub) * RCC_TM + VBex); Fex = VBex /(Vex_bias + (XIMex + XIMsub) * RCCxx_TM + VBex);
XIex = Fex * XIMex; XIex = Fex * XIMex;
`ifdef SUBSTRATE `ifdef SUBSTRATE
XIsub = Fex * XIMsub; XIsub = Fex * XIMsub;
`endif `endif
end
end else
begin
Fex = 0;
XnBex = 0 ;
end
// Variable base resistance // Variable base resistance
q0Q = 1.0 + Vte / VER_T + Vtc / VEF_T; q0Q = 1.0 + Vte / VER_T + Vtc / VEF_T;
@ -277,30 +322,35 @@ begin // Currents and sharges
RE_TM / (RBC_TM + Rb2); RE_TM / (RBC_TM + Rb2);
Iavl = Ic1c2 * Gem / (Gem +Gem / Gmax + 1.0); Iavl = Ic1c2 * Gem / (Gem +Gem / Gmax + 1.0);
end end
`ifdef SELFHEATING
// Power dissipation
if (eVb2c2star > 0.0) if (eVb2c2star > 0.0)
Vb2c2star = Vt * ln(eVb2c2star); Vb2c2star = Vt * ln(eVb2c2star);
else else
Vb2c2star = Vb2c2; Vb2c2star = Vb2c2;
`ifdef SELFHEATING
// Power dissipation
// RvdT 03-12-2007, modified power equation due to distribution collector resistance
power = In * (Vb2e1 - Vb2c2star) + power = In * (Vb2e1 - Vb2c2star) +
Ic1c2 * (Vb2c2star - Vb2c1) - Ic1c2 * (Vb2c2star - Vb2c1) -
Iavl * Vb2c2star + Iavl * Vb2c2star +
Vee1 * Vee1 / RE_TM + Vee1 * Vee1 / RE_TM +
Vcc1 * Vcc1 / RCC_TM + Vcc3 * Vcc3 * GCCxx_TM +
Vbb1 * Vbb1 / RBC_TM + Vc3c4 * Vc3c4 * GCCex_TM +
Vc4c1 * Vc4c1 * GCCin_TM +
Vbb1 * Vbb1 / RBC_TM +
Ib1b2 * Vb1b2 + Ib1b2 * Vb1b2 +
(Ib1 + Ib2) * Vb2e1 + (Ib1 + Ib2) * Vb2e1 +
Ib1_s * Vb1e1 + Ib1_s * Vb1e1 +
`ifdef SUBSTRATE `ifdef SUBSTRATE
(Iex + Isub + Ib3) * Vb1c1 + (Iex + Ib3) * Vb1c4 + XIex * Vbc3 +
(XIex + XIsub) * Vbc1 - Isub * (Vb1c4 - Vsc4) +
(XIsub + Isub - Isf) * Vsc1; XIsub * (Vbc3 - Vsc3) +
Isf * Vsc1;
`else `else
(Iex + Ib3) * Vb1c1 + XIex * Vbc1; (Iex + Ib3) * Vb1c4 + XIex * Vbc3;
`endif `endif
`endif `endif
@ -320,16 +370,16 @@ begin // Currents and sharges
Qbc_qs = 0.5 * Qb0 * nB * q1Q; Qbc_qs = 0.5 * Qb0 * nB * q1Q;
a_VDC = 0.1 * VDC_T; a_VDC = 0.1 * VDC_T;
`min_logexp(Vjcex, Vb1c1, Vfc, a_VDC); `min_logexp(Vjcex, Vb1c4, Vfc, a_VDC);
Vtexv = VDC_T / (1.0 - PC) * (1.0 - pow(1.0 - Vjcex / VDC_T, 1.0 - PC)) + Vtexv = VDC_T / (1.0 - PC) * (1.0 - pow(1.0 - Vjcex / VDC_T, 1.0 - PC)) +
bjc * (Vb1c1 - Vjcex); bjc * (Vb1c4 - Vjcex);
Qtex = CJC_TM * ((1.0 - XP_T) * Vtexv + XP_T * Vb1c1) * Qtex = CJC_TM * ((1.0 - XP_T) * Vtexv + XP_T * Vb1c4) *
(1.0 - XCJC) * (1.0 - XEXT); (1.0 - XCJC) * (1.0 - XEXT);
`min_logexp(XVjcex, Vbc1, Vfc, a_VDC); `min_logexp(XVjcex, Vbc3, Vfc, a_VDC);
XVtexv = VDC_T / (1.0 - PC) * (1.0 - pow(1.0 - XVjcex / VDC_T, 1.0 - PC)) + XVtexv = VDC_T / (1.0 - PC) * (1.0 - pow(1.0 - XVjcex / VDC_T, 1.0 - PC)) +
bjc * (Vbc1 - XVjcex); bjc * (Vbc3 - XVjcex);
XQtex = CJC_TM * ((1.0 - XP_T) * XVtexv + XP_T * Vbc1) * XQtex = CJC_TM * ((1.0 - XP_T) * XVtexv + XP_T * Vbc3) *
(1.0 - XCJC) * XEXT; (1.0 - XCJC) * XEXT;
`ifdef SUBSTRATE `ifdef SUBSTRATE
@ -353,7 +403,7 @@ begin // Currents and sharges
if (EXMOD == 1) begin if (EXMOD == 1) begin
Qex = Qex * (1.0 - XEXT); Qex = Qex * (1.0 - XEXT);
Xg2 = 4.0 * eVbc1VDC; Xg2 = 4.0 * eVbc3VDC;
XpWex = Xg2 / (1.0 + sqrt(1.0 + Xg2)); XpWex = Xg2 / (1.0 + sqrt(1.0 + Xg2));
XQex = 0.5 * Fex * XEXT * TAUR_T * XQex = 0.5 * Fex * XEXT * TAUR_T *
(Qb0 * XnBex + Qepi0 * XpWex) / (TAUB_T + TEPI_T); (Qb0 * XnBex + Qepi0 * XpWex) / (TAUB_T + TEPI_T);
@ -397,8 +447,6 @@ begin // Currents and sharges
I(c2, e1) <+ TYPE * In; I(c2, e1) <+ TYPE * In;
I(b1, e1) <+ TYPE * Ib1_s; I(b1, e1) <+ TYPE * Ib1_s;
I(b2, e1) <+ TYPE * (Ib1 + Ib2); I(b2, e1) <+ TYPE * (Ib1 + Ib2);
I(b1, c1) <+ TYPE * (Ib3 + Iex);
I(b, c1) <+ TYPE * XIex;
`ifdef SUBSTRATE `ifdef SUBSTRATE
I(b1, s) <+ TYPE * Isub; I(b1, s) <+ TYPE * Isub;
I(b, s) <+ TYPE * XIsub; I(b, s) <+ TYPE * XIsub;
@ -407,9 +455,8 @@ begin // Currents and sharges
I(b1, b2) <+ TYPE * Ib1b2; I(b1, b2) <+ TYPE * Ib1b2;
I(b2, c2) <+ TYPE * (-1.0 * Iavl); I(b2, c2) <+ TYPE * (-1.0 * Iavl);
I(e, e1) <+ TYPE * Vee1 / RE_TM; I(e, e1) <+ TYPE * Vee1 / RE_TM;
I(b, b1) <+ TYPE * Vbb1 / RBC_TM; I(b, b1) <+ TYPE * Vbb1 / RBC_TM;
I(c, c1) <+ TYPE * Vcc1 / RCC_TM;
`ifdef SELFHEATING `ifdef SELFHEATING
// Electrical equivalent for the thermal network // Electrical equivalent for the thermal network
I(dt) <+ V(dt) / RTH_Tamb_M; I(dt) <+ V(dt) / RTH_Tamb_M;
@ -428,8 +475,6 @@ begin // Currents and sharges
I(b2, e1) <+ ddt(TYPE * (Qte + Qbe + Qe)); I(b2, e1) <+ ddt(TYPE * (Qte + Qbe + Qe));
I(b1, e1) <+ ddt(TYPE * (Qte_s)); I(b1, e1) <+ ddt(TYPE * (Qte_s));
I(b2, c2) <+ ddt(TYPE * (Qtc + Qbc + Qepi)); I(b2, c2) <+ ddt(TYPE * (Qtc + Qbc + Qepi));
I(b1, c1) <+ ddt(TYPE * (Qtex + Qex));
I(b, c1) <+ ddt(TYPE * (XQtex + XQex));
`ifdef SUBSTRATE `ifdef SUBSTRATE
I(s, c1) <+ ddt(TYPE * Qts); I(s, c1) <+ ddt(TYPE * Qts);
`endif `endif
@ -438,6 +483,57 @@ begin // Currents and sharges
I(b, c) <+ ddt(TYPE * CBCO_M * Vbc); I(b, c) <+ ddt(TYPE * CBCO_M * Vbc);
end // Currents and charges end // Currents and charges
/* RvdT, Delft Univ. Tech. 03-12-2007.
Distribution of parasitic collector resistance.
This construct supports the case
RCBLI = 0.0 and or RCBLX = 0.0 .
It is up to the compiler to adjust the circuit topology
and perform a node-collapse in such cases. */
if (RCBLX > 0.0)
begin
I(b, c3) <+ TYPE * XIex;
I(c, c3) <+ TYPE * Vcc3 * GCCxx_TM ;
I(b, c3) <+ ddt(TYPE * (XQtex + XQex));
if (RCBLI > 0.0)
begin
I(c4, c1) <+ TYPE * Vc4c1 * GCCin_TM;
I(b1, c4) <+ TYPE * (Ib3 + Iex);
I(c3, c4) <+ TYPE * Vc3c4 * GCCex_TM ;
I(b1, c4) <+ ddt(TYPE * (Qtex + Qex));
end
else
begin
V(c4, c1) <+ 0.0 ;
I(b1, c1) <+ TYPE * (Ib3 + Iex);
I(b1, c1) <+ ddt(TYPE * (Qtex + Qex));
I(c3, c1) <+ TYPE * Vc3c4 * GCCex_TM ;
end
end
else
begin
V(c3, c4) <+ 0 ;
if (RCBLI > 0.0)
begin
I(b, c4) <+ TYPE * XIex;
I(c, c4) <+ TYPE * Vcc3 * GCCxx_TM ;
I(c4, c1) <+ TYPE * Vc4c1 * GCCin_TM;
I(b1, c4) <+ TYPE * (Ib3 + Iex);
I(b1, c4) <+ ddt(TYPE * (Qtex + Qex));
I(b, c4) <+ ddt(TYPE * (XQtex + XQex));
end
else
begin
I(b, c1) <+ TYPE * XIex;
I(c, c1) <+ TYPE * Vcc3 * GCCxx_TM ;
V(c4, c1) <+ 0.0 ;
I(b1, c1) <+ TYPE * (Ib3 + Iex);
I(b1, c1) <+ ddt(TYPE * (Qtex + Qex));
I(b, c1) <+ ddt(TYPE * (XQtex + XQex));
I(c3, c1) <+ TYPE * Vc3c4 * GCCex_TM ;
end
end
// Noise sources // Noise sources
@ -447,7 +543,10 @@ begin // Currents and sharges
common = 4.0 * `KB * Tk; common = 4.0 * `KB * Tk;
powerREC = common / RE_TM; // Emitter resistance powerREC = common / RE_TM; // Emitter resistance
powerRBC = common / RBC_TM; // Base resistance powerRBC = common / RBC_TM; // Base resistance
powerRCC = common / RCC_TM; // Collector resistance // RvdT, 03-12-2007: distributed collector resistance
powerRCCxx = common * GCCxx_TM; // Collector resistance
powerRCCex = common * GCCex_TM; // Collector resistance
powerRCCin = common * GCCin_TM; // Collector resistance
powerRBV = common / Rb2 * (4.0 * eVb1b2 + 5.0) / 3.0; // Variable base resistance powerRBV = common / Rb2 * (4.0 * eVb1b2 + 5.0) / 3.0; // Variable base resistance
// Collector current shot noise // Collector current shot noise
@ -486,15 +585,17 @@ begin // Currents and sharges
powerSubsCS_BS = 2.0 * `QQ * abs(XIsub); powerSubsCS_BS = 2.0 * `QQ * abs(XIsub);
`endif `endif
// Noise due to the avalanche // Noise due to the avalanche
twoqIavl = KAVL * 2.0 * `QQ * Iavl; // twoqIavl = KAVL * 2.0 * `QQ * Iavl;
twoqIavl = KAVL*Gem*powerCCS;
powerCCS_A = powerCCS + twoqIavl * (3.0 + 2.0 * Gem powerCCS_A = powerCCS + twoqIavl * (3.0 + 2.0 * Gem
- (2.0 + 2.0 * Gem)*(2.0 + 2.0 * Gem)/(1.0 + 2.0 * Gem) ); - (2.0 + 2.0 * Gem)*(2.0 + 2.0 * Gem)/(1.0 + 2.0 * Gem) );
// Add noise sources // Add noise sources
I(e, e1) <+ white_noise(powerREC); // "emitter resistance" I(e, e1) <+ white_noise(powerREC); // "emitter resistance"
I(b, b1) <+ white_noise(powerRBC); // "base resistance" I(b, b1) <+ white_noise(powerRBC); // "base resistance"
I(c, c1) <+ white_noise(powerRCC); // "collector resistance"
I(b1, b2) <+ white_noise(powerRBV); // "variable baseresistance" I(b1, b2) <+ white_noise(powerRBV); // "variable baseresistance"
I(noi, e1) <+ white_noise(twoqIavl); // "avalanche" I(noi, e1) <+ white_noise(twoqIavl); // "avalanche"
@ -515,5 +616,41 @@ begin // Currents and sharges
I(b1, s) <+ white_noise(powerSubsCS_B1S); // "bas_sub_current" I(b1, s) <+ white_noise(powerSubsCS_B1S); // "bas_sub_current"
I(b, s) <+ white_noise(powerSubsCS_BS); // "bas_sub_current" I(b, s) <+ white_noise(powerSubsCS_BS); // "bas_sub_current"
`endif `endif
/* RvdT, Delft University of Technology 03-12-2007,
Noise voltage associated with distributed parasitic collector.
In case of vanishing resistance corresponding node
is not addressed: */
// RvdT, 31-01-2007: distributed collector resistance
if (RCBLX > 0.0)
begin
if (RCBLI > 0.0)
begin /* all branches exist */
I(c, c3) <+ white_noise(powerRCCxx); // "collector plug resistance"
I(c3, c4) <+ white_noise(powerRCCex); // "extrinsic collector BL resistance"
I(c4, c1) <+ white_noise(powerRCCin); // "intrinsic collector BL resistance"
end
else
begin /* only Rcblx exists */
I(c, c3) <+ white_noise(powerRCCxx); // "collector plug resistance"
I(c3, c1) <+ white_noise(powerRCCex); // "extrinsic collector BL resistance"
end
end
else
begin
if (RCBLI > 0.0)
begin /* only Rcbli exists */
I(c, c4) <+ white_noise(powerRCCxx); // "collector plug resistance"
I(c4, c1) <+ white_noise(powerRCCin); // "intrinsic collector BL resistance"
end
else
begin /* neither Rcblx nor Rcbli exists */
I(c, c1) <+ white_noise(powerRCCxx); // "collector plug resistance"
end
end
end // Noise sources end // Noise sources

View File

@ -14,7 +14,18 @@
`define AJC 2.0 `define AJC 2.0
`define AJS 2.0 `define AJS 2.0
`define VEXLIM 200.0 `define VEXLIM 200.0
`define PI 3.1415926
// Desriptions and units
`ifdef __VAMS_COMPACT_MODELING__
`define OPP(nam,uni,des) (* desc="des", units="uni" *) real nam;
`define PAR(des,uni) (* desc="des", units="uni" *) parameter real
`define PAI(des,uni) (* desc="des", units="uni" *) parameter integer
`else
`define OPP(nam,uni,des)
`define PAR(des,uni) parameter real
`define PAI(des,uni) parameter integer
`endif
// ADMS specific definitions // ADMS specific definitions
`ifdef insideADMS `ifdef insideADMS

View File

@ -1,8 +1,9 @@
`include "frontdef.inc" `include "frontdef.inc"
`define SELFHEATING
`define SUBSTRATE `define SUBSTRATE
module bjt504_va (c, b, e, s); module bjt504_va (c, b, e, s, dt);
`ifdef insideADMS `ifdef insideADMS
`define P(p) (*p*) `define P(p) (*p*)
`else `else
@ -10,12 +11,13 @@ module bjt504_va (c, b, e, s);
`endif `endif
// External ports // External ports
inout c, b, e, s; inout c, b, e, s, dt;
electrical c `P(info="external collector node"); electrical c `P(info="external collector node");
electrical b `P(info="external base node"); electrical b `P(info="external base node");
electrical e `P(info="external emitter node"); electrical e `P(info="external emitter node");
electrical s `P(info="external substrate node"); electrical s `P(info="external substrate node");
electrical dt `P(info="external thermal node");
// Internal nodes // Internal nodes
electrical c1 `P(info="internal collector node 1"); electrical c1 `P(info="internal collector node 1");
@ -23,26 +25,30 @@ module bjt504_va (c, b, e, s);
electrical b1 `P(info="internal base node 1"); electrical b1 `P(info="internal base node 1");
electrical b2 `P(info="internal base node 2"); electrical b2 `P(info="internal base node 2");
electrical c2 `P(info="internal collector node 2"); electrical c2 `P(info="internal collector node 2");
electrical c3 `P(info="internal collector node 3");
electrical c4 `P(info="internal collector node 4");
// For correlated noise implementation // For correlated noise implementation
electrical noi `P(info="internal noise node"); electrical noi `P(info="internal noise node");
`include "parameters.inc" `include "parameters.inc"
`include "variables.inc" `include "variables.inc"
`include "opvars.inc"
analog begin analog begin
`ifdef insideADMS //`ifdef insideADMS
@(initial_model) begin // @(initial_model) begin
`else //`else
@(initial_step or initial_step("static")) begin // @(initial_step or initial_step("static")) begin
`endif //`endif
`include "initialize.inc" `include "initialize.inc"
`include "tscaling.inc" `include "tscaling.inc"
end // initial_step // end // initial_step
`include "evaluate.inc" `include "evaluate.inc"
`include "opinfo.inc"
end // analog end // analog
endmodule endmodule

View File

@ -5,7 +5,7 @@ parameter integer LEVEL = 504 from [504:505)
parameter real TREF = 25.0 from [-273.0:inf) parameter real TREF = 25.0 from [-273.0:inf)
`ATTR(info="Reference temperature"); `ATTR(info="Reference temperature");
parameter real DTA = 0.0 parameter real DTA = 0.0
`ATTR(info="Difference between the local and global ambient temperatures"); `ATTR(info="Difference between the local and global ambient temperatures");
parameter integer EXMOD = 1 from [0:1] parameter integer EXMOD = 1 from [0:1]
`ATTR(info="Flag for extended modeling of the reverse current gain"); `ATTR(info="Flag for extended modeling of the reverse current gain");
parameter integer EXPHI = 1 from [0:1] parameter integer EXPHI = 1 from [0:1]
@ -44,18 +44,20 @@ parameter real VAVL = 3.0 from [0.01:inf)
`ATTR(info="Voltage determining curvature of avalanche current"); `ATTR(info="Voltage determining curvature of avalanche current");
parameter real SFH = 0.3 from [0.0:inf) parameter real SFH = 0.3 from [0.0:inf)
`ATTR(info="Current spreading factor of avalanche model when EXAVL=1"); `ATTR(info="Current spreading factor of avalanche model when EXAVL=1");
// RvdT, 22-02-2008: for MXT 504.7
parameter real RE = 5.0 from [1.0u:inf) // increased lower clipping values RE, RBC, RBV, RCC, RCV, SCRCV
// from 1u to 1m:
parameter real RE = 5.0 from [1.0m:inf)
`ATTR(info="Emitter resistance"); `ATTR(info="Emitter resistance");
parameter real RBC = 23.0 from [1.0u:inf) parameter real RBC = 23.0 from [1.0m:inf)
`ATTR(info="Constant part of the base resistance"); `ATTR(info="Constant part of the base resistance");
parameter real RBV = 18.0 from [1.0u:inf) parameter real RBV = 18.0 from [1.0m:inf)
`ATTR(info="Zero-bias value of the variable part of the base resistance"); `ATTR(info="Zero-bias value of the variable part of the base resistance");
parameter real RCC = 12.0 from [1.0u:inf) parameter real RCC = 12.0 from [1.0m:inf)
`ATTR(info="Constant part of the collector resistance"); `ATTR(info="Constant part of the collector resistance");
parameter real RCV = 150.0 from [1.0u:inf) parameter real RCV = 150.0 from [1.0m:inf)
`ATTR(info="Resistance of the un-modulated epilayer"); `ATTR(info="Resistance of the un-modulated epilayer");
parameter real SCRCV = 1250.0 from [1.0u:inf) parameter real SCRCV = 1250.0 from [1.0m:inf)
`ATTR(info="Space charge resistance of the epilayer"); `ATTR(info="Space charge resistance of the epilayer");
parameter real IHC = 4.0m from [1.0p:inf) parameter real IHC = 4.0m from [1.0p:inf)
`ATTR(info="Critical current for velocity saturation in the epilayer"); `ATTR(info="Critical current for velocity saturation in the epilayer");
@ -85,6 +87,12 @@ parameter real MC = 0.5 from [0.0:1.0)
`ATTR(info="Coefficient for current modulation of CB depletion capacitance"); `ATTR(info="Coefficient for current modulation of CB depletion capacitance");
parameter real XCJC = 32.0m from [0.0:1.0] parameter real XCJC = 32.0m from [0.0:1.0]
`ATTR(info="Fraction of CB depletion capacitance under the emitter"); `ATTR(info="Fraction of CB depletion capacitance under the emitter");
// RvdT, 30-11-2007: introduced RCBLX and RCBLI:
//dw clipped to 1m and default to 1 Ohm as long adms-ngspice has no working node-collapsing
parameter real RCBLX = 1.0 from [1.0m:inf)
`ATTR(info="Resistance Collector Buried Layer eXtrinsic");
parameter real RCBLI = 1.0 from [1.0m:inf)
`ATTR(info="Resistance Collector Buried Layer Intrinsic");
parameter real CBCO = 0.0 from [0.0:inf) parameter real CBCO = 0.0 from [0.0:inf)
`ATTR(info="Collector-base overlap capacitance"); `ATTR(info="Collector-base overlap capacitance");
@ -94,7 +102,7 @@ parameter real TAUE = 2.0p from [0.0:inf)
`ATTR(info="Minimum transit time of stored emitter charge"); `ATTR(info="Minimum transit time of stored emitter charge");
parameter real TAUB = 4.2p from (0.0:inf) parameter real TAUB = 4.2p from (0.0:inf)
`ATTR(info="Transit time of stored base sharge"); `ATTR(info="Transit time of stored base sharge");
parameter real TEPI = 41.0p from (0.0:inf) parameter real TEPI = 41.0p from [0.0:inf)
`ATTR(info="Transit time of stored epilayer charge"); `ATTR(info="Transit time of stored epilayer charge");
parameter real TAUR = 520.0p from [0.0:inf) parameter real TAUR = 520.0p from [0.0:inf)
`ATTR(info="Transit time of reverse extrinsic stored base charge"); `ATTR(info="Transit time of reverse extrinsic stored base charge");
@ -115,7 +123,10 @@ parameter real AEPI = 2.5
parameter real AEX = 0.62 parameter real AEX = 0.62
`ATTR(info="Temperature coefficient of the resistivity of the extrinsic base"); `ATTR(info="Temperature coefficient of the resistivity of the extrinsic base");
parameter real AC = 2.0 parameter real AC = 2.0
`ATTR(info="Temperature coefficient of the resistivity of the buried layer"); `ATTR(info="Temperature coefficient of the resistivity of the collector contact");
// RvdT, 30-01-2007: introduced ACBL
parameter real ACBL = 2.0 from [0.0:inf)
`ATTR(info="Temperature coefficient of the resistivity of the collector buried layer");
parameter real DVGBF = 50.0m parameter real DVGBF = 50.0m
`ATTR(info="Band-gap voltage difference of the forward current gain"); `ATTR(info="Band-gap voltage difference of the forward current gain");
parameter real DVGBR = 45.0m parameter real DVGBR = 45.0m

View File

@ -61,7 +61,12 @@
RE_T = RE * pow(tN, AE); RE_T = RE * pow(tN, AE);
RBV_T = RBV * pow(tN, AB - AQBO); RBV_T = RBV * pow(tN, AB - AQBO);
RBC_T = RBC * pow(tN, AEX); RBC_T = RBC * pow(tN, AEX);
RCC_T = RCC * pow(tN, AC);
// RvdT, 30-11-2007: new collector resistances RCCxx_T, RCCex_T, RCCin_T
RCCxx_T = RCC * pow(tN, AC);
RCCex_T = RCBLX * pow(tN, ACBL);
RCCin_T = RCBLI * pow(tN, ACBL);
RCV_T = RCV * pow(tN, AEPI); RCV_T = RCV * pow(tN, AEPI);
// Current gains // Current gains
@ -80,7 +85,7 @@
`ifdef SUBSTRATE `ifdef SUBSTRATE
ISS_T = ISS * pow(tN, 4.0 - AS) * exp(-VGS * VdtINV); ISS_T = ISS * pow(tN, 4.0 - AS) * exp(-VGS * VdtINV);
if (ISS_T > 0.0) if ((ISS_T > 0.0))
IKS_T = IKS * pow(tN, 1.0 - AS) * (IS_T / IS) * (ISS / ISS_T); IKS_T = IKS * pow(tN, 1.0 - AS) * (IS_T / IS) * (ISS / ISS_T);
else else
IKS_T = IKS * pow(tN, 1.0 - AS); IKS_T = IKS * pow(tN, 1.0 - AS);
@ -95,9 +100,17 @@
// Avalanche constant // Avalanche constant
Tk300 = Tk - 300.0; Tk300 = Tk - 300.0;
BnT = Bn * (1.0 + 7.2e-4 * Tk300 - 1.6e-6 * Tk300 * Tk300); // RvdT, 15-02-2008: prevent division by zero and overflow at high temperatures:
if (Tk < 525.0)
begin
BnT = Bn * (1.0 + 7.2e-4 * Tk300 - 1.6e-6 * Tk300 * Tk300) ;
end
else
begin
BnT = Bn * 1.081 ;
end
// Heterojunction features // Heterojunction features
DEG_T = DEG * pow(tN, AQBO); DEG_T = DEG * pow(tN, AQBO);
@ -129,11 +142,41 @@
RE_TM = RE_T * invMULT; RE_TM = RE_T * invMULT;
RBC_TM = RBC_T * invMULT; RBC_TM = RBC_T * invMULT;
RBV_TM = RBV_T * invMULT; RBV_TM = RBV_T * invMULT;
RCC_TM = RCC_T * invMULT; // RvdT, 30-01-2007: new collector resistances:
RCCxx_TM = RCCxx_T * invMULT;
RCCex_TM = RCCex_T * invMULT;
RCCin_TM = RCCin_T * invMULT;
RCV_TM = RCV_T * invMULT; RCV_TM = RCV_T * invMULT;
// RvdT, 03-12-2007: new collector conductances
if (RCC > 0.0)
begin
GCCxx_TM = 1.0 / RCCxx_TM ;
end
else
begin
GCCxx_TM = 0 ;
end
if (RCBLX > 0.0)
begin
GCCex_TM = 1.0 / RCCex_TM ;
end
else
begin
GCCex_TM = 0 ;
end
if (RCBLI > 0.0)
begin
GCCin_TM = 1.0 / RCCin_TM ;
end
else
begin
GCCin_TM = 0 ;
end
`ifdef SELFHEATING `ifdef SELFHEATING
RTH_Tamb_M = RTH_Tamb * invMULT; RTH_Tamb_M = RTH_Tamb * invMULT;
`endif `endif

View File

@ -14,7 +14,10 @@ real UdeT, VDE_T, UdcT, VDC_T;
real CJE_T, CJC_T, XP_T; real CJE_T, CJC_T, XP_T;
real CJCscale, CJCscaleINV; real CJCscale, CJCscaleINV;
real RE_T, RBV_T, RBC_T, RCC_T, RCV_T; real RE_T, RBV_T, RBC_T, RCV_T;
// RvdT: 30-01-2007, new collector resistances:
real RCCxx_T, RCCex_T, RCCin_T;
real BF_T, BRI_T; real BF_T, BRI_T;
real IS_T, IK_T, IBF_T, IBR_T, VEF_T, VER_T; real IS_T, IK_T, IBF_T, IBR_T, VEF_T, VER_T;
@ -36,7 +39,13 @@ real invMULT;
real IS_TM, IK_TM, IBF_TM, IBR_TM, IHC_M; real IS_TM, IK_TM, IBF_TM, IBR_TM, IHC_M;
real CJE_TM, CJC_TM; real CJE_TM, CJC_TM;
real RE_TM, RBC_TM, RBV_TM, RCC_TM, RCV_TM, SCRCV_M; real RE_TM, RBC_TM, RBV_TM, RCV_TM, SCRCV_M;
// RvdT: 30-01-2007, new collector resistances:
real RCCxx_TM, RCCex_TM, RCCin_TM;
// RvdT: 03-12-2007, new collector conductances:
real GCCxx_TM, GCCex_TM, GCCin_TM;
real KF_M, KFN_M; real KF_M, KFN_M;
`ifdef SELFHEATING `ifdef SELFHEATING
@ -53,7 +62,7 @@ real ISS_TM, IKS_TM, CJS_TM;
real K0, Kw, pW, Ec, Ic1c2; real K0, Kw, pW, Ec, Ic1c2;
real Vqs_th, Vqs, Iqs; real Vqs_th, Vqs, Iqs;
real alpha, vyi, yi, xi_w, xi_w1; real alpha, vyi, yi, xi_w, xi_w1;
real gp0, gp02, p0star, eVb2c2star; real gp0, gp02, p0star, Vb2c2star, eVb2c2star;
real B1, B2, Vxi0, Vch, Icap, pav; real B1, B2, Vxi0, Vch, Icap, pav;
// Effective emitter and collector junction bias variables // Effective emitter and collector junction bias variables
@ -92,7 +101,7 @@ real lambda, Gem, Gmax, Iavl;
real Icap_IHC; real Icap_IHC;
`ifdef SELFHEATING `ifdef SELFHEATING
real Vb2c2star, power; real power;
`endif `endif
// Charges and capacitances variables // Charges and capacitances variables
@ -114,10 +123,16 @@ real CBEO_M, CBCO_M;
// Biases and exponential terms variables // Biases and exponential terms variables
real Vb2c1, Vb2c2, Vb2e1, Vb1e1, Vb1b2, Vb1c1, Vc1c2; real Vb2c1, Vb2c2, Vb2e1, Vb1e1, Vb1b2, Vb1c4, Vc1c2;
real Vsc1, Vee1, Vbb1, Vbc1, Vcc1, Vbe, Vbc; // RvdT, 30-01-2007: new variables Vc3c4, Vc4c1
real eVb2c2, eVb2e1, eVb1e1, eVb1b2, eVb1c1, eVbc1, eVsc1; real Vc3c4, Vc4c1;
real eVb1c1VDC, eVb2c2VDC, eVbc1VDC, eVb2c1VDC; // RvdT, 25-02-2008: new variables Vsc3, Vsc4
`ifdef SUBSTRATE
real Vsc1, Vsc3, Vsc4;
`endif
real Vee1, Vbb1, Vbc3, Vcc3, Vbe, Vbc;
real eVb2c2, eVb2e1, eVb1e1, eVb1b2, eVb1c4, eVbc3, eVsc1;
real eVb1c4VDC, eVb2c2VDC, eVbc3VDC, eVb2c1VDC;
// Help variables // Help variables
@ -138,7 +153,7 @@ real a_VDS;
// Noise variables // Noise variables
real common; real common;
real powerREC, powerRBC, powerRCC, powerRBV; real powerREC, powerRBC, powerRCCxx, powerRCCex, powerRCCin, powerRBV;
real powerCCS; real powerCCS;
real powerFBCS, powerFBC1fB1, exponentFBC1fB2, powerFBC1fB2; real powerFBCS, powerFBC1fB1, exponentFBC1fB2, powerFBC1fB2;
real powerEBSCS, powerEBSC1f; real powerEBSCS, powerEBSC1f;

View File

@ -37,6 +37,8 @@ plot abs(i(vc))/abs(i(vb)) vs abs(-i(vc)) xlog xlimit 1e-09 10e-3 ylimit 0 150
+RE=949.668E-03 +RE=949.668E-03
+RBC=27.769E+00 +RBC=27.769E+00
+RBV=32.004E+00 +RBV=32.004E+00
+RCBLX=1.0
+RCBLI=1.0
+RCC=18.026E+00 +RCC=18.026E+00
+RCV=237.417E+00 +RCV=237.417E+00
+SCRCV=882.839E+00 +SCRCV=882.839E+00

View File

@ -36,6 +36,8 @@ plot abs(i(vc))
+RE=949.668E-03 +RE=949.668E-03
+RBC=27.769E+00 +RBC=27.769E+00
+RBV=32.004E+00 +RBV=32.004E+00
+RCBLX=1.0
+RCBLI=1.0
+RCC=18.026E+00 +RCC=18.026E+00
+RCV=237.417E+00 +RCV=237.417E+00
+SCRCV=882.839E+00 +SCRCV=882.839E+00