update version and improve veriloga compatibility

This commit is contained in:
dwarning 2020-12-14 12:20:43 +01:00 committed by Holger Vogt
parent 46122bab52
commit 8ce89a2b80
12 changed files with 1394 additions and 1326 deletions

View File

@ -1,40 +0,0 @@
Verilog-A implementation of the Mextram Bipolar Transistor Model,
including variants of the Mextram model released by Delft University.
Copyright (c) 2006 Delft University of Technology
Licensed under the Educational Community License version 1.0
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

@ -0,0 +1,48 @@
// Copyright (c) 2000-2007, NXP Semiconductors
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015, Auburn University
INTELLECTUAL PROPERTY NOTICE, DISCLAIMER AND LICENSE
The Mextram model and documentation presented at this website,
denoted as the Model,
has been developed by NXP Semiconductors until 2007,
Delft University of Technology from 2007 to 2014,
and Auburn University since April 2015.
The Model is distributed as is, completely without any expressed
or implied warranty or service support.
NXP Semiconductors, Delft University of Technology,
Auburn University and their employees are not liable for
the condition or performance of the Model.
NXP Semiconductors, Delft University of Technology,
Auburn University own
the copyright and grant users a perpetual,
irrevocable, worldwide, non-exclusive, royalty-free
license with respect to the Model as set forth below.
NXP Semiconductors, Delft University of Technology, Auburn University
hereby disclaim all implied warranties.
NXP Semiconductors, Delft University of Technology, Auburn University
grant the users the right to modify, copy, and
redistribute the Model and documentation,
both within the user's organization and externally,
subject to the following restrictions
1. The users agree not to charge for the code
itself but may charge for additions, extensions, or support.
2. In any product based on the Model, the users agree to acknowledge
NXP Semiconductors, Delft University of Technology, Auburn University
that developed the Model. This acknowledgment
shall appear in the product documentation.
3. The users agree to obey all restrictions governing redistribution
or export of the Model.
4. The users agree to reproduce any copyright notice which appears
on the Model on any copy or modification of such made available
to others.

View File

@ -1,46 +1,47 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
`include "frontdef.inc" `include "frontdef.inc"
`define SELFHEATING `define SELFHEATING
`define SUBSTRATE `define SUBSTRATE
module bjt504tva (c, b, e, s, dt); module bjt504tva (c, b, e, s, dt);
`ifdef insideADMS
`define P(p) (*p*)
`else
`define P(p)
`endif
// External ports // External ports
inout c, b, e, s, dt; 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"); 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");
electrical e1 `P(info="internal emitter node"); electrical e1 `P(info="internal emitter node");
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 c3 `P(info="internal collector node 3");
electrical c4 `P(info="internal collector node 4"); 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" `include "opvars.inc"
analog begin analog begin
`include "initialize.inc" `include "initialize.inc"
`include "tscaling.inc" `include "tscaling.inc"
`include "evaluate.inc" `include "evaluate.inc"
`include "noise.inc"
`include "opinfo.inc" `include "opinfo.inc"
// The following can be used to print OP-info to std out:
// `include "op_print.inc"
end // analog end // analog
endmodule endmodule

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +1,8 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
// Front definitions // Front definitions
`include "discipline.h" `include "discipline.h"
@ -15,70 +20,111 @@
`define AJE 3.0 `define AJE 3.0
`define AJC 2.0 `define AJC 2.0
`define AJS 2.0 `define AJS 2.0
`define VEXLIM 200.0 `define VEXLIM 400.0
`define PI 3.1415926 `define PI 3.1415926
// Desriptions and units // Desriptions and units
`ifdef __VAMS_COMPACT_MODELING__ `ifdef __VAMS_COMPACT_MODELING__
`define OPP(nam,uni,des) (* desc="des", units="uni" *) real nam; `define OPP(nam,uni,des) (* desc="des", units="uni" *) real nam;
`define PAR(des,uni) (* desc="des", units="uni" *) parameter real `define PAR(des,uni) (* desc="des", units="uni" *) parameter real
`define PAI(des,uni) (* desc="des", units="uni" *) parameter integer `define PAI(des,uni) (* desc="des", units="uni" *) parameter integer
`else `else
`define OPP(nam,uni,des) `define OPP(nam,uni,des)
`define PAR(des,uni) parameter real `define PAR(des,uni) parameter real
`define PAI(des,uni) parameter integer `define PAI(des,uni) parameter integer
`endif `endif
`define PGIVEN $param_given
// ADMS specific definitions // ADMS specific definitions
`ifdef insideADMS `ifdef insideADMS
`define MODEL @(initial_model) `define P(p) (*p*)
`define INSTANCE @(initial_instance) `define MODEL @(initial_model)
`define NOISE @(noise) `define INSTANCE @(initial_instance)
`define ATTR(txt) (*txt*) `define NOISE @(noise)
`else `else
`define MODEL `define P(p)
`define INSTANCE `define MODEL
`define NOISE `define INSTANCE
`define ATTR(txt) `define NOISE
`endif `endif
// Smooth limitting functions // Smooth limitting functions
`define max_hyp0(result, x, epsilon)\ `define max_hyp0(result, x, epsilon)\
eps2 = epsilon * epsilon;\ eps2 = epsilon * epsilon;\
x2 = x * x;\ x2 = x * x;\
if (x < 0.0)\ if (x < 0.0)\
result = 0.5 * eps2 / (sqrt(x2 + eps2) - x);\ result = 0.5 * eps2 / (sqrt(x2 + eps2) - x);\
else\ else\
result = 0.5 * (sqrt(x2 + eps2) + x);\ result = 0.5 * (sqrt(x2 + eps2) + x);\
result=result result=result
`define min_logexp(result, x, x0, a)\ `define min_logexp(result, x, x0, a)\
dxa = (x - x0) / (a);\ dxa = (x - x0) / (a);\
if (x < x0)\ if (x < x0)\
result = x - a * ln(1.0 + exp(dxa));\ result = x - a * ln(1.0 + exp(dxa));\
else\ else\
result = x0 - a * ln(1.0 + exp(-dxa));\ result = x0 - a * ln(1.0 + exp(-dxa));\
result=result result=result
`define max_logexp(result, x, x0, a)\ `define max_logexp(result, x, x0, a)\
dxa = (x - x0) / (a);\ dxa = (x - x0) / (a);\
if (x < x0)\ if (x < x0)\
result = x0 + a * ln(1.0 + exp(dxa));\ result = x0 + a * ln(1.0 + exp(dxa));\
else\ else\
result = x + a * ln(1.0 + exp(-dxa));\ result = x + a * ln(1.0 + exp(-dxa));\
result=result result=result
`define expLin(result, x)\ `define expLin(result, x)\
if (x < `VEXLIM)\ if (x < `VEXLIM) begin\
result = exp(x);\ result = exp(x);\
else begin\ end else begin\
expl = exp(`VEXLIM);\ expl = exp(`VEXLIM);\
result = expl * (1.0 + (x - `VEXLIM));\ result = expl * (1.0 + (x - `VEXLIM));\
end end
`define linLog(result, x, vlim)\ `define linLog(result, x, vlim)\
if (x < vlim)\ if (x < vlim)\
result = x;\ result = x;\
else\ else\
result = vlim + ln(1.0 + (x - vlim));\ result = vlim + ln(1.0 + (x - vlim));\
result=result result=result
// Macros for the model/instance parameters
//
// MPRxx model parameter real
// MPIxx model parameter integer
// ||
// cc closed lower bound, closed upper bound
// oo open lower bound, open upper bound
// co closed lower bound, open upper bound
// oc open lower bound, closed upper bound
// cz closed lower bound=0, open upper bound=inf
// oz open lower bound=0, open upper bound=inf
// nb no bounds
// ex no bounds with exclude
// sw switch(integer only, values 0=false and 1=true)
// ty switch(integer only, values -1=p-type and +1=n-type)
//
//
`define MPRnb(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def ;
`define MPRex(nam,def,uni,exc, des) (*units=uni, desc=des*) parameter real nam=def exclude exc ;
`define MPRcc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from[lwr:upr] ;
`define MPRoo(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from(lwr:upr) ;
`define MPRco(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from[lwr:upr) ;
`define MPRoc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from(lwr:upr] ;
`define MPRcz(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def from[ 0:inf);
`define MPRoz(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def from( 0:inf);
`define MPInb(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def ;
`define MPIex(nam,def,uni,exc, des) (*units=uni, desc=des*) parameter integer nam=def exclude exc ;
`define MPIcc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from[lwr:upr] ;
`define MPIoo(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from(lwr:upr) ;
`define MPIco(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from[lwr:upr) ;
`define MPIoc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from(lwr:upr] ;
`define MPIcz(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from[ 0:inf);
`define MPIoz(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from( 0:inf);
`define MPIsw(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from[ 0: 1] ;
`define MPIty(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from[ -1: 1] exclude 0 ;

View File

@ -1,16 +1,26 @@
// Initialze model constants // Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
if (`PGIVEN(GMIN))
my_gmin = GMIN;
else
my_gmin = $simparam("gmin");
// Initialize model constants
// Impact ionization constants (NPN - PNP) // Impact ionization constants (NPN - PNP)
if (TYPE == 1) begin if (TYPE == 1) begin
An = 7.03e7; An = 7.03e7;
Bn = 1.23e8; Bn = 1.23e8;
end else begin end else begin
An = 1.58e8; An = 1.58e8;
Bn = 2.04e8; Bn = 2.04e8;
end end
@ -19,33 +29,36 @@ Xext1 = 1.0 - XEXT;
// Temperature independent MULT scaling // Temperature independent MULT scaling
`ifdef SELFHEATING `ifdef SELFHEATING
CTH_M = CTH * MULT; CTH_M = CTH * MULT;
`endif `endif
CBEO_M = CBEO * MULT; CBEO_M = CBEO * MULT;
CBCO_M = CBCO * MULT; CBCO_M = CBCO * MULT;
invMULT = 1.0 / MULT; invMULT = 1.0 / MULT;
SCRCV_M = SCRCV * invMULT; SCRCV_M = SCRCV * invMULT;
KF_M = KF * pow(MULT, 1.0 - AF); KF_M = KF * pow(MULT, 1.0 - AF);
KFN_M = KFN * pow(MULT, 1.0 - (2.0 * (MLF - 1.0) + AF * (2.0 - MLF))); KFN_M = KFN * pow(MULT, 1.0 - (2.0 * (MLF - 1.0) + AF * (2.0 - MLF)));
// begin: RvdT, November 2008 ; Zener tunneling current model // begin: RvdT, November 2008; Zener tunneling current model
pow2_2mPE = pow(2.0, 2.0 - PE); pow2_2mPE = pow(2.0, 2.0 - PE);
pow2_PEm2 = 1.0 / pow2_2mPE; pow2_PEm2 = 1.0 / pow2_2mPE;
// Reference Temperature expressed in Kelvin: // Reference Temperature expressed in Kelvin:
Trk = TREF + `C2K; Trk = TREF + `C2K;
// Ambient Temperature expressed in Kelvin:
Tamb = $temperature + DTA;
// begin: RvdT, November 2008 ; Zener tunneling current model
// begin: RvdT, November 2008; Zener tunneling current model
// //
// Comment added March 2009: this assumes VGZEBOK as a model parameter. // Comment added March 2009: this assumes VGZEBOK as a model parameter.
// //
// Bandgap for Zener tunnel current model at reference temperature in eV: // Bandgap for Zener tunnel current model at reference temperature in eV:
// VGZEB_Tr = VGZEBOK - AVGEB*Trk*Trk / (Trk + TVGEB) ; // VGZEB_Tr = VGZEBOK - AVGEB*Trk*Trk / (Trk + TVGEB);
// `max_logexp(VGZEB_Tr, VGZEBOK - AVGEB*Trk*Trk / (Trk + TVGEB), 0.05, 0.1) ; // `max_logexp(VGZEB_Tr, VGZEBOK - AVGEB*Trk*Trk / (Trk + TVGEB), 0.05, 0.1);
// end: RvdT, November 2008 // end: RvdT, November 2008
// begin: RvdT March 2009: // begin: RvdT March 2009:
@ -53,22 +66,23 @@ Xext1 = 1.0 - XEXT;
// use VGZEB as a parameter, instead of VGZEBOK: // use VGZEB as a parameter, instead of VGZEBOK:
// VGZEB : bandgap for Zener tunneling at T = Tref, // VGZEB : bandgap for Zener tunneling at T = Tref,
// VGZEBOK : bandgap for Zener tunneling at T = 0 K. // VGZEBOK : bandgap for Zener tunneling at T = 0 K.
// `max_logexp(VGZEBOK, VGZEB + AVGEB*Trk*Trk / (Trk + TVGEB), 0.05, 0.1); //`max_logexp(VGZEBOK, VGZEB + AVGEB*Trk*Trk / (Trk + TVGEB), 0.05, 0.1);
//dw can't expand the macro `max_logexp here - using the code //dw admsXml can't expand the macro `max_logexp here - using the code
_x = VGZEB + AVGEB*Trk*Trk / (Trk + TVGEB); _x = VGZEB + AVGEB*Trk*Trk / (Trk + TVGEB);
_x0 = 0.05; _x0 = 0.05;
_a = 0.1; _a = 0.1;
_dxa = (_x - _x0) / (_a); _dxa = (_x - _x0) / (_a);
if (_x < _x0) if (_x < _x0)
VGZEBOK = _x0 + _a * ln(1.0 + exp(_dxa)); VGZEBOK = _x0 + _a * ln(1.0 + exp(_dxa));
else else
VGZEBOK = _x + _a * ln(1.0 + exp(-_dxa)); VGZEBOK = _x + _a * ln(1.0 + exp(-_dxa));
VGZEB_Tr = VGZEB; VGZEB_Tr = VGZEB;
// end: RvdT March 2009: use VGZEB as a parameter, instead of VGZEBOK: // end: RvdT March 2009: use VGZEB as a parameter, instead of VGZEBOK:
inv_VGZEB_Tr = 1.0 / VGZEB_Tr; inv_VGZEB_Tr = 1.0 / VGZEB_Tr;
inv_VDE = 1.0 / VDE; inv_VDE = 1.0 / VDE;
// end: RvdT, November 2008; Zener tunneling current model
// end: RvdT, November 2008 ; Zener tunneling current model

View File

@ -0,0 +1,145 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
// Noise sources
`NOISE begin
// Thermal noise
common = 4.0 * `KB * Tk;
powerREC = common / RE_TM; // Emitter resistance
powerRBC = common / RBC_TM; // Base 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) * `one_third ; // Variable base resistance
// Main current shot noise
In_N = (If + Ir) / qBI;
powerCCS = 2.0 * `QQ * abs(In_N);
// Weak-avalanche current shot noise
if (KAVL > 0) begin
Gem_N = abs(Iavl / In_N);
end else begin
Gem_N = 0.0;
end
powerIIS = 2.0 * `QQ * Iavl * (Gem_N + 1);
// Transit time for noise
if (In_N > 0.0) begin
Taub_N = (Qbe + Qbc) / In_N;
end else begin
Taub_N = TAUB_T * q1Q * qBI;
end
// RF correlation noise model switch
if (KC == 1) begin
// use charge partition for noise transit time
taun = XQB * Taub_N;
end else if (KC == 2) begin
// use fraction of transit time for noise transit time
taun = FTAUN * Taub_N;
end else begin // KC == 0
// no correlation noise
taun = 0;
end
// Forward base current shot noise and 1/f noise
powerFBCS = 2.0 * `QQ * (abs(Ib1) + abs(Ib2) + abs(Izteb));
powerFBC1fB1 = (1.0 - XIBI) * pow((abs(Ib1) / (1 - XIBI)), AF) * KF_M;
exponentFBC1fB2 = (2.0 * (MLF - 1.0)) + (AF * (2.0 - MLF));
powerFBC1fB2 = KFN_M * pow(abs(Ib2), exponentFBC1fB2);
// Emitter-base sidewall current shot and 1/f noise
powerEBSCS = 2.0 * `QQ * abs(Ib1_s);
if (XIBI == 0)
powerEBSC1f = 0.0;
else
powerEBSC1f = KF_M * XIBI * pow((abs(Ib1_s / XIBI)), AF);
// Reverse base current shot noise and 1/f noise
powerRBCS = 2.0 * `QQ * abs(Ib3);
powerRBC1f = KF_M * pow(abs(Ib3), AF);
// Extrinsic current shot noise and 1/f noise
powerExCS = 2.0 * `QQ * abs(Iex);
powerExC1f = KF_M * (1 - (EXMOD * XEXT)) *
pow((abs(Iex) / (1 - (EXMOD * XEXT))), AF);
powerExCSMOD = 2.0 * `QQ * abs(XIex) * EXMOD;
if (XEXT == 0.0)
powerExC1fMOD = 0.0;
else
powerExC1fMOD = KF_M * EXMOD * XEXT * pow((abs(XIex) / XEXT), AF);
`ifdef SUBSTRATE
// Substrate current shot noise (between nodes B1 and S, resp. B and S)
powerSubsCS_B1S = 2.0 * `QQ * abs(Isub);
powerSubsCS_BS = 2.0 * `QQ * abs(XIsub);
`endif
// Reference un-correlated current shot noise sources
I(noi) <+ white_noise(powerCCS, "un-correlated current shot noise");
I(noi) <+ V(noi);
// Implementing correlated noise sources
I(b2, e1) <+ taun * ddt(V(noi));
I(c2, b2) <+ Gem_N * V(noi);
I(c2, e1) <+ V(noi);
// Implementing un-correlated noise sources
I(c2, b2) <+ white_noise(powerIIS, "un-correlated noise");
I(b2, e1) <+ white_noise(powerFBCS, "un-correlated noise");
// Add noise sources
I(e, e1) <+ white_noise(powerREC, "emitter resistance");
I(b, b1) <+ white_noise(powerRBC, "base resistance");
I(b1, b2) <+ white_noise(powerRBV, "variable base resistance");
I(b2, e1) <+ flicker_noise(powerFBC1fB1, 1, "bas_emi_forw");
I(b2, e1) <+ flicker_noise(powerFBC1fB2, 1, "bas_emi_forw");
I(e1, b1) <+ white_noise(powerEBSCS, "emi_bas_side");
I(e1, b1) <+ flicker_noise(powerEBSC1f, 1, "emi_bas_side");
I(b1, c4) <+ white_noise(powerRBCS, "bas_col_reve");
I(b1, c4) <+ flicker_noise(powerRBC1f, 1, "bas_col_reve");
I(b1, c4) <+ white_noise(powerExCS, "Ext_bas_col");
I(b1, c4) <+ flicker_noise(powerExC1f, 1, "Ext_bas_col");
I(b, c3) <+ white_noise(powerExCSMOD, "Ext_bas_col");
I(b, c3) <+ flicker_noise(powerExC1fMOD, 1, "Ext_bas_col");
`ifdef SUBSTRATE
I(b1, s) <+ white_noise(powerSubsCS_B1S, "bas_sub_current");
I(b, s) <+ white_noise(powerSubsCS_BS, "bas_sub_current");
`endif
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

View File

@ -1,24 +1,38 @@
// Evaluate the operating point (outout) variables // Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
// Evaluate the operating point (output) variables
begin begin
`ifdef __VAMS_COMPACT_MODELING__ `ifdef __VAMS_COMPACT_MODELING__
// The external currents and the current gain // The external currents and the current gain
OP_ic = I(<c>); // External DC collector current OP_ic = I(<c>); // External DC collector current
OP_ib = I(<b>); // External DC base Current OP_ib = I(<b>); // External DC base Current
OP_betadc = OP_ic / OP_ib; // External DC Current gain
if (OP_ib == 0)
begin
OP_betadc = 0.0 ;
end
else
begin
OP_betadc = OP_ic / OP_ib; // External DC Current gain
end
// begin added in MXT 504.9: // begin added in MXT 504.9:
OP_ie = I(<e>); // External DC emitter current OP_ie = I(<e>); // External DC emitter current
OP_vbe = V(b, e); // External base-emitter bias OP_vbe = V(b, e); // External base-emitter bias
OP_vce = V(c, e); // External collector-emitter bias OP_vce = V(c, e); // External collector-emitter bias
OP_vbc = V(b, c); // External base-collector bias OP_vbc = V(b, c); // External base-collector bias
`ifdef SUBSTRATE `ifdef SUBSTRATE
OP_is = I(<s>); // External DC emitter current OP_is = I(<s>); // External DC emitter current
OP_vse = V(s, e); // External substrate-emitter bias OP_vse = V(s, e); // External substrate-emitter bias
OP_vbs = V(b, s); // External base-substrate bias OP_vbs = V(b, s); // External base-substrate bias
OP_vsc = V(s, c); // External substrate-collector bias OP_vsc = V(s, c); // External substrate-collector bias
`endif `endif
// end added in MXT 504.9: // end added in MXT 504.9:
@ -52,9 +66,9 @@ OP_iavl = Iavl; // Avalanche current
OP_iex = Iex; // Extrinsic reverse base current OP_iex = Iex; // Extrinsic reverse base current
OP_xiex = XIex; // Extrinsic reverse base current OP_xiex = XIex; // Extrinsic reverse base current
`ifdef SUBSTRATE `ifdef SUBSTRATE
OP_isub = Isub; // Substrate current OP_isub = Isub; // Substrate current
OP_xisub = XIsub; // Substrate current OP_xisub = XIsub; // Substrate current
OP_isf = Isf; // Substrate-collector current OP_isf = Isf; // Substrate-collector current
`endif `endif
OP_ire = - Vee1 / RE_TM; // Current through emiter resistance OP_ire = - Vee1 / RE_TM; // Current through emiter resistance
OP_irbc = Vbb1 / RBC_TM; // Current through constant base resistance OP_irbc = Vbb1 / RBC_TM; // Current through constant base resistance
@ -77,7 +91,7 @@ OP_xqtex = XQtex; // Extrinsic base-collector depletion charge
OP_qex = Qex; // Extrinsic base-collector diffusion charge OP_qex = Qex; // Extrinsic base-collector diffusion charge
OP_xqex = XQex; // Extrinsic base-collector diffusion charge OP_xqex = XQex; // Extrinsic base-collector diffusion charge
`ifdef SUBSTRATE `ifdef SUBSTRATE
OP_qts = Qts; // Collector substrate depletion charge OP_qts = Qts; // Collector substrate depletion charge
`endif `endif
// Small signal equivalent circuit conductances and resistances // Small signal equivalent circuit conductances and resistances
@ -125,13 +139,12 @@ OP_rcbli = RCCin_TM; // Extrinsic buried layer resistance
`ifdef SUBSTRATE `ifdef SUBSTRATE
OP_gs = ddx(Isub, V(b)) + ddx(Isub, V(b1)); // Conductance parasitic PNP transitor OP_gs = ddx(Isub, V(b)) + ddx(Isub, V(b1)); // Conductance parasitic PNP transitor
OP_xgs = ddx(XIsub, V(b)) ; // Conductance parasitic PNP transistor OP_xgs = ddx(XIsub, V(b)) ; // Conductance parasitic PNP transistor
OP_gsf = ddx(Isf, V(s)) ; // Conductance substrate-collector current OP_gsf = ddx(Isf, V(s)) ; // Conductance substrate-collector current
`endif `endif
// Small signal equivalent circuit capacitances // Small signal equivalent circuit capacitances
OP_scbe = - ddx(Qte_s, V(e)) - ddx(Qte_s, V(e1)); // Capacitance sidewall b-e junction OP_scbe = - ddx(Qte_s, V(e)) - ddx(Qte_s, V(e1)); // Capacitance sidewall b-e junction
@ -164,7 +177,7 @@ OP_cb1b2y = - ddx(Qb1b2, V(c2)); // Cross-capacitance AC current crowding
OP_cb1b2z = - ddx(Qb1b2, V(c1)) ; // Cross-capacitance AC current crowding OP_cb1b2z = - ddx(Qb1b2, V(c1)) ; // Cross-capacitance AC current crowding
`ifdef SUBSTRATE `ifdef SUBSTRATE
OP_cts = ddx(Qts, V(s)) ; // Capacitance s-c junction OP_cts = ddx(Qts, V(s)) ; // Capacitance s-c junction
`endif `endif
// Approximate small signal equivalent circuit // Approximate small signal equivalent circuit
@ -208,7 +221,7 @@ rz = alpha_ft * rx;
ry = (1.0 - OP_grcvz * rz) / OP_grcvy; ry = (1.0 - OP_grcvz * rz) / OP_grcvy;
rb1b2 = gammax * rx + gammay * ry + gammaz * rz; rb1b2 = gammax * rx + gammay * ry + gammaz * rz;
rex = rz + rb1b2 - OP_rcbli; rex = rz + rb1b2 - OP_rcbli;
xrex = rex + RBC_TM * ((gbfx + OP_gmux) * rx + (gbfy + OP_gmuy) * ry + xrex = rz + rb1b2 + RBC_TM * ((gbfx + OP_gmux) * rx + (gbfy + OP_gmuy) * ry +
(gbfz + OP_gmuz) * rz) - OP_rcbli - OP_rcblx; (gbfz + OP_gmuz) * rz) - OP_rcbli - OP_rcblx;
taut = OP_scbe * (rx + rb1b2) + (OP_cbex + OP_cbcx) * rx + (OP_cbey + OP_cbcy) * taut = OP_scbe * (rx + rb1b2) + (OP_cbex + OP_cbcx) * rx + (OP_cbey + OP_cbcy) *
@ -222,7 +235,7 @@ OP_vb2c2star = Vb2c2star; // Physical value of internal base-collector b
//self-heating //self-heating
`ifdef SELFHEATING `ifdef SELFHEATING
OP_pdiss = power; // Dissipation OP_pdiss = power_dis; // Dissipation
`endif `endif
OP_tk = Tk; // Actual temperature OP_tk = Tk; // Actual temperature

View File

@ -1,3 +1,8 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
// //
// Operation point (output) variables // Operation point (output) variables
// //
@ -102,8 +107,8 @@
`OPP(OP_rcblx, Ohm, Extrinsic buried layer resistance) `OPP(OP_rcblx, Ohm, Extrinsic buried layer resistance)
`OPP(OP_rcbli, Ohm, Intrinsic buried layer resistance) `OPP(OP_rcbli, Ohm, Intrinsic buried layer resistance)
`ifdef SUBSTRATE `ifdef SUBSTRATE
`OPP(OP_gs, S, Conductance parasistic PNP transistor) `OPP(OP_gs, S, Conductance parasitic PNP transistor)
`OPP(OP_xgs, S, Conductance parasistic PNP transistor) `OPP(OP_xgs, S, Conductance parasitic PNP transistor)
`OPP(OP_gsf, S, Conductance substrate failure current) `OPP(OP_gsf, S, Conductance substrate failure current)
`endif `endif
//Small signal equivalent circuit capacitances //Small signal equivalent circuit capacitances
@ -149,4 +154,3 @@
real dydx, dydz, gpi; real dydx, dydz, gpi;
real gammax, gammay, gammaz, gbfx, gbfy, gbfz, alpha_ft; real gammax, gammay, gammaz, gbfx, gbfy, gbfz, alpha_ft;
real rx, ry, rz, rb1b2, rex, xrex, taut; real rx, ry, rz, rb1b2, rex, xrex, taut;

View File

@ -1,209 +1,115 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
// Mextram parameters // Mextram parameters
`MPIco( LEVEL ,504 ,"" ,504 ,505 ,"Model level" )
parameter integer LEVEL = 504 from [504:505) `MPRco( TREF ,25.0 ,"" ,-273.0 ,inf ,"Reference temperature" )
`ATTR(info="Model level"); `MPRnb( DTA ,0.0 ,"" ,"Difference between the local and global ambient temperatures" )
parameter real TREF = 25.0 from [-273.0:inf) `MPIcc( EXMOD ,1 ,"" ,0 ,2 ,"Flag for extended modeling of the reverse current gain" )
`ATTR(info="Reference temperature"); `MPIcc( EXPHI ,1 ,"" ,0 ,1 ,"Flag for the distributed high-frequency effects in transient" )
parameter real DTA = 0.0 `MPIcc( EXAVL ,0 ,"" ,0 ,1 ,"Flag for extended modeling of avalanche currents" )
`ATTR(info="Difference between the local and global ambient temperatures");
parameter integer EXMOD = 1 from [0:1]
`ATTR(info="Flag for extended modeling of the reverse current gain");
parameter integer EXPHI = 1 from [0:1]
`ATTR(info="Flag for the distributed high-frequency effects in transient");
parameter integer EXAVL = 0 from [0:1]
`ATTR(info="Flag for extended modeling of avalanche currents");
parameter real IS = 22.0a from (0.0:inf)
`ATTR(info="Collector-emitter saturation current");
parameter real IK = 0.1 from [1.0p:inf)
`ATTR(info="Collector-emitter high injection knee current");
parameter real VER = 2.5 from [0.01:inf)
`ATTR(info="Reverse Early voltage");
parameter real VEF = 44.0 from [0.01:inf)
`ATTR(info="Forward Early voltage");
parameter real BF = 215.0 from [0.1m:inf)
`ATTR(info="Ideal forward current gain");
parameter real IBF = 2.7f from [0.0:inf)
`ATTR(info="Saturation current of the non-ideal forward base current");
parameter real MLF = 2.0 from [0.1:inf)
`ATTR(info="Non-ideality factor of the non-ideal forward base current");
parameter real XIBI = 0.0 from [0.0:1.0]
`ATTR(info="Part of ideal base current that belongs to the sidewall");
// begin: RvdT, November 2008, BE tunneling current parameters:
parameter real IZEB = 0.0 from [0.0:inf)
`ATTR(info="Pre-factor of emitter-base Zener tunneling current");
parameter real NZEB = 22.0 from [0.0:inf)
`ATTR(info="Coefficient of emitter-base Zener tunneling current");
// end: RvdT, November 2008, EB tunneling current parameters:
parameter real BRI = 7.0 from [1.0e-4:inf)
`ATTR(info="Ideal reverse current gain");
parameter real IBR = 1.0f from [0.0:inf)
`ATTR(info="Saturation current of the non-ideal reverse base current");
parameter real VLR = 0.2
`ATTR(info="Cross-over voltage of the non-ideal reverse base current");
parameter real XEXT = 0.63 from [0.0:1.0]
`ATTR(info="Part of currents and charges that belong to extrinsic region");
parameter real WAVL = 1.1u from [1.0n:inf)
`ATTR(info="Epilayer thickness used in weak-avalanche model");
parameter real VAVL = 3.0 from [0.01:inf)
`ATTR(info="Voltage determining curvature of avalanche current");
parameter real SFH = 0.3 from [0.0:inf)
`ATTR(info="Current spreading factor of avalanche model when EXAVL=1");
// RvdT, 22-02-2008: for MXT 504.7
// 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");
parameter real RBC = 23.0 from [1.0m:inf)
`ATTR(info="Constant part of the base resistance");
parameter real RBV = 18.0 from [1.0m:inf)
`ATTR(info="Zero-bias value of the variable part of the base resistance");
parameter real RCC = 12.0 from [1.0m:inf)
`ATTR(info="Constant part of the collector resistance");
parameter real RCV = 150.0 from [1.0m:inf)
`ATTR(info="Resistance of the un-modulated epilayer");
parameter real SCRCV = 1250.0 from [1.0m:inf)
`ATTR(info="Space charge resistance of the epilayer");
parameter real IHC = 4.0m from [1.0p:inf)
`ATTR(info="Critical current for velocity saturation in the epilayer");
parameter real AXI = 0.3 from [0.02:inf)
`ATTR(info="Smoothness parameter for the onset of quasi-saturation");
parameter real CJE = 73.0f from [0.0:inf)
`ATTR(info="Zero-bias emitter-base depletion capacitance");
parameter real VDE = 0.95 from [0.05:inf)
`ATTR(info="Emitter-base diffusion voltage");
parameter real PE = 0.4 from [0.01:0.99)
`ATTR(info="Emitter-base grading coefficient");
parameter real XCJE = 0.4 from [0.0:1.0]
`ATTR(info="Sidewall fraction of the emitter-base depletion capacitance");
parameter real CBEO = 0.0 from [0.0:inf)
`ATTR(info="Emitter-base overlap capacitance");
parameter real CJC = 78.0f from [0.0:inf)
`ATTR(info="Zero-bias collector-base depletion capacitance");
parameter real VDC = 0.68 from [0.05:inf)
`ATTR(info="Collector-base diffusion voltage");
parameter real PC = 0.5 from [0.01:0.99)
`ATTR(info="Collector-base grading coefficient");
parameter real XP = 0.35 from [0.0:0.99)
`ATTR(info="Constant part of Cjc");
parameter real MC = 0.5 from [0.0:1.0)
`ATTR(info="Coefficient for current modulation of CB depletion capacitance");
parameter real XCJC = 32.0m from [0.0:1.0]
`ATTR(info="Fraction of CB depletion capacitance under the emitter");
// RvdT, 30-11-2007: introduced RCBLX and RCBLI:
parameter real RCBLX = 0.0 from [0.0:inf)
`ATTR(info="Resistance Collector Buried Layer eXtrinsic");
parameter real RCBLI = 0.0 from [0.0:inf)
`ATTR(info="Resistance Collector Buried Layer Intrinsic");
parameter real CBCO = 0.0 from [0.0:inf)
`ATTR(info="Collector-base overlap capacitance");
parameter real MTAU = 1.0 from [0.1:inf)
`ATTR(info="Non-ideality factor of the emitter stored charge");
parameter real TAUE = 2.0p from [0.0:inf)
`ATTR(info="Minimum transit time of stored emitter charge");
parameter real TAUB = 4.2p from (0.0:inf)
`ATTR(info="Transit time of stored base sharge");
parameter real TEPI = 41.0p from [0.0:inf)
`ATTR(info="Transit time of stored epilayer charge");
parameter real TAUR = 520.0p from [0.0:inf)
`ATTR(info="Transit time of reverse extrinsic stored base charge");
parameter real DEG = 0.0
`ATTR(info="Bandgap difference over the base");
parameter real XREC = 0.0 from [0.0:inf)
`ATTR(info="Pre-factor of the recombination part of Ib1");
parameter real AQBO = 0.3
`ATTR(info="Temperature coefficient of the zero-bias base charge");
parameter real AE = 0.0
`ATTR(info="Temperature coefficient of the resistivity of the emitter");
parameter real AB = 1.0
`ATTR(info="Temperature coefficient of the resistivity of the base");
parameter real AEPI = 2.5
`ATTR(info="Temperature coefficient of the resistivity of the epilayer");
parameter real AEX = 0.62
`ATTR(info="Temperature coefficient of the resistivity of the extrinsic base");
parameter real AC = 2.0
`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
`ATTR(info="Band-gap voltage difference of the forward current gain");
parameter real DVGBR = 45.0m
`ATTR(info="Band-gap voltage difference of the reverse current gain");
parameter real VGB = 1.17 from [0.1:inf)
`ATTR(info="Band-gap voltage of the base");
parameter real VGC = 1.18 from [0.1:inf)
`ATTR(info="Band-gap voltage of the collector");
parameter real VGJ = 1.15 from [0.1:inf)
`ATTR(info="Band-gap voltage recombination emitter-base junction");
parameter real VGZEB = 1.15 from [0.1:inf)
`ATTR(info="Band-gap voltage at Tref of Zener effect emitter-base junction");
parameter real AVGEB = 4.73e-4 from (-inf:inf)
`ATTR(info="Temperature coefficient band-gap voltage for Zener effect emitter-base junction");
parameter real TVGEB = 636.0 from [0.0:inf)
`ATTR(info="Temperature coefficient band-gap voltage for Zener effect emitter-base junction");
parameter real DVGTE = 0.05
`ATTR(info="Band-gap voltage difference of emitter stored charge");
parameter real DAIS = 0.0
`ATTR(info="Fine tuning of temperature dependence of C-E saturation current");
parameter real AF = 2.0 from [0.01:inf)
`ATTR(info="Exponent of the Flicker-noise");
parameter real KF = 20.0p from [0.0:inf)
`ATTR(info="Flicker-noise coefficient of the ideal base current");
parameter real KFN = 20.0p from [0.0:inf)
`ATTR(info="Flicker-noise coefficient of the non-ideal base current");
parameter integer KAVL = 0 from [0:1]
`ATTR(info="Switch for white noise contribution due to avalanche");
`ifdef SUBSTRATE `ifdef SUBSTRATE
parameter real ISS = 48.0a from [0.0:inf) `MPIcc( EXSUB ,0 ,"" ,0 ,1 ,"Flag for extended modelling of substrate currents" )
`ATTR(info="Base-substrate saturation current"); `endif
parameter real ICSS = -1.0 from (-inf:inf)
`ATTR(info="Collector-substrate ideal saturation current"); `MPRoo( IS ,22.0a ,"" ,0.0 ,inf ,"Collector-emitter saturation current" )
parameter real IKS = 250.0u from [1.0p:inf) `MPRco( IK ,0.1 ,"" ,1.0p ,inf ,"Collector-emitter high injection knee current" )
`ATTR(info="Base-substrate high injection knee current"); `MPRco( VER ,2.5 ,"" ,0.01 ,inf ,"Reverse Early voltage" )
parameter real CJS = 315.0f from [0:inf) `MPRco( VEF ,44.0 ,"" ,0.01 ,inf ,"Forward Early voltage" )
`ATTR(info="Zero-bias collector-substrate depletion capacitance"); `MPRco( BF ,215.0 ,"" ,0.1m ,inf ,"Ideal forward current gain" )
parameter real VDS = 0.62 from (0.05:inf) `MPRco( IBF ,2.7f ,"" ,0.0 ,inf ,"Saturation current of the non-ideal forward base current" )
`ATTR(info="Collector-substrate diffusion voltage"); `MPRco( MLF ,2.0 ,"" ,0.1 ,inf ,"Non-ideality factor of the non-ideal forward base current" )
parameter real PS = 0.34 from (0.01:0.99) `MPRcc( XIBI ,0.0 ,"" ,0.0 ,1.0 ,"Part of ideal base current that belongs to the sidewall" )
`ATTR(info="Collector-substrate grading coefficient"); `MPRco( IZEB ,0.0 ,"" ,0.0 ,inf ,"Pre-factor of emitter-base Zener tunneling current" )
parameter real VGS = 1.20 from [0.1:inf) `MPRco( NZEB ,22.0 ,"" ,0.0 ,inf ,"Coefficient of emitter-base Zener tunneling current" )
`ATTR(info="band-gap voltage of the substrate"); `MPRco( BRI ,7.0 ,"" ,1.0e-4 ,inf ,"Ideal reverse current gain" )
parameter real AS = 1.58 `MPRco( IBR ,1.0f ,"" ,0.0 ,inf ,"Saturation current of the non-ideal reverse base current" )
`ATTR(info="Substrate temperature coefficient"); `MPRnb( VLR ,0.2 ,"" ,"Cross-over voltage of the non-ideal reverse base current" )
parameter real ASUB = 2.0 `MPRcc( XEXT ,0.63 ,"" ,0.0 ,1.0 ,"Part of currents and charges that belong to extrinsic region" )
`ATTR(info="Temperature coefficient for mobility of minorities in the substrate"); `MPRco( WAVL ,1.1u ,"" ,1.0n ,inf ,"Epilayer thickness used in weak-avalanche model" )
`MPRco( VAVL ,3.0 ,"" ,0.01 ,inf ,"Voltage determining curvature of avalanche current" )
`MPRco( SFH ,0.3 ,"" ,0.0 ,inf ,"Current spreading factor of avalanche model when EXAVL=1" )
`MPRco( RE ,5.0 ,"" ,1.0m ,inf ,"Emitter resistance" )
`MPRco( RBC ,23.0 ,"" ,1.0m ,inf ,"Constant part of the base resistance" )
`MPRco( RBV ,18.0 ,"" ,1.0m ,inf ,"Zero-bias value of the variable part of the base resistance" )
`MPRco( RCC ,12.0 ,"" ,1.0m ,inf ,"Constant part of the collector resistance" )
`MPRco( RCV ,150.0 ,"" ,1.0m ,inf ,"Resistance of the un-modulated epilayer" )
`MPRco( SCRCV ,1250.0 ,"" ,1.0m ,inf ,"Space charge resistance of the epilayer" )
`MPRco( IHC ,4.0m ,"" ,1.0p ,inf ,"Critical current for velocity saturation in the epilayer" )
`MPRco( AXI ,0.3 ,"" ,0.02 ,inf ,"Smoothness parameter for the onset of quasi-saturation" )
`MPRco( CJE ,73.0f ,"" ,0.0 ,inf ,"Zero-bias emitter-base depletion capacitance" )
`MPRco( VDE ,0.95 ,"" ,0.05 ,inf ,"Emitter-base diffusion voltage" )
`MPRco( PE ,0.4 ,"" ,0.01 ,0.99 ,"Emitter-base grading coefficient" )
`MPRcc( XCJE ,0.4 ,"" ,0.0 ,1.0 ,"Sidewall fraction of the emitter-base depletion capacitance" )
`MPRco( CBEO ,0.0 ,"" ,0.0 ,inf ,"Emitter-base overlap capacitance" )
`MPRco( CJC ,78.0f ,"" ,0.0 ,inf ,"Zero-bias collector-base depletion capacitance" )
`MPRco( VDC ,0.68 ,"" ,0.05 ,inf ,"Collector-base diffusion voltage" )
`MPRco( PC ,0.5 ,"" ,0.01 ,0.99 ,"Collector-base grading coefficient" )
`MPRco( XP ,0.35 ,"" ,0.0 ,0.99 ,"Constant part of Cjc" )
`MPRco( MC ,0.5 ,"" ,0.0 ,1.0 ,"Coefficient for current modulation of CB depletion capacitance" )
`MPRcc( XCJC ,32.0m ,"" ,0.0 ,1.0 ,"Fraction of CB depletion capacitance under the emitter" )
`MPRco( RCBLX ,0.001 ,"" ,0.001 ,inf ,"Resistance Collector Buried Layer eXtrinsic" )
`MPRco( RCBLI ,0.001 ,"" ,0.001 ,inf ,"Resistance Collector Buried Layer Intrinsic" )
`MPRco( CBCO ,0.0 ,"" ,0.0 ,inf ,"Collector-base overlap capacitance" )
`MPRco( MTAU ,1.0 ,"" ,0.1 ,inf ,"Non-ideality factor of the emitter stored charge" )
`MPRco( TAUE ,2.0p ,"" ,0.0 ,inf ,"Minimum transit time of stored emitter charge" )
`MPRoo( TAUB ,4.2p ,"" ,0.0 ,inf ,"Transit time of stored base charge" )
`MPRco( TEPI ,41.0p ,"" ,0.0 ,inf ,"Transit time of stored epilayer charge" )
`MPRco( TAUR ,520.0p ,"" ,0.0 ,inf ,"Transit time of reverse extrinsic stored base charge" )
`MPRnb( DEG ,0.0 ,"" ,"Bandgap difference over the base" )
`MPRco( XREC ,0.0 ,"" ,0.0 ,inf ,"Pre-factor of the recombination part of Ib1" )
`MPRcc( XQB ,`one_third ,"" ,0.0 ,1.0 ,"Emitter-fraction of base diffusion charge" )
`MPRnb( AQBO ,0.3 ,"" ,"Temperature coefficient of the zero-bias base charge" )
`MPRnb( AE ,0.0 ,"" ,"Temperature coefficient of the resistivity of the emitter" )
`MPRnb( AB ,1.0 ,"" ,"Temperature coefficient of the resistivity of the base" )
`MPRnb( AEPI ,2.5 ,"" ,"Temperature coefficient of the resistivity of the epilayer" )
`MPRnb( AEX ,0.62 ,"" ,"Temperature coefficient of the resistivity of the extrinsic base" )
`MPRnb( AC ,2.0 ,"" ,"Temperature coefficient of the resistivity of the collector contact" )
`MPRco( ACBL ,2.0 ,"" ,0.0 ,inf ,"Temperature coefficient of the resistivity of the collector buried layer" )
`MPRnb( DVGBF ,50.0m ,"" ,"Band-gap voltage difference of the forward current gain" )
`MPRnb( DVGBR ,45.0m ,"" ,"Band-gap voltage difference of the reverse current gain" )
`MPRco( VGB ,1.17 ,"" ,0.1 ,inf ,"Band-gap voltage of the base" )
`MPRco( VGC ,1.18 ,"" ,0.1 ,inf ,"Band-gap voltage of the collector" )
`MPRco( VGJ ,1.15 ,"" ,0.1 ,inf ,"Band-gap voltage recombination emitter-base junction" )
`MPRco( VGZEB ,1.15 ,"" ,0.1 ,inf ,"Band-gap voltage at Tref of Zener effect emitter-base junction" )
`MPRoo( AVGEB ,4.73e-4 ,"" ,-inf ,inf ,"Temperature coefficient band-gap voltage for Zener effect emitter-base junction" )
`MPRco( TVGEB ,636.0 ,"" ,0.0 ,inf ,"Temperature coefficient band-gap voltage for Zener effect emitter-base junction" )
`MPRnb( DVGTE ,0.05 ,"" ,"Band-gap voltage difference of emitter stored charge" )
`MPRnb( DAIS ,0.0 ,"" ,"Fine tuning of temperature dependence of C-E saturation current" )
`MPRco( AF ,2.0 ,"" ,0.01 ,inf ,"Exponent of the Flicker-noise" )
`MPRco( KF ,20.0p ,"" ,0.0 ,inf ,"Flicker-noise coefficient of the ideal base current" )
`MPRco( KFN ,20.0p ,"" ,0.0 ,inf ,"Flicker-noise coefficient of the non-ideal base current" )
`MPIcc( KAVL ,0 ,"" ,0 ,1 ,"Switch for white noise contribution due to avalanche" )
`MPIcc( KC ,0 ,"" ,0 ,2 ,"Switch for RF correlation noise model selection" )
`MPRcc( KE ,0.0 ,"" ,0.0 ,1.0 ,"Fraction of QE in excess phase shift" )
`MPRcc( FTAUN ,0.0 ,"" ,0.0 ,1.0 ,"Fraction of noise transit time to total transit time" )
`ifdef SUBSTRATE
`MPRco( ISS ,48.0a ,"" ,0.0 ,inf ,"Base-substrate saturation current" )
`MPRoo( ICSS ,-1.0 ,"" ,-inf ,inf ,"Collector-substrate ideal saturation current" )
`MPRco( IKS ,250.0u ,"" ,1.0p ,inf ,"Base-substrate high injection knee current" )
`MPRco( CJS ,315.0f ,"" ,0.0 ,inf ,"Zero-bias collector-substrate depletion capacitance" )
`MPRoo( VDS ,0.62 ,"" ,0.05 ,inf ,"Collector-substrate diffusion voltage" )
`MPRoo( PS ,0.34 ,"" ,0.01 ,0.99 ,"Collector-substrate grading coefficient" )
`MPRco( VGS ,1.20 ,"" ,0.1 ,inf ,"Band-gap voltage of the substrate" )
`MPRnb( AS ,1.58 ,"" ,"Substrate temperature coefficient" )
`MPRnb( ASUB ,2.0 ,"" ,"Temperature coefficient for mobility of minorities in the substrate" )
`endif `endif
`ifdef SELFHEATING `ifdef SELFHEATING
parameter real RTH = 300.0 from (0.0:inf) `MPRoo( RTH ,300.0 ,"" ,0.0 ,inf ,"Thermal resistance" )
`ATTR(info="Thermal resistance"); `MPRco( CTH ,3.0n ,"" ,0.0 ,inf ,"Thermal capacitance" )
parameter real CTH = 3.0n from [0.0:inf) `MPRnb( ATH ,0.0 ,"" ,"Temperature coefficient of the thermal resistance" )
`ATTR(info="Thermal capacitance");
parameter real ATH = 0.0
`ATTR(info="Temperature coefficient of the thermal resistance");
`endif `endif
parameter real MULT = 1.0 from (0.0:inf) `MPRoo( MULT ,1.0 ,"" ,0.0 ,inf ,"Multiplication factor" )
`ATTR(info="Multiplication factor"); `MPIty( TYPE ,1 ,"" ,"Flag for NPN (1) or PNP (-1) transistor type" )
`MPRoc( GMIN ,1.0e-13 ,"" ,0.0 ,1e-10 ,"Minimum conductance" )
// Non-standard (additional) model parameters
// (introduced for the users' convenience)
`ifdef insideADMS
parameter integer TYPE = 1 from [-1:1]
`ATTR(info="Flag for NPN (1) or PNP (-1) transistor type");
`else
parameter integer TYPE = 1 from [-1:1] exclude 0;
`endif
parameter real GMIN = 1.0e-13 from (0:1e-10]
`ATTR(info="Minimum conductance");

View File

@ -1,69 +1,66 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
// Temperature scaling of parameters // Temperature scaling of parameters
// The excess transistor temperature due to the self-heating // The excess transistor temperature due to the self-heating
`ifdef SELFHEATING `ifdef SELFHEATING
Tki = V(dt); Tki = V(dt);
// *** Convergence related smoothing *** // *** Convergence related smoothing ***
if (Tki < 0.0) begin if (Tki < 0.0) begin
Tki = - ln(1.0 - Tki); Tki = - ln(1.0 - Tki);
end end
`linLog(Vdt, Tki, 200.0); `linLog(Vdt, Tki, 200.0);
// `min_logexp(Vdt, Tki, 200.0, 10.0); // `min_logexp(Vdt, Tki, 200.0, 10.0);
`else `else
Vdt = 0.0; Vdt = 0.0;
`endif `endif
// Temperature variables // Temperature variables
Tk = Tamb + Vdt;
tN = Tk / Trk;
Vt = `KBdivQQ * Tk;
Vtr = `KBdivQQ * Trk;
VtINV = 1.0 / Vt;
VtrINV = 1.0 / Vtr;
VdtINV = VtINV - VtrINV;
`ifdef insideADMS lntN = ln(tN) ;
Tk = Trk + DTA + Vdt;
Tamb = Trk + DTA;
`else
Tk = $temperature + DTA + Vdt;
Tamb = $temperature + DTA;
`endif
tN = Tk / Trk;
Vt = `KBdivQQ * Tk;
Vtr = `KBdivQQ * Trk;
VtINV = 1.0 / Vt;
VtrINV = 1.0 / Vtr;
VdtINV = VtINV - VtrINV;
lntN = ln(tN) ;
// begin: RvdT, November 2008, "Zener tunneling model" // begin: RvdT, November 2008, "Zener tunneling model"
// VGZEB_T = VGZEBOK - AVGEB*Tk*Tk / (Tk + TVGEB) ; // VGZEB_T = VGZEBOK - AVGEB*Tk*Tk / (Tk + TVGEB) ;
`max_logexp(VGZEB_T, VGZEBOK - AVGEB*Tk*Tk / (Tk + TVGEB), 0.05, 0.1) ; `max_logexp(VGZEB_T, VGZEBOK - AVGEB*Tk*Tk / (Tk + TVGEB), 0.05, 0.1) ;
// end: RvdT, November 2008, "Zener tunneling model" // end: RvdT, November 2008, "Zener tunneling model"
// Depletion capacitances // Depletion capacitances
UdeT = -3.0 * Vt * ln(tN) + VDE * tN + (1.0 - tN) * VGB; UdeT = -3.0 * Vt * ln(tN) + VDE * tN + (1.0 - tN) * VGB;
`max_logexp(VDE_T, `VDLOW, UdeT, Vt); `max_logexp(VDE_T, `VDLOW, UdeT, Vt);
UdcT = -3.0 * Vt * ln(tN) + VDC * tN + (1.0 - tN) * VGC; UdcT = -3.0 * Vt * ln(tN) + VDC * tN + (1.0 - tN) * VGC;
`max_logexp(VDC_T, `VDLOW, UdcT, Vt); `max_logexp(VDC_T, `VDLOW, UdcT, Vt);
`ifdef SUBSTRATE `ifdef SUBSTRATE
UdsT = -3.0 * Vt * ln(tN) + VDS * tN + (1.0 - tN) * VGS; UdsT = -3.0 * Vt * ln(tN) + VDS * tN + (1.0 - tN) * VGS;
`max_logexp(VDS_T, `VDLOW, UdsT, Vt); `max_logexp(VDS_T, `VDLOW, UdsT, Vt);
`endif `endif
inv_VDE_T = 1.0 / VDE_T ; inv_VDE_T = 1.0 / VDE_T ;
CJE_T_div_CJE = pow(VDE * inv_VDE_T, PE); CJE_T_div_CJE = pow(VDE * inv_VDE_T, PE);
CJE_T = CJE * CJE_T_div_CJE ; CJE_T = CJE * CJE_T_div_CJE ;
`ifdef SUBSTRATE `ifdef SUBSTRATE
CJS_T = CJS * pow(VDS / VDS_T, PS); CJS_T = CJS * pow(VDS / VDS_T, PS);
`endif `endif
CJCscale = ((1.0 - XP) * pow(VDC / VDC_T, PC) + XP); CJCscale = ((1.0 - XP) * pow(VDC / VDC_T, PC) + XP);
CJCscaleINV = 1.0 / CJCscale; CJCscaleINV = 1.0 / CJCscale;
CJC_T = CJC * CJCscale; CJC_T = CJC * CJCscale;
XP_T = XP * CJCscaleINV; XP_T = XP * CJCscaleINV;
// Resistances // Resistances
@ -72,122 +69,120 @@
// RE_T = RE * pow(tN, AE); // RE_T = RE * pow(tN, AE);
// we use, here, and in all following powers of tN, // we use, here, and in all following powers of tN,
// the following computationally cheaper implementation: // the following computationally cheaper implementation:
RE_T = RE * exp(lntN * AE); RE_T = RE * exp(lntN * AE);
// This is based on the observation that exp() is faster than pow(). // This is based on the observation that exp() is faster than pow().
// Acknowledgement due to Geoffrey Coram. // Acknowledgement due to Geoffrey Coram.
RBV_T = RBV * exp(lntN * (AB - AQBO)); RBV_T = RBV * exp(lntN * (AB - AQBO));
RBC_T = RBC * exp(lntN * AEX); RBC_T = RBC * exp(lntN * AEX);
// RvdT, 30-11-2007: new collector resistances RCCxx_T, RCCex_T, RCCin_T // RvdT, 30-11-2007: new collector resistances RCCxx_T, RCCex_T, RCCin_T
RCCxx_T = RCC * exp(lntN * AC); RCCxx_T = RCC * exp(lntN * AC);
RCCex_T = RCBLX * exp(lntN * ACBL); RCCex_T = RCBLX * exp(lntN * ACBL);
RCCin_T = RCBLI * exp(lntN * ACBL); RCCin_T = RCBLI * exp(lntN * ACBL);
RCV_T = RCV * exp(lntN * AEPI); RCV_T = RCV * exp(lntN * AEPI);
// Current gains // Current gains
BF_T = BF * exp(lntN * (AE - AB - AQBO)) * exp(-DVGBF * VdtINV); BF_T = BF * exp(lntN * (AE - AB - AQBO)) * exp(-DVGBF * VdtINV);
BRI_T = BRI * exp(-DVGBR * VdtINV); BRI_T = BRI * exp(-DVGBR * VdtINV);
// Currents and voltages // Currents and voltages
IS_T = IS * exp(lntN * (4.0 - AB - AQBO + DAIS)) * exp(-VGB * VdtINV); IS_T = IS * exp(lntN * (4.0 - AB - AQBO + DAIS)) * exp(-VGB * VdtINV);
IK_T = IK * exp(lntN * (1.0 - AB)); IK_T = IK * exp(lntN * (1.0 - AB));
IBF_T = IBF * exp(lntN * (6.0 - 2.0 * MLF)) * exp(-VGJ * VdtINV / MLF); IBF_T = IBF * exp(lntN * (6.0 - 2.0 * MLF)) * exp(-VGJ * VdtINV / MLF);
IBR_T = IBR * tN * tN * exp(-VGC * VdtINV / 2.0); IBR_T = IBR * tN * tN * exp(-VGC * VdtINV / 2.0);
// begin RvdT, November 2008, MXT504.8_alpha // begin RvdT, November 2008, MXT504.8_alpha
// T-scaling BE tunneling: // T-scaling BE tunneling:
// //
x = pow(VGZEB_T * inv_VGZEB_Tr, -0.5) ; x = pow(VGZEB_T * inv_VGZEB_Tr, -0.5) ;
// y = pow(VDE_T * inv_VDE, PE) ; // y = pow(VDE_T * inv_VDE, PE) ;
// more efficient, because we need both y and 1.0 / y: // more efficient, because we need both y and 1.0 / y:
y = 1.0 / CJE_T_div_CJE ; y = 1.0 / CJE_T_div_CJE ;
// definition: // definition:
// nZEB_T = NZEB* pow(VGZEB_T/VGZEB_Tr, 1.5) * pow(VDE_T / VDE, PE-1) ; // nZEB_T = NZEB* pow(VGZEB_T/VGZEB_Tr, 1.5) * pow(VDE_T / VDE, PE-1) ;
// more efficient implementation: // more efficient implementation:
// nZEB_T = NZEB* VGZEB_T * VGZEB_T * x * y * VDE /(VDE_T*VGZEB_Tr*VGZEB_Tr) ; // nZEB_T = NZEB* VGZEB_T * VGZEB_T * x * y * VDE /(VDE_T*VGZEB_Tr*VGZEB_Tr) ;
nZEB_T = NZEB* VGZEB_T * VGZEB_T * x * y * VDE * inv_VDE_T*inv_VGZEB_Tr*inv_VGZEB_Tr ; nZEB_T = NZEB* VGZEB_T * VGZEB_T * x * y * VDE * inv_VDE_T*inv_VGZEB_Tr*inv_VGZEB_Tr ;
// definition: // definition:
// IZEB_T = IZEB* pow(VGZEB_T/VGZEB_Tr, -0.5) * pow(VDE_T / VDE, 2-PE) * exp(NZEB-nZEB_T); // IZEB_T = IZEB* pow(VGZEB_T/VGZEB_Tr, -0.5) * pow(VDE_T / VDE, 2-PE) * exp(NZEB-nZEB_T);
// more efficient implementation: // more efficient implementation:
IZEB_T = IZEB* x * VDE_T * VDE_T * inv_VDE * inv_VDE * CJE_T_div_CJE * exp(NZEB-nZEB_T) ; IZEB_T = IZEB* x * VDE_T * VDE_T * inv_VDE * inv_VDE * CJE_T_div_CJE * exp(NZEB-nZEB_T) ;
// //
// end RvdT, November 2008, MXT504.8_alpha // end RvdT, November 2008, MXT504.8_alpha
x = exp(lntN * AQBO) ; x = exp(lntN * AQBO) ;
VEF_T = VEF * x * CJCscaleINV; VEF_T = VEF * x * CJCscaleINV;
// VER_T = VER * x * pow(VDE / VDE_T, -PE); // VER_T = VER * x * pow(VDE / VDE_T, -PE);
VER_T = VER * x * y; VER_T = VER * x * y;
`ifdef SUBSTRATE `ifdef SUBSTRATE
ISS_T = ISS * exp(lntN * (4.0 - AS)) * exp(-VGS * VdtINV); ISS_T = ISS * exp(lntN * (4.0 - AS)) * exp(-VGS * VdtINV);
// New 504.9: // New 504.9:
ICSS_T = ICSS * exp(lntN * (3.5 - 0.5 * ASUB)) * exp(-VGS * VdtINV); ICSS_T = ICSS * exp(lntN * (3.5 - 0.5 * ASUB)) * exp(-VGS * VdtINV);
// End New 504.9. // End New 504.9.
if ((ISS_T > 0.0)) if ((ISS_T > 0.0))
IKS_T = IKS * exp(lntN * (1.0 - AS)) * (IS_T / IS) * (ISS / ISS_T); IKS_T = IKS * exp(lntN * (1.0 - AS)) * (IS_T / IS) * (ISS / ISS_T);
else else
IKS_T = IKS * exp(lntN * (1.0 - AS)); IKS_T = IKS * exp(lntN * (1.0 - AS));
`endif `endif
// Transit times // Transit times
TAUE_T = TAUE * exp(lntN * (AB - 2.0)) * exp(-DVGTE * VdtINV); TAUE_T = TAUE * exp(lntN * (AB - 2.0)) * exp(-DVGTE * VdtINV);
TAUB_T = TAUB * exp(lntN * (AQBO + AB - 1.0)); TAUB_T = TAUB * exp(lntN * (AQBO + AB - 1.0));
TEPI_T = TEPI * exp(lntN * (AEPI - 1.0)); TEPI_T = TEPI * exp(lntN * (AEPI - 1.0));
TAUR_T = TAUR * (TAUB_T + TEPI_T) / (TAUB + TEPI); TAUR_T = TAUR * (TAUB_T + TEPI_T) / (TAUB + TEPI);
// Avalanche constant // Avalanche constant
Tk300 = Tk - 300.0; Tk300 = Tk - 300.0;
// RvdT, 15-02-2008: prevent division by zero and overflow at high temperatures: // RvdT, 15-02-2008: prevent division by zero and overflow at high temperatures:
if (Tk < 525.0) if (Tk < 525.0)
begin begin
BnT = Bn * (1.0 + 7.2e-4 * Tk300 - 1.6e-6 * Tk300 * Tk300) ; BnT = Bn * (1.0 + 7.2e-4 * Tk300 - 1.6e-6 * Tk300 * Tk300) ;
end end
else else
begin begin
BnT = Bn * 1.081 ; BnT = Bn * 1.081 ;
end end
// Heterojunction features // Heterojunction features
DEG_T = DEG * exp(lntN * AQBO); DEG_T = DEG * exp(lntN * AQBO);
`ifdef SELFHEATING `ifdef SELFHEATING
// Tempearature scaling of the thermal resistance // Temperature scaling of the thermal resistance
RTH_Tamb = RTH * pow(Tamb / Trk, ATH); RTH_Tamb = RTH * pow(Tamb / Trk, ATH);
`endif `endif
// MULT - scaling // MULT - scaling
IS_TM = IS_T * MULT; IS_TM = IS_T * MULT;
IK_TM = IK_T * MULT; IK_TM = IK_T * MULT;
IBF_TM = IBF_T * MULT; IBF_TM = IBF_T * MULT;
IBR_TM = IBR_T * MULT; IBR_TM = IBR_T * MULT;
// RvdT: November 2008, Zener tunneling parameters // RvdT: November 2008, Zener tunneling parameters
IZEB_TM = IZEB_T * MULT ; IZEB_TM = IZEB_T * MULT ;
// end Zener tunneling parameters // end Zener tunneling parameters
IHC_M = IHC * MULT;
IHC_M = IHC * MULT;
`ifdef SUBSTRATE `ifdef SUBSTRATE
ISS_TM = ISS_T * MULT; ISS_TM = ISS_T * MULT;
// New: 504.9 // New: 504.9
ICSS_TM = ICSS_T * MULT; ICSS_TM = ICSS_T * MULT;
IKS_TM = IKS_T * MULT; IKS_TM = IKS_T * MULT;
`endif `endif
CJE_TM = CJE_T * MULT; CJE_TM = CJE_T * MULT;
CJC_TM = CJC_T * MULT; CJC_TM = CJC_T * MULT;
// begin RvdT, 28-10-2008, MXT504.8_alpha // begin RvdT, 28-10-2008, MXT504.8_alpha
// Base-emitter tunneling current Mult scaling: // Base-emitter tunneling current Mult scaling:
@ -196,47 +191,47 @@
`ifdef SUBSTRATE `ifdef SUBSTRATE
CJS_TM = CJS_T * MULT; CJS_TM = CJS_T * MULT;
`endif `endif
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;
// RvdT, 30-01-2007: new collector resistances: // RvdT, 30-01-2007: new collector resistances:
RCCxx_TM = RCCxx_T * invMULT; RCCxx_TM = RCCxx_T * invMULT;
RCCex_TM = RCCex_T * invMULT; RCCex_TM = RCCex_T * invMULT;
RCCin_TM = RCCin_T * invMULT; RCCin_TM = RCCin_T * invMULT;
RCV_TM = RCV_T * invMULT; RCV_TM = RCV_T * invMULT;
// RvdT, 03-12-2007: new collector conductances // RvdT, 03-12-2007: new collector conductances
if (RCC > 0.0) if (RCC > 0.0)
begin begin
GCCxx_TM = 1.0 / RCCxx_TM ; GCCxx_TM = 1.0 / RCCxx_TM ;
end end
else else
begin begin
GCCxx_TM = 0 ; GCCxx_TM = 0 ;
end end
if (RCBLX > 0.0) if (RCBLX > 0.0)
begin begin
GCCex_TM = 1.0 / RCCex_TM ; GCCex_TM = 1.0 / RCCex_TM ;
end end
else else
begin begin
GCCex_TM = 0 ; GCCex_TM = 0 ;
end end
if (RCBLI > 0.0) if (RCBLI > 0.0)
begin begin
GCCin_TM = 1.0 / RCCin_TM ; GCCin_TM = 1.0 / RCCin_TM ;
end end
else else
begin begin
GCCin_TM = 0 ; GCCin_TM = 0 ;
end end
`ifdef SELFHEATING `ifdef SELFHEATING
RTH_Tamb_M = RTH_Tamb * invMULT; RTH_Tamb_M = RTH_Tamb * invMULT;
`endif `endif

View File

@ -1,9 +1,12 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
// Declaration of variables // Declaration of variables
real _x, _x0, _a, _dxa; real _x, _x0, _a, _dxa;
real _circuit_gmin;
// Model constants // Model constants
real An, Bn; real An, Bn;
@ -122,7 +125,7 @@ real lambda, Gem, Gmax, Iavl;
real Icap_IHC; real Icap_IHC;
`ifdef SELFHEATING `ifdef SELFHEATING
real Tki, power; real Tki, power_dis;
`endif `endif
// Charges and capacitances variables // Charges and capacitances variables
@ -138,6 +141,7 @@ real Vfs, Vjs, Qts;
`endif `endif
real Qe0, Qe; real Qe0, Qe;
real Qe_qs;
real Qepi0, Qepi, Xg2, XpWex, XQex; real Qepi0, Qepi, Xg2, XpWex, XQex;
real Qex; real Qex;
real CBEO_M, CBCO_M; real CBEO_M, CBCO_M;
@ -145,11 +149,9 @@ real CBEO_M, CBCO_M;
// Biases and exponential terms variables // Biases and exponential terms variables
real Vb2c1, Vb2c2, Vb2e1, Vb1e1, Vb1b2, Vb1c4, Vc1c2; real Vb2c1, Vb2c2, Vb2e1, Vb1e1, Vb1b2, Vb1c4, Vc1c2;
// RvdT, 30-01-2007: new variables Vc3c4, Vc4c1
real Vc3c4, Vc4c1; real Vc3c4, Vc4c1;
// RvdT, 25-02-2008: new variables Vsc3, Vsc4
`ifdef SUBSTRATE `ifdef SUBSTRATE
real Vsc1, Vsc3, Vsc4, eVsc1; real Vsc1, Vsc3, Vsc4, eVsc1, eVsc3, eVsc4;
`endif `endif
real Vee1, Vbb1, Vbc3, Vcc3, Vbe, Vbc; real Vee1, Vbb1, Vbc3, Vcc3, Vbe, Vbc;
real eVb2c2, eVb2e1, eVb1e1, eVb1b2, eVb1c4, eVbc3; real eVb2c2, eVb2e1, eVb1e1, eVb1b2, eVb1c4, eVbc3;
@ -179,7 +181,6 @@ real a_VDS;
`endif `endif
// Noise variables // Noise variables
real common; real common;
real powerREC, powerRBC, powerRCCxx, powerRCCex, powerRCCin, powerRBV; real powerREC, powerRBC, powerRCCxx, powerRCCex, powerRCCin, powerRBV;
real powerCCS; real powerCCS;
@ -187,11 +188,14 @@ real powerFBCS, powerFBC1fB1, exponentFBC1fB2, powerFBC1fB2;
real powerEBSCS, powerEBSC1f; real powerEBSCS, powerEBSC1f;
real powerRBCS, powerRBC1f; real powerRBCS, powerRBC1f;
real powerExCS, powerExCSMOD, powerExC1f, powerExC1fMOD; real powerExCS, powerExCSMOD, powerExC1f, powerExC1fMOD;
real powerIIS;
`ifdef SUBSTRATE `ifdef SUBSTRATE
real powerSubsCS_B1S, powerSubsCS_BS; real powerSubsCS_B1S, powerSubsCS_BS;
`endif `endif
//real twoqIavl, powerCCS_A, powerFBCS_A, powerAVL_B2C2; // noise correlation help variables
real twoqIavl, cor_exp_1, cor_exp_2, powerCCS_A; real In_N, Gem_N, Taub_N, taun, Qbe_qs_eff;
real my_gmin;