rm vacode

This commit is contained in:
dwarning 2023-01-12 16:35:03 +01:00
parent 51d732a7ba
commit 35b1cc59e3
45 changed files with 0 additions and 22980 deletions

View File

@ -1,922 +0,0 @@
/*
EKV MOS model version 2.6 rev.15 with documentation at: http://ekv.epfl.ch
Matthias Bucher, Christophe Lallement, Christian Enz, Fabien Theodoloz, Francois Krummenacher
Electronics Laboratories, Swiss Federal Institute of Technology Lausanne, Switzerland
This Verilog-A was developed by Wladek Grabinski with modifications
by Tiburon Design Automation (www.tiburon-da.com).
This software has been provided pursuant to a License Agreement containing restrictions on its use.
It may not be copied or distributed in any form or medium, disclosed to third parties,
reverse engineered or used in any manner not provided for in said License Agreement
except with the prior written authorization.
Licensed under the Educational Community License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at http://opensource.org/licenses/ECL-2.0
Unless required by applicable law or agreed to in writing, software distributed under
the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
either express or implied. See the License for the specific language governing permissions
and limitations under the License.
$RCSfile: ekv.va,v $ $Revision: 1.9 $ $Date: 2003/12/17 01:20:10 $
$RCSfile: ekv.va,v $ $Revision: 2.6.15 $ $Date: 2020/05/29 11:50:10 $
*/
/*
`include "disciplines.vams"
`include "constants.vams"
`include "compact.vams"
*/
// Macros for the model/instance parameters
//
// MPRxx model parameter real
// MPIxx model parameter integer
// IPRxx instance parameter real
// IPIxx instance 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)
//
// IPM instance parameter mFactor(multiplicity, implicit for LRM 2.2)
// OPP operating point parameter, includes units and description for printing
`define OPP(nam,uni,des) (* units=uni, desc=des *) real nam;
`define OPM(nam,uni,des) (* units=uni, desc=des, multiplicity="multiply" *) real nam;
`define OPD(nam,uni,des) (* units=uni, desc=des, multiplicity="divide" *) real nam;
`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;
`define IPRnb(nam,def,uni, des) (* units=uni, type = "instance", desc=des *) parameter real nam=def;
`define IPRex(nam,def,uni,exc, des) (* units=uni, type = "instance", desc=des *) parameter real nam=def exclude exc;
`define IPRcc(nam,def,uni,lwr,upr,des) (* units=uni, type = "instance", desc=des *) parameter real nam=def from[lwr:upr];
`define IPRoo(nam,def,uni,lwr,upr,des) (* units=uni, type = "instance", desc=des *) parameter real nam=def from(lwr:upr);
`define IPRco(nam,def,uni,lwr,upr,des) (* units=uni, type = "instance", desc=des *) parameter real nam=def from[lwr:upr);
`define IPRoc(nam,def,uni,lwr,upr,des) (* units=uni, type = "instance", desc=des *) parameter real nam=def from(lwr:upr];
`define IPRcz(nam,def,uni, des) (* units=uni, type = "instance", desc=des *) parameter real nam=def from[ 0:inf);
`define IPRoz(nam,def,uni, des) (* units=uni, type = "instance", desc=des *) parameter real nam=def from( 0:inf);
`define IPInb(nam,def,uni, des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def;
`define IPIex(nam,def,uni,exc, des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def exclude exc;
`define IPIcc(nam,def,uni,lwr,upr,des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def from[lwr:upr];
`define IPIoo(nam,def,uni,lwr,upr,des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def from(lwr:upr);
`define IPIco(nam,def,uni,lwr,upr,des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def from[lwr:upr);
`define IPIoc(nam,def,uni,lwr,upr,des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def from(lwr:upr];
`define IPIcz(nam,def,uni, des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def from[ 0:inf);
`define IPIoz(nam,def,uni, des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def from( 0:inf);
`define BPRco(nam, def, uni, lwr, upr, des) (* units = uni, type = "instance", desc = des *) parameter real nam = def from[lwr : upr);
`define BPRoz(nam, def, uni, des) (* units = uni, type = "instance", desc = des *) parameter real nam = def from(0.0 : inf);
`define BPRcz(nam, def, uni, des) (* units = uni, type = "instance", desc = des *) parameter real nam = def from[0.0 : inf);
`define BPIcc(nam, def, uni, lwr, upr, des) (* units = uni, type = "instance", desc = des *) parameter integer nam = def from[lwr : upr];
`define BPInb(nam,def,uni, des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def;
`define BPRnb(nam,def,uni, des) (* units=uni, type = "instance", desc=des *) parameter real nam=def;
// includes: in case we do not want to include any other file [AB:040902]
// we can just add the following section in this file
// AB: i hope this may help our code to be easily transported
//----------------------------------------
// from disciplines.h we need:
// Electrical
// Current in amperes
nature Current
units = "A";
access = I;
idt_nature = Charge;
`ifdef CURRENT_ABSTOL
abstol = `CURRENT_ABSTOL;
`else
abstol = 1e-12;
`endif
endnature
// Charge in coulombs
nature Charge
units = "coul";
access = Q;
ddt_nature = Current;
`ifdef CHARGE_ABSTOL
abstol = `CHARGE_ABSTOL;
`else
abstol = 1e-14;
`endif
endnature
// Potential in volts
nature Voltage
units = "V";
access = V;
idt_nature = Flux;
`ifdef VOLTAGE_ABSTOL
abstol = `VOLTAGE_ABSTOL;
`else
abstol = 1e-6;
`endif
endnature
// Flux in Webers
nature Flux
units = "Wb";
access = Phi;
ddt_nature = Voltage;
`ifdef FLUX_ABSTOL
abstol = `FLUX_ABSTOL;
`else
abstol = 1e-9;
`endif
endnature
// Conservative discipline
discipline electrical
potential Voltage;
flow Current;
enddiscipline
// Signal flow disciplines
discipline voltage
potential Voltage;
enddiscipline
discipline current
potential Current;
enddiscipline
//from constants.h we need
`define C_EPSSIL 1.03594314e-10
`define C_EPSOX 34.5e-12
`define C_QE 1.602e-19
`define C_K 1.3807e-23
`define P_K 1.3806226e-23
`define P_EPS0 8.85418792394420013968e-12
`define P_CELSIUS0 273.15
`define POS_MIN 1.0E-6
`define SQRT2 1.4142135623730950488016887242097
`define ONE3RD 0.33333333333333333333333333333333
`define ONESQRT2 0.70710678118654752440084436210485
//if any other constant is needed it may be copied from the constants.h and be put above.
//------------------------------------------ end of includes
`define FWD 1
`define REV -1
// AB 040902
`define NOT_GIVEN -1.0e21
`define DEFAULT_TNOM 25
module ekv_va(d,g,s,b);
// %%DEVICE_CLASS=MOS(NMOS:TYPE=1,PMOS:TYPE=-1)%%
// Node definitions
inout d,g,s,b; // external nodes
electrical d,g,s,b; // external nodes
// Branch definitions
branch (d,s) ds;
branch (d,b) db;
branch (s,b) sb;
branch (g,b) gb;
// * Local variables
real tmp1, tmp2, tmp3; // temporary variables
real VGprime, GAMMAprime;// short and narrow channel effect
real VP, VPprime; // pinch-off voltage
real if_, ir, irprime; // normalized currents
real VDSS, VDSSprime;// saturation voltage
real deltaL, Leq; // channel length reduction
real beta; // transconductance factor
real n; // slope factor
real Ispec; // specific current
real Vt; // k*T/q
real gm, gms, gmbs, gds;
real isub, Isub;
real inv_Vt, Vt_01, Vt_2, Vt_4, Vt_Vt, Vt_Vt_2, Vt_Vt_16;
real eps_COX, eps_COX_W, eps_COX_L;
real Lc, Lc_LAMBDA, IBN_2, T0, T1, eta_qi;
real inv_UCRIT, Lc_UCRIT, Lc_IBB, IBA_IBB;
integer Mode;
real WETA_W, LETA_L;
real E0_Q_1, AWL;
real T, KP_Weff;
real Eg, refEg, deltaT, ratioT, Tnom;
real VTO_T, VTO_S, KP_T, UCRIT_T, IBB_T, PHI_T, GAMMA_S;
real sqrt_Lprime_Lmin;
real GAMMAstar, sqrt_GAMMAstar;
real big_sqrt_VP;
real big_sqrt_VP0, VP0;
real PHI_VD, PHI_VS;
real sqrt_PHI;
real sqrt_PHI_VP, sqrt_PHI_VD, sqrt_PHI_VS;
real sqrt_PHI_VD_Vt, sqrt_PHI_VS_Vt;
real Vds, deltaV_2, Vip;
real VDSS_sqrt, sqrt_VDSS_deltaV, sqrt_Vds_VDSS_deltaV;
real VDSSprime_sqrt, sqrt_VDSSprime_deltaV, sqrt_Vds_VDSSprime_deltaV;
real if_ir;
real sqrt_if, sqrt_ir, sqrt_irprime;
real dif_dv, dir_dv, dirprime_dv;
// Charge related variables
real sif, sir, sif2, sir2, sif3, sir3;
real sif_sir_2;
real qi, qb;
real QD, QS, QI, QB, QG;
real VP_PHI_eps, sqrt_PHI_VP_2, WLCox;
real n_Vt_COX, n_1, n_1_n;
// Variables used for derivatives computation
real dVP_dVD, dVP_dVG, dVP_dVS;
real dif_dVD, dif_dVS, dif_dVG;
real dir_dVD, dir_dVS, dir_dVG;
real dVDSS_dVD, dVDSS_dVG, dVDSS_dVS;
real ddeltaV_dVD, ddeltaV_dVG, ddeltaV_dVS;
real dVip_dVD, dVip_dVG, dVip_dVS;
real dVDSSprime_dVD, dVDSSprime_dVG, dVDSSprime_dVS;
real dirprime_dVD, dirprime_dVG, dirprime_dVS;
real dLeq_dVD, dLeq_dVG, dLeq_dVS;
real dbeta_dVD, dbeta_dVG, dbeta_dVS;
real VGstar, sqrt_VGstar;
real VG, VD, VS;
real Von, Vdsat, Id, Ibd;
real Gn;
real GAMMA_sqrt_PHI, Lmin, Lprime, T0_GAMMA_1, THETA_VP_1, Vc;
real Vdsprime, Vt_Vc, dGAMMAprime_dVD, dGAMMAprime_dVG, dGAMMAprime_dVS;
real dVPprime_dVD, dVPprime_dVG, dVPprime_dVS, ddeltaL_dVD, ddeltaL_dVG;
real ddeltaL_dVS, dn_dVD, dn_dVG, dn_dVS;
real log_Vc_Vt, sqrt_PHI_VP0, sqrt_VP_Vt;
real Lc_IBB_Vib, Vib, dIsub_factor, exp_ib;
real inv_Vib, sqrt_PHI_VP2_2;
real V0, deltaVFB, vL;
real dQI_dVD, dQI_dVS, dQI_dVG;
real dQB_dVD, dQB_dVS, dQB_dVG;
real Leff, Weff;
real RSeff, RDeff;
real yk, z0, zk;
real EPSOX, epssil;
real ddt_QD, ddt_QS;
//DIODES realted variables [AB: 040902]
real as_i, ad_i, ps_i, pd_i, v_di_b, v_si_b;
real temp_arg, tmp0;
real js_t, jsw_t, jswg_t;
real pb_t, pbsw_t, pbswg_t;
real cj_t, cjsw_t, cjswg_t;
real njts_t, njtssw_t, njtsswg_t;
real is_d, arg_d, is_s, arg_s;
real f_breakdown_d, f_breakdown_s, idb_tun, isb_tun;
real csb_d, cssw_d, csswg_d;
real csb_s, cssw_s, csswg_s;
real qjd, qjs;
// parameter definitions
parameter integer TYPE = 1 from [-1:1] exclude 0; // NMOS=1, PMOS=-1
parameter integer Noise = 1 from [0:1]; // Set to zero to prevent noise calculation
parameter real Trise = 0.0 from [-inf:inf]; // Difference sim. temp and device temp [C deg]
// parameter real Temp = -`NOT_GIVEN from [`P_CELSIUS0:inf]; // Device temp [C]
//AB: the parameter name Temp is not working for no obvious reason; changed to TEMP
parameter real TEMP = -`NOT_GIVEN from [`P_CELSIUS0:inf]; // Device temp [C]
parameter real TNOM = -`NOT_GIVEN; // Temperature [C]
// Instance parameters
// - intrinsic model
`IPRoz( L ,1.0e-5 ,"m" ,"Length" )
`IPRoz( W ,1.0e-5 ,"m" ,"Total width including fingers" )
`IPIco( M ,1 ,"" ,1 ,inf ,"Parallel multiplier" )
`IPIco( NS ,1 ,"" ,1 ,inf ,"Series multiplier" )
`BPRnb( DTEMP ,0.0 ,"K" ,"Offset of device temperature" )
// - external parasitics
`IPRcz( AS ,0.0 ,"m^2" ,"Source-to-substrate junction area" )
`IPRcz( AD ,0.0 ,"m^2" ,"Drain-to-substrate junction area" )
`IPRcz( PS ,0.0 ,"m" ,"Source-to-substrate junction perimeter" )
`IPRcz( PD ,0.0 ,"m" ,"Drain-to-substrate junction perimeter" )
`IPRcz( NRS ,1.0 ,"" ,"Number of squares in source" )
`IPRcz( NRD ,1.0 ,"" ,"Number of squares in drain" )
// *** Process related parameters
parameter real COX = 2.0E-3 from [0.0:inf]; // Gate oxide capacitance per unit area [F]
parameter real XJ = 300E-9 from [0.0:inf]; // Junction depth [m]
//*** Threshold voltage/substrate effect parameters (long-channel)
parameter real VTO = 0.5 from [-inf:inf]; // Long-channel threshold voltage [V]
parameter real TCV = 1.0e-3; // Threshold voltage temperature coefficient [V/K]
parameter real GAMMA = 0.7 from [0.0:inf]; // Body effect parameter
parameter real PHI = 0.5 from [0.2:inf]; // Bulk Fermi potential [V]
//*** Mobility parameters (long-channel) ***
parameter real KP = 150E-6 from [0.0:inf]; // Transconductance parameter [A/V/V]
parameter real BEX = -1.5; // Mobility temperature exponent
parameter real THETA = 0.0 from [0.0:inf]; // Mobility reduction coefficient [1/V]
parameter real E0 = 1.0E8; // Mobility reduction coefficient [V/m]
//*** Velocity sat./channel length mod. parameters (short-channel)
parameter real UCRIT = 2.0E6 from [0.0:inf]; // Longitudinal critical field [V/m]
parameter real UCEX = 0.8; // Longitudinal critical field temperature exponent
parameter real LAMBDA = 0.8 from [0.0:inf]; // Depletion length coefficient (channel length modulation)
//*** Process related parameters
parameter real DL = -0.01E-6; // Channel width correction [m]
parameter real DW = -0.01E-6; // Channel length correction [m]
//*** Threshold voltage/substrate effect parameter (narrow-channel)
parameter real WETA = 0.2 from [0.0:inf]; // Narrow-channel effect coefficient
//*** Threshold voltage/substrate effect parameters (short-channel)
parameter real LETA = 0.3 from [0.0:inf]; // Short-channel effect coefficient
parameter real Q0 = 230E-6 from [0.0:inf]; // Reverse short channel effect peak charge density
parameter real LK = 0.4E-6 from [0.0:inf]; // Reverse short channel effect characteristic length [m]
//*** Substrate current parameters
parameter real IBA = 5.0E8 from [0.0:inf]; // First impact ionization coefficient [1/m]
parameter real IBB = 4.0E8 from [0.0:inf]; // Second impact ionization coefficient [V/m]
parameter real IBBT = 9.0e-4; // Temperature coefficient for IBB [1/K]
parameter real IBN = 1.0 from [0.0:inf]; // Saturation voltage factor for impact ionization
//*** Series resistance parameters
parameter real RSH = 0.0 from [0.0:inf]; // Sheet resistance [Ohms]
parameter real HDIF = 0.5E-6 from [0.0:inf]; // Sheet resistance multipler
//*** for MC analysis fk 25/05/97
parameter real AVTO = 1E-6 from [0.0:inf]; // Area related threshold voltage mismatch parameter [Vm]
parameter real AKP = 1E-6 from [0.0:inf]; // Area related gain mismatch parameter [m]
parameter real AGAMMA = 1E-6 from [0.0:inf]; // Area related body effect mismatch parameter [sqr(V) m]
parameter real AF = 1.0 from (0:inf); // Flicker noise exponent
parameter real KF = 0.0 from [0:inf); // Flicker noise coefficient
//*** JUNCTION DRAIN-BULK AND SOURCE-BULK AREA, CURRENT, CAPACITANCE [AB:040902]
parameter real xd_n = 1.0 from [0.0:inf);
parameter real xd_js = 1.0E-09 from [0.0:inf);
parameter real xd_jsw = 1.0E-12 from [0.0:inf);
parameter real xd_jswg = 1.0E-12 from [0.0:inf);
parameter real xd_mj = 0.900 from [0.0:1.0];
parameter real xd_mjsw = 0.700 from [0.0:1.0];
parameter real xd_mjswg = 0.700 from [0.0:1.0];
parameter real xd_pb = 0.800 from (0.0:inf);
parameter real xd_pbsw = 0.600 from (0.0:inf);
parameter real xd_pbswg = 0.600 from (0.0:inf);
parameter real xd_cj = 1.0E-09 from [0.0:inf);
parameter real xd_cjsw = 1.0E-12 from [0.0:inf);
parameter real xd_cjswg = 1.0E-12 from [0.0:inf);
parameter real xd_gmin = 0.0 from [0.0:inf);
parameter real xd_xjbv = 0.0 from [0.0:inf);
parameter real xd_bv = 10.0 from [0.0:inf);
parameter real xd_njts = 1.0 from [0.0:inf);
parameter real xd_njtssw = 1.0 from [0.0:inf);
parameter real xd_njtsswg = 1.0 from [0.0:inf);
parameter real xd_vts = 0.0 from [0.0:inf);
parameter real xd_vtssw = 0.0 from [0.0:inf);
parameter real xd_vtsswg = 0.0 from [0.0:inf);
parameter real tp_xti = 3.0 from (-inf:inf);
parameter real tp_cj = 0.0 from (-inf:inf);
parameter real tp_cjsw = 0.0 from (-inf:inf);
parameter real tp_cjswg = 0.0 from (-inf:inf);
parameter real tp_pb = 0.0 from (-inf:inf);
parameter real tp_pbsw = 0.0 from (-inf:inf);
parameter real tp_pbswg = 0.0 from (-inf:inf);
parameter real tp_njts = 0.0 from [0.0:inf);
parameter real tp_njtssw = 0.0 from [0.0:inf);
parameter real tp_njtsswg = 0.0 from [0.0:inf);
analog begin
// Set constant
EPSOX = 3.9 * `P_EPS0;
epssil = 11.7 * `P_EPS0;
Ibd = 0.0;
// The following are necessary to prevent memory states being reserved:
THETA_VP_1 = 0.0;
VPprime = 0.0;
sqrt_VP_Vt = 0.0;
// Geometry, voltage and temperature independent model variables
eps_COX = epssil/COX;
Lc = sqrt(eps_COX*XJ);
Lc_LAMBDA = Lc * LAMBDA;
eps_COX_W = 3.0 * eps_COX * WETA;
eps_COX_L = eps_COX * LETA;
IBN_2 = IBN + IBN;
T0 = COX / (epssil*E0);
V0 = (Q0+Q0) / COX;
eta_qi = TYPE > 0 ? 0.5 : 0.3333333333333;
/* Model working variables, geometry and voltage independent,
* which need to be updated after temperature change
* EKV model internal variables depending on temperature.
*/
/* If Temp is explicitly specified, use that value
otherwise use Tckt+Trise */
if (TEMP == -`NOT_GIVEN) //AB: 040902 Temp -> TEMP
T = $temperature + Trise;
else
T = TEMP + `P_CELSIUS0; //AB: 040902 Temp -> TEMP
if (TNOM == -`NOT_GIVEN)
Tnom = `DEFAULT_TNOM + `P_CELSIUS0;
else
Tnom = TNOM + `P_CELSIUS0;
Vt = $vt(T);
Vt_01 = 0.1 * Vt;
inv_Vt = 1.0 / Vt;
Vt_2 = Vt + Vt;
Vt_4 = Vt_2 + Vt_2;
Vt_Vt = Vt * Vt;
Vt_Vt_2 = Vt_Vt + Vt_Vt;
Vt_Vt_16 = 16.0 * Vt_Vt;
Eg = 1.16 - 7.02e-4 * T * T / (T + 1108.0);
refEg = 1.16 - (7.02e-4*Tnom*Tnom) / (Tnom + 1108.0);
deltaT = T - Tnom;
ratioT = T / Tnom;
VTO_T = VTO - TCV * deltaT;
KP_T = KP * pow(ratioT, BEX);
UCRIT_T = UCRIT * pow(ratioT, UCEX);
IBB_T = IBB * (1.0 + IBBT * deltaT);
PHI_T = PHI * ratioT - 3.0 * Vt * ln(ratioT) - refEg * ratioT + Eg;
// !! mb 99/07/30 prevents PHI from becoming smaller than 0.2
tmp1 = 0.2;
tmp2 = PHI_T - tmp1;
PHI_T = 0.5*(tmp2 + sqrt(tmp2*tmp2 + Vt*Vt)) + tmp1;
sqrt_PHI = sqrt(PHI_T);
inv_UCRIT = 1.0/UCRIT_T;
Lc_UCRIT = Lc * UCRIT_T;
Lc_IBB = Lc * IBB_T;
IBA_IBB = IBA / IBB_T;
/* VTO, KP and GAMMA with variation for MC analysis if required.
* The default value for model parameters AVTO, AKP and AGAMMA
* is set to 1e-6 to allow meaningful sensitivity analysis. Only
* the deviation from this value has to be taken into account
*/
// wg: for userc.c and verilog implementations
Leff = L + DL;
// wg: for userc.c and verilog implementations
Weff = W + DW;
Vc = UCRIT_T*Leff; // NOTE: use L if necessary
log_Vc_Vt = Vt*(ln(0.5*Vc*inv_Vt)-0.6); // mb 98/02/05 (r1)
// de-normalization
AWL = 1.0/sqrt(Weff*Leff);
if (TYPE > 0)
VTO_S = ((AVTO != 1e-6) ? AWL*(AVTO - 1e-6) + VTO_T : VTO_T);
else
VTO_S = ((AVTO != 1e-6) ? AWL*(1e-6 - AVTO) - VTO_T: -VTO_T);
KP_Weff = Weff * ((AKP != 1e-6) ? KP_T*(1 + (AKP - 1e-6)*AWL) : KP_T);
GAMMA_S = ((AGAMMA !=1e-6) ? GAMMA + (AGAMMA - 1e-6)*AWL : GAMMA);
GAMMA_sqrt_PHI = GAMMA_S*sqrt_PHI;
/* ************************************
* STATIC MODEL EQUATIONS
* *************************************/
// VGprime:
if (V0 == 0.0)
deltaVFB = 0.0;
// else begin : VGprime //AB: 040902 VGPrime is also a variable and
else begin : VGprime_block //AB: 040902 VGPrime -> VGprime_block
real sqv;
// mb 99/03/26 corrected for multiple device number
vL = 0.28 * (Leff/(LK*NS) - 0.1);
sqv = 1.0 / (1.0 + 0.5*(vL + sqrt(vL*vL + 1.936e-3)));
deltaVFB = V0 * sqv * sqv;
end
VG = TYPE * V(g,b); // wg 22/04/08 corrected for device TYPE
VS = TYPE * V(s,b);
VD = TYPE * V(d,b);
if (VD - VS < 0) begin
Mode = `REV;
T1 = VS;
VS = VD;
VD = T1;
end
else
Mode = `FWD;
// VGB = VGS - VBS;
// VBD = VBS - VDS;
VGstar = VG - VTO_S - deltaVFB + PHI_T + GAMMA_sqrt_PHI;
sqrt_VGstar = sqrt(VGstar*VGstar + 2.0*Vt_Vt_16);
VGprime = 0.5*(VGstar + sqrt_VGstar);
// Pinch-off voltage VP, limited to VP >= -PHI
PHI_VS = PHI_T+VS;
sqrt_PHI_VS_Vt = sqrt(PHI_VS*PHI_VS+Vt_Vt_16);
sqrt_PHI_VS = sqrt(0.5*(PHI_VS+sqrt_PHI_VS_Vt));
PHI_VD = PHI_T+VD;
sqrt_PHI_VD_Vt = sqrt(PHI_VD*PHI_VD+Vt_Vt_16);
sqrt_PHI_VD = sqrt(0.5*(PHI_VD+sqrt_PHI_VD_Vt));
WETA_W = eps_COX_W * M / Weff;
LETA_L = eps_COX_L * NS / Leff;
// mb: symmetric version of GAMMAprime necessary with charges model
big_sqrt_VP0 = sqrt(VGprime + 0.25*GAMMA_S*GAMMA_S);
VP0 = VGprime - PHI_T - GAMMA_S*(big_sqrt_VP0 - 0.5*GAMMA_S);
sqrt_PHI_VP0 = sqrt(VP0+PHI_T+Vt_01);
GAMMAstar = GAMMA_S - LETA_L * (sqrt_PHI_VS+sqrt_PHI_VD) +
WETA_W * sqrt_PHI_VP0;
// keep GAMMAprime from becoming negative
sqrt_GAMMAstar = sqrt(GAMMAstar*GAMMAstar+Vt_01);
GAMMAprime = 0.5*(GAMMAstar+sqrt_GAMMAstar);
big_sqrt_VP = sqrt(VGprime+0.25*GAMMAprime*GAMMAprime);
VP = VGprime-PHI_T-GAMMAprime*(big_sqrt_VP-0.5*GAMMAprime);
// Forward normalized current:
tmp1 = (VP - VS) * inv_Vt;
if (tmp1 > -0.35) begin
z0 = 2.0/(1.3 + tmp1 - ln(tmp1 + 1.6));
zk = (2.0 + z0)/(1.0 + tmp1 + ln(z0));
yk = (1.0 + tmp1 + ln(zk))/(2.0 + zk);
end else begin
if (tmp1 > -15.0) begin
z0 = 1.55 + exp(-tmp1);
zk = (2.0 + z0)/(1.0 + tmp1 + ln(z0));
yk = (1.0 + tmp1 + ln(zk))/(2.0 + zk);
end else begin
if (tmp1 > -23.0) begin
yk = 1.0/(2.0 + exp(-tmp1));
end else begin
yk = exp(tmp1) + 1E-64;
end
end
end
if_ = yk*(1.0 + yk);
sqrt_if = sqrt(if_);
dif_dv = yk;
// Saturation voltage:
Vt_Vc = Vt / Vc;
VDSS_sqrt = sqrt(0.25+sqrt_if*Vt_Vc);
VDSS = Vc*(VDSS_sqrt-0.5);
Vds = 0.5*(VD-VS);
deltaV_2 = Vt_Vt_16*(LAMBDA*(sqrt_if-
VDSS*inv_Vt)+15.625e-3);
sqrt_VDSS_deltaV = sqrt(VDSS*VDSS+deltaV_2);
sqrt_Vds_VDSS_deltaV = sqrt((Vds-VDSS)*(Vds-VDSS)+deltaV_2);
Vip = sqrt_VDSS_deltaV-sqrt_Vds_VDSS_deltaV;
VDSSprime_sqrt = sqrt(0.25+(sqrt_if-0.75*ln(if_))*Vt_Vc);
VDSSprime = Vc*(VDSSprime_sqrt-0.5)+log_Vc_Vt;
// Reverse normalized current:
Vdsprime = Vds-VDSSprime; // mb 97/07/18 introduced Vdsprime
sqrt_VDSSprime_deltaV = sqrt(VDSSprime*VDSSprime+deltaV_2);
sqrt_Vds_VDSSprime_deltaV = sqrt(Vdsprime*Vdsprime+deltaV_2);
tmp1 = (VP-Vds-VS-sqrt_VDSSprime_deltaV+
sqrt_Vds_VDSSprime_deltaV)*inv_Vt;
// include -> Charge F(x) interpolate function
if (tmp1 > -0.35) begin
z0 = 2.0/(1.3 + tmp1 - ln(tmp1 + 1.6));
zk = (2.0 + z0)/(1.0 + tmp1 + ln(z0));
yk = (1.0 + tmp1 + ln(zk))/(2.0 + zk);
end else begin
if (tmp1 > -15.0) begin
z0 = 1.55 + exp(-tmp1);
zk = (2.0 + z0)/(1.0 + tmp1 + ln(z0));
yk = (1.0 + tmp1 + ln(zk))/(2.0 + zk);
end else begin
if (tmp1 > -23.0) begin
yk = 1.0/(2.0 + exp(-tmp1));
end else begin
yk = exp(tmp1) + 1E-64;
end
end
end
irprime = yk*(1.0 + yk);
sqrt_irprime = sqrt(irprime);
dirprime_dv = yk;
/* Channel length modulation & mobility reduction due
* to longitudinal field */
deltaL = Lc_LAMBDA*ln(1.0+(Vds-Vip)/Lc_UCRIT);
Lprime = Leff-deltaL+(Vds+Vip)*inv_UCRIT;
Lmin = 0.1*Leff;
sqrt_Lprime_Lmin = sqrt(Lprime*Lprime+Lmin*Lmin);
Leq = 0.5*(Lprime+sqrt_Lprime_Lmin);
// Transconductance factor:
// Mobility reduction due to vertical field
// Reverse normalized current:
// ratioV_ir
tmp1 = (VP - VD) * inv_Vt;
if (tmp1 > -0.35) begin
z0 = 2.0/(1.3 + tmp1 - ln(tmp1 + 1.6));
zk = (2.0 + z0)/(1.0 + tmp1 + ln(z0));
yk = (1.0 + tmp1 + ln(zk))/(2.0 + zk);
end else begin
if (tmp1 > -15.0) begin
z0 = 1.55 + exp(-tmp1);
zk = (2.0 + z0)/(1.0 + tmp1 + ln(z0));
yk = (1.0 + tmp1 + ln(zk))/(2.0 + zk);
end else begin
if (tmp1 > -23.0) begin
yk = 1.0/(2.0 + exp(-tmp1));
end else begin
yk = exp(tmp1) + 1E-64;
end
end
end
ir = yk*(1.0 + yk);
sqrt_ir = sqrt(ir);
dir_dv = yk;
sif2 = 0.25+if_;
sir2 = 0.25+ir;
sif = sqrt(sif2);
sir = sqrt(sir2);
sif_sir_2 = (sif+sir)*(sif+sir);
VP_PHI_eps = VP+PHI_T+1.0e-6;
sqrt_PHI_VP_2 = 2.0*sqrt(VP_PHI_eps);
n_1 = GAMMA_S/sqrt_PHI_VP_2;
n_1_n = GAMMA_S/(sqrt_PHI_VP_2 + GAMMA_S);
// Normalized inversion charge (qi=QI/WLCox)
qi = -(1.0+n_1)*Vt*((0.66666666+0.66666666)*
(sir2+sir*sif+sif2)/(sif+sir) - 1.0);
// Normalized depletion charge (qb=QB/WLCox), for depletion to inversion
qb = -0.5*GAMMA_S*sqrt_PHI_VP_2 - n_1_n*qi;
if (E0 == 0.0) begin
/* NOTE: this version of the simple mobility model from prior
* versions of the EKV model is reinstated.
* In case E0 is *not* specified, this
* simple mobility model is used according to THETA, if specified.
* VPprime:
* mb eliminated discontinuity of derivative of 1+THETA*VP
*/
sqrt_VP_Vt = sqrt(VP*VP + Vt_Vt_2);
VPprime = 0.5 * (VP + sqrt_VP_Vt);
THETA_VP_1 = 1.0+THETA*VPprime;
beta = KP_Weff / (Leq * THETA_VP_1); // mb 97/07/18
end
else begin
/* new model for mobility reduction, linked to the charges model
* mb 98/10/11 (r10) introduced fabs(Eeff) (jpm)
* E0_Q_1 = 1.0 + T0 * abs(qb+eta_qi*qi);
*/
if ((qb + eta_qi*qi) > 0.0)
E0_Q_1 = 1.0 + T0*(qb + eta_qi*qi);
else
E0_Q_1 = 1.0 - T0*(qb + eta_qi*qi);
T0_GAMMA_1 = 1.0 + T0*GAMMA_sqrt_PHI;
beta = KP_Weff * T0_GAMMA_1 / (Leq * E0_Q_1);
end
/* Slope factor: mb introduced new formula to avoid divergence
* of n for VP->-PHI */
sqrt_PHI_VP = sqrt(PHI_T+VP+Vt_4); // mb 95/12/19 introduced Vt_4
n = 1.0 + GAMMA_S/(2.0*sqrt_PHI_VP);
// Drain current:
if_ir = if_-irprime;
Ispec = Vt_Vt_2 * n * beta;
Id = Ispec * if_ir;
/* Return threshold voltage
* Von = Vth(Vs) = Vto + Gamma*(sqrt(Phi + Vsb)-sqrt(Phi)) */
Von = VTO_S + GAMMAprime*(sqrt_PHI_VS - sqrt_PHI);
// Return saturation voltage (estimate)
Vdsat = Vt * (2.0*sqrt_if + 4.0);
// Return equivalent conductance for thermal noise calculation
Gn = beta * abs(qi);
/* Pinch-off voltage derivatives:
* mb 97/09/14 symmetric version of GAMMAprime necessary with
* charges model
* mb 99/05/10 (r12) New VGprime formulation (REVISION III) allows
* VP derivatives to be expressed with a single equation
*/
tmp1 = GAMMAprime / (sqrt_GAMMAstar+sqrt_GAMMAstar);
tmp2 = VGprime/sqrt_VGstar; // dVGprime_dVG
dGAMMAprime_dVD = -LETA_L * tmp1 * sqrt_PHI_VD / sqrt_PHI_VD_Vt;
dGAMMAprime_dVS = -LETA_L * tmp1 * sqrt_PHI_VS / sqrt_PHI_VS_Vt;
dGAMMAprime_dVG = WETA_W * tmp1 * (big_sqrt_VP0-0.5*GAMMA_S) /
(big_sqrt_VP0*sqrt_PHI_VP0) * tmp2;
tmp3 = (VP+PHI_T) / big_sqrt_VP;
dVP_dVD = -tmp3 * dGAMMAprime_dVD;
dVP_dVS = -tmp3 * dGAMMAprime_dVS;
dVP_dVG = -tmp3 * dGAMMAprime_dVG + (1.0 -
GAMMAprime/(big_sqrt_VP+big_sqrt_VP)) * tmp2;
// Forward normalized current derivatives:
tmp1 = dif_dv * inv_Vt; // mb 95/08/28, 97/04/21
dif_dVD = tmp1 * dVP_dVD;
dif_dVS = tmp1 * (dVP_dVS-1.0);
dif_dVG = tmp1 * dVP_dVG;
// Saturation voltage derivatives:
tmp1 = Vt / (4.0*VDSS_sqrt*sqrt_if);
dVDSS_dVD = tmp1 * dif_dVD;
dVDSS_dVS = tmp1 * dif_dVS;
dVDSS_dVG = tmp1 * dif_dVG;
// deltaV derivatives:
tmp1 = (Vt_4+Vt_4) * LAMBDA;
tmp2 = Vt / (sqrt_if+sqrt_if);
ddeltaV_dVD = tmp1 * (dif_dVD*tmp2 - dVDSS_dVD);
ddeltaV_dVS = tmp1 * (dif_dVS*tmp2 - dVDSS_dVS);
ddeltaV_dVG = tmp1 * (dif_dVG*tmp2 - dVDSS_dVG);
// Vip derivatives:
tmp1 = 1.0 / sqrt_VDSS_deltaV;
tmp2 = 1.0 / sqrt_Vds_VDSS_deltaV;
tmp3 = Vds-VDSS;
dVip_dVD = (VDSS*dVDSS_dVD + ddeltaV_dVD) * tmp1 -
(tmp3 * (0.5-dVDSS_dVD) + ddeltaV_dVD) * tmp2;
dVip_dVS = (VDSS*dVDSS_dVS + ddeltaV_dVS) * tmp1 -
(tmp3 * (-0.5-dVDSS_dVS) + ddeltaV_dVS) * tmp2;
dVip_dVG = (VDSS*dVDSS_dVG + ddeltaV_dVG) * tmp1 -
(tmp3 * -dVDSS_dVG + ddeltaV_dVG) * tmp2;
// VDSSprime derivatives:
tmp1 = Vt * (sqrt_if-1.5)/(4.0*VDSSprime_sqrt*if_);
dVDSSprime_dVD = tmp1 * dif_dVD;
dVDSSprime_dVS = tmp1 * dif_dVS;
dVDSSprime_dVG = tmp1 * dif_dVG;
// Reverse normalized current derivatives:
tmp1 = dirprime_dv * inv_Vt; // mb 95/08/28, 97/04/21
tmp2 = 1.0 / sqrt_VDSSprime_deltaV; // mb 97/04/21
tmp3 = 1.0 / sqrt_Vds_VDSSprime_deltaV;
dirprime_dVD = tmp1 * (dVP_dVD-0.5 -
(VDSSprime*dVDSSprime_dVD+ddeltaV_dVD) * tmp2 +
(Vdsprime*(0.5-dVDSSprime_dVD)+ddeltaV_dVD) * tmp3);
dirprime_dVS = tmp1 * (dVP_dVS-0.5 -
(VDSSprime*dVDSSprime_dVS+ddeltaV_dVS) * tmp2 +
(Vdsprime*(-0.5-dVDSSprime_dVS)+ddeltaV_dVS) * tmp3);
dirprime_dVG = tmp1*(dVP_dVG -
(VDSSprime*dVDSSprime_dVG+ddeltaV_dVG) * tmp2 +
(Vdsprime*(-dVDSSprime_dVG)+ddeltaV_dVG) * tmp3);
// Channel length modulation & mobility reduction derivatives:
// deltaL derivatives:
tmp1 = Lc_LAMBDA / (Lc_UCRIT+Vds-Vip);
ddeltaL_dVD = tmp1 * (0.5-dVip_dVD);
ddeltaL_dVS = tmp1 * (-0.5-dVip_dVS);
ddeltaL_dVG = -tmp1 * dVip_dVG;
// Leq derivatives:
tmp1 = 1.0 / sqrt_Lprime_Lmin; // in fact dLeq_dVX/Leq
dLeq_dVD = tmp1 * (-ddeltaL_dVD + (0.5+dVip_dVD)*inv_UCRIT);
dLeq_dVS = tmp1 * (-ddeltaL_dVS + (-0.5+dVip_dVS)*inv_UCRIT);
dLeq_dVG = tmp1 * (-ddeltaL_dVG + dVip_dVG*inv_UCRIT);
// Transconductance factor derivatives:
tmp1 = dir_dv*inv_Vt;
dir_dVD = tmp1 * (dVP_dVD-1.0);
dir_dVS = tmp1 * dVP_dVS;
dir_dVG = tmp1 * dVP_dVG;
tmp1 = -(1.0+n_1)*Vt*0.66666666/sif_sir_2;
tmp2 = tmp1*(sif+2.0*sir);
tmp3 = tmp1*(sir+2.0*sif);
tmp1 = -n_1*qi/((2.0+n_1+n_1)*VP_PHI_eps);
dQI_dVD = tmp1 * dVP_dVD + tmp2 * dif_dVD + tmp3 * dir_dVD;
dQI_dVS = tmp1 * dVP_dVS + tmp2 * dif_dVS + tmp3 * dir_dVS;
dQI_dVG = tmp1 * dVP_dVG + tmp2 * dif_dVG + tmp3 * dir_dVG;
tmp1 = (1.0+n_1)-qi/(2.0*(1.0+n_1)*VP_PHI_eps);
dQB_dVD = -n_1_n * (tmp1 * dVP_dVD + dQI_dVD);
dQB_dVS = -n_1_n * (tmp1 * dVP_dVS + dQI_dVS);
dQB_dVG = -n_1_n * (tmp1 * dVP_dVG + dQI_dVG);
if (E0 == 0.0) begin
tmp1 = THETA * VPprime / (THETA_VP_1 * sqrt_VP_Vt);
// VPprime derivatives:
dVPprime_dVD = tmp1 * dVP_dVD;
dVPprime_dVS = tmp1 * dVP_dVS;
dVPprime_dVG = tmp1 * dVP_dVG;
dbeta_dVD = -dLeq_dVD - dVPprime_dVD; // in fact dbeta_dVX / beta
dbeta_dVS = -dLeq_dVS - dVPprime_dVS;
dbeta_dVG = -dLeq_dVG - dVPprime_dVG;
end
else begin
tmp1 = T0 / E0_Q_1;
dbeta_dVD = -dLeq_dVD + tmp1 * (dQB_dVD+eta_qi*dQI_dVD);
dbeta_dVS = -dLeq_dVS + tmp1 * (dQB_dVS+eta_qi*dQI_dVS);
dbeta_dVG = -dLeq_dVG + tmp1 * (dQB_dVG+eta_qi*dQI_dVG);
end
// Slope factor derivatives:
tmp1 = -GAMMA_S/(4.0*n*sqrt_PHI_VP*(PHI_T+VP+Vt_4));// mb 95/12/19
dn_dVD = tmp1 * dVP_dVD;
dn_dVS = tmp1 * dVP_dVS;
dn_dVG = tmp1 * dVP_dVG;
// Transconductances:
gds = Ispec*((dn_dVD + dbeta_dVD)*if_ir + dif_dVD - dirprime_dVD);
gms = -Ispec*((dn_dVS + dbeta_dVS)*if_ir + dif_dVS - dirprime_dVS);
gm = Ispec*((dn_dVG + dbeta_dVG)*if_ir + dif_dVG - dirprime_dVG);
gmbs = gms - gm - gds;
// S/D resistance corrections including W and DW
RSeff = (RSH*HDIF)/(Weff-DW);
RDeff = (RSH*HDIF)/(Weff-DW);
tmp1 = 1.0/(1.0 + gms*RSeff + gds*RDeff);
Id = Id*tmp1;
/****** Impact ionization current ******
* mb 95/12/19 introduced impact ionization
* This current component is flowing from the intrinsic drain terminal
* to the bulk (for NMOS) in parallel with the junction current.
* The simulator should also take into account the corresponding
* conductances.
*/
// Substrate current:
Vib = VD-VS-IBN_2*VDSS;
if ((Vib > 0.0) && (IBA_IBB > 0.0)) begin
inv_Vib = 1.0/Vib;
Lc_IBB_Vib = -Lc_IBB*inv_Vib;
if (Lc_IBB_Vib < -35.0) // math precision check
Lc_IBB_Vib = -35.0;
exp_ib = exp(Lc_IBB_Vib);
isub = IBA_IBB*Vib*exp_ib;
Isub = isub*Id;
dIsub_factor = Isub*inv_Vib*(1.0-Lc_IBB_Vib);
end
else begin
Lc_IBB_Vib = 0.0;
Isub = 0.0;
end
// END: substrate current computation
Ibd = Ibd - Isub;
// --- Charge calculations ---
WLCox = Weff * Leff * COX;
sif3 = sif*sif2;
sir3 = sir*sir2;
tmp1 = sqrt(PHI_T + 0.5 * VP);
sqrt_PHI_VP2_2 = tmp1+tmp1;
n_Vt_COX = (1.0 + GAMMAprime/sqrt_PHI_VP2_2) * Vt*WLCox;
QD = -n_Vt_COX*(0.266666666*(3.0*sir3+6.0*sir2*sif+4.0*
sir*sif2+2.0*sif3)/sif_sir_2 - 0.5);
QS = -n_Vt_COX*(0.266666666*(3.0*sif3+6.0*sif2*sir+4.0*
sif*sir2+2.0*sir3)/sif_sir_2 - 0.5);
QI = QS + QD;
QB = WLCox * (-0.5*GAMMAprime*sqrt_PHI_VP_2 + VGprime - VGstar) -
QI*GAMMAprime/(GAMMAprime+sqrt_PHI_VP2_2);
QG = -QI -QB;
I(ds) <+ TYPE * Mode * Id; // wg 22/04/08 corrected for device TYPE
ddt_QD = ddt(QD);
ddt_QS = ddt(QS);
if (Mode == `FWD) begin
I(db) <+ TYPE * ddt_QD; // wg 22/04/08 corrected for device TYPE
I(sb) <+ TYPE * ddt_QS;
I(db) <+ TYPE * Isub;
end
else begin
I(sb) <+ TYPE * ddt_QD; // wg 22/04/08 corrected for device TYPE
I(db) <+ TYPE * ddt_QS;
I(sb) <+ TYPE * Isub;
end
I(gb) <+ TYPE * ddt(QG); // wg 22/04/08 corrected for device TYPE
// if (Noise) begin : Noise //AB: 040902 Noise is also a variable and
if (Noise) begin : Noise_block //AB: 040902 Noise -> Noise_block
real S_flicker, S_thermal;
S_thermal = 4 * `P_K * T * Gn;
S_flicker = KF * gm * gm / (Weff * NS * Leff * COX);
I(ds) <+ white_noise(S_thermal, "thermal") +
flicker_noise(S_flicker, AF, "flicker");
end
///////////////////////////////////
//EXTRINSIC PART: JUNCTION DIODES//
///////////////////////////////////
//diode area and perimeter computation
if ((AS == 0.0) && (HDIF>0.0)) as_i = 2.0*HDIF*Weff;
else as_i = AS;
if ((PS == 0.0) && (HDIF>0.0)) ps_i = 4.0*HDIF+1.0*Weff;
else ps_i = PS;
if ((AD == 0.0) && (HDIF>0.0)) ad_i = 2.0*HDIF*Weff;
else ad_i = AD;
if ((PD == 0.0) && (HDIF>0.0)) pd_i = 4.0*HDIF+1.0*Weff;
else pd_i = PD;
//temperature update for diodes
temp_arg = exp((refEg/$vt(Tnom) - Eg/Vt + tp_xti*ln(ratioT))/xd_n);
js_t = xd_js*temp_arg;
jsw_t = xd_jsw*temp_arg;
jswg_t = xd_jswg*temp_arg;
pb_t = xd_pb - tp_pb*deltaT;
pbsw_t = xd_pbsw - tp_pbsw*deltaT;
pbswg_t = xd_pbswg - tp_pbswg*deltaT;
cj_t = xd_cj*(1.0+tp_cj*deltaT);
cjsw_t = xd_cjsw*(1.0+tp_cjsw*deltaT);
cjswg_t = xd_cjswg*(1.0+tp_cjswg*deltaT);
njts_t = xd_njts*(1.0+(ratioT-1.0)*tp_njts);
njtssw_t = xd_njtssw*(1.0+(ratioT-1.0)*tp_njtssw);
njtsswg_t = xd_njtsswg*(1.0+(ratioT-1.0)*tp_njtsswg);
//DC
v_di_b = TYPE*V(d,b);
v_si_b = TYPE*V(s,b);
//DRAIN - BULK
is_d = js_t*ad_i+jsw_t*pd_i+jswg_t*Weff;
arg_d = -v_di_b*ratioT/(Vt*xd_n);
if (arg_d < -40.0) arg_d = -40.0;
tmp0 = (-v_di_b+xd_bv)*ratioT/(Vt*xd_n);
if (tmp0>70) f_breakdown_d = 1.0;
else f_breakdown_d = 1.0 + xd_xjbv*exp(-tmp0);
// TRAP-ASSISTED TUNNELING CURRENT
idb_tun = -Weff*jswg_t*(exp(v_di_b*ratioT/(Vt*njtsswg_t) * xd_vtsswg/max(xd_vtsswg+v_di_b,1.0e-3))-1.0);
idb_tun = idb_tun - pd_i*jsw_t*(exp(v_di_b*ratioT/(Vt*njtssw_t) * xd_vtssw/max(xd_vtssw+v_di_b,1.0e-3))-1.0);
idb_tun = idb_tun - ad_i*js_t*(exp(v_di_b*ratioT/(Vt*njts_t) * xd_vts/max(xd_vts+v_di_b,1.0e-3))-1.0);
I(d,b) <+ (is_d * (1.0 - exp(arg_d))*f_breakdown_d+v_di_b*xd_gmin + idb_tun)*TYPE*M;
//SOURCE - BULK
is_s = js_t*as_i+jsw_t*ps_i+jswg_t*Weff;
arg_s = -v_si_b*ratioT/(Vt*xd_n);
if (arg_s < -40.0) arg_s = -40.0;
tmp0 = (-v_si_b+xd_bv)*ratioT/(Vt*xd_n);
if (tmp0>70) f_breakdown_s = 1.0;
else f_breakdown_s = 1.0 + xd_xjbv*exp(-tmp0);
// TRAP-ASSISTED TUNNELING CURRENT
isb_tun = -Weff*jswg_t*(exp(v_si_b*ratioT/(Vt*njtsswg_t) * xd_vtsswg/max(xd_vtsswg+v_si_b,1.0e-3))-1.0);
isb_tun = isb_tun - ps_i*jsw_t*(exp(v_si_b*ratioT/(Vt*njtssw_t) * xd_vtssw/max(xd_vtssw+v_si_b,1.0e-3))-1.0);
isb_tun = isb_tun - as_i*js_t*(exp(v_si_b*ratioT/(Vt*njts_t) * xd_vts/max(xd_vts+v_si_b,1.0e-3))-1.0);
I(s,b) <+ (is_s * (1.0 - exp(arg_s))*f_breakdown_s+v_si_b*xd_gmin + isb_tun)*TYPE*M;
//AC
//DRAIN - BULK
if (v_di_b>0.0)
begin
csb_d = cj_t * ad_i * exp(-xd_mj*ln(1.0+v_di_b/pb_t));
cssw_d = cjsw_t * pd_i * exp(-xd_mjsw*ln(1.0+v_di_b/pbsw_t));
csswg_d = cjswg_t * Weff * exp(-xd_mjswg*ln(1.0+v_di_b/pbswg_t));
end
else
begin
csb_d = cj_t * ad_i * (1.0 - xd_mj*v_di_b/pb_t);
cssw_d = cjsw_t * pd_i * (1.0 - xd_mjsw*v_di_b/pbsw_t);
csswg_d = cjswg_t * Weff * (1.0 - xd_mjswg*v_di_b/pbswg_t);
end
qjd = (csb_d+cssw_d+csswg_d) * v_di_b;
I(d,b) <+ ddt(qjd)*TYPE*M;
//SOURCE - BULK
if (v_si_b>0.0)
begin
csb_s = cj_t * as_i * exp(-xd_mj*ln(1.0+v_si_b/pb_t));
cssw_s = cjsw_t * ps_i * exp(-xd_mjsw*ln(1.0+v_si_b/pbsw_t));
csswg_s = cjswg_t * Weff * exp(-xd_mjswg*ln(1.0+v_si_b/pbswg_t));
end
else
begin
csb_s = cj_t * as_i * (1.0 - xd_mj*v_si_b/pb_t);
cssw_s = cjsw_t * ps_i * (1.0 - xd_mjsw*v_si_b/pbsw_t);
csswg_s = cjswg_t * Weff * (1.0 - xd_mjswg*v_si_b/pbswg_t);
end
qjs = (csb_s+cssw_s+csswg_s) * v_si_b;
I(s,b) <+ ddt(qjs)*TYPE*M;
//END OF DIODES
end
endmodule

View File

@ -1,8 +0,0 @@
Copyright 2020 University of California
Licensed under Educational Community License, Version 2.0 (the "License"); you may
not use this file except in compliance with the License. You may obtain a copy of the license at
http://opensource.org/licenses/ECL-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations
under the License.

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +0,0 @@
Copyright 2019 University of California
Licensed under Educational Community License, Version 2.0 (the "License"); you may
not use this file except in compliance with the License. You may obtain a copy of the license at
http://opensource.org/licenses/ECL-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations
under the License.

View File

@ -1,44 +0,0 @@
// ****************************************************************************
// * BSIM-CMG 111.0.0 released by Harshit Agarwal on 09/12/2019 *
// * BSIM Common Multi-Gate Model (Verilog-A) *
// ****************************************************************************
// ****************************************************************************
// * Copyright © 2019 University of California *
// * *
// * Project director: Prof. Chenming Hu *
// * *
// * Current developers: Harshit Agarwal (Postdoc) *
// * Pragya Kushwaha (Postdoc) *
// * Avirup Dasgupta (Postdoc) *
// * Yen-Kai Lin (Ph.D. student) *
// * Ming-Yen Kao (Ph.D. student) *
// ****************************************************************************
/*
Licensed under Educational Community License, Version 2.0 (the "License"); you may
not use this file except in compliance with the License. You may obtain a copy of the license at
http://opensource.org/licenses/ECL-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations
under the License.
BSIM-CMG model is supported by the members of Silicon Integration Initiative's Compact Model Coalition. A link to the most recent version of this
standard can be found at: http://www.si2.org/cmc
*/
`include "constants.vams"
`include "disciplines.vams"
`include "bsimcmg_macros.include"
module bsimcmg_va(d, g, s, e, t);
inout d, g, s, e, t;
electrical d, g, s, e;
electrical di, si;
electrical ge, gi;
electrical q;
electrical n;
thermal t;
`include "bsimcmg_parameters.include"
`include "bsimcmg_variables.include"
`include "bsimcmg_body.include"
endmodule

File diff suppressed because it is too large Load Diff

View File

@ -1,399 +0,0 @@
// ****************************************************************************
// * BSIM-CMG 111.0.0 released by Harshit Agarwal on 09/12/2019 *
// * BSIM Common Multi-Gate Model (Verilog-A) *
// ****************************************************************************
// ****************************************************************************
// * Copyright © 2019 University of California *
// * *
// * Project director: Prof. Chenming Hu *
// * *
// * Current developers: Harshit Agarwal (Postdoc) *
// * Pragya Kushwaha (Postdoc) *
// * Avirup Dasgupta (Postdoc) *
// * Yen-Kai Lin (Ph.D. student) *
// * Ming-Yen Kao (Ph.D. student) *
// ****************************************************************************
/*
Licensed under Educational Community License, Version 2.0 (the "License"); you may
not use this file except in compliance with the License. You may obtain a copy of the license at
http://opensource.org/licenses/ECL-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations
under the License.
BSIM-CMG model is supported by the members of Silicon Integration Initiative's Compact Model Coalition. A link to the most recent version of this
standard can be found at: http://www.si2.org/cmc
*/
// Parameter checking
if (Leff <= 0.0) begin
$strobe("Fatal: Leff = %e is not positive.", Leff);
$finish(0);
end else if (Leff <= 1.0e-9) begin
$strobe("Warning: Leff = %e <= 1.0e-9.", Leff);
end
if (Leff1 <= 0.0) begin
$strobe("Fatal: Leff1 = %e is not positive.", Leff1);
$finish(0);
end else if (Leff1 <= 1.0e-9) begin
$strobe("Warning: Leff1 = %e <= 1.0e-9.", Leff1);
end
if (LeffCV <= 1.0e-9) begin
$strobe("Warning: LeffCV = %e <= 1.0e-9.", LeffCV);
end
if (BULKMOD != 0) begin
if (LeffCV_acc <= 1.0e-9) begin
$strobe("Warning: LeffCV_acc = %e <= 1.0e-9.", LeffCV_acc);
end
end
if (Weff0 <= 1.0e-9) begin
$strobe("Warning: Weff0 = %e <= 1.0e-9.", Weff0);
end
if (WeffCV0 <= 1.0e-9) begin
$strobe("Warning: WeffCV0 = %e <= 1.0e-9.", WeffCV0);
end
if (NBODY_i <= 0.0) begin
$strobe("Fatal: NBODY_i = %e is not positive.", NBODY_i);
$finish(0);
end else if (NBODY_i <= 1.0e18) begin
$strobe("Warning: NBODY_i = %e m^-3 may be too small.", NBODY_i);
end
if (NGATE_i < 0.0) begin
$strobe("Fatal: NGATE_i = %e is negative.", NGATE_i);
$finish(0);
end else if (NGATE_i != 0.0 && NGATE_i <= 1.0e24) begin
$strobe("Warning: NGATE_i = %e may be too small.", NGATE_i);
end else if (NGATE_i > 1.0e31) begin
$strobe("Fatal: NGATE_i = %e is too high.", NGATE_i);
$finish(0);
end
if (DVT0_i < 0.0) begin
$strobe("Warning: DVT0_i = %e is negative.", DVT0_i);
end
if (PHIG_i <= 0.0) begin
$strobe("Fatal: PHIG_i = %e is not positive.", PHIG_i);
$finish(0);
end
if (VSAT_i <= 0.0) begin
$strobe("Fatal: VSAT_i = %e is not positive.", VSAT_i);
$finish(0);
end
if (VSAT1_i <= 0.0) begin
$strobe("Fatal: VSAT1_i = %e is not positive.", VSAT1_i);
$finish(0);
end
if (ASYMMOD != 0 && VSAT1R_i <= 0.0) begin
$strobe("Fatal: VSAT1R_i = %e is not positive.", VSAT1R_i);
$finish(0);
end
if (DVT1_i <= 0.0) begin
$strobe("Fatal: DVT1_i = %e is not positive.", DVT1_i);
$finish(0);
end
if (DVT1SS_i <= 0.0) begin
$strobe("Fatal: DVT1SS_i = %e is not positive.", DVT1SS_i);
$finish(0);
end
if (CDSC_i < 0.0) begin
$strobe("Warning: CDSC_i = %e is negative.", CDSC_i);
end
if (CDSCD_i < 0.0) begin
$strobe("Warning: CDSCD_i = %e is negative.", CDSCD_i);
end
if (ASYMMOD != 0 && CDSCDR_i < 0.0) begin
$strobe("Warning: CDSCDR_i = %e is negative.", CDSCDR_i);
end
if (DSUB_i <= 0.0) begin
$strobe("Fatal: DSUB_i = %e is not positive.", DSUB_i);
$finish(0);
end
if (ETA0_i < 0.0) begin
$strobe("Warning: ETA0_i = %e is negative, setting it to 0", ETA0_i);
ETA0_i = 0.0;
end
if (ETA0R_i < 0.0) begin
$strobe("Warning: ETA0R_i = %e is negative, setting it to 0", ETA0R_i);
ETA0R_i = 0.0;
end
if (LPE0_i < -Leff) begin
$strobe("Warning: LPE0_i = %e is less than -Leff. Clipping LPE0_i to 0", LPE0_i);
LPE0_i = 0.0;
end
if (K0SI_i < 0.0) begin
$strobe("Warning: K0SI_i = %e is negative, setting it to 0.", K0SI_i);
K0SI_i = 0.0;
end
if (K2SI_i < 0.0) begin
$strobe("Warning: K2SI_i = %e is negative, setting it to 0.", K2SI_i);
K2SI_i = 0.0;
end
if (BULKMOD != 0 && PHIBE_i < 0.2) begin
$strobe("Warning: PHIBE_i = %e is less than 0.2, setting it to 0.2.", PHIBE_i);
PHIBE_i = 0.2;
end
if (BULKMOD != 0 && PHIBE_i > 1.2) begin
$strobe("Warning: PHIBE_i = %e is larger than 1.2, setting it to 1.2.", PHIBE_i);
PHIBE_i = 1.2;
end
if (PSAT_i < 2.0) begin
$strobe("Warning: PSAT_i = %e is less than 2.0, setting it to 2.0.", PSAT_i);
PSAT_i = 2.0;
end
if (PSATCV_i < 2.0) begin
$strobe("Warning: PSATCV_i = %e is less than 2.0, setting it to 2.0.", PSATCV_i);
PSATCV_i = 2.0;
end
if (U0_i < 0.0) begin
$strobe("Warning: U0_i = %e is negative, setting it to the default value.", U0_i);
U0_i = 0.03;
end
if (UA_i < 0.0) begin
$strobe("Warning: UA_i = %e is negative, setting it to 0.", UA_i);
UA_i = 0.0;
end
if (EU_i < 0.0) begin
$strobe("Warning: EU_i = %e is negative, setting it to 0.", EU_i);
EU_i = 0.0;
end
if (UD_i < 0.0) begin
$strobe("Warning: UD_i = %e is negative, setting it to 0.", UD_i);
UD_i = 0.0;
end
if (UCS_i < 0.0) begin
$strobe("Warning: UCS_i = %e is negative, setting it to 0.", UCS_i);
UCS_i = 0.0;
end
if (ETAMOB_i < 0.0) begin
$strobe("Warning: ETAMOB_i = %e is negative, setting it to 0", ETAMOB_i);
ETAMOB_i = 0.0;
end
RDSWMIN_i = RDSWMIN;
if (RDSWMIN_i < 0.0) begin
$strobe("Warning: RDSWMIN = %e is negative, setting it to 0", RDSWMIN_i);
RDSWMIN_i = 0.0;
end
if (RDSW_i < 0.0) begin
$strobe("Warning: RDSW_i = %e is negative, setting it to 0", RDSW_i);
RDSW_i = 0.0;
end
RSWMIN_i = RSWMIN;
if (RSWMIN_i < 0.0) begin
$strobe("Warning: RSWMIN = %e is negative, setting it to 0", RSWMIN_i);
RSWMIN_i = 0.0;
end
if (RSW_i < 0.0) begin
$strobe("Warning: RSW_i = %e is negative, setting it to 0", RSW_i);
RSW_i = 0.0;
end
RDWMIN_i = RDWMIN;
if (RDWMIN_i < 0.0) begin
$strobe("Warning: RDWMIN = %e is negative, setting it to 0", RDWMIN_i);
RDWMIN_i = 0.0;
end
if (RDW_i < 0.0) begin
$strobe("Warning: RDW_i = %e is negative, setting it to 0", RDW_i);
RDW_i = 0.0;
end
if (PRWGD_i < 0.0) begin
$strobe("Warning: PRWGD_i = %e is negative, setting it to 0", PRWGD_i);
PRWGD_i = 0.0;
end
if (PRWGS_i < 0.0) begin
$strobe("Warning: PRWGS_i = %e is negative, setting it to 0", PRWGS_i);
PRWGS_i = 0.0;
end
if (PCLM_i < 0.0) begin
$strobe("Warning: PCLM_i = %e is negative.", PCLM_i);
end
if (PDIBL1_i < 0.0) begin
$strobe("Warning: PDIBL1_i = %e is negative.", PDIBL1_i);
end
if (ASYMMOD != 0) begin
if (PDIBL1R_i < 0.0) begin
$strobe("Warning: PDIBL1R_i = %e is negative.", PDIBL1R_i);
end
if (PDIBL2R_i < 0.0) begin
$strobe("Warning: PDIBL2R_i = %e is negative.", PDIBL2R_i);
end
if (U0R_i < 0) begin
$strobe("Warning: U0R_i = %e is negative, setting it to 0.", U0R_i);
U0R_i = 0.0;
end
if (UAR_i < 0.0) begin
$strobe("Warning: UAR_i = %e is negative, setting it to 0.", UAR_i);
UAR_i = 0.0;
end
if (EUR_i < 0.0) begin
$strobe("Warning: EUR_i = %e is negative, setting it to 0.", EUR_i);
EUR_i = 0.0;
end
if (UDR_i < 0.0) begin
$strobe("Warning: UDR_i = %e is negative, setting it to 0.", UDR_i);
UDR_i = 0.0;
end
end
if (PDIBL2_i < 0.0) begin
$strobe("Warning: PDIBL2_i = %e is negative.", PDIBL2_i);
end
if (DROUT_i <= 0.0) begin
$strobe("Fatal: DROUT_i = %e is non-positive.", DROUT_i);
$finish(0);
end
if (MEXP_i < 2.0) begin
$strobe("Warning: MEXP_i = %e < 2. Setting MEXP_i = 2.", MEXP_i);
MEXP_i = 2.0;
end
if (ASYMMOD != 0) begin
if (MEXPR_i < 2.0) begin
$strobe("Warning: MEXPR_i = %e < 2. Setting MEXPR_i = 2.", MEXPR_i);
MEXPR_i = 2.0;
end
end
if (PTWG_i < 0.0) begin
$strobe("Warning: PTWG_i = %e is negative, setting it to 0.", PTWG_i);
PTWG_i = 0.0;
end
if (CGIDL_i < 0.0) begin
$strobe("Warning: CGIDL_i = %e < 0. Setting CGIDL_i = 0.", CGIDL_i);
CGIDL_i = 0.0;
end
if (CGISL_i < 0.0) begin
$strobe("Warning: CGISL_i = %e < 0. Setting CGISL_i = 0.", CGISL_i);
CGISL_i = 0.0;
end
if (IGBMOD != 0) begin
if (NIGBINV_i <= 0.0) begin
$strobe("Fatal: NIGBINV_i = %e is non-positive.", NIGBINV_i);
$finish(0);
end
if (NIGBACC_i <= 0.0) begin
$strobe("Fatal: NIGBACC_i = %e is non-positive.", NIGBACC_i);
$finish(0);
end
end
if (IGCMOD != 0) begin
if (POXEDGE_i <= 0.0) begin
$strobe("Fatal: POXEDGE_i = %e is non-positive.", POXEDGE_i);
$finish(0);
end
if (PIGCD_i <= 0.0) begin
$strobe("Fatal: PIGCD_i = %e is non-positive.", PIGCD_i);
$finish(0);
end
end
if (IGCMOD != 0 || IGBMOD != 0) begin
if (TOXREF <= 0.0) begin
$strobe("Fatal: TOXREF = %e is non-positive.", TOXREF);
$finish(0);
end
end
if (LINTIGEN >= (Leff / 2.0)) begin
$strobe("Warning: LINTIGEN = %e is too large - Leff for r/g current is negative. Re-setting LINTIGEN = 0.", LINTIGEN);
LINTIGEN_i = 0.0;
end else begin
LINTIGEN_i = LINTIGEN;
end
if (NTGEN_i <= 0.0) begin
$strobe("Fatal: NTGEN_i = %e is non-positive.", NTGEN_i);
$finish(0);
end
if (NQSMOD == 1 && XRCRG1_i != 0.0) begin
if (XRCRG1_i < 1.0e-3) begin
$strobe("Warning: XRCRG1_i = %e. Gate resistance may be too large. Disabling NQS Gate Resistance.", XRCRG1_i);
XRCRG1_i = 0.0;
end
end
if (IIMOD == 2) begin
if (BETAII0_i < 0.0) begin
$strobe("Warning: BETAII0_i = %e is negative.", BETAII0_i);
end
if (BETAII1_i < 0.0) begin
$strobe("Warning: BETAII1_i = %e is negative.", BETAII1_i);
end
if (BETAII2_i < 0.0) begin
$strobe("Warning: BETAII2_i = %e is negative.", BETAII2_i);
end
if (ESATII_i < 0.0) begin
$strobe("Warning: ESATII_i = %e is negative.", ESATII_i);
end
if (LII_i < 0.0) begin
$strobe("Warning: LII_i = %e is negative.", LII_i);
end
if (SII1_i < 0.0) begin
$strobe("Warning: SII1_i = %e is negative.", SII1);
end
if (SII2_i < 0.0) begin
$strobe("Warning: SII2_i = %e is negative.", SII2_i);
end
if (SIID_i < 0.0) begin
$strobe("Warning: SIID_i = %e is negative.", SIID_i);
end
end
if (EF <= 0.0) begin
$strobe("Fatal: EF = %e is non-positive.", EF);
$finish(0);
end else if (EF > 2.0) begin
$strobe("Fatal: EF = %e > 2.0.", EF);
$finish(0);
end

View File

@ -1,141 +0,0 @@
// ****************************************************************************
// * BSIM-CMG 111.0.0 released by Harshit Agarwal on 09/12/2019 *
// * BSIM Common Multi-Gate Model (Verilog-A) *
// ****************************************************************************
// ****************************************************************************
// * Copyright © 2019 University of California *
// * *
// * Project director: Prof. Chenming Hu *
// * *
// * Current developers: Harshit Agarwal (Postdoc) *
// * Pragya Kushwaha (Postdoc) *
// * Avirup Dasgupta (Postdoc) *
// * Yen-Kai Lin (Ph.D. student) *
// * Ming-Yen Kao (Ph.D. student) *
// ****************************************************************************
/*
Licensed under Educational Community License, Version 2.0 (the "License"); you may
not use this file except in compliance with the License. You may obtain a copy of the license at
http://opensource.org/licenses/ECL-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations
under the License.
BSIM-CMG model is supported by the members of Silicon Integration Initiative's Compact Model Coalition. A link to the most recent version of this
standard can be found at: http://www.si2.org/cmc
*/
// Source/drain resistances
Dr = 0.0; Rdrain = 0.0; Rsource = 0.0; Rdsi = 0.0;
// Temperature effects
CJS_t = 0.0; CJSWS_t = 0.0; CJSWGD_t = 0.0;
CJD_t = 0.0; CJSWD_t = 0.0; CJSWGS_t = 0.0;
PBS_t = 0.0; PBSWS_t = 0.0; PBSWGS_t = 0.0;
PBD_t = 0.0; PBSWD_t = 0.0; PBSWGD_t = 0.0;
JSS_t = 0.0; JSWS_t = 0.0; JSWGS_t = 0.0;
JSD_t = 0.0; JSWD_t = 0.0; JSWGD_t = 0.0;
JTSS_t = 0.0; JTSD_t = 0.0;
JTSSWS_t = 0.0; JTSSWD_t = 0.0;
JTSSWGS_t = 0.0; JTSSWGD_t = 0.0;
NJTS_t = 0.0; NJTSD_t = 0.0;
NJTSSW_t = 0.0; NJTSSWD_t = 0.0;
NJTSSWG_t = 0.0; NJTSSWGD_t = 0.0;
RSDRR_t = 0.0; RDDRR_t = 0.0;
UAR_t = 0.0; UC_t = 0.0; UCR_t = 0.0; UDR_t = 0.0;
VSATR_t = 0.0; VSAT1R_t = 0.0; MEXPR_t = 0.0; PTWGR_t = 0.0;
// Quantum mechanical correction
Tcen0 = 0.0;
// Midpoint potential and charge
qba = 0.0; u0r = 0.0;
// Geometry-dependent fringe capacitance
Cfr_geo = 0.0;
// Gate resistance
ggeltd = 0.0;
// Gate current
igbinv = 0.0; igbacc = 0.0;
igbs = 0.0; igbd = 0.0;
igcs = 0.0; igcd = 0.0;
igs = 0.0; igd = 0.0;
// GIDL/GISL
igisl = 0.0; igidl = 0.0;
// Impact ionization current
Iii = 0.0;
// Accumulation capacitance
cox_acc = 0.0; qg_acc = 0.0; qb_acc = 0.0;
// Parasitic capacitance
qgs_ov = 0.0; qgd_ov = 0.0;
// Junction current and capacitance
Ies = 0.0; Ied = 0.0;
Czbs = 0.0; Czbssw = 0.0; Czbsswg = 0.0;
Czbd = 0.0; Czbdsw = 0.0; Czbdswg = 0.0;
Qesj = 0.0; Qedj = 0.0;
Isbs = 0.0; Isbd = 0.0;
Nvtms = 0.0; Nvtmd = 0.0;
SslpFwd = 0.0; IVjsmFwd = 0.0; VjsmFwd = 0.0; XExpBVS = 0.0;
SslpRev = 0.0; IVjsmRev = 0.0; VjsmRev = 0.0;
DslpFwd = 0.0; IVjdmFwd = 0.0; VjdmFwd = 0.0; XExpBVD = 0.0;
DslpRev = 0.0; IVjdmRev = 0.0; VjdmRev = 0.0;
vec1s = 0.0; pb21s = 0.0;
vec2s = 0.0; pb22s = 0.0;
vec3s = 0.0; pb23s = 0.0;
vec1d = 0.0; pb21d = 0.0;
vec2d = 0.0; pb22d = 0.0;
vec3d = 0.0; pb23d = 0.0;
// NQS gate resistance
gcrg = 0.0; gtau = 0.0;
// Thermal noise
sid = 0.0;
// Correlated thermal noise
Dr0 = 0.0; ctnoi = 0.0; sigrat = 0.0;
// Self-heating
gth = 0.0; cth = 0.0;
// Short channel effects
CITR_i = 0.0; CDSCDR_i = 0.0; ETA0R_i = 0.0; DVTSHIFTR_i = 0.0;
// Body effect
veseff = 0.0;
PHIBE_i = 0.0; K1_i = 0.0; K11_i = 0.0; K2SAT_i = 0.0; K2SAT1_i = 0.0;
K2_i = 0.0; K21_i = 0.0;
// Velocity satuation
VSATR_i = 0.0; VSAT1R_i = 0.0; KSATIVR_i = 0.0; MEXPR_i = 0.0;
PTWGR_i = 0.0; ATR_i = 0.0;
// Mobility
U0R_i = 0.0; UPR_i = 0.0; UAR_i = 0.0; UC_i = 0.0; UCR_i = 0.0; EUR_i = 0.0;
UDR_i = 0.0; UTER_i = 0.0; UTLR_i = 0.0;
UA1R_i = 0.0; UC1_i = 0.0; UC1R_i = 0.0; UD1R_i = 0.0;
// DIBL
PDIBL1R_i = 0.0; PDIBL2R_i = 0.0;
// Channel length modulation
PCLMR_i = 0.0;
// Overlap capacitance
CGSO_i = 0.0; CGDO_i = 0.0;
// NQS gate resistance model & charge deficit model
XRCRG1_i = 0.0; XRCRG2_i = 0.0;
// Unified FinFET compact model
Cins = 0.0; Ach = 0.0; Weff_UFCM = 0.0; rc = 0.0; Qdep_ov_Cins = 0.0;
qi_acc_for_QM = 0.0; nq = 0.0;

View File

@ -1,239 +0,0 @@
// ****************************************************************************
// * BSIM-CMG 111.0.0 released by Harshit Agarwal on 09/12/2019 *
// * BSIM Common Multi-Gate Model (Verilog-A) *
// ****************************************************************************
// ****************************************************************************
// * Copyright © 2019 University of California *
// * *
// * Project director: Prof. Chenming Hu *
// * *
// * Current developers: Harshit Agarwal (Postdoc) *
// * Pragya Kushwaha (Postdoc) *
// * Avirup Dasgupta (Postdoc) *
// * Yen-Kai Lin (Ph.D. student) *
// * Ming-Yen Kao (Ph.D. student) *
// ****************************************************************************
/*
Licensed under Educational Community License, Version 2.0 (the "License"); you may
not use this file except in compliance with the License. You may obtain a copy of the license at
http://opensource.org/licenses/ECL-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations
under the License.
BSIM-CMG model is supported by the members of Silicon Integration Initiative's Compact Model Coalition. A link to the most recent version of this
standard can be found at: http://www.si2.org/cmc
*/
// Model types
`define ntype 1
`define ptype -1
// Numerical constants
`define EXPL_THRESHOLD 80.0
`define MAX_EXPL 5.540622384e34
`define MIN_EXPL 1.804851387e-35
`define N_MINLOG 1.0e-38
`define LN_N_MINLOG -87.498233534
`define MEXPQM 4.0
`define DELTA_1 0.02
`define DELTA_ASYMM 0.04
`define CONSTCtoK 273.15
`define REFTEMP 300.15
`define ONE_OV_3 0.333333333
`define TWO_OV_3 0.666666667
`define FOUR_OV_3 1.333333333
// Physical constants
`define q 1.60219e-19
`define EPS0 8.8542e-12
`define HBAR 1.05457e-34
`define MEL 9.11e-31
`define KboQ 8.617087e-5
// Clamped exponential
`define lexp(x) ((x > `EXPL_THRESHOLD) ? `MAX_EXPL * (1.0 + x - `EXPL_THRESHOLD) : (x < -`EXPL_THRESHOLD) ? `MIN_EXPL : exp(x))
// Clamped logarithm
`define lln(x) ((x > `N_MINLOG) ? ln(x) : `LN_N_MINLOG)
// Hyperbolic smoothing
`define hypsmooth(x, c) (0.5 * (x + sqrt(x * x + 4.0 * c * c)))
// Hyperbolic smoothing with a maximum value
`define hypmax(x, xmin, c) (xmin + 0.5 * (x - xmin - c + sqrt((x - xmin - c) * (x - xmin - c) - 4.0 * xmin * c)))
// Smoothing with a minimum value
`define smoothminx(x, x0, deltax) (0.5 * (x + x0 + sqrt((x - x0) * (x - x0) + 0.25 * deltax * deltax)))
// Temperature dependence
`define tempdep(param_t, param_i, t_term) \
begin \
if (TEMPMOD != 0) begin \
param_t = param_i + `hypmax(t_term * delTemp, -param_i, 1.0e-6); \
end else begin \
param_t = param_i * `hypsmooth((1.0 + t_term * delTemp - 1.0e-6), 1.0e-3); \
end \
end
// Binning equations
`define binning(param_i, r_term, l_term, n_term, p_term) \
begin \
param_i = r_term + Inv_L * l_term + Inv_NFIN * n_term + Inv_LNFIN * p_term; \
end
// NFIN scaling
`define nfin_scaling(param_i, n1_term, n2_term) \
begin \
if (n1_term != 0.0) begin \
param_i = param_i * (1.0 + n1_term / NFIN * `lln(1.0 + NFIN / n2_term)); \
end \
end
// NFINNOM scaling
`define nfinnom_scaling(param_i, lt_term) \
begin \
param_i = param_i * (1.0 + (NFIN - NFINNOM) * lt_term * Leff); \
end
// Length scaling
`define length_scaling(param, a_term, b_term) \
begin \
param = param + a_term * `lexp(-Leff / b_term); \
end
// Junction capacitance
`define juncap_bias_indep(SJ, PB_t, MJ, MJ2, vec, pb2) \
begin \
if (SJ > 0.0) begin \
vec = PB_t * (1.0 - pow((1.0 / SJ), (1.0 / MJ))); \
pb2 = PB_t * SJ * MJ2 / MJ / pow((1.0 - vec / PB_t), -(1.0 + MJ)); \
end \
end
`define junction_cap(vex, vec, pb2, Cz, PB, SJ, MJ, MJ2, Qej) \
begin \
if (Cz > 0.0) begin \
T1 = vex / PB; \
if (T1 < 0.9) begin \
if (SJ > 0.0) begin \
if (vex > vec) begin \
arg = 1.0 - T1; \
if (MJ == 0.5) begin \
sarg = 1.0 / sqrt(arg); \
end else begin \
sarg = pow(arg, -MJ); \
end \
Qej = PB * Cz * (1.0 - arg * sarg) / (1.0 - MJ); \
end else begin \
arg = 1.0 - vec / PB; \
if (MJ == 0.5) begin \
sarg = 1.0 / sqrt(arg); \
end else begin \
sarg = pow(arg, -MJ); \
end \
Qec = PB * Cz * (1.0 - arg * sarg) / (1.0 - MJ); \
arg = 1.0 - (vex - vec) / pb2; \
if (MJ2 == 0.5) begin \
sarg = 1.0 / sqrt(arg); \
end else begin \
sarg = pow(arg, -MJ2); \
end \
Qej = Qec + SJ * pb2 * Cz * (1.0 - arg * sarg) / (1.0 - MJ2); \
end \
end else begin \
arg = 1.0 - T1; \
if (MJ == 0.5) begin \
sarg = 1.0 / sqrt(arg); \
end else begin \
sarg = pow(arg, -MJ); \
end \
Qej = PB * Cz * (1.0 - arg * sarg) / (1.0 - MJ); \
end \
end else begin \
T2 = pow(0.1, -MJ); \
T3 = 1.0 / (1.0 - MJ); \
T4 = T2 * (T1 - 1.0) * (5.0 * MJ * (T1 - 1.0) + (1.0 + MJ)); \
T5 = T3 * (1.0 - 0.05 * MJ * (1.0 + MJ) * T2); \
Qej = PB * Cz * (T4 + T5); \
end \
end else begin \
Qej = 0.0; \
end \
end
// Geometry-dependent fringe capacitance
`define cfringe_2d(Hg, Hc, Wfin, Cf1, Cgg) \
begin \
Hr = 2.3 + 0.2 * (Hg + TOXP) / Hc; \
Lr = 1.05; \
Hgdelta = abs(Hg + TOXP - Hc); \
Lmax = LSP * Lr; \
y = min(Hc, Hg + TOXP); \
x = LSP / (Hr + 1.0); \
Cnon = 1.7e12; \
CcgSat = epssp * (y - x) / LSP; \
TT1 = Cnon * CcgSat; \
if (TT1 > `EXPL_THRESHOLD) begin \
Ccg1 = CcgSat; \
end else begin \
Ccg1 = 1.0 / Cnon * ln(1.0 + `lexp(TT1)); \
end \
r1cf = 0.5 * min(Hc / (Hg + TOXP), (Hg + TOXP) / Hc); \
Rcf = Hgdelta * r1cf; \
Ccg2 = epssp * 2.0 / `M_PI * `lln((LSP + 0.5 * `M_PI * Rcf) / LSP); \
Ccg = Wfin * (Ccg1 + Ccg2); \
x = Lmax / Hg; \
C1 = 4.0 / (sqrt(2.0 * (x + 1.0)) * `M_PI); \
C2 = sqrt(TOXP * TOXP + 2.0 * Hg * TOXP + Hg * Hg * (x + 1.0)) * sqrt(x + 1.0) + TOXP + Hg * x + Hg; \
C3 = TOXP * sqrt((x + 1.0) * (x + 4.0)) + TOXP * (x + 2.0); \
Cfglog = epssp * (C1 * `lln(C2 / C3) + 12.27); \
dcf = Hr * Lr; \
TT0 = sqrt(dcf * dcf + 1.0); \
TT1 = sqrt((dcf * dcf + 1.0) * ((dcf * TOXP) * (dcf * TOXP) + 2.0 * dcf * Lmax * TOXP + (dcf * dcf + 1.0) * Lmax * Lmax)) + dcf * TOXP + dcf * dcf * Lmax + Lmax; \
TT2 = (TT0 + 1.0) * (dcf * TOXP); \
Cfgsat = 2.0 * epssp * sqrt(2.0) / `M_PI * (Cf1) * dcf / TT0 * `lln(TT1 / TT2); \
delta = 1.2e-12; \
TT1 = Cfgsat - Cfglog - delta; \
Cfg = Wfin * (Cfgsat - 0.5 * (TT1 + sqrt(TT1 * TT1 + 4.0 * delta * Cfgsat))); \
Cgg = Ccg + Cfg; \
end
// Macros for the model/instance parameters
// OPP: operating point parameter, includes units and description for printing
// MPRxx: model parameter real
// MPIxx: model parameter integer
// IPRxx: instance parameter real
// IPIxx: instance parameter integer
// BPRxx: both model and instance parameter real
// BPIxx: both model and instance 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 OPP(nam, uni, des) (* units = uni, desc = des *) real nam;
`define OPM(nam,uni,des) (* units=uni, desc=des, multiplicity="multiply" *) real nam;
`define OPD(nam,uni,des) (* units=uni, desc=des, multiplicity="divide" *) real nam;
`define BPRco(nam, def, uni, lwr, upr, des) (* units = uni, type = "instance", desc = des *) parameter real nam = def from[lwr : upr);
`define BPRoz(nam, def, uni, des) (* units = uni, type = "instance", desc = des *) parameter real nam = def from(0.0 : inf);
`define BPRcz(nam, def, uni, des) (* units = uni, type = "instance", desc = des *) parameter real nam = def from[0.0 : inf);
`define BPRnb(nam, def, uni, des) (* units = uni, type = "instance", desc = des *) parameter real nam = def;
`define BPIcc(nam, def, uni, lwr, upr, des) (* units = uni, type = "instance", desc = des *) parameter integer nam = def from[lwr : upr];
`define IPIco(nam, def, uni, lwr, upr, des) (* units = uni, type = "instance", desc = des *) parameter integer nam = def from[lwr : upr);
`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 MPRcz(nam, def, uni, des) (* units = uni, desc = des *) parameter real nam = def from[0.0 : inf);
`define MPRoz(nam, def, uni, des) (* units = uni, desc = des *) parameter real nam = def from(0.0 : inf);
`define MPIcc(nam, def, uni, lwr, upr, des) (* units = uni, desc = des *) parameter integer nam = def from[lwr : upr];

View File

@ -1,197 +0,0 @@
// ****************************************************************************
// * BSIM-CMG 111.0.0 released by Harshit Agarwal on 09/12/2019 *
// * BSIM Common Multi-Gate Model (Verilog-A) *
// ****************************************************************************
// ****************************************************************************
// * Copyright © 2019 University of California *
// * *
// * Project director: Prof. Chenming Hu *
// * *
// * Current developers: Harshit Agarwal (Postdoc) *
// * Pragya Kushwaha (Postdoc) *
// * Avirup Dasgupta (Postdoc) *
// * Yen-Kai Lin (Ph.D. student) *
// * Ming-Yen Kao (Ph.D. student) *
// ****************************************************************************
/*
Licensed under Educational Community License, Version 2.0 (the "License"); you may
not use this file except in compliance with the License. You may obtain a copy of the license at
http://opensource.org/licenses/ECL-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations
under the License.
BSIM-CMG model is supported by the members of Silicon Integration Initiative's Compact Model Coalition. A link to the most recent version of this
standard can be found at: http://www.si2.org/cmc
*/
// Noise model
Esatnoi = 2.0 * VSAT_a / ueff;
// Flicker noise, Ref: BSIM4
if (NOIA > 0.0 || NOIB > 0.0 || NOIC > 0.0) begin
Leffnoi = Leff - 2.0 * LINTNOI;
if (Leffnoi <= 0.0) begin
$strobe("Warning: LINTNOI = %e is too large to have positive Leff for noise. Set LINTNOI = 0.", LINTNOI);
Leffnoi = Leff;
end
Leffnoisq = Leffnoi * Leffnoi;
if (EM > 0.0) begin
T0 = (diffVds / litl + EM) / Esatnoi;
DelClm = litl * `lln(T0);
end else begin
DelClm = 0.0;
end
T1 = `q * `q * `q * Vtm * abs(ids) * ueff;
T2 = 1.0e10 * coxeff * Leffnoisq;
N0 = coxeff * qis / `q;
Nl = coxeff * qid / `q;
Nstar = Vtm / `q * (coxeff + CIT_a);
T3 = NOIA * `lln((N0 + Nstar) / (Nl + Nstar));
T4 = NOIB * (N0 - Nl);
T5 = 0.5 * NOIC * (N0 * N0 - Nl * Nl);
T6 = `q * Vtm * ids * ids;
T7 = 1.0e10 * Leffnoisq * Weff0 * NFINtotal;
T8 = NOIA + NOIB * Nl + NOIC * Nl * Nl;
T9 = (Nl + Nstar) * (Nl + Nstar);
Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9;
T10 = NOIA * `q * Vtm;
T11 = Weff0 * NFINtotal * Leffnoi * 1.0e10 * Nstar * Nstar;
Swi = T10 / T11 * ids * ids;
T1 = Swi + Ssi;
if (T1 > 0.0) begin
FNPowerAt1Hz = (Ssi * Swi) / T1;
end else begin
FNPowerAt1Hz = 0.0;
end
end else begin
FNPowerAt1Hz = 0.0;
end
// Thermal noise
case (TNOIMOD)
// Charge-based thermal noise model, Ref: BSIM4
0: begin
T0 = ueff * qinv;
T1 = T0 * Rdsi + Leff * Leff;
Gtnoi = (T0 / T1) * NTNOI;
sid = 4.0 * Vtm * `q * Gtnoi;
end
// Correlated thermal noise model, Ref: Chap. 6 of Darsen Lu's Ph.D. thesis
1: begin
T0 = qia / EsatL;
T0 = T0 * T0;
// Empirical parameters for short-channel excess noise
noiBeta = RNOIA * (1.0 + T0 * TNOIA * Leff);
noiTheta = RNOIB * (1.0 + T0 * TNOIB * Leff);
noiCorr = RNOIC * (1.0 + T0 * TNOIC * Leff);
noiLowId = RNOIK * (1.0 + T0 * TNOIK * Leff);
// T1, T2, T3 are all 1.0 by default
T1 = 3.0 * noiBeta * noiBeta;
T2 = 7.5 * noiTheta * noiTheta;
T3 = 2.5298 * noiCorr;
// Theoretical equations
noiEta = (qid / qis) * (1.0 - Vdseff / Vdsat);
Dvsat3 = Dvsat * Dvsat * Dvsat;
noiWI = q0 / (q0 + qia);
// Mnud at Vds = 0
if (K0_t != 0.0) begin
T4 = K0_t / (max(0.0, K0SI_t) * qis + 2.0 * nVtm);
Mnud0 = `lexp(-T4);
end else begin
Mnud0 = 1.0;
end
// Mob at Vds = 0
if (BULKMOD == 2) begin
T4 = `hypsmooth(K2_t, 1.0e-6);
T5 = T4 / (max(0.0, K2SI_t) * qis + 2.0 * nVtm);
T6 = sqrt(PHIBE_i - veseff) - sqrt(PHIBE_i);
Mob0 = `lexp(-T5 * T6);
end else begin
Mob0 = 1.0;
end
// Dmob at Vds = 0
Eeffm0 = EeffFactor * (qba + eta_mu * qis);
T4 = pow(0.5 * (1.0 + abs(qis / qb0)), UCS_t);
if (BULKMOD != 0) begin
T5 = (UA_a + UC_a * veseff) * pow(abs(Eeffm0), EU_a) + UD_a / T4;
end else begin
T5 = UA_a * pow(abs(Eeffm0), EU_a) + UD_a / T4;
end
Dmob0 = 1.0 + T5;
Dmob0 = `smoothminx(Dmob0, 1.0, DMOBCLAMP);
Dmob0 = Dmob0 / U0MULT;
// Dvsat at Vds = 0
Dvsat0 = 1.0 + 0.25 * DVSATCLAMP;
// ids0_ov_dqi at Vds = 0
etaiv0 = q0 / (q0 + qis);
T4 = (2.0 - etaiv0) * nVtm;
ids0_ov_dqi0 = qis + T4;
// Dr at Vds = 0
case (RDSMOD)
0: begin
T4 = 1.0 + PRWGS_i * qis;
T5 = 1.0 / T4;
T6 = 0.5 * (T5 + sqrt(T5 * T5 + 0.01));
Rdsi0 = rdstemp * (RDSWMIN_i + RDSW_i * T6) * WeffWRFactor;
Dr0 = 1.0 + NFINtotal * beta * ids0_ov_dqi0 / (Dmob0 * Dvsat0) * Rdsi0;
end
1: begin
Dr0 = 1.0;
end
2: begin
T4 = 1.0 + PRWGS_i * qis;
T5 = 1.0 / T4;
T6 = 0.5 * (T5 + sqrt(T5 * T5 + 0.01));
Rdsi0 = (RDSWMIN_i + RDSW_i * T6) * WeffWRFactor;
Rdsi0 = rdstemp * (RSourceGeo + RDrainGeo + Rdsi0);
Dr0 = 1.0 + NFINtotal * beta * ids0_ov_dqi0 / (Dmob0 * Dvsat0) * Rdsi0;
end
endcase
// Gds at Vds = 0, Moc will always be 1.0 at Vds = 0
noiGd0 = NFINtotal * beta * qis * Mnud0 * Mob0 / (Dmob0 * Dvsat0 * Dr0);
T4 = 1.0 + noiEta;
T5 = 1.0 - noiEta;
T6 = (2.0 * noiWI) / qis * nVtm;
T7 = T4 + T6;
T5_2 = T5 * T5;
T5_3 = T5_2 * T5;
T5_4 = T5_3 * T5;
T7_2 = T7 * T7;
T7_3 = T7_2 * T7;
T7_4 = T7_3 * T7;
T7_5 = T7_4 * T7;
// Theoretical Sid for long-channel devices
gamma1 = 0.5 * T4;
gamma2 = T5_2 / (6.0 * T7);
gamma = (Moc / Dvsat) * (gamma1 + gamma2);
// Theoretical Sig for long-channel devices
delta1 = T4 / T7_2;
delta2 = (6.0 * T4 + T6) * T5_2 / (15.0 * T7_4);
delta3 = T5_4 / (9.0 * T7_5);
delta = (Moc / 6.0) * Dvsat3 * (delta1 - delta2 + delta3);
// Theoretical correlated noise between Sid and Sig for long-channel devices
epsilon1 = T5 / T7;
epsilon2 = T5_3 / (3.0 * T7_3);
epsilon = (Moc / 6.0) * Dvsat * (epsilon1 - epsilon2);
// Empirical tuning of correlation coefficient between Sid and Sig by T3
// ctnoi = 1: fully correlated; ctnoi = 0: uncorrelated
ctnoi = T3 * epsilon / sqrt(gamma * delta);
if (ctnoi > 1.0) begin
ctnoi = 1.0;
end else if (ctnoi < 0.0) begin
ctnoi = 0.0;
end
// Empirical tuning of Sid, T1: saturation region, T8: subthreshold and linear region
T8 = 1.0 + noiLowId * noiLowId / (TNOIK2 + qia) * (Vdseff / Vdsat);
gamma = (Moc / Dvsat) * (T8 * gamma1 + T1 * gamma2);
// Sid level
sid = 4.0 * Vtm * `q * gamma * noiGd0;
// Empirical tuning of Sig by T2, RNOIB = 0 turns Sig off
delta = (Moc / 6.0) * Dvsat3 * T2 * (delta1 - delta2 + delta3);
// Sig ratio to Sid
sigrat = sqrt(delta / gamma) * NFINtotal * coxeff * WeffCV0 * LeffCV / noiGd0;
end
endcase

File diff suppressed because it is too large Load Diff

View File

@ -1,226 +0,0 @@
// ****************************************************************************
// * BSIM-CMG 111.0.0 released by Harshit Agarwal on 09/12/2019 *
// * BSIM Common Multi-Gate Model (Verilog-A) *
// ****************************************************************************
// ****************************************************************************
// * Copyright © 2019 University of California *
// * *
// * Project director: Prof. Chenming Hu *
// * *
// * Current developers: Harshit Agarwal (Postdoc) *
// * Pragya Kushwaha (Postdoc) *
// * Avirup Dasgupta (Postdoc) *
// * Yen-Kai Lin (Ph.D. student) *
// * Ming-Yen Kao (Ph.D. student) *
// ****************************************************************************
/*
Licensed under Educational Community License, Version 2.0 (the "License"); you may
not use this file except in compliance with the License. You may obtain a copy of the license at
http://opensource.org/licenses/ECL-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations
under the License.
BSIM-CMG model is supported by the members of Silicon Integration Initiative's Compact Model Coalition. A link to the most recent version of this
standard can be found at: http://www.si2.org/cmc
*/
// Variables
integer devsign;
real NFINtotal;
real DevTemp;
real ids0, ids0_ov_dqi, ids, vgs, vds, vdsx, sigvds, vch, etaiv;
real vgs_noswap, vds_noswap, vgd_noswap;
real qd, qg, qs, qb;
real ni, epssub, epssp, epsratio, Eg, Eg0, Nc;
real Lg, deltaL, deltaL1, deltaLCV, Leff, Leff_ln, Leff1, LeffCV, LeffCV_acc, Weff0, WeffCV0;
real cox, cdsc, cbox;
real phib, deltaPhi;
real T0, T1, T2, T3, T4, T4a, T5, T6, T7, T8, T9;
real Vtm, Vtm0, nVtm;
real beta, beta0;
real wf, wr;
real Dr, WeffWRFactor;
real RSourceGeo, RDrainGeo;
real Rdrain, Rsource;
real rdstemp, Rdsi, Rdss;
real DIBLfactor, PVAGfactor, diffVds, VaDIBL, Vgst2Vtm, Moc, Mclm;
real MclmCV, inv_MclmCV;
real Dvsat, Vdsat, inv_MEXP, DvsatCV, Nsat;
real Esat, EsatL, Esat1, Esat1L, EsatCV, EsatCVL;
real WVCox, Ta, Tb, Tc;
// Temperature effects
real Tnom, TRatio, TRatio_m1, dvth_temp, delTemp, ThetaSS;
real K0_t, K0SI_t, K2SI_t, K1_t, K2SAT_t, A1_t, A2_t;
real AIGBINV_t, AIGBACC_t, AIGC_t, AIGS_t, AIGD_t;
real BETA0_t, SII0_t, BGISL_t, BGIDL_t, igtemp, PTWG_t, PTWGR_t;
real ALPHA0_t, ALPHA1_t, ALPHAII0_t, ALPHAII1_t;
real CJS_t, CJSWS_t, CJSWGD_t, CJD_t, CJSWD_t, CJSWGS_t;
real PBS_t, PBSWS_t, PBSWGS_t, PBD_t, PBSWD_t, PBSWGD_t;
real JSS_t, JSWS_t, JSWGS_t, JSD_t, JSWD_t, JSWGD_t;
real JTSS_t, JTSD_t, JTSSWS_t, JTSSWD_t, JTSSWGS_t, JTSSWGD_t;
real NJTS_t, NJTSD_t, NJTSSW_t, NJTSSWD_t, NJTSSWG_t, NJTSSWGD_t;
real K2_t;
real K0SISAT_t, K2SISAT_t;
real ETA0_t, ETA0R_t;
real RSDR_t, RSDRR_t, RDDR_t, RDDRR_t;
real UA_t, UAR_t, UC_t, UCR_t, UCS_t, UD_t, UDR_t, U0R_t, ETAMOB_t;
real VSAT_t, VSATR_t, VSAT1_t, VSAT1R_t, VSATCV_t, MEXP_t, MEXPR_t;
// Surface potential
real q0;
real T10, T11, T12, T12a;
real e0, e1, e2;
// Accumulation model
real vgsfb, vgsfbeff;
// Short channel effects
real scl, vbi, phist, dvth_vtroll, dvth_dibl, dvth_rsce, dvth_all;
real tmp, Theta_SCE, Theta_SW, Theta_DIBL, Theta_RSCE, Theta_DITS;
// Lateral non-uniform doping effect
real Mnud;
// Body effect for BULKMOD = 1
real ves, vesx, vesmax, veseff;
real Mob;
// Quantum mechanical correction
real coxeff, Tcen0, Tcen, dvch_qm, MTcen;
real E0, E0prime, E1, E1prime, mx, mxprime, md, mdprime;
real gprime, gfactor, gam0, gam1, kT;
// Drain saturation voltage
real Vdseff, qis, qid, qbs, Dmobs;
// Midpoint potential and charge
real qia, qia2, qba, dqi;
real qb0;
real eta_mu, eta_mu_cv, Eeffm, Eeffm_cv, Dmob, Dmob_cv, u0, ueff, u0_a, u0r;
real Trat_ln, Eeffs, EeffFactor;
// Asymmetry model
real VSAT1_a, MEXP_a, PTWG_a, RSDR_a, RDDR_a, PDIBL1_a, VSAT_a;
// Geometry-dependent S/D resistance
real mu_max, mu_rsd, rhorsd, afin, thetarsp;
real Rsp, lt, arsd_total, prsd_total, alpha;
real eta, RrsdTML, Rrsdside, Rrsd;
real Rdsgeo, Arsd, Prsd;
// Geometry-dependent fringe capacitance
real Hg, Wg, Trsd, Hrsd, Cgg_top, Cgg_side, Cfr_geo, Acorner, Ccorner;
// Gate resistance
real ggeltd, Rgeltd;
// Gate current
real Vaux_Igbinv, igbinv, igsd_mult, igsd_mult0, igbs, igbd;
real Voxacc, Vaux_Igbacc, vfbzb, igbacc;
real igcs, igcd, igc0, Vdseffx, T1_exp;
real igisl, igidl, vfbsd, igs, igd, vgs_eff, vgd_eff;
real Aechvb, Bechvb, Toxratio, Toxratioedge;
// Impact ionization current
real Iii, Vdiff, Vdsatii, VgsStep, Ratio, ALPHAII;
// Accumulation capacitance
real cox_acc;
real qg_acc, qb_acc;
real vge;
// Parasitic capacitance
real qgs_ov, qgd_ov, qgs_fr, qgd_fr, qds_fr;
real qgs_parasitic, qgd_parasitic, Qes, Qed, Qeg;
real vgs_overlap, vgd_overlap, vge_overlap;
real cgsp, cgdp, csbox, cdbox, cgbox, vfbsdcv;
// Junction current and capacitance
real Ies, Ied, ves_jct, ved_jct;
real Czbs, Czbssw, Czbsswg, Czbd, Czbdsw, Czbdswg;
real arg, sarg, Qec;
real Qesj, Qesj1, Qesj2, Qesj3, Qedj, Qedj1, Qedj2, Qedj3;
real Isbs, Isbd, Nvtms, Nvtmd;
real SslpRev, IVjsmRev, VjsmRev, SslpFwd, IVjsmFwd, VjsmFwd, XExpBVS;
real DslpRev, IVjdmRev, VjdmRev, DslpFwd, IVjdmFwd, VjdmFwd, XExpBVD;
real igentemp, idsgen;
real vec1s, pb21s, vec2s, pb22s, vec3s, pb23s, vec1d, pb21d, vec2d, pb22d, vec3d, pb23d;
// NQS gate resistance
real gcrg, gtau, xdpart, IdovVds;
// Flicker noise
real litl, Esatnoi, Leffnoi, Leffnoisq, DelClm;
real N0, Nl, Nstar, Ssi, Swi, FNPowerAt1Hz;
// Thermal noise
real qinv, Gtnoi, sid;
real gspr, gdpr;
// Correlated thermal noise
real noiBeta, noiTheta, noiCorr, noiLowId, noiEta, noiWI, noiGd0, Dvsat3;
real T5_2, T5_3, T5_4, T7_2, T7_3, T7_4, T7_5;
real etaiv0, ids0_ov_dqi0, Rdsi0, Eeffm0;
real Mnud0, Mob0, Dmob0, Dvsat0, Dr0;
real gamma1, gamma2, gamma;
real delta1, delta2, delta3, delta;
real epsilon1, epsilon2, epsilon;
real ctnoi, sigrat;
// Self-heating
real gth, cth;
// Binning variables
real Inv_L, Inv_NFIN, Inv_LNFIN;
real NBODY_i, PHIG_i, CFD_i, CFS_i, COVS_i, COVD_i, CGSO_i, CGDO_i;
real CGSL_i, CGDL_i, CGBL_i, CKAPPAS_i, CKAPPAD_i, CKAPPAB_i;
real QMFACTOR_i, QMTCENCV_i, QMTCENCVA_i, KSATIV_i, KSATIVR_i, KSATIV_a;
real CDSC_i, CDSCD_i, CDSCD_a, CDSCDR_i, CIT_i, DVT0_i, CITR_i, CIT_a;
real DVT1_i, DVT1SS_i, PHIN_i, ETA0_i, ETA0_a, ETA0R_i, DSUB_i, VSAT_i, VSATR_i;
real DVTP0_i, DVTP1_i;
real K0_i, K01_i, K0SI_i, K0SI1_i, K2SI_i, K2SI1_i, PHIBE_i, K1_i, K11_i, K2SAT_i, K2SAT1_i;
real DELTAVSAT_i, PSAT_i, DELTAVSATCV_i, PSATCV_i, VSAT1_i, VSAT1R_i, PTWG_i, PTWGR_i, VSATCV_i;
real UP_i, U0_i, U0R_i, ETAMOB_i, NGATE_i, RDSW_i, UPR_i;
real PRWGS_i, PRWGD_i, WR_i, PDIBL1_i, PDIBL1R_i, PDIBL2_i, PDIBL2R_i, PDIBL2_a;
real DROUT_i, PVAG_i;
real AIGBINV_i, AIGBINV1_i, BIGBINV_i, CIGBINV_i, EIGBINV_i, NIGBINV_i;
real AIGBACC_i, AIGBACC1_i, BIGBACC_i, CIGBACC_i, NIGBACC_i;
real AIGC_i, AIGC1_i, BIGC_i, CIGC_i, PIGCD_i;
real AIGS_i, AIGS1_i, BIGS_i, CIGS_i, NTOX_i, POXEDGE_i;
real AIGD_i, AIGD1_i, BIGD_i, CIGD_i;
real AGIDL_i, BGIDL_i, CGIDL_i, EGIDL_i, PGIDL_i;
real AGISL_i, BGISL_i, CGISL_i, EGISL_i, PGISL_i;
real ALPHA0_i, ALPHA1_i, ALPHAII0_i, ALPHAII1_i, BETA0_i;
real BETAII0_i, BETAII1_i, BETAII2_i, ESATII_i;
real LII_i, SII0_i, SII1_i, SII2_i, SIID_i, TII_i;
real MEXP_i, MEXPR_i;
real PCLM_i, PCLMG_i, PCLMCV_i, PCLM_a, PCLMR_i;
real A1_i, A2_i, A11_i, A21_i;
real K1RSCE_i, LPE0_i, DVTSHIFT_i, DVTSHIFT_a, DVTSHIFTR_i;
real UA_i, UC_i, EU_i, UD_i, UCS_i, UAR_i, EUR_i, UCR_i, UDR_i, UA_a, UD_a, UC_a, EU_a;
real UA1_i, UA1R_i, UC1_i, UD1_i, UCSTE_i, UTE_i, UTL_i, EMOBT_i, UC1R_i, UD1R_i, UTER_i, UTLR_i;
real PTWGT_i;
real AT_i, ATCV_i, ATR_i;
real RDW_i, RSW_i;
real PRT_i, KT1_i, TSS_i, IIT_i, IGT_i, TGIDL_i;
real NTGEN_i, AIGEN_i, BIGEN_i;
real K0SISAT_i, K0SISAT1_i;
real K2SISAT_i, K2SISAT1_i;
real K2_i, K21_i;
real XRCRG1_i, XRCRG2_i;
real LINTIGEN_i;
real RDSWMIN_i, RDWMIN_i, RSWMIN_i;
real XL_i, LINT_i, DLBIN_i;
// Unified FinFET compact model
real Cins, Ach, Weff_UFCM, qdep, rc, vth_fixed_factor_Sub, vth_fixed_factor_SI, qm, qm_ln, Qdep_ov_Cins, qi_acc_for_QM;
real fieldnormalizationfactor, auxQMfact, QMFACTORCVfinal;
real psipclamp, sqrtpsip, nq, F0;
// Fringe capacitance
real Hr, Lr, Hgdelta, Lmax, y, x, Cnon, CcgSat, TT1, Ccg1, r1cf, Rcf, Ccg2;
real Ccg, C1, C2, C3, Cfglog, dcf, TT0, TT2, Cfgsat, Cfg;

File diff suppressed because it is too large Load Diff

View File

@ -1,40 +0,0 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015-2020, Auburn University
Mextram Model Intellectual Property Notice, Disclaimer and License
Software is distributed as is, completely without warranty or service
support. Auburn University, NXP Semiconductors, and Delft University of
Technology, along with their employees are not liable for the condition
or performance of the software.
NXP Semiconductors, Delft University of Technology, and Auburn
University own the copyright and grant users a perpetual, irrevocable,
worldwide, non-exclusive, royalty-free license with respect to the
software as set forth below.
NXP Semiconductors, Delft University of Technology, and Auburn
University hereby disclaim all implied warranties.
NXP Semiconductors, Delft University of Technology, and Auburn University grant
the users the right to modify, copy, and redistribute the software and
documentation, both within the user's organization and externally,
subject to the following restrictions:
1. The users agree not to charge for the NXP Semiconductors, Delft
University of Technology, and Auburn University-developed code itself
but may charge for additions, extensions, or support.
2. In any product based on the software, the users agree to acknowledge
NXP Semiconductors, Delft University of Technology, and Auburn
University that developed the software. This acknowledgment shall appear
in the product documentation.
3. Redistributions to others of source code and documentation must
retain the copyright notice, disclaimer, and list of conditions.
4. Redistributions to others in binary form must reproduce the copyright
notice, disclaimer, and list of conditions in the documentation and/or
other materials provided with the distribution.

View File

@ -1,38 +0,0 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015-2020, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
`include "frontdef.inc"
`define SUBSTRATE
module bjt505_va (c, b, e, s);
// External ports
inout c, b, e, s;
electrical e, b, c, s;
// Internal nodes
electrical e1, b1, b2, c1, c2, c3, c4;
// Noise node
electrical noi; // for correlated noise implementation
`include "parameters.inc"
`include "variables.inc"
`include "opvars.inc"
analog begin
`include "initialize.inc"
`include "tscaling.inc"
`include "evaluate.inc"
`include "noise.inc"
`include "opinfo.inc"
// The following can be used to print OP-info to std out:
// `include "op_print.inc"
end // analog
endmodule

View File

@ -1,40 +0,0 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015-2020, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
`include "frontdef.inc"
`define SELFHEATING
`define SUBSTRATE
module bjt505t_va (c, b, e, s, dt);
// External ports
inout c, b, e, s, dt;
electrical e, b, c, s;
thermal dt;
// Internal nodes
electrical e1, b1, b2, c1, c2, c3, c4;
// Noise node
electrical noi; // for correlated noise implementation
`include "parameters.inc"
`include "variables.inc"
`include "opvars.inc"
analog begin
`include "initialize.inc"
`include "tscaling.inc"
`include "evaluate.inc"
`include "noise.inc"
`include "opinfo.inc"
// The following can be used to print OP-info to std out:
// `include "op_print.inc"
end // analog
endmodule

View File

@ -1,37 +0,0 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015-2020, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
`include "frontdef.inc"
module bjtd505_va (c, b, e);
// External ports
inout c, b, e;
electrical e, b, c;
// Internal nodes
electrical e1, b1, b2, c1, c2, c3, c4;
// Noise node
electrical noi; // for correlated noise implementation
`include "parameters.inc"
`include "variables.inc"
`include "opvars.inc"
analog begin
`include "initialize.inc"
`include "tscaling.inc"
`include "evaluate.inc"
`include "noise.inc"
`include "opinfo.inc"
// The following can be used to print OP-info to std out:
// `include "op_print.inc"
end // analog
endmodule

View File

@ -1,39 +0,0 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015-2020, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
`include "frontdef.inc"
`define SELFHEATING
module bjtd505t_va (c, b, e, dt);
// External ports
inout c, b, e, dt;
electrical e, b, c;
thermal dt;
// Internal nodes
electrical e1, b1, b2, c1, c2, c3, c4;
// Noise node
electrical noi; // for correlated noise implementation
`include "parameters.inc"
`include "variables.inc"
`include "opvars.inc"
analog begin
`include "initialize.inc"
`include "tscaling.inc"
`include "evaluate.inc"
`include "noise.inc"
`include "opinfo.inc"
// The following can be used to print OP-info to std out:
// `include "op_print.inc"
end // analog
endmodule

View File

@ -1,702 +0,0 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015-2020, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
// Evaluate model equations
// Currents and charges
// Nodal biases
Vb2c1 = type * V(b2, c1);
Vb2c2 = type * V(b2, c2);
Vb2e1 = type * V(b2, e1);
Vb1e1 = type * V(b1, e1);
Vb1b2 = type * V(b1, b2);
`ifdef SUBSTRATE
Vsc1 = type * V(s, c1);
`endif
Vc1c2 = type * V(c1, c2);
Vee1 = type * V(e, e1);
Vbb1 = type * V(b, b1);
Vbe = type * V(b, e);
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.0;
Vc3c4 = type * V(c3, c1);
end
end else begin
if (rcbli > 0.0) begin
Vc4c1 = type * V(c4, c1);
Vc3c4 = 0.0;
end else begin
Vc4c1 = 0.0;
Vc3c4 = 0.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
`expLin(eVb2c2,Vb2c2 * VtINV,vexlim)
`expLin(eVb2e1,Vb2e1 * VtINV / nff_t,vexlim)
`expLin(eVb1c4,Vb1c4 * VtINV,vexlim)
`expLin(eVb1b2,Vb1b2 * VtINV,vexlim)
`expLin(eVbc3,Vbc3 * VtINV,vexlim)
`ifdef SUBSTRATE
`expLin(eVsc1,Vsc1 * VtINV,vexlim)
// RvdT MXT504.10, new: eVsc3, eVsc4
`expLin(eVsc3,Vsc3 * VtINV,vexlim)
`expLin(eVsc4,Vsc4 * VtINV,vexlim)
`endif
`expLin(eVbc3vdc,(Vbc3 - vdc_t) * VtINV,vexlim)
`expLin(eVb1c4vdc,(Vb1c4 - vdc_t) * VtINV,vexlim)
`expLin(eVb2c2vdc,(Vb2c2 - vdc_t) * VtINV,vexlim)
`expLin(eVb2c1vdc,(Vb2c1 - vdc_t) * VtINV,vexlim)
// Governing equations
// Epilayer model
K0 = sqrt(1.0 + 4.0 * eVb2c2vdc);
Kw = sqrt(1.0 + 4.0 * eVb2c1vdc);
pW = 2.0 * eVb2c1vdc / (1.0 + Kw);
if (pW < `TEN_M40) pW = 0.0;
Ec = Vt * (K0 - Kw - ln((K0 + 1.0) / (Kw + 1.0)) );
Ic1c2 = (Ec + Vc1c2) / rcv_t;
if (Ic1c2 > 0.0) begin
`linLog(tmpV,Vb2c1,100.0)
Vqs_th = vdc_t +
2.0 * Vt * ln(0.5 * Ic1c2 * rcv_t * VtINV + 1.0) - tmpV;
eps_vdc = 0.2 * vdc_t;
`max_hyp0(Vqs, Vqs_th, eps_vdc)
Iqs = Vqs * (Vqs + ihc * scrcv) / (scrcv * (Vqs + ihc * rcv_t));
Ic1c2_Iqs = Ic1c2 / Iqs;
`max_logexp(alpha1, Ic1c2_Iqs, 1.0, axi)
alpha = alpha1 / (1.0 + axi * ln(1.0 + exp(-1.0 / axi)));
vyi = Vqs / (ihc * scrcv);
yi = (1.0 + sqrt(1.0 + 4.0 * alpha * vyi * (1.0 + vyi))) /
(2.0 * alpha * (1.0 + vyi));
//xi_w = 1.0 - yi / (1.0 + pW * yi);
/* Niu 5/23/2015, fixes numerical discontinuity at forward/reverse transition,
see "Epi layer model improvement of smoothness at I=0" */
xi_w = (1.0 - yi + pW * yi) / (1.0 + pW * yi);
gp0 = 0.5 * Ic1c2 * rcv_t * xi_w * VtINV;
gp0_help = 2.0 * gp0 + pW * (pW + gp0 + 1.0);
gp02 = 0.5 * (gp0 - 1.0);
sqr_arg = gp02 * gp02 + gp0_help;
if (gp0 >= 1.0) begin
p0star = gp02 + sqrt(sqr_arg);
end else begin
p0star = gp0_help / (sqrt(sqr_arg) - gp02);
end
if (p0star < `TEN_M40) begin
p0star = 0.0;
end
eVb2c2star = p0star * (p0star + 1.0) * exp(vdc_t * VtINV);
B1 = 0.5 * scrcv * (Ic1c2 - ihc);
B2 = scrcv * rcv_t * ihc * Ic1c2;
Vxi0 = B1 + sqrt(B1 * B1 + B2);
if (swvchc == 0) begin
Vch = vdc_ctc_t * 0.1;
end else begin
Vch = vdc_ctc_t * (0.1 + 2.0 * Ic1c2 / (Ic1c2 + Iqs));
end
Icap = ihc * Ic1c2 / (ihc + Ic1c2);
Icap_ihc = ihc / (ihc + Ic1c2);
end else begin
Iqs = 0.0;
p0star = 2.0 * eVb2c2vdc / (1.0 + K0);
eVb2c2star = eVb2c2;
if ((abs(Vc1c2) < 1.0e-5 * Vt) ||
(abs(Ec) < `TEN_M40 * Vt * (K0 + Kw))) begin
pav = 0.5 * (p0star + pW);
xi_w = pav / (pav + 1.0);
end else begin
xi_w = Ec / (Ec + Vb2c2 - Vb2c1);
end
Vxi0 = Vc1c2;
Vch = 0.1 * vdc_ctc_t;
Icap = Ic1c2;
Icap_ihc = 1.0 - Icap / ihc;
end
// Effective EB junction capacitance bias
Vfe = vde_t * (1.0 - pow(`AJE , -1.0 / pe));
a_vde = 0.1 * vde_t;
`min_logexp(Vje, Vb2e1, Vfe, a_vde)
// RvdT, November 2008, E0EB to be re-used in EB- Zener tunnel model:
E0EB = pow(1.0 - Vje * inv_vde_t, 1.0 - pe);
Vte = vde_t / (1.0 - pe) * (1.0 - E0EB) +
`AJE * (Vb2e1 - Vje);
// Effective CB junction capacitance bias switch
if (swvjunc == 1) begin
// ignore epi layer voltage drop
Vjunc = Vb2c1;
end else if (swvjunc == 2) begin
// 504, using resistance at xi=0
Vjunc = Vb2c1 + Vxi0;
end else begin
// default
Vjunc = Vb2c2;
end
bjc = (`AJC - xp_t) / (1.0 - xp_t);
Vfc = vdc_ctc_t * (1.0 - pow(bjc, -1.0 / pc));
`min_logexp(Vjc, Vjunc, Vfc, Vch)
fI = pow(Icap_ihc, mc);
Vcv = vdc_ctc_t / (1.0 - pc) * (1.0 - fI * pow(1.0 - Vjc / vdc_ctc_t, 1.0 - pc)) +
fI * bjc * (Vjunc - Vjc);
Vtc = (1.0 - xp_t) * Vcv + xp_t * Vb2c1;
// Transfer current
If0 = 4.0 * is_t / ik_t;
// nff effect included in eVb2e1 definition,
// necessary to keep Qbe/If ratio at transit time,
// so that the effective transit time is not affected
// by addition of nff
f1 = If0 * eVb2e1;
n0 = f1 / (1.0 + sqrt(1.0 + f1));
// nfr effect on diffusion charge included here
eVb2c2star_nfr = pow(eVb2c2star, 1.0 / nfr_t);
f2 = If0 * eVb2c2star_nfr;
nB = f2 / (1.0 + sqrt(1.0 + f2));
if (deg == 0.0) begin
q0I = 1.0 + Vte / ver_t + Vtc / vef_t;
end else begin
termE = (Vte / ver_t + 1.0) * deg_t * VtINV;
termC = -Vtc / vef_t * deg_t * VtINV;
q0I = (exp(termE) - exp(termC)) /
(exp(deg_t * VtINV) - 1.0);
end
`max_hyp0(q1I, q0I, 0.1)
qBI = q1I * (1.0 + 0.5 * (n0 + nB));
Ir = issr * is_t * eVb2c2star_nfr;
If = is_t * eVb2e1;
In = (If - Ir) / qBI;
// Base and substrate current(s)
`expLin(tmpExp,Vb2e1 * VtINV / nbi,vexlim)
if (xrec == 0.0) begin
Ib1 = ibi_t * (tmpExp - 1.0);
end else begin
Ib1 = ibi_t * ((1.0 - xrec) * (tmpExp - 1.0) +
xrec * (tmpExp + eVb2c2star - 2.0) * (1.0 + Vtc / vef_t));
end
`expLin(tmpExp,Vb1e1 * VtINV / nbis,vexlim)
Ib1_s = ibis_t * (tmpExp - 1.0);
`expLin(tmpExp,Vb2e1 * VtINV / mlf,vexlim)
Ib2 = ibf_t * (tmpExp - 1.0) + GMIN * Vb2e1;
`expLin(tmpExp,Vb1e1 * VtINV / mlfs,vexlim)
Ib2_s = ibfs_t * (tmpExp - 1.0);
`expLin(tmpExp,Vb1c4 * VtINV / mlr,vexlim)
Ib3 = ibr_t * (tmpExp - 1.0) + GMIN * Vb1c4;
`expLin(tmpExp,Vb1e1 * VtINV / nfibrel,vexlim)
Ibrel = isibrel_t * (tmpExp - 1.0);
// begin RvdT, November 2008, MXT504.8_alpha
// Base-emitter tunneling current
// max E-field E0BE calculated in BE depletion charge model:
if ((izeb > 0.0) && (nzeb > 0.0) && (Vb2e1 < Vfmax_z)) begin
`expLin(expnzeb, nzeb_t * (1.0 - (pow2_2m_pe / (2.0 * E0EB))),vexlim)
// Force all derivatives at Vb2e1=0 to zero by using in dzeb a
// modified dE0EB expression for E0EB:
x = Vb2e1 * inv_vde_t;
dE0EB = pow(-x, -2.0 - pe) *
(pe * (1.0 - pe * pe - 3.0 * x * (pe - 1.0)) -
6.0 * x * x * (pe - 1.0 + x)) *
`one_sixth;
zeb = Vb2e1 * pow2_2m_pe * nzeb_t / (vgzeb_t * dE0EB) - 1.0e-7;
`expLin(e_zeb,zeb,vexlim)
dzeb = -Vb2e1 * (zeb - e_zeb + 1.0) / zeb;
Izteb = 2.0 * izeb_t * dzeb * E0EB * expnzeb * inv_vde_t * pow2_pe_m2;
end else begin
dzeb = 0.0;
Izteb = 0.0;
end
// end RvdT, November 2008, MXT504.8_alpha
// 505. Collector-base tunneling current
// max E-field E0CB calculated from CB capacitance using dedicated Vdc_zener and Pc_zener:
if ((izcb > 0.0) && (nzcb > 0.0) && (Vb2c1 < Vfmax_z)) begin
E0CB = pow(1.0 - Vb2c1 * inv_vdc_zener_t, 1.0 - Pc_zener);
`expLin(expnzcb, nzcb_t * (1.0 - (pow2_2m_pc / (2.0 * E0CB))),vexlim)
xx = Vb2c1 * inv_vdc_zener_t;
dE0CB = pow(-xx, -2.0 - Pc_zener) *
(Pc_zener * (1.0 - Pc_zener * Pc_zener - 3.0 * xx * (Pc_zener - 1.0)) -
6.0 * xx * xx * (Pc_zener - 1.0 + xx)) *
`one_sixth;
zcb = Vb2c1 * pow2_2m_pc * nzcb_t / (vgzcb_t * dE0CB) - 1.0e-7;
`expLin(e_zcb,zcb,vexlim)
dzcb = -Vb2c1 * (zcb + 1.0 - e_zcb) / zcb;
Iztcb = 2.0 * izcb_t * dzcb * E0CB * expnzcb * inv_vdc_zener_t * pow2_pc_m2;
end else begin
dzcb = 0.0;
Iztcb = 0.0;
end
// Iex, Isub (XIex, XIsub)
g1 = If0 * eVb1c4;
g2 = 4.0 * eVb1c4vdc;
// nBex until and including MXT 504.9:
// nBex = g1 / (1.0 + sqrt(1.0 + g1));
// nBex since MXT 504.10.1: Ackn. Jos Peters, Geoffrey Coram
nBex = (g1 - If0) / (1.0 + sqrt(1.0 + g1));
pWex = g2 / (1.0 + sqrt(1.0 + g2));
/* Iex until and including MXT 504.9:
Iex = (1.0 / BRI_T) * (0.5 * ik_t * nBex - is_t);
*/
// Iex since MXT 505.0 - hole injection from p+ extrinsic base into n-epi
Iex = 2.0 * ibx_t * (eVb1c4 - 1.0) / (1.0 + sqrt(1.0 + 4.0 * ibx_t / ikbx_t * eVb1c4));
`ifdef SUBSTRATE
// RvdT MXT504.10, new term: eVsc4
if (exsub == 1) begin
Isub_int = xisubi * 2.0 * iss_t * (eVb2c2 - eVsc1) /
(1.0 + sqrt(1.0 + 4.0 * (iss_t / iks_t) * (eVb2c2 + swvsch * eVsc1)));
Isub = (1.0 - xisubi) * 2.0 * iss_t * (eVb1c4 - eVsc4) /
(1.0 + sqrt(1.0 + 4.0 * (iss_t / iks_t) * (eVb1c4 + swvsch * eVsc4)));
end else begin
Isub_int = xisubi * 2.0 * iss_t * (eVb2c2 - 1.0) /
(1.0 + sqrt(1.0 + 4.0 * (iss_t / iks_t) * eVb2c2));
Isub = (1.0 - xisubi) * 2.0 * iss_t * (eVb1c4 - 1.0) /
(1.0 + sqrt(1.0 + 4.0 * (iss_t / iks_t) * eVb1c4));
end
Isf = 2.0 * icss_t * (eVsc1 - 1.0) /
(1.0 + sqrt(1.0 + swvsch * 4.0 * (icss_t / ikcs_t) * eVsc1)) + Vsc1 * GMIN_cs;
`endif
XIex =0.0;
`ifdef SUBSTRATE
XIsub = 0.0;
`endif
/* beginof RvdT, Q4 2012, Mextram 504.11: added exmod=2 option: */
Fex = 1.0;
if ((exmod > 0.0) && (xext > 0.0)) begin
Iex = Iex * Xext1;
`ifdef SUBSTRATE
Isub = Isub * Xext1;
`endif
/* XIMex until and including MXT 504.9:
XIMex = xext * (0.5 * ik_t * XnBex - is_t) / BRI_T;
*/
// XIMex 505.0.0:
XIMex = xext * 2.0 * ibx_t * (eVbc3 - 1.0) / (1.0 + sqrt(1.0 + 4.0 * ibx_t / ikbx_t * eVbc3));
`ifdef SUBSTRATE
// RvdT MXT504.10, new term: eVsc3
if (exsub == 1) begin
XIMsub = (1.0 - xisubi) * xext * 2.0 * iss_t * (eVbc3 - eVsc3) /
(1.0 + sqrt(1.0 + 4.0 * iss_t / iks_t * (eVbc3 + swvsch * eVsc3)));
end else begin
XIMsub = (1.0 - xisubi) * xext * 2.0 * iss_t * (eVbc3 - 1.0) /
(1.0 + sqrt(1.0 + 4.0 * iss_t / iks_t * eVbc3));
end
`else
XIMsub = 0.0;
`endif
if (exmod == 1) begin
`ifdef SUBSTRATE
Vex_bias = xext * (ibx_t + iss_t) * rcc_xx_t;
`else
Vex_bias = xext * ibx_t * rcc_xx_t;
`endif
Vex = Vt * (2.0 - ln( Vex_bias * VtINV ));
vdif = Vbc3 - Vex;
`max_hyp0(VBex, vdif, 0.11)
Fex = VBex /(Vex_bias + (XIMex + XIMsub) * rcc_xx_t + VBex);
end else begin
Vex = 0.0;
vdif = 0.0;
VBex = 0.0;
Fex = 1.0;
end
/* endof: RvdT, Q4, 2012, Mextram 504.11: added exmod=2 option: */
XIex = Fex * XIMex;
`ifdef SUBSTRATE
XIsub = Fex * XIMsub;
`endif
end
// Breakdown of CB junction
if (swjbrcb == 1) begin
Vb1c1 = Vb1b2 + Vb2c1;
`max_hyp0(Vcbeff, -1.0 * Vb1c1, 1e-6)
f_stop = 1.0 / (1.0 - pow(alpha_brcb, pbrcb));
Vcbr_stop = alpha_brcb * vbrcb;
dfbrcb = f_stop * f_stop * pow(alpha_brcb, pbrcb - 1.0) * pbrcb / vbrcb;
if (Vcbeff < Vcbr_stop) begin
fbrcb = 1.0 / (1.0 - pow(Vcbeff / vbrcb, pbrcb));
end else begin
fbrcb = f_stop + (Vcbeff - Vcbr_stop) * dfbrcb;
end
end else begin
fbrcb = 1.0;
end
Iztcb = Iztcb * fbrcb;
Iex = Iex * fbrcb;
Ib3 = Ib3 * fbrcb;
XIex = XIex * fbrcb;
// Variable base resistance
q0Q = 1.0 + Vte / ver_t + Vtc / vef_t;
`max_hyp0(q1Q, q0Q, 0.1)
qBQ = q1Q * (1.0 + 0.5 * (n0 + nB));
Rb2 = 3.0 * rbv_t / qBQ;
Ib1b2 = (2.0 * Vt * (eVb1b2 - 1.0) + Vb1b2) / Rb2;
// Avalanche factor and avalanche current
Gem = 0.0;
Iavl = 0.0;
if (In > 0.0) begin
if (swavl == 1) begin
if (Vb2c1 < vdcavl) begin
`expLin(expIn,-In / itoavl,vexlim)
vl = (vdcavl - Vb2c1) * expIn;
`expLin(expMm1,-bavl_t * pow(vl, cavl),vexlim)
Gem = aavl / bavl_t * vl * expMm1;
end
end else if (swavl == 2) begin
if (Vb2c1 < vdc_t) begin
dEdx0 = 2.0 * vavl / (wavl * wavl);
sqr_arg = (vdc_t - Vb2c1) / Icap_ihc;
xd = sqrt(2.0 * sqr_arg / dEdx0);
if (exavl == 0) begin
Weff = wavl;
end else begin
xi_w1 = 1.0 - 0.5 * xi_w;
Weff = wavl * xi_w1 * xi_w1;
end
Wd = xd * Weff / sqrt(xd * xd + Weff * Weff);
Eav = (vdc_t - Vb2c1) / Wd;
E0 = Eav + 0.5 * Wd * dEdx0 * Icap_ihc;
if (exavl == 0) begin
Em = E0;
end else begin
SHw = 1.0 + 2.0 * sfh * (1.0 + 2.0 * xi_w);
Efi = (1.0 + sfh) / (1.0 + 2.0 * sfh);
Ew = Eav - 0.5 * Wd * dEdx0 * (Efi - In / (ihc * SHw));
sqr_arg = (Ew - E0) * (Ew - E0) + 0.1 * Eav * Eav * Icap / ihc;
Em = 0.5 * (Ew + E0 + sqrt(sqr_arg));
end
EmEav_Em = (Em - Eav) / Em;
if (abs(EmEav_Em) > `TEN_M07) begin
lambda = 0.5 * Wd / EmEav_Em;
Gem = An / Bnt * Em * lambda *
(exp(-Bnt / Em) - exp(-Bnt / Em * (1.0 + Weff / lambda)) );
end else begin
Gem = An * Weff * exp(-Bnt / Em);
end
end
end else if (swavl == 3) begin
if (Vb2c1 < vdcavl) begin
Vdeptmp = pow((vdcavl - Vb2c1), cavl) * pow((1 - In/(ihcavl+In)), davl);
if (exavl == 0) begin
Vdep = Vdeptmp;
end else begin
In_shift_ihcavl = (In-ionexavl) / ihcavl;
`max_logexp(In_shift_n, In_shift_ihcavl, 1.0, aexavl)
Vdep = Vdeptmp * pow(In_shift_n,eavl);
end
`expLin(expMm1,-bavl_t * Vdep,vexlim)
Gem = aavl / bavl_t * (vdcavl - Vb2c1) * expMm1;
end
end
if (Gem > 0.0) begin
if (swgemlim == 1) begin
Gmax = Vt / (In * (rbc_t + Rb2)) + qBI / is_t * ibi_t +
re_t / (rbc_t + Rb2);
if (swavl == 3) begin
`min_logexp(Gem, Gem, Gmax, 1e-6)
Iavl = In * Gem;
end else begin
Iavl = In * Gem* Gmax / (Gem + Gmax);
end
end else begin
Iavl = In * Gem;
end
end
end
if (eVb2c2star > 0.0) begin
Vb2c2star = Vt * ln(eVb2c2star);
end else begin
Vb2c2star = Vb2c2;
end
`ifdef SELFHEATING
// Power dissipation
// RvdT 03-12-2007, modified power equation due to distribution collector resistance
power = In * (Vb2e1 - Vb2c2star) +
Ic1c2 * (Vb2c2star - Vb2c1) -
Iavl * Vb2c2star +
Vee1 * Vee1 / re_t +
Vcc3 * Vcc3 * gcc_xx_t +
Vc3c4 * Vc3c4 * gcc_ex_t +
Vc4c1 * Vc4c1 * gcc_in_t +
Vbb1 * Vbb1 / rbc_t +
Ib1b2 * Vb1b2 +
// 504.8: Nov. 2008, RvdT, TU_Delft: Zener current contribution added:
// Izteb > 0 for Vb2e1 < 0, hence the minus sign:
(Ib1 + Ib2 - Izteb) * Vb2e1 - Iztcb * Vb2c2 +
(Ib1_s + Ib2_s + Ibrel) * Vb1e1 +
`ifdef SUBSTRATE
(Iex + Ib3) * Vb1c4 + XIex * Vbc3 +
Isub * (Vb1c4 - Vsc4) +
// Vb2s = Vb2c2 - Vsc2 = Vb2c1 - Vsc1 to avoid defining Vsc2
Isub_int * (Vb2c1 - Vsc1) +
XIsub * (Vbc3 - Vsc3) +
Isf * Vsc1;
`else
(Iex + Ib3) * Vb1c4 + XIex * Vbc3;
`endif
`endif
// Charges
Qte = (1.0 - xcje) * cje_t * Vte;
`min_logexp(Vje_s, Vb1e1, Vfe, a_vde)
Qte_s = xcje * cje_t * (vde_t / (1.0 - pe) *
(1.0 - pow(1.0 - Vje_s * inv_vde_t, 1.0 - pe)) +
`AJE * (Vb1e1 - Vje_s));
Qtc = xcjc * cjc_t * Vtc;
Qb0 = taub_t * ik_t;
Qbe_qs = 0.5 * Qb0 * n0 * q1Q;
Qbc_qs = 0.5 * Qb0 * nB * q1Q;
a_vdcctc = 0.1 * vdc_ctc_t;
`min_logexp(Vjcex, Vb1c4, Vfc, a_vdcctc)
Vtexv = vdc_ctc_t / (1.0 - pc) * (1.0 - pow(1.0 - Vjcex / vdc_ctc_t, 1.0 - pc)) +
bjc * (Vb1c4 - Vjcex);
Qtex = cjc_t * ((1.0 - xp_t) * Vtexv + xp_t * Vb1c4) *
(1.0 - xcjc) * (1.0 - xext);
`min_logexp(XVjcex, Vbc3, Vfc, a_vdcctc)
XVtexv = vdc_ctc_t / (1.0 - pc) * (1.0 - pow(1.0 - XVjcex / vdc_ctc_t, 1.0 - pc)) +
bjc * (Vbc3 - XVjcex);
XQtex = cjc_t * ((1.0 - xp_t) * XVtexv + xp_t * Vbc3) *
(1.0 - xcjc) * xext;
`ifdef SUBSTRATE
a_vds = 0.1 * vds_t;
Vfs = vds_t * (1.0 - pow(`AJS , -1.0 / ps));
`min_logexp(Vjs, Vsc1, Vfs, a_vds)
Qts = cjs_t * (vds_t / (1.0 - ps) *
(1.0 - pow(1.0 - Vjs / vds_t, 1.0 - ps)) + `AJS * (Vsc1 - Vjs));
`endif
Qe0 = taue_t * ik_t * pow(is_t / ik_t, 1.0 / mtau);
`expLin(tmpExp,Vb2e1 / (mtau * Vt),vexlim)
// Niu Q2, 2016, for fixing reverse VBE noise when ke=1, kc=1,
// Previous Qe_qs causes unphysically large noise correlation time constant tau_n
Qe_qs = Qe0 * tmpExp;
Qepi0 = 4.0 * tepi_t * Vt / rcv_t;
Qepi = 0.5 * Qepi0 * xi_w * (p0star + pW + 2.0);
if (swqex == 0) begin
Qex = taur_t * 0.5 * (Qb0 * nBex + Qepi0 * pWex) / (taub_t + tepi_t);
end else begin
`expLin(eVb1c4vdcex,(Vb1c4 - vdcex_t) * VtINV,vexlim)
Qex = 2.0 * ibx_t * tauex_t * eVb1c4 / (1.0 + sqrt(1.0 + 4.0 * eVb1c4vdcex));
end
XQex = 0.0;
if (((exmod == 1) || (exmod == 3)) && (xext > 0.0)) begin
Qex = Qex * Xext1;
if (swqex == 0) begin
Xg1 = If0 * eVbc3;
// XnBex until and including MXT 504.9:
// XnBex = Xg1 / (1.0 + sqrt(1.0 + Xg1));
// XnBex in MXT 504.10.1: Ackn. Jos Peters, Geoffrey Coram:
XnBex = (Xg1 - If0) / (1.0 + sqrt(1.0 + Xg1));
Xg2 = 4.0 * eVbc3vdc;
XpWex = Xg2 / (1.0 + sqrt(1.0 + Xg2));
XQMex = 0.5 * xext * taur_t *
(Qb0 * XnBex + Qepi0 * XpWex) / (taub_t + tepi_t);
end else begin
`expLin(eVbc3vdcex,(Vbc3 - vdcex_t) * VtINV,vexlim)
XQMex = 2.0 * xext * ibx_t *
tauex_t * eVbc3 / (1.0 + sqrt(1.0 + 4.0 * eVbc3vdcex));
end
XQex = Fex * XQMex;
end
Qb1b2 = 0.0;
if (exphi == 1) begin
dVteVje = pow(1.0 - Vje * inv_vde_t, -pe) - `AJE;
Vb2e1Vfe = (Vb2e1 - Vfe) / a_vde;
if (Vb2e1Vfe < 0.0) begin
dVjeVb2e1 = 1.0 / (1.0 + exp(Vb2e1Vfe));
end else begin
dVjeVb2e1 = exp(- Vb2e1Vfe) / (1.0 + exp(- Vb2e1Vfe));
end
dVteVb2e1 = dVteVje * dVjeVb2e1 + `AJE;
dQteVb2e1 = (1.0 - xcje) * cje_t * dVteVb2e1;
// nff needs to be in diffusion capacitance too
// Note that eVb2e1 includes nff_t
dn0Vb2e1 = If0 * eVb2e1 * VtINV / nff_t * (0.5 / sqrt(1.0 + f1));
dQbeVb2e1 = 0.5 * Qb0 * q1Q * dn0Vb2e1;
// Niu, Q2 2016. Modified to fix reverse VBE noise problem.
dQeVb2e1 = Qe_qs / (mtau * Vt);
Qb1b2 = 0.2 * Vb1b2 * (dQteVb2e1 + dQbeVb2e1 + dQeVb2e1);
Qe = (1.0 - ke) * Qe_qs;
Qbe_qs_eff = Qbe_qs + ke * Qe_qs;
Qbc = xqb * Qbe_qs_eff + Qbc_qs;
Qbe = (1.0 - xqb) * Qbe_qs_eff;
end else begin
Qbe = Qbe_qs;
Qbc = Qbc_qs;
Qe = Qe_qs;
end
// Add branch current contributions
// Static currents
I(c1, c2) <+ type * Ic1c2 * mult;
I(c2, e1) <+ type * In * mult;
I(b1, e1) <+ type * (Ib1_s + Ib2_s + Ibrel) * mult;
// begin RvdT, 28-10-2008, MXT504.8_alpha
// contribution tunnel current added
I(b2, e1) <+ type * (Ib1 + Ib2 - Izteb) * mult;
// CB tunneling current
I(b2, c2) <+ type * (-Iztcb) * mult;
`ifdef SUBSTRATE
I(b1, s) <+ type * Isub * mult;
I(b2, s) <+ type * Isub_int * mult;
I(b, s) <+ type * XIsub * mult;
I(s, c1) <+ type * Isf * mult;
`endif
I(b1, b2) <+ type * Ib1b2 * mult;
I(b2, c2) <+ type * (-1.0 * Iavl) * mult;
I(e, e1) <+ type * Vee1 / re_t * mult;
I(b, b1) <+ type * Vbb1 / rbc_t * mult;
`ifdef SELFHEATING
// Electrical equivalent for the thermal network
Pwr(dt) <+ Temp(dt) / rth_tamb * mult;
Pwr(dt) <+ ddt(cth * Temp(dt)) * mult;
Pwr(dt) <+ -1.0 * power * mult;
`endif
// Dynamic currents
I(b2, e1) <+ ddt(type * (Qte + Qbe + Qe)) * mult;
I(b1, e1) <+ ddt(type * (Qte_s)) * mult;
I(b2, c2) <+ ddt(type * (Qtc + Qbc + Qepi)) * mult;
`ifdef SUBSTRATE
I(s, c1) <+ ddt(type * Qts) * mult;
`endif
I(b1, b2) <+ ddt(type * Qb1b2) * mult;
I(b, e) <+ ddt(type * cbeo * Vbe) * mult;
I(b, c) <+ ddt(type * cbco * Vbc) * mult;
//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 * mult;
I(c, c3) <+ type * Vcc3 * gcc_xx_t * mult;
I(b, c3) <+ ddt(type * (XQtex + XQex)) * mult;
if (rcbli > 0.0) begin
I(c4, c1) <+ type * Vc4c1 * gcc_in_t * mult;
I(b1, c4) <+ type * (Ib3 + Iex) * mult;
I(c3, c4) <+ type * Vc3c4 * gcc_ex_t * mult;
I(b1, c4) <+ ddt(type * (Qtex + Qex)) * mult;
end else begin
V(c4, c1) <+ 0.0;
I(b1, c1) <+ type * (Ib3 + Iex) * mult;
I(b1, c1) <+ ddt(type * (Qtex + Qex)) * mult;
I(c3, c1) <+ type * Vc3c4 * gcc_ex_t * mult;
end
end else begin
V(c3, c4) <+ 0.0;
if (rcbli > 0.0) begin
I(b, c4) <+ type * XIex * mult;
I(c, c4) <+ type * Vcc3 * gcc_xx_t * mult;
I(c4, c1) <+ type * Vc4c1 * gcc_in_t * mult;
I(b1, c4) <+ type * (Ib3 + Iex) * mult;
I(b1, c4) <+ ddt(type * (Qtex + Qex)) * mult;
I(b, c4) <+ ddt(type * (XQtex + XQex)) * mult;
end else begin
I(b, c1) <+ type * XIex * mult;
I(c, c1) <+ type * Vcc3 * gcc_xx_t * mult;
V(c4, c1) <+ 0.0;
I(b1, c1) <+ type * (Ib3 + Iex) * mult;
I(b1, c1) <+ ddt(type * (Qtex + Qex)) * mult;
I(b, c1) <+ ddt(type * (XQtex + XQex)) * mult;
I(c3, c1) <+ type * Vc3c4 * gcc_ex_t * mult;
end
end

View File

@ -1,112 +0,0 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015-2020, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
// Front definitions
`include "discipline.h"
// Numerical, physical and model constants
`define TEN_M40 1.0e-40
`define TEN_M07 1.0e-7
`define C2K 273.15
`define KB 1.3806226e-23
`define QQ 1.6021918e-19
`define KBdivQQ 8.61708691805812512584e-5
`define one_third 0.33333333333333333333
`define one_sixth 0.16666666666666666667
`define VDLOW 0.05
`define AJE 3.0
`define AJC 2.0
`define AJS 2.0
`define PI 3.14159265358979323846
`define LN2 0.69314718055994530942
// Smooth limiting functions
`define max_hyp0(result, x, epsilon)\
eps2 = epsilon * epsilon;\
x2 = x * x;\
if (x < 0.0) begin\
result = 0.5 * eps2 / (sqrt(x2 + eps2) - x);\
end else begin\
result = 0.5 * (sqrt(x2 + eps2) + x);\
end
`define min_logexp(result, x, x0, a)\
dxa = (x - x0) / (a);\
if (x < x0) begin\
result = x - a * ln(1.0 + exp(dxa));\
end else begin\
result = x0 - a * ln(1.0 + exp(-dxa));\
end
`define max_logexp(result, x, x0, a)\
dxa = (x - x0) / (a);\
if (x < x0) begin\
result = x0 + a * ln(1.0 + exp(dxa));\
end else begin\
result = x + a * ln(1.0 + exp(-dxa));\
end
`define expLin(result, x, vexlim)\
if ((x) < vexlim) begin\
result = exp(x);\
end else begin\
expl = exp(vexlim);\
result = expl * (1.0 + ((x) - vexlim));\
end
`define linLog(result, x, vlim)\
if (x < vlim) begin\
result = x;\
end else begin\
result = vlim + ln(1.0 + (x - vlim));\
end
// Macros for the model/instance parameters
//
// MPRxx model parameter real
// MPIxx model parameter integer
// IPRxx instance parameter real
// IPIxx instance 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;
`define IPRnb(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def;
`define IPRoo(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from(lwr:upr);
`define OPP(nam,uni,des) (* desc=des, units=uni *) real nam;
`define OPM(nam,uni,des) (* desc=des, units=uni, multiplicity="multiply" *) real nam;
`define OPD(nam,uni,des) (* desc=des, units=uni, multiplicity="divide" *) real nam;

View File

@ -1,78 +0,0 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015-2020, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
// Initialize model constants
// Impact ionization constants (NPN - PNP)
if (type == 1) begin
An = 7.03e7;
Bn = 1.23e8;
end else begin
An = 1.58e8;
Bn = 2.04e8;
end
Xext1 = 1.0 - xext;
// Reference Temperature expressed in Kelvin:
Trk = tref + `C2K;
// Ambient Temperature expressed in Kelvin:
Tamb = $temperature + dta;
// Minimum conductance:
GMIN = $simparam("gmin", 0.0);
// icss flag
`ifdef SUBSTRATE
if (icss > 0) begin
GMIN_cs = GMIN;
end else begin
GMIN_cs = 0.0;
end
`endif
// nff_t and nfr_t limiting width
eps_nf = 1e-3;
// Minimum bavl_t:
eps_bavl_t = 1e-3;
// begin: RvdT, November 2008; Zener tunneling current model
pow2_2m_pe = pow(2.0, 2.0 - pe);
pow2_pe_m2 = 1.0 / pow2_2m_pe;
// begin: RvdT, November 2008; Zener tunneling current model
//
// Comment added March 2009: this assumes vgzebok as a model parameter.
//
// Bandgap for Zener tunnel current model at reference temperature in eV:
// vgzeb_tr = vgzebok - avgeb*Trk*Trk / (Trk + tvgeb);
// `max_logexp(vgzeb_tr, vgzebok - avgeb*Trk*Trk / (Trk + tvgeb), 0.05, 0.1)
// end: RvdT, November 2008
// begin: RvdT March 2009:
// to decrease parameter interdependency,
// use vgzeb as a parameter, instead of vgzebok:
// vgzeb : bandgap for Zener tunneling at T = Tref,
// vgzebok : bandgap for Zener tunneling at T = 0 K.
`max_logexp(vgzebok, vgzeb + avgeb * Trk * Trk / (Trk + tvgeb), 0.05, 0.1)
vgzeb_tr = vgzeb;
// end: RvdT March 2009: use vgzeb as a parameter, instead of vgzebok:
// end: RvdT, November 2008; Zener tunneling current model
inv_vgzeb_tr = 1.0 / vgzeb_tr;
inv_vde = 1.0 / vde;
// CB Zener tunneling
Vdc_zener = vdcctc;
Pc_zener = pc;
pow2_2m_pc = pow(2.0, 2.0 - Pc_zener);
pow2_pc_m2 = 1.0 / pow2_2m_pc;
`max_logexp(vgzcbok, vgzcb + avgcb * Trk * Trk / (Trk + tvgcb), 0.05, 0.1)
vgzcb_tr = vgzcb;
inv_vgzcb_tr = 1.0 / vgzcb_tr;
inv_vdc_zener = 1.0 / Vdc_zener;
Vfmax_z = -vzmin;
// Alpha factor of CB junction avalanche model
alpha_brcb = 1.0 - 1.0 /frevcb;

View File

@ -1,151 +0,0 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015-2020, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
// Noise sources
// Thermal noise
common = 4.0 * `KB * Tk;
power_rec = common / re_t; // Emitter resistance
power_rbc = common / rbc_t; // Constant Base resistance
power_rcc_xx = common * gcc_xx_t; // Collector resistance
power_rcc_ex = common * gcc_ex_t; // Collector resistance
power_rcc_in = common * gcc_in_t; // Collector resistance
power_rbv = 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.0);
// 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.0;
end
// Forward base current shot noise
powerFBCS = 2.0 * `QQ * abs(Ib1 + Ib2 - Izteb);
// Ideal forward base current 1/f noise
Ib_fwd_ideal_tot = Ib1 + Ib1_s;
powerFBC1f = kf * pow(abs(Ib_fwd_ideal_tot), af);
if (Ib_fwd_ideal_tot < 0) begin
powerFBC1f = -powerFBC1f;
end
// Non-ideal forward base current 1/f noise
Ib_fwd_non_ideal_tot = Ib2 + Ib2_s + Ibrel;
powerNFBC1f = kfn * pow(abs(Ib_fwd_non_ideal_tot), afn);
if (Ib_fwd_non_ideal_tot < 0) begin
powerNFBC1f = -powerNFBC1f;
end
// Emitter-base sidewall current shot
powerEBSCS = 2.0 * `QQ * abs(Ib1_s + Ib2_s + Ibrel);
// Reverse base current shot noise and 1/f noise
powerRBCS = 2.0 * `QQ * abs(Ib3);
powerRBC1f = kf * pow(abs(Ib3), af);
if (Ib3 < 0) begin
powerRBC1f = -powerRBC1f;
end
powerZTCB = 2.0 * `QQ * abs(Iztcb);
// Extrinsic current shot noise and 1/f noise
powerExCS = 2.0 * `QQ * abs(Iex);
powerExC1f = kf * (1.0 - (exmod * xext)) *
pow((abs(Iex) / (1.0 - (exmod * xext))), af);
if (Iex < 0) begin
powerExC1f = -powerExC1f;
end
powerExCSMOD = 2.0 * `QQ * abs(XIex) * exmod;
if (xext == 0.0) begin
powerExC1fMOD = 0.0;
end else begin
powerExC1fMOD = kf * exmod * xext * pow((abs(XIex) / xext), af);
end
if (XIex < 0) begin
powerExC1fMOD = -powerExC1fMOD;
end
`ifdef SUBSTRATE
// Substrate current shot noise (between nodes B1 and S, resp. B and S)
powerSubsCS_B2S = 2.0 * `QQ * abs(Isub_int);
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 * mult, "in");
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 * mult, "iavl");
I(b2, e1) <+ white_noise(powerFBCS * mult, "ib2e1");
// Add noise sources
I(e, e1) <+ white_noise(power_rec * mult, "re");
I(b, b1) <+ white_noise(power_rbc * mult, "rbc");
I(b1, b2) <+ white_noise(power_rbv * mult, "rbv");
I(b2, e1) <+ flicker_noise(powerFBC1f * mult, 1, "ib2e1_f");
I(b1, e1) <+ flicker_noise(powerNFBC1f * mult, 1, "ib1e1_f");
I(b1, e1) <+ white_noise(powerEBSCS * mult, "ib1e1");
I(b1, c4) <+ white_noise(powerRBCS * mult, "ib3");
I(b1, c4) <+ flicker_noise(powerRBC1f * mult, 1, "ib3_f");
I(c2, b2) <+ white_noise(powerZTCB * mult, "iztcb");
I(b1, c4) <+ white_noise(powerExCS * mult, "iex");
I(b1, c4) <+ flicker_noise(powerExC1f * mult, 1, "iex_f");
I(b, c3) <+ white_noise(powerExCSMOD * mult, "xiex");
I(b, c3) <+ flicker_noise(powerExC1fMOD * mult, 1, "xiex_f");
`ifdef SUBSTRATE
I(b2, s) <+ white_noise(powerSubsCS_B2S * mult, "isub_int");
I(b1, s) <+ white_noise(powerSubsCS_B1S * mult, "isub");
I(b, s) <+ white_noise(powerSubsCS_BS * mult, "xisub");
`endif
if (rcblx > 0.0) begin
if (rcbli > 0.0) begin /* all branches exist */
I(c, c3) <+ white_noise(power_rcc_xx * mult, "rcc");
I(c3, c4) <+ white_noise(power_rcc_ex * mult, "rcblx");
I(c4, c1) <+ white_noise(power_rcc_in * mult, "rcbli");
end else begin /* only Rcblx exists */
I(c, c3) <+ white_noise(power_rcc_xx * mult, "rcc");
I(c3, c1) <+ white_noise(power_rcc_ex * mult, "rcblx");
end
end else begin
if (rcbli > 0.0) begin /* only Rcbli exists */
I(c, c4) <+ white_noise(power_rcc_xx * mult, "rcc");
I(c4, c1) <+ white_noise(power_rcc_in * mult, "rcbli");
end else begin /* neither Rcblx nor Rcbli exists */
I(c, c1) <+ white_noise(power_rcc_xx * mult, "rcc");
end
end

View File

@ -1,163 +0,0 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015-2020, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
// print the operating point (output) variables
// The external voltage differences
$strobe("vbe : ", vbe); // External base-emitter bias
$strobe("vce : ", vce); // External collector-emitter bias
$strobe("vbc : ", vbc); // External base-collector bias
`ifdef SUBSTRATE
$strobe("vse : ", vse); // External substrate-emitter bias
$strobe("vbs : ", vbs); // External base-substrate bias
$strobe("vsc : ", vsc); // External substrate-collector bias
`endif
// The external currents and the current gain
$strobe("ic : ", ic); // External DC collector current
$strobe("ib : ", ib); // External DC base Current
// begin added in MXT 504.9:
$strobe("ie : ", ie); // External DC emitter current
`ifdef SUBSTRATE
$strobe("isx : ", isx); // External DC substrate current
`endif
// end added in MXT 504.9
$strobe("betadc :", betadc); // External DC Current gain
// The internal voltage differences
$strobe("vb2e1 : ", vb2e1); // Internal base-emitter bias
$strobe("vb2c2 : ", vb2c2); // Internal base-emitter bias
$strobe("vb2c1 : ", vb2c1); // Internal base-collector bias including epilayer
$strobe("vb1c1 : " ,vb1c1); // External base-collector bias without contact resistances
$strobe("vc4c1 : ", vc4c1); // Bias over intrinsic buried layer
$strobe("vc3c4 : ", vc3c4); // Bias over extrinsic buried layer
$strobe("ve1e : ", ve1e); // Bias over emitter resistance
// The branch currents
$strobe("in : ", in); // Main current
$strobe("ic1c2 : ", ic1c2); // Epilayer current
$strobe("ib1b2 : ", ib1b2); // Pinched-base current
$strobe("ib1 : ", ib1); // Ideal forward base current
$strobe("ib1s : ", ib1s); // Ideal side-wall base current
$strobe("izteb : ", izteb); // Zener tunneling current in the emitter base junction
$strobe("ib2 : ", ib2); // Non-ideal forward base current
$strobe("ib3 : ", ib3); // Non-ideal reverse base current
$strobe("iavl : ", iavl); // Avalanche current
$strobe("iex : ", iex); // Extrinsic reverse base current
$strobe("xiex : ", xiex); // Extrinsic reverse base current
`ifdef SUBSTRATE
$strobe("isub : ", isub); // Substrate current
$strobe("xisub : ", xisub); // Substrate current
$strobe("isf : ", isf); // Substrate-collector current
`endif
$strobe("ire : ", ire); // Current through emitter resistance
$strobe("irbc : ", irbc); // Current through constant base resistance
$strobe("ircc : ", ircc); // Current through collector contact resistance
$strobe("ircblx: ", ircblx); // Current through extrinsic buried layer resistance
$strobe("ircbli: ", ircbli); // Current through extrinsic buried layer resistance
// The branch charges
$strobe("qe : ", qe); // Emitter charge or emitter neutral charge
$strobe("qte : ", qte); // Base-emitter depletion charge
$strobe("sqte : ", sqte); // Sidewall base-emitter depletion charge
$strobe("qbe : ", qbe); // Base-emitter diffusion charge
$strobe("qbc : ", qbc); // Base-collector diffusion charge
$strobe("qtc : ", qtc); // Base-collector depletion charge
$strobe("qepi : ", qepi); // Epilayer diffusion charge
$strobe("qb1b2 : ", qb1b2); // AC current crowding charge
$strobe("qtex : ", qtex); // Extrinsic base-collector depletion charge
$strobe("xqtex : ", xqtex); // Extrinsic base-collector depletion charge
$strobe("qex : ", qex); // Extrinsic base-collector diffusion charge
$strobe("xqex : ", xqex); // Extrinsic base-collector diffusion charge
`ifdef SUBSTRATE
$strobe("qts : ", qts); // Collector substrate depletion charge
`endif
// Small signal equivalent circuit conductances and resistances
$strobe("gx : ", gx); // Forward transconductance
$strobe("gy : ",gy); // Reverse transconductance
$strobe("gz : ",gz); // Reverse transconductance
$strobe("sgpi : ",sgpi); // Conductance sidewall b-e junction
$strobe("gpix : ",gpix); // Conductance floor b-e junction
$strobe("gpiy : ",gpiy); // Early effect on recombination base current
$strobe("gpiz : ",gpiz); // Early effect on recombination base current
$strobe("gmux : ",gmux); // Early effect on avalanche current limiting
$strobe("gmuy : ",gmuy); // Conductance of avalanche current
$strobe("gmuz : ",gmuz); // Conductance of avalanche current
$strobe("gmuex : ",gmuex); // Conductance extrinsic b-c current
$strobe("xgmuex : ",xgmuex); // Conductance extrinsic b-c current
$strobe("grcvy : ",grcvy); // Conductance of epilayer current
$strobe("grcvz : ",grcvz); // Conductance of epilayer current
$strobe("rb_v : ",rb_v); // Variable base resistance
$strobe("grbvx : ",grbvx); // Early effect on variable base resistance
$strobe("grbvy : ",grbvy); // Early effect on variable base resistance
$strobe("grbvz : ",grbvz); // Early effect on variable base resistance
$strobe("r_e : ",r_e); // Emitter resistance
$strobe("rb_c : ",rb_c); // Constant base resistance
$strobe("rc_c : ",rc_c); // Collector Contact resistance
$strobe("rc_blx : ",rc_blx); // Extrinsic buried layer resistance
$strobe("rc_bli : ",rc_bli); // Extrinsic buried layer resistance
`ifdef SUBSTRATE
$strobe("gs : ", gs); // Conductance parasitic PNP transistor
$strobe("xgs : ", xgs); // Conductance parasitic PNP transistor
$strobe("gsf : ", gsf); // Conductance substrate failure current
`endif
// Small signal equivalent circuit capacitances
$strobe("scbe : ", scbe); // Capacitance sidewall b-e junction
$strobe("cbex : ", cbex); // Capacitance floor b-e junction
$strobe("cbey : ", cbey); // Early effect on b-e diffusion junction
$strobe("cbez : ", cbez); // Early effect on b-e diffusion junction
$strobe("cbcx : ", cbcx); // Early effect on b-c diffusion junction
$strobe("cbcy : ", cbcy); // Capacitance floor b-c junction
$strobe("cbcz : ", cbcz); // Capacitance floor b-c junction
$strobe("cbcex : ", cbcex); // Capacitance extrinsic b-c junction
$strobe("xcbcex : ", xcbcex); // Capacitance extrinsic b-c junction
$strobe("cb1b2 : ", cb1b2); // Capacitance AC current crowding
$strobe("cb1b2x : ", cb1b2x); // Cross-capacitance AC current crowding
$strobe("cb1b2y : ", cb1b2y); // Cross-capacitance AC current crowding
$strobe("cb1b2z : ", cb1b2z); // Cross-capacitance AC current crowding
`ifdef SUBSTRATE
$strobe("cts : ", cts); // Capacitance s-c junction
`endif
$strobe("gm : ", gm); // Transconductance
$strobe("beta : ", beta); // Current amplification
$strobe("gout : ", gout); // Output conductance
$strobe("gmu : ", gmu); // Feedback transconductance
$strobe("rb : ", rb); // Base resistance
$strobe("rc : ", rc); // Collector resistance
$strobe("cbe : ", cbe); // Base-emitter capacitance
$strobe("cbc : ", cbc); // Base-collector capacitance
$strobe("ft : ", ft); // Good approximation for cut-off frequency
$strobe("iqs : ", iqs); // Current at onset of quasi-saturation
$strobe("xiwepi : ", xiwepi); // Thickness of injection layer
$strobe("vb2c2star : ", vb2c2star); // Physical value of internal base-collector bias
// self-heating
`ifdef SELFHEATING
$strobe("pdiss : ", pdiss); // Dissipation
`endif
$strobe("tk : ", tk); // Actual temperature

View File

@ -1,336 +0,0 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015-2020, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
// Evaluate the operating point (output) variables
// The external currents and the current gain
ic = I(<c>); // External DC collector current
ib = I(<b>); // External DC base Current
if (ib == 0.0) begin
betadc = 0.0;
end else begin
betadc = ic / ib; // External DC Current gain
end
// begin added in MXT 504.9:
ie = I(<e>); // External DC emitter current
vbe = V(b, e); // External base-emitter bias
vce = V(c, e); // External collector-emitter bias
vbc = V(b, c); // External base-collector bias
`ifdef SUBSTRATE
isx = I(<s>); // External DC substrate current
vse = V(s, e); // External substrate-emitter bias
vbs = V(b, s); // External base-substrate bias
vsc = V(s, c); // External substrate-collector bias
`endif
// end added in MXT 504.9:
// The internal voltage differences
vb2e1 = Vb2e1; // Internal base-emitter bias
vb2c2 = Vb2c2; // Internal base-emitter bias
vb2c1 = Vb2c1; // Internal base-collector bias including epilayer
vb1c1 = Vb1b2 + Vb2c1; // External base-collector bias without contact resistances
vc4c1 = Vc4c1; // Bias over intrinsic buried layer
vc3c4 = Vc3c4; // Bias over extrinsic buried layer
ve1e = - Vee1; // Bias over emitter resistance
// The branch currents
in = In; // Main current
ic1c2 = Ic1c2; // Epilayer current
ib1b2 = Ib1b2; // Pinched-base current
ib1 = Ib1; // Ideal forward base current
ib1s = Ib1_s; // Ideal side-wall base current
ib2s = Ib2_s; // Non-ideal side-wall base current
ibrel = Ibrel; // Additional non-ideal base current for reliability simulation
//
// 504.8, RvdT, TU-Delft April. 2009:
//
izteb = Izteb; // Zener emitter-base tunneling current
//
iztcb = Iztcb; // Zener collector-base tunneling current
ib2 = Ib2; // Non-ideal forward base current
ib3 = Ib3; // Non-ideal reverse base current
iavl = Iavl; // Avalanche current
iex = Iex; // Extrinsic reverse base current
xiex = XIex; // Extrinsic reverse base current
`ifdef SUBSTRATE
isub = Isub; // Substrate current
xisub = XIsub; // Substrate current
isf = Isf; // Substrate-collector current
`endif
ire = - Vee1 / re_t; // Current through emitter resistance
irbc = Vbb1 / rbc_t; // Current through constant base resistance
ircc = Vcc3 * gcc_xx_t; // Current through collector contact resistance
ircblx = Vc3c4 * gcc_ex_t; // Current through extrinsic buried layer resistance
ircbli = Vc4c1 * gcc_in_t; // Current through extrinsic buried layer resistance
// The branch charges
qe = Qe; // Emitter charge or emitter neutral charge
qte = Qte; // Base-emitter depletion charge
sqte = Qte_s; // Sidewall base-emitter depletion charge
qbe = Qbe; // Base-emitter diffusion charge
qbc = Qbc; // Base-collector diffusion charge
qtc = Qtc; // Base-collector depletion charge
qepi = Qepi; // Epilayer diffusion charge
qb1b2 = Qb1b2; // AC current crowding charge
qtex = Qtex; // Extrinsic base-collector depletion charge
xqtex = XQtex; // Extrinsic base-collector depletion charge
qex = Qex; // Extrinsic base-collector diffusion charge
xqex = XQex; // Extrinsic base-collector diffusion charge
`ifdef SUBSTRATE
qts = Qts; // Collector substrate depletion charge
`endif
// Small signal equivalent circuit conductances and resistances
gx = - ddx(In, V(e1)); // Forward transconductance
gy = - ddx(In, V(c2)); // Reverse transconductance
gz = - ddx(In, V(c1)); // Reverse transconductance
sgpi = - ddx(Ib1_s, V(e1)); // Conductance sidewall b-e junction
gpix = - ddx(Ib1+Ib2, V(e1)); // Conductance floor b-e junction
gpiy = - ddx(Ib1, V(c2)); // Early effect on recombination base current
gpiz = - ddx(Ib1, V(c1)); // Early effect on recombination base current
gmux = ddx( Iavl, V(e1)); // Early effect on avalanche current limiting
gmuy = ddx( Iavl, V(c2)); // Conductance of avalanche current
gmuz = - ddx(- Iavl, V(c1)); // Conductance of avalanche current
// Conductance extrinsic b-c current :
gmuex = ddx(Iex+Ib3, V(b1))
+ ddx(Iex+Ib3, V(b2))
+ ddx(Iex+Ib3, V(c2));
xgmuex = ddx(XIex, V(b)); // Conductance extrinsic b-c current
grcvy = - ddx(Ic1c2, V(c2)); // Conductance of epilayer current
grcvz = - ddx(Ic1c2, V(c1)); // Conductance of epilayer current
rb_v = 1.0 / (- ddx(Ib1b2, V(b2)) - ddx(Ib1b2, V(c2))); // Variable base resistance
grbvx = - ddx(Ib1b2, V(e1)); // Early effect on variable base resistance
grbvy = - ddx(Ib1b2, V(c2)); // Early effect on variable base resistance
grbvz = - ddx(Ib1b2, V(c1)); // Early effect on variable base resistance
r_e = re_t; // Emitter resistance
rb_c = rbc_t; // Constant base resistance
rc_c = rcc_xx_t; // Collector Contact resistance
rc_blx = rcc_ex_t; // Extrinsic buried layer resistance
rc_bli = rcc_in_t; // Extrinsic buried layer resistance
`ifdef SUBSTRATE
gs = ddx(Isub, V(b1)); // Conductance parasitic PNP transistor
xgs = ddx(XIsub, V(b)); // Conductance parasitic PNP transistor
gsf = ddx(Isf, V(s)); // Conductance substrate-collector current
`endif
// Small signal equivalent circuit capacitances
scbe = - ddx(Qte_s, V(e1)); // Capacitance sidewall b-e junction
cbex = - ddx(Qte + Qbe + Qe, V(e1)); // Capacitance floor b-e junction
cbey = - ddx(Qbe, V(c2)); // Early effect on b-e diffusion junction
cbez = - ddx(Qbe, V(c1)); // Early effect on b-e diffusion junction
cbcx = - ddx(Qbc, V(e1)); // Early effect on b-c diffusion junction
cbcy = - ddx(Qtc + Qbc + Qepi, V(c2)); // Capacitance floor b-c junction
cbcz = - ddx(Qtc + Qbc + Qepi, V(c1)); // Capacitance floor b-c junction
// Capacitance extrinsic b-c junction :
cbcex = ddx(Qtex + Qex,V(b1))
+ ddx(Qtex + Qex,V(b2))
+ ddx(Qtex + Qex,V(c2));
// Capacitance extrinsic b-c junction :
xcbcex = ddx(XQtex + XQex, V(b));
cb1b2 = - ddx(Qb1b2, V(b2)) - ddx(Qb1b2, V(c2)); // Capacitance AC current crowding
cb1b2x = - ddx(Qb1b2, V(e1)); // Cross-capacitance AC current crowding
cb1b2y = - ddx(Qb1b2, V(c2)); // Cross-capacitance AC current crowding
cb1b2z = - ddx(Qb1b2, V(c1)); // Cross-capacitance AC current crowding
`ifdef SUBSTRATE
cts = ddx(Qts, V(s)); // Capacitance s-c junction
`endif
// Approximate small signal equivalent circuit
dydx = (gx - gmux) / (grcvy + gmuy - gy);
dydz = (gz - grcvz - gmuz) / (grcvy + gmuy - gy);
gpi = sgpi + gpix + gmux + gpiz + gmuz +
(gpiy + gmuy) * (dydx + dydz);
gm = (grcvy * (gx - gmux + // Transconductance
gz - gmuz) - grcvz *
(gy - gmuy)) / (grcvy + gmuy - gy);
beta = gm / gpi; // Current amplification
gout = ((gy - gmuy) * grcvz - // Output conductance
(gz - gmuz) * grcvy) /
(grcvy + gmuy - gy);
gmu = gpiz + gmuz + (gpiy + gmuy) * dydz + // Feedback transconductance
gmuex + xgmuex;
rb = rbc_t + rb_v; // Base resistance
rc = rc_c + rc_blx + rc_bli; // Collector resistance
cbe = cbex + scbe + cbcx + // Base-emitter capacitance
(cbey + cbcy) * dydx + cbeo;
cbc = (cbey + cbcy) * dydz + cbcz + // Base-collector capacitance
cbcex + xcbcex + cbco;
// Quantities to describe internal state of the model
gammax = (gpix + gmux - grbvx) * rb_v;
gammay = (gpiy + gmuy - grbvy) * rb_v;
gammaz = (gpiz + gmuz - grbvz) * rb_v;
gbfx = gpix + sgpi * (1.0 + gammax);
gbfy = gpiy + sgpi * gammay;
gbfz = gpiz + sgpi * gammaz;
// RvdT March 2008:
alpha_ft = (1.0 + (grcvy * dydx * rc) +
(gx + gbfx + (gy + gbfy) * dydx) * re_t)/
(1.0 - (grcvz + grcvy * dydz) * rc -
(gz + gbfz + (gy + gbfy) * dydz) * re_t);
rx = pow((grcvy * dydx + alpha_ft * (grcvz + grcvy * dydz)), -1);
rz = alpha_ft * rx;
ry = (1.0 - grcvz * rz) / grcvy;
rb1b2 = gammax * rx + gammay * ry + gammaz * rz;
rex = rz + rb1b2 - rc_bli;
xrex = rz + rb1b2 + rbc_t * ((gbfx + gmux) * rx + (gbfy + gmuy) * ry +
(gbfz + gmuz) * rz) - rc_bli - rc_blx;
taut = scbe * (rx + rb1b2) + (cbex + cbcx) * rx + (cbey + cbcy) *
ry + (cbez + cbcz) * rz + cbcex * rex + xcbcex * xrex +
(cbeo + cbco) * (xrex - rcc_xx_t);
ft = 1.0 / (2.0 * `PI * taut); // Good approximation for cut-off frequency
iqs = Iqs; // Current at onset of quasi-saturation
xiwepi = xi_w; // Thickness of injection layer
vb2c2star = Vb2c2star; // Physical value of internal base-collector bias
//self-heating
`ifdef SELFHEATING
pdiss = power; // Dissipation
`endif
tk = Tk; // Actual temperature
if (mult != 1.0) begin
ic = ic * mult;
ib = ib * mult;
ie = ie * mult;
`ifdef SUBSTRATE
isx = isx * mult;
`endif
in = in * mult;
ic1c2 = ic1c2 * mult;
ib1b2 = ib1b2 * mult;
ib1 = ib1 * mult;
ib1s = ib1s * mult;
ib2s = ib2s * mult;
ibrel = ibrel * mult;
izteb = izteb * mult;
iztcb = iztcb * mult;
ib2 = ib2 * mult;
ib3 = ib3 * mult;
iavl = iavl * mult;
iex = iex * mult;
xiex = xiex * mult;
`ifdef SUBSTRATE
isub = isub * mult;
xisub = xisub * mult;
isf = isf * mult;
`endif
ire = ire * mult;
irbc = irbc * mult;
ircblx = ircblx * mult;
ircbli = ircbli * mult;
ircc = ircc * mult;
qe = qe * mult;
qte = qte * mult;
sqte = sqte * mult;
qbe = qbe * mult;
qbc = qbc * mult;
qtc = qtc * mult;
qepi = qepi * mult;
qb1b2 = qb1b2 * mult;
qtex = qtex * mult;
xqtex = xqtex * mult;
qex = qex * mult;
xqex = xqex * mult;
`ifdef SUBSTRATE
qts = qts * mult;
`endif
gx = gx * mult;
gy = gy * mult;
gz = gz * mult;
sgpi = sgpi * mult;
gpix = gpix * mult;
gpiy = gpiy * mult;
gpiz = gpiz * mult;
gmux = gmux * mult;
gmuy = gmuy * mult;
gmuz = gmuz * mult;
gmuex = gmuex * mult;
xgmuex = xgmuex * mult;
grcvy = grcvy * mult;
grcvz = grcvz * mult;
rb_v = rb_v / mult;
grbvx = grbvx * mult;
grbvy = grbvy * mult;
grbvz = grbvz * mult;
r_e = r_e / mult;
rb_c = rb_c / mult;
rc_c = rc_c / mult;
rc_blx = rc_blx / mult;
rc_bli = rc_bli / mult;
`ifdef SUBSTRATE
gs = gs * mult;
xgs = xgs * mult;
gsf = gsf * mult;
`endif
scbe = scbe * mult;
cbex = cbex * mult;
cbey = cbey * mult;
cbez = cbez * mult;
cbcx = cbcx * mult;
cbcy = cbcy * mult;
cbcz = cbcz * mult;
cbcex = cbcex * mult;
xcbcex = xcbcex * mult;
cb1b2 = cb1b2 * mult;
cb1b2x = cb1b2x * mult;
cb1b2y = cb1b2y * mult;
cb1b2z = cb1b2z * mult;
`ifdef SUBSTRATE
cts = cts * mult;
`endif
gm = gm * mult;
gout = gout * mult;
gmu = gmu * mult;
rb = rb / mult;
rc = rc / mult;
cbe = cbe * mult;
cbc = cbc * mult;
iqs = iqs * mult;
`ifdef SELFHEATING
pdiss = pdiss * mult;
`endif
end

View File

@ -1,159 +0,0 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015-2020, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
//
// Operation point (output) variables
//
// The external currents and current gain
`OPM(ic, "A", "External DC collector current")
`OPM(ib, "A", "External DC base current")
`OPP(betadc, "", "External DC current gain Ic/Ib")
// begin added in MXT 504.9:
`OPM(ie, "A", "External DC emitter current")
// The external biases
`OPP(vbe, "V", "External base-emitter bias")
`OPP(vce, "V", "External collector-emitter bias")
`OPP(vbc, "V", "External base-collector bias")
`ifdef SUBSTRATE
`OPM(isx, "A", "External DC substrate current")
`OPP(vse, "V", "External substrate-emitter bias")
`OPP(vbs, "V", "External base-substrate bias")
`OPP(vsc, "V", "External substrate-collector bias")
`endif
// end added in MXT 504.9
// The internal biases
`OPP(vb2e1, "V", "Internal base-emitter bias")
`OPP(vb2c2, "V", "Internal base-collector bias")
`OPP(vb2c1, "V", "Internal base-collector bias including epilayer")
`OPP(vb1c1, "V", "External base-collector bias without contact resistances")
`OPP(vc4c1, "V", "Bias over intrinsic buried layer")
`OPP(vc3c4, "V", "Bias over extrinsic buried layer")
`OPP(ve1e, "V", "Bias over emitter resistance")
// The actual currents
`OPM(in, "A", "Main current")
`OPM(ic1c2, "A", "Epilayer current")
`OPM(ib1b2, "A", "Pinched-base current")
`OPM(ib1, "A", "Ideal forward base current")
`OPM(ib1s, "A", "Ideal side-wall base current")
`OPM(ib2s, "A", "Non-ideal side-wall base current")
`OPM(ibrel, "A", "Additional non-ideal base current for reliability simulation")
//
// 504.8, RvdT, TU-Delft April. 2009, Zener tunneling current:
//
`OPM(izteb, "A", "Zener tunneling current in the emitter base junction")
//
`OPM(iztcb, "A", "Zener tunneling current in the collector base junction")
`OPM(ib2, "A", "Non-ideal forward base current")
`OPM(ib3, "A", "Non-ideal reverse base current")
`OPM(iavl, "A", "Avalanche current")
`OPM(iex, "A", "Extrinsic reverse base current")
`OPM(xiex, "A", "Extrinsic reverse base current")
`ifdef SUBSTRATE
`OPM(isub, "A", "Substrate current")
`OPM(xisub, "A", "Substrate current")
`OPM(isf, "A", "Substrate failure current")
`endif
`OPM(ire, "A", "Current through emitter resistance")
`OPM(irbc, "A", "Current through constant base resistance")
`OPM(ircblx, "A", "Current through extrinsic buried layer resistance")
`OPM(ircbli, "A", "Current through intrinsic buried layer resistance")
`OPM(ircc, "A", "Current through collector contact resistance")
//The actual charges
`OPM(qe, "coul", "Emitter charge or emitter neutral charge")
`OPM(qte, "coul", "Base-emitter depletion charge")
`OPM(sqte, "coul", "Sidewall base-emitter depletion charge")
`OPM(qbe, "coul", "Base-emitter diffusion charge")
`OPM(qbc, "coul", "Base_collector diffusion charge")
`OPM(qtc, "coul", "Base-collector depletion charge")
`OPM(qepi, "coul", "Epilayer diffusion charge")
`OPM(qb1b2, "coul", "ac current crowding charge")
`OPM(qtex, "coul", "Extrinsic base-collector depletion charge")
`OPM(xqtex, "coul", "Extrinsic base-collector depletion charge")
`OPM(qex, "coul", "Extrinsic base-collector diffusion charge")
`OPM(xqex, "coul", "Extrinsic base-collector diffusion charge")
`ifdef SUBSTRATE
`OPM(qts, "coul", "Collector-substrate depletion charge")
`endif
//Small signal equivalent circuit conductances and resistances
`OPM(gx, "S", "Forward transconductance")
`OPM(gy, "S", "Reverse transconductance")
`OPM(gz, "S", "Reverse transconductance")
`OPM(sgpi, "S", "Conductance sidewall b-e junction")
`OPM(gpix, "S", "Conductance floor b-e junction")
`OPM(gpiy, "S", "Early effect on recombination base current")
`OPM(gpiz, "S", "Early effect on recombination base current")
`OPM(gmux, "S", "Early effect on avalanche current limiting")
`OPM(gmuy, "S", "Conductance of avalanche current")
`OPM(gmuz, "S", "Conductance of avalanche current")
`OPM(gmuex, "S", "Conductance of extrinsic b-c junction")
`OPM(xgmuex, "S", "Conductance of extrinsic b-c junction")
`OPM(grcvy, "S", "Conductance of epilayer current")
`OPM(grcvz, "S", "Conductance of epilayer current")
`OPD(rb_v, "Ohm", "Variable base resistance")
`OPM(grbvx, "S", "Early effect on variable base resistance")
`OPM(grbvy, "S", "Early effect on variable base resistance")
`OPM(grbvz, "S", "Early effect on variable base resistance")
`OPD(r_e, "Ohm", "Emitter resistance")
`OPD(rb_c, "Ohm", "Constant base resistance")
`OPD(rc_c, "Ohm", "Collector contact resistance")
`OPD(rc_blx, "Ohm", "Extrinsic buried layer resistance")
`OPD(rc_bli, "Ohm", "Intrinsic buried layer resistance")
`ifdef SUBSTRATE
`OPM(gs, "S", "Conductance parasitic PNP transistor")
`OPM(xgs, "S", "Conductance parasitic PNP transistor")
`OPM(gsf, "S", "Conductance substrate failure current")
`endif
//Small signal equivalent circuit capacitances
`OPM(scbe, "F", "Capacitance sidewall b-e junction")
`OPM(cbex, "F", "Capacitance floor b-e junction")
`OPM(cbey, "F", "Early effect on b-e diffusion charge")
`OPM(cbez, "F", "Early effect on b-e diffusion charge")
`OPM(cbcx, "F", "Early effect on b-c diffusion charge")
`OPM(cbcy, "F", "Capacitance floor b-c junction")
`OPM(cbcz, "F", "Capacitance floor b-c junction")
`OPM(cbcex, "F", "Capacitance extrinsic b-c junction")
`OPM(xcbcex, "F", "Capacitance extrinsic b-c junction")
`OPM(cb1b2, "F", "Capacitance AC current crowding")
`OPM(cb1b2x, "F", "Cross-capacitance AC current crowding")
`OPM(cb1b2y, "F", "Cross-capacitance AC current crowding")
`OPM(cb1b2z, "F", "Cross-capacitance AC current crowding")
`ifdef SUBSTRATE
`OPM(cts, "F", "Capacitance s-c junction")
`endif
//Approximate small signal equivalent circuit
`OPM(gm, "S", "transconductance")
`OPP(beta, "", "Current amplification")
`OPM(gout, "S", "Output conductance")
`OPM(gmu, "S", "Feedback transconductance")
`OPD(rb, "Ohm", "Base resistance")
`OPD(rc, "Ohm", "Collector resistance")
`OPM(cbe, "F", "Base-emitter capacitance")
`OPM(cbc, "F", "Base-collector capacitance")
//quantities to describe internal state of the model
`OPP(ft, "Hz", "Good approximation for cut-off frequency")
`OPM(iqs, "A", "Current at onset of quasi-saturation")
`OPP(xiwepi, "", "Thickness of injection layer normalized to epi layer width")
`OPP(vb2c2star, "V", "Physical value of internal base-collector bias")
//self-heating
`ifdef SELFHEATING
`OPM(pdiss, "W", "Dissipation")
`endif
`OPP(tk, "K", "Actual temperature")
//help variables
real dydx, dydz, gpi;
real gammax, gammay, gammaz, gbfx, gbfy, gbfz, alpha_ft;
real rx, ry, rz, rb1b2, rex, xrex, taut;

View File

@ -1,186 +0,0 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015-2020, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
//Instance parameters
`IPRnb( dta ,0.0 ,"degC" ,"Difference between the local and global ambient temperatures" )
aliasparam trise = dta;
aliasparam dtemp = dta;
`IPRoo( mult ,1.0 ,"" ,0.0 ,inf ,"Multiplication factor" )
// Mextram parameters
`MPRco( version ,505.20 ,"" ,505.20 ,505.21 ,"Model version" )
`MPIty( type ,1 ,"" ,"Flag for NPN (1) or PNP (-1) transistor type" )
`MPRco( tref ,25.0 ,"degC" ,-273.0 ,inf ,"Reference temperature" )
`MPIcc( exmod ,1 ,"" ,0 ,3 ,"Flag for extended modeling of the reverse current gain" )
`MPIcc( exphi ,1 ,"" ,0 ,1 ,"Flag for distributed high-frequency effects in transient" )
`MPIcc( exavl ,0 ,"" ,0 ,1 ,"Flag for extended modeling of avalanche currents" )
`ifdef SUBSTRATE
`MPIcc( exsub ,1 ,"" ,0 ,1 ,"Flag for extended modeling of substrate currents" )
`endif
// main current parameters
`MPRoz( is ,22.0a ,"A" ,"Saturation current of main current" )
`MPRco( nff ,1.0 ,"" ,1.0 ,inf ,"Non-ideality factor of forward main current" )
`MPRco( nfr ,1.0 ,"" ,1.0 ,inf ,"Non-ideality factor of reverse main current" )
`MPRco( ik ,0.1 ,"A" ,1.0p ,inf ,"CE high injection knee current" )
`MPRco( ver ,2.5 ,"V" ,0.01 ,inf ,"Reverse Early voltage" )
`MPRco( vef ,44.0 ,"V" ,0.01 ,inf ,"Forward Early voltage" )
`MPRoo( issr ,1.0 ,"" ,0.0 ,inf ,"Fraction of saturation current for reverse main current " )
// forward base current parameters
`MPRcz( ibi ,0.1a ,"A" ,"Saturation current of ideal base current" )
`MPRco( nbi ,1.0 ,"" ,0.1 ,inf ,"Non-ideality factor of ideal base current" )
`MPRcz( ibis ,0.0 ,"A" ,"Saturation current of ideal side wall base current" )
`MPRco( nbis ,1.0 ,"" ,0.1 ,inf ,"Non-ideality factor of ideal side wall base current" )
`MPRcz( ibf ,2.7f ,"A" ,"Saturation current of non-ideal forward base current" )
`MPRco( mlf ,2.0 ,"" ,0.1 ,inf ,"Non-ideality factor of non-ideal forward base current" )
`MPRcz( ibfs ,0.0 ,"A" ,"Saturation current of non-ideal side wall forward base current" )
`MPRco( mlfs ,2.0 ,"" ,0.1 ,inf ,"Non-ideality factor of non-ideal side wall forward base current" )
// reverse base current parameters
`MPRcz( ibx ,3.14a ,"A" ,"Saturation current of extrinsic reverse base current" )
`MPRco( ikbx ,14.29m ,"A" ,1.0p ,inf ,"Extrinsic CB high injection knee current" )
`MPRcz( ibr ,1.0f ,"A" ,"Saturation current of non-ideal reverse base current" )
`MPRco( mlr ,2.0 ,"" ,0.1 ,inf ,"Non-ideality factor of non-ideal reverse base current" )
`MPRcc( xext ,0.63 ,"" ,0.0 ,1.0 ,"Part of currents and charges that belong to extrinsic region" )
// EB tunneling model parameters
`MPRcz( izeb ,0.0 ,"A" ,"Pre-factor of EB Zener tunneling current" )
`MPRcz( nzeb ,22.0 ,"" ,"Coefficient of EB Zener tunneling current" )
// CB tunneling model parameters
`MPRcz( izcb ,0.0 ,"A" ,"Pre-factor of CB Zener tunneling current" )
`MPRcz( nzcb ,22.0 ,"" ,"Coefficient of CB Zener tunneling current" )
// zener tunneling model parameters
`MPRoo( vzmin ,1.0u ,"V" ,0.0 ,inf ,"Minimum junction reverse voltage to help avoid Zener current numerical issues close to zero bias" )
// 505 avalanche model parameters
`MPIcc( swavl ,1 ,"" ,0 ,3 ,"Switch of avalanche factor Gem model" )
`MPRcz( aavl ,400.0 ,"" ,"aavl of swavl=1,3 Gem models" )
`MPRoo( cavl ,-370.0m ,"" ,-inf ,0.0 ,"cavl of swavl=1,3 Gem models" )
`MPRoz( itoavl ,500.0m ,"A" ,"Current dependence parameter of swavl=1 Gem model" )
`MPRoz( bavl ,25.0 ,"" ,"bavl of swavl=1,3 Gem models" )
`MPRnb( vdcavl ,100.0m ,"V" ,"CB diffusion voltage dedicated for swavl=1 Gem model" )
// 504 avalanche model parameters
`MPRco( wavl ,1.1u ,"m" ,1.0n ,inf ,"Epilayer thickness used in weak-avalanche model" )
`MPRco( vavl ,3.0 ,"V" ,0.01 ,inf ,"Voltage determining curvature of avalanche current" )
`MPRcz( sfh ,0.3 ,"" ,"Current spreading factor of avalanche model when exavl=1" )
// 505.2.0 avalanche model parameters
`MPRco( ihcavl ,4.0m ,"A" ,1.0p ,inf ,"Critical current for velocity saturation of swavl=3 Gem model" )
`MPRoo( davl ,-370.0m ,"" ,-inf ,0.0 ,"Coefficient for controlling decrease of Gem with current in swavl=3 Gem model" )
`MPRoo( eavl ,-370.0m ,"" ,-inf ,0.0 ,"Coefficient for controlling increase of Gem with current in swavl=3 extended Gem model" )
`MPRoo( aexavl ,0.3 ,"" ,0.0 ,inf ,"Smoothness parameter for onset of swavl=3 extended Gem model" )
`MPRco( ionexavl ,4.0m ,"A" ,1.0p ,inf ,"Onset current of swavl=3 extended Gem model" )
`MPIcc( swgemlim ,1 ,"" ,0 ,1 ,"Switch of limiting of avalanche factor Gem model" )
// resistance parameters
`MPRco( re ,5.0 ,"Ohm" ,1.0m ,inf ,"Emitter resistance" )
`MPRco( rbc ,23.0 ,"Ohm" ,1.0m ,inf ,"Constant part of base resistance" )
`MPRco( rbv ,18.0 ,"Ohm" ,1.0m ,inf ,"Zero-bias value of variable part of the base resistance" )
`MPRco( rcc ,12.0 ,"Ohm" ,1.0m ,inf ,"Constant part of collector resistance" )
`MPRcz( rcblx ,0.0 ,"Ohm" ,"Resistance Collector Buried Layer extrinsic" )
`MPRcz( rcbli ,0.0 ,"Ohm" ,"Resistance Collector Buried Layer Intrinsic" )
// epilayer dc parameters
`MPRco( rcv ,150.0 ,"Ohm" ,1.0m ,inf ,"Resistance of un-modulated epilayer" )
`MPRco( scrcv ,1250.0 ,"Ohm" ,1.0m ,inf ,"Space charge resistance of epilayer" )
`MPRco( ihc ,4.0m ,"A" ,1.0p ,inf ,"Critical current for velocity saturation in epilayer" )
`MPRco( axi ,0.3 ,"" ,0.02 ,inf ,"Smoothness parameter for onset of quasi-saturation" )
`MPRco( vdc ,0.68 ,"V" ,0.05 ,inf ,"CB diffusion voltage" )
// EB junction capacitance parameters
`MPRcz( cje ,73.0f ,"F" ,"Zero-bias EB depletion capacitance" )
`MPRco( vde ,0.95 ,"V" ,0.05 ,inf ,"EB diffusion voltage" )
`MPRco( pe ,0.4 ,"" ,0.01 ,0.99 ,"EB grading coefficient" )
`MPRcc( xcje ,0.4 ,"" ,0.0 ,1.0 ,"Sidewall fraction of EB depletion capacitance" )
`MPRcz( cbeo ,0.0 ,"F" ,"EB overlap capacitance" )
// CB junction capacitance parameters
`MPRcz( cjc ,78.0f ,"F" ,"Zero-bias CB depletion capacitance" )
`MPRco( vdcctc ,0.68 ,"V" ,0.05 ,inf ,"CB diffusion voltage of depletion capacitance" )
`MPRco( pc ,0.5 ,"" ,0.01 ,0.99 ,"CB grading coefficient" )
`MPIcc( swvchc ,0 ,"" ,0 ,1 ,"Switch of Vch for CB depletion capacitance" )
`MPIcc( swvjunc ,0 ,"" ,0 ,2 ,"Switch of Vjunc for collector junction capacitance" )
`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" )
`MPRcz( cbco ,0.0 ,"F" ,"CB overlap capacitance" )
`MPIcc( swqex ,0 ,"" ,0 ,1 ,"Switch for CB diffusion capacitance" )
`MPRco( vdcex ,0.68 ,"V" ,0.05 ,inf ,"CB diffusion voltage of diffusion capacitance" )
// Breakdown for CB junction leakage parameters (not avalanche of IN)
`MPRoc( vbrcb ,100.0 ,"V" ,0.0 ,2000.0 ,"Breakdown voltage for CB junction leakage" )
`MPRoc( pbrcb ,4.0 ,"V" ,0.0 ,500.0 ,"Breakdown onset tuning parameter for CB junction leakage" )
`MPRoc( frevcb ,1000.0 ,"" ,1e1 ,1e10 ,"Coefficient for limiting CB junction breakdown leakage current" )
`MPIsw( swjbrcb ,0 ,"" ,"Switch for breakdown in CB junction leakage" )
// transit time parameters
`MPRco( mtau ,1.0 ,"" ,0.1 ,inf ,"Non-ideality factor of emitter stored charge" )
`MPRcz( taue ,2.0p ,"s" ,"Minimum transit time of stored emitter charge" )
`MPRoz( taub ,4.2p ,"s" ,"Transit time of stored base charge" )
`MPRcz( tepi ,41.0p ,"s" ,"Transit time of stored epilayer charge" )
`MPRcz( taur ,520.0p ,"s" ,"Transit time of reverse extrinsic stored base charge" )
`MPRcz( tauex ,10.0p ,"s" ,"Transit time of reverse extrinsic stored epilayer charge of swqex=1" )
// heterojunction parameters
`MPRnb( deg ,0.0 ,"eV" ,"Bandgap difference over the base" )
// neutral base recombination parameter
`MPRcz( xrec ,0.0 ,"" ,"Pre-factor of the recombination part of Ib1" )
// charge partition parameters
`MPRcc( xqb ,`one_third ,"" ,0.0 ,1.0 ,"Emitter-fraction of base diffusion charge" )
`MPRcc( ke ,0.0 ,"" ,0.0 ,1.0 ,"Fraction of QE in excess phase shift" )
// general temperature scaling parameters
`MPRnb( aqbo ,0.3 ,"" ,"Temperature coefficient of zero-bias base charge" )
`MPRnb( ae ,0.0 ,"" ,"Temperature coefficient of resistivity of the emitter" )
`MPRnb( ab ,1.0 ,"" ,"Temperature coefficient of resistivity of the base" )
`MPRnb( aepi ,2.5 ,"" ,"Temperature coefficient of resistivity of the epilayer" )
`MPRnb( aepiex ,2.5 ,"" ,"Temperature coefficient of reverse transit time of the extrinsic epilayer" )
`MPRnb( aex ,0.62 ,"" ,"Temperature coefficient of resistivity of the extrinsic base" )
`MPRnb( ac ,2.0 ,"" ,"Temperature coefficient of resistivity of the collector contact" )
`MPRnb( acx ,1.3 ,"" ,"Temperature coefficient of extrinsic reverse base current" )
`MPRcz( acbl ,2.0 ,"" ,"Temperature coefficient of resistivity of the collector buried layer" )
`MPRco( vgb ,1.17 ,"V" ,0.1 ,inf ,"Band-gap voltage of base" )
`MPRco( vgc ,1.18 ,"V" ,0.1 ,inf ,"Band-gap voltage of collector" )
`MPRco( vge ,1.12 ,"V" ,0.1 ,inf ,"Band-gap voltage of emitter" )
`MPRco( vgcx ,1.125 ,"V" ,0.1 ,inf ,"Band-gap voltage of extrinsic collector" )
`MPRco( vgj ,1.15 ,"V" ,0.1 ,inf ,"Band-gap voltage recombination EB junction" )
`MPRco( vgzeb ,1.15 ,"V" ,0.1 ,inf ,"Band-gap voltage at Tref for EB tunneling" )
`MPRnb( avgeb ,4.73e-4 ,"V/K" ,"Temperature coefficient of band-gap voltage for EB tunneling" )
`MPRcz( tvgeb ,636.0 ,"K" ,"Temperature coefficient of band-gap voltage for EB tunneling" )
`MPRco( vgzcb ,1.15 ,"V" ,0.1 ,inf ,"Band-gap voltage at Tref for CB tunneling" )
`MPRnb( avgcb ,4.73e-4 ,"V/K" ,"Temperature coefficient of band-gap voltage for CB tunneling" )
`MPRcz( tvgcb ,636.0 ,"K" ,"Temperature coefficient of band-gap voltage for CB tunneling" )
`MPRnb( dvgte ,0.05 ,"V" ,"Band-gap voltage difference of emitter stored charge" )
`MPRnb( dais ,0.0 ,"" ,"Fine tuning of temperature dependence of CE saturation current" )
`MPRnb( tnff ,0.0 ,"/K" ,"Temperature coefficient of nff" )
`MPRnb( tnfr ,0.0 ,"/K" ,"Temperature coefficient of nfr" )
`MPRnb( tbavl ,500.0u ,"" ,"Temperature scaling parameter of bavl when swavl=1" )
// 1/f noise parameters
`MPRco( af ,2.0 ,"" ,0.01 ,inf ,"Exponent of Flicker-noise of ideal base current" )
`MPRco( afn ,2.0 ,"" ,0.01 ,inf ,"Exponent of Flicker-noise of non-ideal base current" )
`MPRcz( kf ,20.0p ,"" ,"Flicker-noise coefficient of ideal base current" )
`MPRcz( kfn ,20.0p ,"" ,"Flicker-noise coefficient of non-ideal base current" )
// avalanche noise switch
`MPIcc( kavl ,0 ,"" ,0 ,1 ,"Switch for white noise contribution due to avalanche" )
// correlated noise parameters
`MPIcc( kc ,0 ,"" ,0 ,2 ,"Switch for RF correlation noise model selection" )
`MPRcc( ftaun ,0.0 ,"" ,0.0 ,1.0 ,"Fraction of noise transit time to total transit time" )
`ifdef SUBSTRATE
`MPRcz( iss ,48.0a ,"A" ,"Saturation current of parasitic BCS transistor main current" )
`MPRcz( icss ,0.0 ,"A" ,"CS ideal saturation current" )
`MPRco( iks ,545.5u ,"A" ,1.0p ,inf ,"Knee current for BCS transistor main current" )
`MPRco( ikcs ,50.0u ,"A" ,1.0p ,inf ,"Knee current for CS junction diode current" )
`MPRcz( cjs ,315.0f ,"F" ,"Zero-bias CS depletion capacitance" )
`MPRoo( vds ,0.62 ,"V" ,0.05 ,inf ,"CS diffusion voltage" )
`MPRoo( ps ,0.34 ,"" ,0.01 ,0.99 ,"CS grading coefficient" )
`MPRco( vgs ,1.20 ,"V" ,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" )
`MPRcc( xisubi ,0.0 ,"" ,0.0 ,1.0 ,"Part of substrate current that belongs to intrinsic region" )
`MPIsw( swvsch ,0 ,"" ,"Switch for Vsc induced high injection in main currents of BCS transistors and CS diode current" )
`endif
// self heating parameters
`ifdef SELFHEATING
`MPRoz( rth ,300.0 ,"K/W" ,"Thermal resistance" )
`MPRcz( cth ,3.0n ,"J/K" ,"Thermal capacitance" )
`MPRnb( ath ,0.0 ,"" ,"Temperature coefficient of thermal resistance" )
`endif
// reliability modeling parameters
`MPRcz( isibrel ,0.0 ,"A" ,"Saturation current of base current for reliability simulation" )
`MPRco( nfibrel ,2.0 ,"" ,0.1 ,inf ,"Non-ideality factor of base current for reliability simulation" )
`MPRcc( vexlim ,400.0 ,"" ,40.0 ,400.0 ,"Upper limit of exp() function argument for convergence" )

View File

@ -1,230 +0,0 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015-2020, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
// Temperature scaling of parameters
// The excess transistor temperature due to the self-heating
`ifdef SELFHEATING
Tki = Temp(dt);
// *** Convergence related smoothing ***
if (Tki < 0.0) begin
Tki = - ln(1.0 - Tki);
end
`linLog(Vdt, Tki, 200.0)
// `min_logexp(Vdt, Tki, 200.0, 10.0)
`else
Vdt = 0.0;
`endif
// 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;
dT = Tk - Trk;
lntN = ln(tN);
// RvdT, November 2008, EB Zener tunneling model
// vgzeb_t = vgzebok - avgeb*Tk*Tk / (Tk + tvgeb);
`max_logexp(vgzeb_t, vgzebok - avgeb*Tk*Tk / (Tk + tvgeb), 0.05, 0.1)
// 2016. CB Zener tunneling model
`max_logexp(vgzcb_t, vgzcbok - avgcb*Tk*Tk / (Tk + tvgcb), 0.05, 0.1)
// Diffusion voltages for depletion capacitances, quasi-saturation, and Zener tunneling
// EB vde - shared by CV and Zener
UdeT = -3.0 * Vt * ln(tN) + vde * tN + (1.0 - tN) * vgb;
`max_logexp(vde_t, `VDLOW, UdeT, Vt)
// CB vdc dedicated to quasi-saturation
UdcT = -3.0 * Vt * ln(tN) + vdc * tN + (1.0 - tN) * vgc;
`max_logexp(vdc_t, `VDLOW, UdcT, Vt)
// Qex 2019
UdcexT = -3.0 * Vt * ln(tN) + vdcex * tN + (1.0 - tN) * vgc;
`max_logexp(vdcex_t, `VDLOW, UdcexT, Vt)
// CB vdc dedicated to CV
UdcT_ctc = -3.0 * Vt * ln(tN) + vdcctc * tN + (1.0 - tN) * vgc;
`max_logexp(vdc_ctc_t, `VDLOW, UdcT_ctc, Vt)
// CB vdc dedicated to Zener tunneling
UdcT_zener = -3.0 * Vt * ln(tN) + Vdc_zener * tN + (1.0 - tN) * vgc;
`max_logexp(vdc_zener_t, `VDLOW, UdcT_zener, Vt)
// CS
`ifdef SUBSTRATE
UdsT = -3.0 * Vt * ln(tN) + vds * tN + (1.0 - tN) * vgs;
`max_logexp(vds_t, `VDLOW, UdsT, Vt)
`endif
inv_vde_t = 1.0 / vde_t;
inv_vdc_zener_t = 1.0 / vdc_zener_t;
cje_t_div_cje = pow(vde * inv_vde_t, pe);
cjc_t_div_cjc_zener = pow(Vdc_zener * inv_vdc_zener_t, Pc_zener);
cje_t = cje * cje_t_div_cje;
`ifdef SUBSTRATE
cjs_t = cjs * pow(vds / vds_t, ps);
`endif
cjc_scale = ((1.0 - xp) * pow(vdcctc / vdc_ctc_t, pc) + xp);
cjc_scale_inv = 1.0 / cjc_scale;
cjc_t = cjc * cjc_scale;
xp_t = xp * cjc_scale_inv;
// Resistances
// RvdT, November 2008:
// Instead of the following definition
// re_t = re * pow(tN, ae);
// we use, here, and in all following powers of tN,
// the following computationally cheaper implementation:
re_t = re * exp(lntN * ae);
// This is based on the observation that exp() is faster than pow().
// Acknowledgement due to Geoffrey Coram.
rbv_t = rbv * exp(lntN * (ab - aqbo));
rbc_t = rbc * exp(lntN * aex);
// RvdT, 30-11-2007: new collector resistances rcc_xx_t, rcc_ex_t, rcc_in_t
rcc_xx_t = rcc * exp(lntN * ac);
rcc_ex_t = rcblx * exp(lntN * acbl);
rcc_in_t = rcbli * exp(lntN * acbl);
rcv_t = rcv * exp(lntN * aepi);
// Currents and voltages
// main current non-ideality factor - forward
if (tnff != 0.0) begin
nff_t_tmp = nff * (1.0 + dT * tnff);
`max_logexp(nff_t_tmp, nff_t_tmp, 1.0, eps_nf)
nff_t = nff_t_tmp - eps_nf * `LN2;
end else begin
nff_t = nff;
end
// main current non-ideality factor - reverse
if (tnfr != 0.0) begin
nfr_t_tmp = nfr * (1.0 + dT * tnfr);
`max_logexp(nfr_t_tmp, nfr_t_tmp, 1.0, eps_nf)
nfr_t = nfr_t_tmp - eps_nf * `LN2;
end else begin
nfr_t = nfr;
end
// avalanche coefficient bavl
bavl_t_tmp = bavl * (1.0 + tbavl * dT);
`max_hyp0(bavl_t, bavl_t_tmp, eps_bavl_t)
// Saturation currents for main current and diode currents, knee currents
is_t = is * exp(lntN * (4.0 - ab - aqbo + dais) / nff_t) * exp(-vgb * VdtINV / nff_t);
ik_t = ik * exp(lntN * (1.0 - ab));
ikbx_t = ikbx * exp(lntN * (1.0 - acx));
ibf_t = ibf * exp(lntN * (6.0 - 2.0 * mlf)) * exp(-vgj * VdtINV / mlf);
ibr_t = ibr * exp(lntN * (6.0 - 2.0 * mlr)) * exp(-vgc * VdtINV / mlr);
ibi_t = ibi * exp(lntN * (4.0 - ae + dais) / nbi) * exp(-vge * VdtINV / nbi);
ibx_t = ibx * exp(lntN * (4.0 - acx + dais)) * exp(-vgcx * VdtINV);
ibis_t = ibis * exp(lntN * (4.0 - ae + dais) / nbis) * exp(-vge * VdtINV / nbis);
ibfs_t = ibfs * exp(lntN * (6.0 - 2.0 * mlfs)) * exp(-vgj * VdtINV / mlfs);
isibrel_t = isibrel * exp(lntN * (4.0 / nfibrel)) * exp(-vgj * VdtINV / nfibrel);
// begin RvdT, November 2008, MXT504.8_alpha
// T-scaling BE tunneling:
//
x = pow(vgzeb_t * inv_vgzeb_tr, -0.5);
// y = pow(vde_t * inv_vde, pe);
// more efficient, because we need both y and 1.0 / y:
y = 1.0 / cje_t_div_cje;
// definition:
// nzeb_t = nzeb* pow(vgzeb_t/vgzeb_tr, 1.5) * pow(vde_t / vde, pe-1);
// 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 * inv_vde_t * inv_vgzeb_tr * inv_vgzeb_tr;
// definition:
// izeb_t = izeb* pow(vgzeb_t/vgzeb_tr, -0.5) * pow(vde_t / vde, 2-pe) * exp(nzeb-nzeb_t);
// more efficient implementation:
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
// T-scaling CB tunneling:
inv_vdc_zener_t = 1.0 / vdc_zener_t;
xx = pow(vgzcb_t * inv_vgzcb_tr, -0.5);
yy = 1.0 / cjc_t_div_cjc_zener;
nzcb_t = nzcb * vgzcb_t * vgzcb_t * xx * yy * Vdc_zener * inv_vdc_zener_t * inv_vgzcb_tr * inv_vgzcb_tr;
izcb_t = izcb * xx * vdc_zener_t * vdc_zener_t * inv_vdc_zener * inv_vdc_zener * cjc_t_div_cjc_zener * exp(nzcb - nzcb_t);
x = exp(lntN * aqbo);
vef_t = vef * x * cjc_scale_inv;
// ver_t = ver * x * pow(vde / vde_t, -pe);
ver_t = ver * x * y;
`ifdef SUBSTRATE
iss_t = iss * exp(lntN * (4.0 - as)) * exp(-vgs * VdtINV);
// New 504.9:
icss_t = icss * exp(lntN * (3.5 - 0.5 * asub)) * exp(-vgs * VdtINV);
// End New 504.9.
iks_t = iks * exp(lntN * (1.0 - as));
ikcs_t = ikcs * exp(lntN * (1.0 - asub));
`endif
// Transit times
taue_t = taue * exp(lntN * (ab - 2.0)) * exp(-dvgte * VdtINV);
taub_t = taub * exp(lntN * (aqbo + ab - 1.0));
tepi_t = tepi * exp(lntN * (aepi - 1.0));
taur_t = taur * (taub_t + tepi_t) / (taub + tepi);
tauex_t = tauex * exp(lntN * (aepiex - 1.0));
// Avalanche constant
Tk300 = Tk - 300.0;
// 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
deg_t = deg * exp(lntN * aqbo);
`ifdef SELFHEATING
// Temperature scaling of the thermal resistance
rth_tamb = rth * pow(Tamb / Trk, ath);
`endif
// mult - scaling
// RvdT: November 2008, EB Zener tunneling parameters
// 2016, CB tunneling izcb
// RvdT, 30-01-2007: new collector resistances:
// RvdT, 03-12-2007: new collector conductances
if (rcc > 0.0) begin
gcc_xx_t = 1.0 / rcc_xx_t;
end else begin
gcc_xx_t = 0.0;
end
if (rcblx > 0.0) begin
gcc_ex_t = 1.0 / rcc_ex_t;
end else begin
gcc_ex_t = 0.0;
end
if (rcbli > 0.0) begin
gcc_in_t = 1.0 / rcc_in_t;
end else begin
gcc_in_t = 0.0;
end

View File

@ -1,186 +0,0 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015-2020, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
// Declaration of variables
// Model constants
real An, Bn;
// Temperature scaling variables
real Tk, Trk, tN, Tamb;
real Vt, Vtr, VtINV, VtrINV, VdtINV;
real Vdt;
real dT;
real UdeT, vde_t, UdcT, vdc_t, vdc_ctc_t, UdcT_ctc, vdc_zener_t, UdcT_zener;
real UdcexT, vdcex_t;
real cje_t, cjc_t, xp_t;
real cjc_scale, cjc_scale_inv;
real re_t, rbv_t, rbc_t, rcv_t;
real rcc_xx_t, rcc_ex_t, rcc_in_t;
real is_t, ik_t, ikbx_t, ibf_t, ibr_t, vef_t, ver_t, ibi_t, ibx_t, ibis_t, ibfs_t, isibrel_t;
real nff_t, nfr_t, nff_t_tmp, nfr_t_tmp, eps_nf;
// Zener tunneling parameters and variables:
real Izteb, izeb_t, E0EB, dE0EB,nzeb_t, pow2_2m_pe, pow2_pe_m2, inv_vde, inv_vde_t, inv_vdc_zener, inv_vdc_zener_t;
real expnzeb, e_zeb, dzeb, vgzeb_t, vgzeb_tr, inv_vgzeb_tr, cje_t_div_cje;
real vgzebok;
real Vdc_zener, Pc_zener, E0CB, expnzcb, pow2_2m_pc, dE0CB, e_zcb, dzcb, Iztcb, nzcb_t, izcb_t, vgzcb_t, inv_vgzcb_tr, vgzcb_tr, vgzcbok, pow2_pc_m2;
real cjc_t_div_cjc_zener;
real taue_t, taub_t, tepi_t, taur_t, tauex_t;
real Bnt, deg_t, Tk300;
`ifdef SELFHEATING
real rth_tamb;
`endif
`ifdef SUBSTRATE
real UdsT, vds_t, cjs_t, iss_t, icss_t, iks_t, ikcs_t;
`endif
real gcc_xx_t, gcc_ex_t, gcc_in_t;
// Epilayer model variables
real K0, Kw, pW, Ec, Ic1c2;
real Vqs_th, Vqs, Iqs;
real alpha, vyi, yi, xi_w, xi_w1;
real gp0, gp02, p0star, Vb2c2star, eVb2c2star, eVb2c2star_nfr;
real B1, B2, Vxi0, Vch, Icap, pav;
// Effective emitter and collector junction bias variables
real Vfe, Vje, Vte;
real Vjunc, bjc, Vfc, Vjc, fI, Vcv, Vtc;
// Transfer current variables
real If0, f1, f2, n0, nB;
real q0I, q1I, qBI, Ir, If, In;
// Base and substrate current(s) variables
real Xext1;
real Ib1, Ib1_s, Ib2, Ib3, Ib2_s, Ibrel;
real Iex;
real g1, g2, pWex, nBex;
real Xg1, XnBex, XIMex, XIMsub, Vex, VBex, Fex, XIex;
real eVb1c4vdcex, eVbc3vdcex;
`ifdef SUBSTRATE
real Isub, XIsub, Isf, Isub_int;
`endif
// Distributed base effects variables
real q0Q, q1Q, qBQ, Rb2, Ib1b2;
real dVteVb2e1, dVteVje, dVjeVb2e1;
real dQteVb2e1, dQbeVb2e1, dQeVb2e1;
real dn0Vb2e1;
// swavl=2 (504) avalanche current variables
real dEdx0, xd, Weff, Wd, Eav, E0, Em, SHw, Efi, Ew;
real lambda, Gem, Gmax, Iavl;
real Icap_ihc;
// swavl=3 (505.2.0) avalanche current variables
real Vdeptmp, Vdep, In_shift_ihcavl, In_shift_n;
`ifdef SELFHEATING
real Tki, power;
`endif
// Charges and capacitances variables
real Qte, Vje_s, Qte_s;
real Qtc;
real Qb0, Qbe, Qbc, Qb1b2;
real Qbe_qs, Qbc_qs;
real Vjcex, Vtexv, Qtex, XVjcex, XVtexv, XQtex;
`ifdef SUBSTRATE
real Vfs, Vjs, Qts;
`endif
real Qe0, Qe;
real Qe_qs;
real Qepi0, Qepi, Xg2, XpWex, XQMex, XQex;
real Qex;
// Biases and exponential terms variables
real Vb2c1, Vb2c2, Vb2e1, Vb1e1, Vb1b2, Vb1c4, Vc1c2;
real Vc3c4, Vc4c1;
`ifdef SUBSTRATE
real Vsc1, Vsc3, Vsc4, eVsc1, eVsc3, eVsc4;
`endif
real Vee1, Vbb1, Vbc3, Vcc3, Vbe, Vbc;
real eVb2c2, eVb2e1, eVb1b2, eVb1c4, eVbc3;
real eVb1c4vdc, eVb2c2vdc, eVbc3vdc, eVb2c1vdc;
// Help variables
// lntN introduced to speed up T-scaling:
// Acknowledgements due to Geoffrey Coram
real lntN;
// Variables for local use; may be re-used globally:
real x, y, xx, yy;
real zeb, zcb, Vfmax_z;
real dxa, sqr_arg;
real eps2, x2;
real alpha1, vdif, Ic1c2_Iqs, gp0_help;
real EmEav_Em, Vb2e1Vfe, termE, termC;
real Vex_bias;
real eps_vdc, a_vde, a_vdcctc;
real expl, tmpExp, tmpV;
`ifdef SUBSTRATE
real a_vds;
`endif
// Noise variables
real common;
real power_rec, power_rbc, power_rcc_xx, power_rcc_ex, power_rcc_in, power_rbv;
real powerCCS;
real powerFBCS;
real powerFBC1f;
real powerNFBC1f;
real powerEBSCS;
real powerRBCS, powerRBC1f, powerZTCB;
real powerExCS, powerExCSMOD, powerExC1f, powerExC1fMOD;
real powerIIS;
real Ib_fwd_ideal_tot, Ib_fwd_non_ideal_tot;
`ifdef SUBSTRATE
real powerSubsCS_B2S, powerSubsCS_B1S, powerSubsCS_BS;
`endif
// noise correlation help variables
real In_N, Gem_N, Taub_N, taun, Qbe_qs_eff;
// New avalanche model when swavl=1
real expIn, vl, bavl_t, bavl_t_tmp, eps_bavl_t, expMm1;
// Minimum conductances
real GMIN;
`ifdef SUBSTRATE
real GMIN_cs;
`endif
// CB junction avalanche factors
real alpha_brcb, Vcbr_stop, fbrcb, dfbrcb;
real Vb1c1, Vcbeff, f_stop;

View File

@ -1,166 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: Common103_macrodefs.include
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 103.8.0 (PSP), 200.6.1 (JUNCAP), July 2020
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
//////////////////////////////////////////////////////////////
//
// General macros and constants for compact va-models
//
//////////////////////////////////////////////////////////////
// Clipping functions
`define CLIP_LOW(val,min) ((val)>(min)?(val):(min))
`define CLIP_HIGH(val,max) ((val)<(max)?(val):(max))
`define CLIP_BOTH(val,min,max) ((val)>(min)?((val)<(max)?(val):(max)):(min))
// Min/Max functions
`define MAX(x,y) ((x)>(y)?(x):(y))
`define MIN(x,y) ((x)<(y)?(x):(y))
// Mathematical constants
`define PI 3.1415926535897931
`define SQRTPI 1.77245385090551603
// Physical constants
`define KELVINCONVERSION 273.15
`define KBOL 1.3806505E-23
`define QELE 1.6021918E-19
`define HBAR 1.05457168E-34
`define MELE 9.1093826E-31
`define EPSO 8.8541878176E-12
`define EPSRSI 11.8
// Other constants
`define oneThird 3.3333333333333333e-01
`define twoThirds 6.6666666666666667e-01
// Constants needed in safe exponential function (called "expl")
`define se 4.6051701859880916e+02
`define se05 2.3025850929940458e+02
`define ke 1.0e-200
`define ke05 1.0e-100
`define keinv 1.0e200
`define ke05inv 1.0e100
// P3 3rd order polynomial expansion of exp()
`define P3(u) (1.0 + (u) * (1.0 + 0.5 * ((u) * (1.0 + (u) * `oneThird))))
// expl exp() with 3rd order polynomial extrapolation for very low values (exp_low),
// very high values (exp_high), or both (expl)
`define expl(x, res) \
if (abs(x) < `se05) begin\
res = exp(x); \
end else begin \
if ((x) < 0.0) begin\
res = `ke05 / `P3(-`se05 - (x)); \
end else begin\
res = `ke05inv * `P3((x) - `se05); \
end \
end
`define expl_low(x, res) \
if ((x) > -`se05) begin\
res = exp(x); \
end else begin\
res = `ke05 / `P3(-`se05 - (x)); \
end
`define expl_high(x, res) \
if ((x) < `se05) begin\
res = exp(x); \
end else begin \
res = `ke05inv * `P3((x) - `se05); \
end
// Exchange function
`define swap(a, b) \
temp = a; \
a = b; \
b = temp;
// Parameter definition macros: "des" description argument is intended to
// be a short description, the "inf" information argument is intended to be
// a detailed description (e.g. for display as part of on-line help).
//
// MPR model parameter real
// MPI model parameter integer
// IPR instance parameter real
// IPI instance parameter integer
// OPP operating point parameter, includes units and description for printing
// OPM operating point parameter, scales with $mfactor
// OPD operating point parameter, scales with 1/$mfactor
//
// Instance parameters have the attribute *type="instance"* and note that
// compilers treat these as both instance and model parameters, with a
// specified instance value taking precedence over a specified model card value.
//
// There are some issues with passing range directives with some compilers,
// so for each parameter declaration there are multiple versions:
// cc closed lower bound, closed upper bound
// co closed lower bound, open upper bound
// cz closed lower bound of zero (no upper bound)
// oc open lower bound, closed upper bound
// oo open lower bound, open upper bound
// oz open lower bound of zero (no upper bound)
// nb no bounds
// sw switch (integer only, values 0=false and >0=true)
// ty switch (integer only, values -1=n-type and +1=p-type)
//
`define ALIAS(alias,paramName) aliasparam alias = paramName;
`define OPP(nam,uni,des) (*units=uni, desc=des*) real nam;
`define OPM(nam,uni,des) (*units=uni, multiplicity="multiply", desc=des*) real nam;
`define OPD(nam,uni,des) (*units=uni, multiplicity="divide", desc=des*) real nam;
`define MPRcc(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 MPRcz(nam,def,uni, des) (*units=uni , desc=des*) parameter real nam=def from[ 0:inf);
`define MPRoc(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 MPRoz(nam,def,uni, des) (*units=uni , desc=des*) parameter real nam=def from( 0:inf);
`define MPRnb(nam,def,uni, des) (*units=uni , desc=des*) parameter real nam=def;
`define MPIcc(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 MPIcz(nam,def,uni, des) (*units=uni , desc=des*) parameter integer nam=def from[ 0:inf);
`define MPIoc(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 MPIoz(nam,def,uni, des) (*units=uni , desc=des*) parameter integer nam=def from( 0:inf);
`define MPInb(nam,def,uni, des) (*units=uni , desc=des*) parameter integer nam=def;
`define MPIsw(nam,def,uni, des) (*units=uni , desc=des*) parameter integer nam=def from[ 0:inf);
`define MPIty(nam,def,uni, des) (*units=uni , desc=des*) parameter integer nam=def from[ -1: 1] exclude 0;
`define IPRcc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[lwr:upr];
`define IPRco(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[lwr:upr);
`define IPRcz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[ 0:inf);
`define IPRoc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from(lwr:upr];
`define IPRoo(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from(lwr:upr);
`define IPRoz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def from( 0:inf);
`define IPRnb(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def;
`define IPIcc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[lwr:upr];
`define IPIco(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[lwr:upr);
`define IPIcz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[ 0:inf);
`define IPIoc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from(lwr:upr];
`define IPIoo(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from(lwr:upr);
`define IPIoz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from( 0:inf);
`define IPInb(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def;
`define IPIsw(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[ 0:inf);

View File

@ -1,378 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: JUNCAP200_InitModel.include
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 200.6.1, July 2020
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
// --------------------------------------------------------------------------------------------------------------
// Calculation of internal parameters which are independent on instance parameters
// --------------------------------------------------------------------------------------------------------------
SWJUNEXP_i = 0.0;
if (SWJUNEXP > 0.5) begin
SWJUNEXP_i = 1.0;
end else begin
SWJUNEXP_i = 0.0;
end
`ifdef JUNCAP_StandAlone
// do nothing
`else // JUNCAP_StandAlone
if (SWJUNASYM == 0.0) begin
CJORBOTD_i = CJORBOT;
CJORSTID_i = CJORSTI;
CJORGATD_i = CJORGAT;
VBIRBOTD_i = VBIRBOT;
VBIRSTID_i = VBIRSTI;
VBIRGATD_i = VBIRGAT;
PBOTD_i = PBOT;
PSTID_i = PSTI;
PGATD_i = PGAT;
PHIGBOTD_i = PHIGBOT;
PHIGSTID_i = PHIGSTI;
PHIGGATD_i = PHIGGAT;
IDSATRBOTD_i = IDSATRBOT;
IDSATRSTID_i = IDSATRSTI;
IDSATRGATD_i = IDSATRGAT;
CSRHBOTD_i = CSRHBOT;
CSRHSTID_i = CSRHSTI;
CSRHGATD_i = CSRHGAT;
XJUNSTID_i = XJUNSTI;
XJUNGATD_i = XJUNGAT;
CTATBOTD_i = CTATBOT;
CTATSTID_i = CTATSTI;
CTATGATD_i = CTATGAT;
MEFFTATBOTD_i = MEFFTATBOT;
MEFFTATSTID_i = MEFFTATSTI;
MEFFTATGATD_i = MEFFTATGAT;
CBBTBOTD_i = CBBTBOT;
CBBTSTID_i = CBBTSTI;
CBBTGATD_i = CBBTGAT;
FBBTRBOTD_i = FBBTRBOT;
FBBTRSTID_i = FBBTRSTI;
FBBTRGATD_i = FBBTRGAT;
STFBBTBOTD_i = STFBBTBOT;
STFBBTSTID_i = STFBBTSTI;
STFBBTGATD_i = STFBBTGAT;
VBRBOTD_i = VBRBOT;
VBRSTID_i = VBRSTI;
VBRGATD_i = VBRGAT;
PBRBOTD_i = PBRBOT;
PBRSTID_i = PBRSTI;
PBRGATD_i = PBRGAT;
VJUNREFD_i = VJUNREF;
FJUNQD_i = FJUNQ;
end else begin
CJORBOTD_i = CJORBOTD;
CJORSTID_i = CJORSTID;
CJORGATD_i = CJORGATD;
VBIRBOTD_i = VBIRBOTD;
VBIRSTID_i = VBIRSTID;
VBIRGATD_i = VBIRGATD;
PBOTD_i = PBOTD;
PSTID_i = PSTID;
PGATD_i = PGATD;
PHIGBOTD_i = PHIGBOTD;
PHIGSTID_i = PHIGSTID;
PHIGGATD_i = PHIGGATD;
IDSATRBOTD_i = IDSATRBOTD;
IDSATRSTID_i = IDSATRSTID;
IDSATRGATD_i = IDSATRGATD;
CSRHBOTD_i = CSRHBOTD;
CSRHSTID_i = CSRHSTID;
CSRHGATD_i = CSRHGATD;
XJUNSTID_i = XJUNSTID;
XJUNGATD_i = XJUNGATD;
CTATBOTD_i = CTATBOTD;
CTATSTID_i = CTATSTID;
CTATGATD_i = CTATGATD;
MEFFTATBOTD_i = MEFFTATBOTD;
MEFFTATSTID_i = MEFFTATSTID;
MEFFTATGATD_i = MEFFTATGATD;
CBBTBOTD_i = CBBTBOTD;
CBBTSTID_i = CBBTSTID;
CBBTGATD_i = CBBTGATD;
FBBTRBOTD_i = FBBTRBOTD;
FBBTRSTID_i = FBBTRSTID;
FBBTRGATD_i = FBBTRGATD;
STFBBTBOTD_i = STFBBTBOTD;
STFBBTSTID_i = STFBBTSTID;
STFBBTGATD_i = STFBBTGATD;
VBRBOTD_i = VBRBOTD;
VBRSTID_i = VBRSTID;
VBRGATD_i = VBRGATD;
PBRBOTD_i = PBRBOTD;
PBRSTID_i = PBRSTID;
PBRGATD_i = PBRGATD;
VJUNREFD_i = VJUNREFD;
FJUNQD_i = FJUNQD;
end
`endif // JUNCAP_StandAlone
// Variables related to temperatures
tkr = `KELVINCONVERSION + TRJ;
tkd = max($temperature + DTA, `KELVINCONVERSION + `MINTEMP);
auxt = tkd / tkr;
KBOL_over_QELE = `KBOL / `QELE;
phitr = KBOL_over_QELE * tkr;
phitrinv = 1.0 / phitr;
phitd = KBOL_over_QELE * tkd;
phitdinv = 1.0 / phitd;
// Bandgap voltages at reference temperature
deltaphigr = -(7.02e-4 * tkr * tkr) / (1108.0 + tkr);
phigrbot = PHIGBOT + deltaphigr;
phigrsti = PHIGSTI + deltaphigr;
phigrgat = PHIGGAT + deltaphigr;
// Bandgap voltages at device temperature
deltaphigd = -(7.02e-4 * tkd * tkd) / (1108.0 + tkd);
phigdbot = PHIGBOT + deltaphigd;
phigdsti = PHIGSTI + deltaphigd;
phigdgat = PHIGGAT + deltaphigd;
// Factors ftd for ideal-current model
ftdbot = (pow(auxt, 1.5)) * exp(0.5 * ((phigrbot * phitrinv) - (phigdbot * phitdinv)));
ftdsti = (pow(auxt, 1.5)) * exp(0.5 * ((phigrsti * phitrinv) - (phigdsti * phitdinv)));
ftdgat = (pow(auxt, 1.5)) * exp(0.5 * ((phigrgat * phitrinv) - (phigdgat * phitdinv)));
// Temperature-scaled saturation current for ideal-current model
idsatbot = IDSATRBOT * ftdbot * ftdbot;
idsatsti = IDSATRSTI * ftdsti * ftdsti;
idsatgat = IDSATRGAT * ftdgat * ftdgat;
// Built-in voltages before limiting
ubibot = VBIRBOT * auxt - 2.0 * phitd * ln(ftdbot);
ubisti = VBIRSTI * auxt - 2.0 * phitd * ln(ftdsti);
ubigat = VBIRGAT * auxt - 2.0 * phitd * ln(ftdgat);
// Built-in voltages limited to phitd
vbibot = ubibot + phitd * ln(1 + exp((`vbilow - ubibot) * phitdinv));
vbisti = ubisti + phitd * ln(1 + exp((`vbilow - ubisti) * phitdinv));
vbigat = ubigat + phitd * ln(1 + exp((`vbilow - ubigat) * phitdinv));
// Inverse values of built-in voltages
vbiinvbot = 1.0 / vbibot;
vbiinvsti = 1.0 / vbisti;
vbiinvgat = 1.0 / vbigat;
// One minus the grading coefficient
one_minus_PBOT = 1.0 - PBOT;
one_minus_PSTI = 1.0 - PSTI;
one_minus_PGAT = 1.0 - PGAT;
// One over "one minus the grading coefficient"
one_over_one_minus_PBOT = 1.0 / one_minus_PBOT;
one_over_one_minus_PSTI = 1.0 / one_minus_PSTI;
one_over_one_minus_PGAT = 1.0 / one_minus_PGAT;
// Temperature-scaled zero-bias capacitance
cjobot = CJORBOT * pow((VBIRBOT * vbiinvbot), PBOT);
cjosti = CJORSTI * pow((VBIRSTI * vbiinvsti), PSTI);
cjogat = CJORGAT * pow((VBIRGAT * vbiinvgat), PGAT);
// Prefactor in physical part of charge model
qprefbot = cjobot * vbibot * one_over_one_minus_PBOT;
qprefsti = cjosti * vbisti * one_over_one_minus_PSTI;
qprefgat = cjogat * vbigat * one_over_one_minus_PGAT;
// Prefactor in mathematical extension of charge model
qpref2bot = `a * cjobot;
qpref2sti = `a * cjosti;
qpref2gat = `a * cjogat;
// Zero-bias depletion widths at reference temperature, needed in SRH and TAT model
wdepnulrbot = EPSSI / CJORBOT;
wdepnulrsti = XJUNSTI * EPSSI / CJORSTI;
wdepnulrgat = XJUNGAT * EPSSI / CJORGAT;
// Inverse values of "wdepnulr", used in BBT model
wdepnulrinvbot = 1.0 / wdepnulrbot;
wdepnulrinvsti = 1.0 / wdepnulrsti;
wdepnulrinvgat = 1.0 / wdepnulrgat;
// Inverse values of built-in voltages at reference temperature, needed in SRH and BBT model
VBIRBOTinv = 1.0 / VBIRBOT;
VBIRSTIinv = 1.0 / VBIRSTI;
VBIRGATinv = 1.0 / VBIRGAT;
// Some constants needed in erfc-approximation, needed in TAT model
perfc = (`SQRTPI * `aerfc);
berfc = ((-5.0 * (`aerfc) + 6.0 - pow((perfc), -2.0)) / 3.0);
cerfc = (1.0 - (`aerfc) - (berfc));
// Half the bandgap energy, limited to values > phitd, needed in TAT model
deltaEbot = max(0.5 * phigdbot, phitd);
deltaEsti = max(0.5 * phigdsti, phitd);
deltaEgat = max(0.5 * phigdgat, phitd);
// Values of atat, needed in TAT model
atatbot = deltaEbot * phitdinv;
atatsti = deltaEsti * phitdinv;
atatgat = deltaEgat * phitdinv;
// Values of btatpart, needed in TAT model
btatpartbot = sqrt(32.0 * MEFFTATBOT * `MELE * `QELE * (deltaEbot * deltaEbot * deltaEbot)) / (3.0 * `HBAR);
btatpartsti = sqrt(32.0 * MEFFTATSTI * `MELE * `QELE * (deltaEsti * deltaEsti * deltaEsti)) / (3.0 * `HBAR);
btatpartgat = sqrt(32.0 * MEFFTATGAT * `MELE * `QELE * (deltaEgat * deltaEgat * deltaEgat)) / (3.0 * `HBAR);
// Temperature-scaled values of FBBT, needed in BBT model
fbbtbot = FBBTRBOT * (1.0 + STFBBTBOT * (tkd - tkr));
fbbtsti = FBBTRSTI * (1.0 + STFBBTSTI * (tkd - tkr));
fbbtgat = FBBTRGAT * (1.0 + STFBBTGAT * (tkd - tkr));
fbbtbot = `CLIP_LOW(fbbtbot, 0.0);
fbbtsti = `CLIP_LOW(fbbtsti, 0.0);
fbbtgat = `CLIP_LOW(fbbtgat, 0.0);
// Values of fstop, needed in avalanche/breakdown model
alphaav = 1.0 - 1.0 / FREV;
fstopbot = 1.0 / (1.0 - pow(alphaav, PBRBOT));
fstopsti = 1.0 / (1.0 - pow(alphaav, PBRSTI));
fstopgat = 1.0 / (1.0 - pow(alphaav, PBRGAT));
// Inverse values of breakdown voltages, needed in avalanche/breakdown model
VBRinvbot = 1.0 / VBRBOT;
VBRinvsti = 1.0 / VBRSTI;
VBRinvgat = 1.0 / VBRGAT;
// Slopes for linear extrapolation close to and beyond breakdown, needed in avalanche/breakdown model
slopebot = -(fstopbot * fstopbot * pow(alphaav, (PBRBOT - 1.0))) * PBRBOT * VBRinvbot;
slopesti = -(fstopsti * fstopsti * pow(alphaav, (PBRSTI - 1.0))) * PBRSTI * VBRinvsti;
slopegat = -(fstopgat * fstopgat * pow(alphaav, (PBRGAT - 1.0))) * PBRGAT * VBRinvgat;
`ifdef JUNCAP_StandAlone
// do nothing
`else // JUNCAP_StandAlone
// Bandgap voltages at reference temperature for drain-bulk junction
phigrbot_d = PHIGBOTD_i + deltaphigr;
phigrsti_d = PHIGSTID_i + deltaphigr;
phigrgat_d = PHIGGATD_i + deltaphigr;
// Bandgap voltages at device temperature for drain-bulk junction
phigdbot_d = PHIGBOTD_i + deltaphigd;
phigdsti_d = PHIGSTID_i + deltaphigd;
phigdgat_d = PHIGGATD_i + deltaphigd;
// Factors ftd for ideal-current model for drain-bulk junction
ftdbot_d = (pow(auxt, 1.5)) * exp(0.5 * ((phigrbot_d * phitrinv) - (phigdbot_d * phitdinv)));
ftdsti_d = (pow(auxt, 1.5)) * exp(0.5 * ((phigrsti_d * phitrinv) - (phigdsti_d * phitdinv)));
ftdgat_d = (pow(auxt, 1.5)) * exp(0.5 * ((phigrgat_d * phitrinv) - (phigdgat_d * phitdinv)));
// Temperature-scaled saturation current for ideal-current model for drain-bulk junction
idsatbot_d = IDSATRBOTD_i * ftdbot_d * ftdbot_d;
idsatsti_d = IDSATRSTID_i * ftdsti_d * ftdsti_d;
idsatgat_d = IDSATRGATD_i * ftdgat_d * ftdgat_d;
// Built-in voltages before limiting for drain-bulk junction
ubibot_d = VBIRBOTD_i * auxt - 2.0 * phitd * ln(ftdbot_d);
ubisti_d = VBIRSTID_i * auxt - 2.0 * phitd * ln(ftdsti_d);
ubigat_d = VBIRGATD_i * auxt - 2.0 * phitd * ln(ftdgat_d);
// Built-in voltages limited to phitd for drain-bulk junction
vbibot_d = ubibot_d + phitd * ln(1.0 + exp((`vbilow - ubibot_d) * phitdinv));
vbisti_d = ubisti_d + phitd * ln(1.0 + exp((`vbilow - ubisti_d) * phitdinv));
vbigat_d = ubigat_d + phitd * ln(1.0 + exp((`vbilow - ubigat_d) * phitdinv));
// Inverse values of built-in voltages for drain-bulk junction
vbiinvbot_d = 1.0 / vbibot_d;
vbiinvsti_d = 1.0 / vbisti_d;
vbiinvgat_d = 1.0 / vbigat_d;
// One minus the grading coefficient for drain-bulk junction
one_minus_PBOT_d = 1.0 - PBOTD_i;
one_minus_PSTI_d = 1.0 - PSTID_i;
one_minus_PGAT_d = 1.0 - PGATD_i;
// One over "one minus the grading coefficient" for drain-bulk junction
one_over_one_minus_PBOT_d = 1.0 / one_minus_PBOT_d;
one_over_one_minus_PSTI_d = 1.0 / one_minus_PSTI_d;
one_over_one_minus_PGAT_d = 1.0 / one_minus_PGAT_d;
// Temperature-scaled zero-bias capacitance for drain-bulk junction
cjobot_d = CJORBOTD_i * pow((VBIRBOTD_i * vbiinvbot_d), PBOTD_i);
cjosti_d = CJORSTID_i * pow((VBIRSTID_i * vbiinvsti_d), PSTID_i);
cjogat_d = CJORGATD_i * pow((VBIRGATD_i * vbiinvgat_d), PGATD_i);
// Prefactor in physical part of charge model for drain-bulk junction
qprefbot_d = cjobot_d * vbibot_d * one_over_one_minus_PBOT_d;
qprefsti_d = cjosti_d * vbisti_d * one_over_one_minus_PSTI_d;
qprefgat_d = cjogat_d * vbigat_d * one_over_one_minus_PGAT_d;
// Prefactor in mathematical extension of charge model for drain-bulk junction
qpref2bot_d = `a * cjobot_d;
qpref2sti_d = `a * cjosti_d;
qpref2gat_d = `a * cjogat_d;
// Zero-bias depletion widths at reference temperature, needed in SRH and TAT model for drain-bulk junction
wdepnulrbot_d = EPSSI / CJORBOTD_i;
wdepnulrsti_d = XJUNSTID_i * EPSSI / CJORSTID_i;
wdepnulrgat_d = XJUNGATD_i * EPSSI / CJORGATD_i;
// Inverse values of "wdepnulr", used in BBT model for drain-bulk junction
wdepnulrinvbot_d = 1.0 / wdepnulrbot_d;
wdepnulrinvsti_d = 1.0 / wdepnulrsti_d;
wdepnulrinvgat_d = 1.0 / wdepnulrgat_d;
// Inverse values of built-in voltages at reference temperature, needed in SRH and BBT model for drain-bulk junction
VBIRBOTinv_d = 1.0 / VBIRBOTD_i;
VBIRSTIinv_d = 1.0 / VBIRSTID_i;
VBIRGATinv_d = 1.0 / VBIRGATD_i;
// Half the bandgap energy, limited to values > phitd, needed in TAT model for drain-bulk junction
deltaEbot_d = max(0.5 * phigdbot_d, phitd);
deltaEsti_d = max(0.5 * phigdsti_d, phitd);
deltaEgat_d = max(0.5 * phigdgat_d, phitd);
// Values of atat, needed in TAT model for drain-bulk junction
atatbot_d = deltaEbot_d * phitdinv;
atatsti_d = deltaEsti_d * phitdinv;
atatgat_d = deltaEgat_d * phitdinv;
// Values of btatpart, needed in TAT model for drain-bulk junction
btatpartbot_d = sqrt(32.0 * MEFFTATBOTD_i * `MELE * `QELE * (deltaEbot_d * deltaEbot_d * deltaEbot_d)) / (3.0 * `HBAR);
btatpartsti_d = sqrt(32.0 * MEFFTATSTID_i * `MELE * `QELE * (deltaEsti_d * deltaEsti_d * deltaEsti_d)) / (3.0 * `HBAR);
btatpartgat_d = sqrt(32.0 * MEFFTATGATD_i * `MELE * `QELE * (deltaEgat_d * deltaEgat_d * deltaEgat_d)) / (3.0 * `HBAR);
// Temperature-scaled values of FBBT, needed in BBT model for drain-bulk junction
fbbtbot_d = FBBTRBOTD_i * (1.0 + STFBBTBOTD_i * (tkd - tkr));
fbbtsti_d = FBBTRSTID_i * (1.0 + STFBBTSTID_i * (tkd - tkr));
fbbtgat_d = FBBTRGATD_i * (1.0 + STFBBTGATD_i * (tkd - tkr));
fbbtbot_d = `CLIP_LOW(fbbtbot_d, 0.0);
fbbtsti_d = `CLIP_LOW(fbbtsti_d, 0.0);
fbbtgat_d = `CLIP_LOW(fbbtgat_d, 0.0);
// Values of fstop, needed in avalanche/breakdown model for drain-bulk junction
fstopbot_d = 1.0 / (1.0 - pow(alphaav, PBRBOTD_i));
fstopsti_d = 1.0 / (1.0 - pow(alphaav, PBRSTID_i));
fstopgat_d = 1.0 / (1.0 - pow(alphaav, PBRGATD_i));
// Inverse values of breakdown voltages, needed in avalanche/breakdown model for drain-bulk junction
VBRinvbot_d = 1.0 / VBRBOTD_i;
VBRinvsti_d = 1.0 / VBRSTID_i;
VBRinvgat_d = 1.0 / VBRGATD_i;
// Slopes for linear extrapolation close to and beyond breakdown, needed in avalanche/breakdown model for drain-bulk junction
slopebot_d = -(fstopbot_d * fstopbot_d * pow(alphaav, (PBRBOTD_i - 1.0))) * PBRBOTD_i * VBRinvbot_d;
slopesti_d = -(fstopsti_d * fstopsti_d * pow(alphaav, (PBRSTID_i - 1.0))) * PBRSTID_i * VBRinvsti_d;
slopegat_d = -(fstopgat_d * fstopgat_d * pow(alphaav, (PBRGATD_i - 1.0))) * PBRGATD_i * VBRinvgat_d;
`endif // JUNCAP_StandAlone

View File

@ -1,519 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: JUNCAP200_macrodefs.include
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 200.6.1, July 2020
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
///////////////////////////////////////////
//
// Macros and constants used in JUNCAP2
//
///////////////////////////////////////////
// Other constants
`define MINTEMP -2.5e2
`define vbilow 5.0e-2
`define a 2.0
`define epsch 0.1
`define dvbi 5.0e-2
`define epsav 1.0e-6
`define vbrmax 1.0e3
`define vmaxlarge 1.0e8
`define aerfc 0.29214664
`define twothirds 0.666666666666667
// Clipping values
`define levelnumber 2.0e2
`define AB_cliplow 0.0
`define LS_cliplow 0.0
`define LG_cliplow 0.0
`define MULT_cliplow 0.0
`define TRJ_cliplow `MINTEMP
`define IMAX_cliplow 1.0e-12
`define FREV_cliplow 1.0e1
`define FREV_cliphigh 1.0e10
`define IFACTOR_cliplow 0.0
`define CFACTOR_cliplow 0.0
`define CJORBOT_cliplow 1.0e-12
`define CJORSTI_cliplow 1.0e-18
`define CJORGAT_cliplow 1.0e-18
`define VBIR_cliplow `vbilow
`define P_cliplow 5.0e-2
`define P_cliphigh 0.95
`define IDSATR_cliplow 0.0
`define CSRH_cliplow 0.0
`define XJUN_cliplow 1.0e-9
`define CTAT_cliplow 0.0
`define MEFFTAT_cliplow 1.0e-2
`define CBBT_cliplow 0.0
`define VBR_cliplow 0.1
`define PBR_cliplow 0.1
`define VJUNREF_cliplow 0.5
`define FJUNQ_cliplow 0.0
/////////////////////////////////////////////////////////////////////////////
//
// Macro definitions.
//
// Note that because at present locally scoped variables
// can only be in named blocks, the intermediate variables
// used in the macros below must be explicitly declared
// as variables.
//
/////////////////////////////////////////////////////////////////////////////
// Variable declarations of variables that need to be *local* in juncap-express initialization
`define LocalGlobalVars \
/* Declaration of variables needed in macro "calcerfcexpmtat" */ \
real ysq, terfc, erfcpos; \
\
/* Declaration of variables needed in hypfunction 5 */ \
real h1, h2, h2d, h3, h4, h5; \
\
/* Declaration of variables calculated outside macro "juncapfunction", voltage-dependent part */ \
real idmult, vj, z, zinv, two_psistar, vjlim, vjsrh, vbbt, vav; \
\
/* Declaration of variables used within macro "juncapfunction" */ \
real tmp, id; \
real isrh, vbi_minus_vjsrh, wsrhstep, dwsrh, wsrh, wdep, asrh; \
real itat, btat, twoatatoverthreebtat, umaxbeforelimiting, umax, sqrtumax, umaxpoweronepointfive; \
real wgamma, wtat, ktat, ltat, mtat, xerfc, erfctimesexpmtat, gammamax; \
real ibbt, Fmaxr; \
real fbreakdown;
// Initialization of (local) variables; required for some verilog-A compilers
`define JuncapLocalVarInit \
ysq = 0.0; \
terfc = 0.0; \
erfcpos = 0.0; \
h1 = 0.0; \
h2 = 0.0; \
h2d = 0.0; \
h3 = 0.0; \
h4 = 0.0; \
h5 = 0.0; \
idmult = 0.0; \
vj = 0.0; \
z = 0.0; \
zinv = 0.0; \
two_psistar = 0.0; \
vjlim = 0.0; \
vjsrh = 0.0; \
vbbt = 0.0; \
vav = 0.0; \
tmp = 0.0; \
id = 0.0; \
isrh = 0.0; \
vbi_minus_vjsrh = 0.0; \
wsrhstep = 0.0; \
dwsrh = 0.0; \
wsrh = 0.0; \
wdep = 0.0; \
asrh = 0.0; \
itat = 0.0; \
btat = 0.0; \
twoatatoverthreebtat = 0.0; \
umaxbeforelimiting = 0.0; \
umax = 0.0; \
sqrtumax = 0.0; \
umaxpoweronepointfive = 0.0; \
wgamma = 0.0; \
wtat = 0.0; \
ktat = 0.0; \
ltat = 0.0; \
mtat = 0.0; \
xerfc = 0.0; \
erfctimesexpmtat = 0.0; \
gammamax = 0.0; \
ibbt = 0.0; \
Fmaxr = 0.0; \
fbreakdown = 0.0;
// Instance parameter dependent initialization
`define JuncapInitInstance(AB_i, LS_i, LG_i, idsatbot, idsatsti, idsatgat, vbibot, vbisti, vbigat, PBOT_i, PSTI_i, PGAT_i, VBIRBOT_i, VBIRSTI_i, VBIRGAT_i, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim) \
if (idsatbot * AB_i > 0.0) begin \
vmaxbot = phitd * ln(IMAX / (idsatbot * AB_i) + 1.0); \
end else begin \
vmaxbot = `vmaxlarge; \
end \
if (idsatsti * LS_i > 0.0) begin \
vmaxsti = phitd * ln(IMAX / (idsatsti * LS_i) + 1.0); \
end else begin \
vmaxsti = `vmaxlarge; \
end \
if (idsatgat * LG_i > 0.0) begin \
vmaxgat = phitd * ln(IMAX / (idsatgat * LG_i) + 1.0); \
end else begin \
vmaxgat = `vmaxlarge; \
end \
VMAX = min(min(vmaxbot, vmaxsti), vmaxgat); \
`expl(VMAX * phitdinv, exp_VMAX_over_phitd) \
\
/* Determination of minimum value of the relevant built-in voltages */ \
/* and determination of limiting value of conditioned voltage for BBT calculation */ \
vbibot2 = vbibot; \
vbisti2 = vbisti; \
vbigat2 = vbigat; \
pbot2 = PBOT_i; \
psti2 = PSTI_i; \
pgat2 = PGAT_i; \
vbibot2r = VBIRBOT_i; \
vbisti2r = VBIRSTI_i; \
vbigat2r = VBIRGAT_i; \
if (AB_i == 0.0) begin \
vbibot2 = vbisti + vbigat; \
pbot2 = 0.9 * min(PSTI_i, PGAT_i); \
vbibot2r = VBIRSTI_i + VBIRGAT_i; \
end \
if (LS_i == 0.0) begin \
vbisti2 = vbibot + vbigat; \
psti2 = 0.9 * min(PBOT_i, PGAT_i); \
vbisti2r = VBIRBOT_i + VBIRGAT_i; \
end \
if (LG_i == 0.0) begin \
vbigat2 = vbibot + vbisti; \
pgat2 = 0.9 * min(PBOT_i, PSTI_i); \
vbigat2r = VBIRBOT_i + VBIRSTI_i; \
end \
vbimin = min(min(vbibot2, vbisti2), vbigat2); \
vch = vbimin * `epsch; \
pmax = max(max(pbot2, psti2), pgat2); \
vfmin = vbimin * (1.0 - (pow(`a, (-1.0 / (pmax))))); \
vbbtlim = min(min(vbibot2r, vbisti2r), vbigat2r) - `dvbi;
// Special power-functions
`define mypower(x,power,result) \
if (power == 0.5) begin \
result = sqrt(x); \
end else begin \
result = pow(x, power); \
end
`define mypower2(x,power,result) \
if (power == -1.0) begin \
result = 1.0 / (x); \
end else begin \
result = pow(x, power); \
end
`define mypower3(x,power,result) \
if (power == 4.0) begin \
result = (x) * (x) * (x) * (x); \
end else begin \
result = pow(abs(x), power); \
end
// Smoothing functions
`define hypfunction2(x,x0,eps,hyp2) \
hyp2 = 0.5 * ((x) + (x0) - sqrt(((x) - (x0)) * ((x) - (x0)) + 4.0 * (eps) * (eps)));
`define hypfunction5(x,x0,eps,hyp5) \
h1 = 4.0 * (eps) * (eps); \
h2 = (eps) / (x0); \
h2d = (x) + (eps) * h2; \
h3 = (x0) + h2d; \
h4 = (x0) - h2d; \
h5 = sqrt(h4 * h4 + h1); \
hyp5 = 2.0 * ((x) * (x0) / (h3 + h5));
// A special function used to calculate TAT-currents,
// including an approximation of the erfc-function
`define calcerfcexpmtat(y,m,result) \
ysq = y * y; \
if (y > 0.0) begin \
terfc = 1.0 / (1.0 + perfc * y); \
end else begin \
terfc = 1.0 / (1.0 - perfc * y); \
end \
`expl_low(-ysq + m, tmp) \
erfcpos = (`aerfc * terfc + berfc * (terfc * terfc) + cerfc * (terfc * terfc * terfc)) * tmp; \
if (y > 0.0) begin \
result = erfcpos; \
end else begin\
`expl_low(m, tmp) \
result = 2.0 * tmp - erfcpos; \
end
// This is the main function of the JUNCAP2-model. It returns the current and charge
// for a single diode
`define juncapfunction(VAK,qpref,qpref2,vbiinv,one_minus_P,idsat,CSRH,CTAT,vbi,wdepnulr,VBIRinv,P,ftd,btatpart,atat,one_over_one_minus_P,CBBT,VBIR,wdepnulrinv,fbbt,VBR,VBRinv,PBR,fstop,slope,Ijprime,Qjprime) \
`mypower((1.0 - vj * vbiinv), one_minus_P, tmp) \
Qjprime = CFACTOR * (qpref * (1.0 - tmp) + qpref2 * (VAK - vj)); \
id = idsat * idmult; \
if ((CSRH == 0.0) && (CTAT == 0.0)) begin \
isrh = 0.0; \
end else begin \
vbi_minus_vjsrh = vbi-vjsrh; \
wsrhstep = 1.0 - sqrt(1.0 - two_psistar / vbi_minus_vjsrh); \
if (P == 0.5) begin \
dwsrh = 0.0; \
end else begin \
dwsrh = ((wsrhstep * wsrhstep * ln(wsrhstep) / (1.0 - wsrhstep)) + wsrhstep) * (1.0 - 2.0 * P); \
end \
wsrh = wsrhstep + dwsrh; \
`mypower(vbi_minus_vjsrh * VBIRinv, P, tmp) \
wdep = wdepnulr * tmp; \
asrh = ftd * ((zinv - 1.0) * wdep); \
isrh = CSRH * (asrh * wsrh); \
end \
if (CTAT == 0.0) begin \
itat = 0.0; \
end else begin \
btat = btatpart * ((wdep * one_minus_P) / vbi_minus_vjsrh); \
twoatatoverthreebtat = (`twothirds * atat) / btat; \
umaxbeforelimiting = twoatatoverthreebtat * twoatatoverthreebtat; \
umax = sqrt(umaxbeforelimiting * umaxbeforelimiting / (umaxbeforelimiting * umaxbeforelimiting + 1.0)); \
sqrtumax = sqrt(abs(umax)); \
umaxpoweronepointfive = umax * sqrtumax; \
`mypower2((1.0 + btat * umaxpoweronepointfive), (-P * one_over_one_minus_P), wgamma) \
wtat = wsrh * wgamma / (wsrh + wgamma); \
ktat = sqrt(0.375 * (btat / sqrtumax)); \
ltat = 2.0 * (twoatatoverthreebtat * sqrtumax) - umax; \
mtat = atat * twoatatoverthreebtat * sqrtumax - atat * umax + 0.5 * (btat * umaxpoweronepointfive); \
xerfc = (ltat - 1.0) * ktat; \
`calcerfcexpmtat(xerfc, mtat, erfctimesexpmtat) \
gammamax = `SQRTPI * 0.5 * (atat * erfctimesexpmtat / ktat); \
itat = CTAT * (asrh * gammamax * wtat); \
end \
if (CBBT == 0.0) begin \
ibbt = 0.0; \
end else begin \
`mypower(((VBIR - vbbt) * VBIRinv), P, tmp) \
Fmaxr = one_over_one_minus_P * ((VBIR - vbbt) * wdepnulrinv / tmp); \
`expl(-fbbt / Fmaxr, tmp) \
ibbt = CBBT * (VAK * Fmaxr * Fmaxr * tmp); \
end \
if (VBR > `vbrmax) begin \
fbreakdown = 1.0; \
end else begin \
if (vav > -alphaav * VBR) begin \
`mypower3(vav * VBRinv, PBR, tmp) \
fbreakdown = 1.0 / (1.0 - tmp); \
end else begin \
fbreakdown = fstop + (vav + alphaav * VBR) * slope; \
end \
end \
Ijprime = IFACTOR * (id + isrh + itat + ibbt) * fbreakdown;
// The following code is written as a macro because the naming of the instance parameters is
// different for JUNCAP2 stand-alone and JUNCAP2-in-PSP: AB, LS, LG for JUNCAP2 stand-alone,
// ABSOURCE, LSSOURCE, LGSOURCE for source junction in PSP and ABDRAIN, LSDRAIN, LGDRAIN for
// drain junction in PSP
`define juncapcommon(V, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \
vbbt = 0.0; \
two_psistar = 0.0; \
if ( !( ((AB_i) == 0.0) && ((LS_i) == 0.0) && ((LG_i) == 0.0) ) ) begin \
`hypfunction5(V, vfmin, vch, vj) \
if (V < VMAX) begin \
`expl(0.5 * (V * phitdinv), zinv) \
idmult = zinv * zinv; \
end else begin \
idmult = (1.0 + (V - VMAX) * phitdinv) * exp_VMAX_over_phitd; \
zinv = sqrt(idmult); \
end \
idmult = idmult - 1.0; \
z = 1.0 / zinv; \
if (V > 0.0) begin \
two_psistar = 2.0 * (phitd * ln(2.0 + z + sqrt((z + 1.0) * (z + 3.0)))); \
end else begin \
two_psistar = -V + 2.0 * (phitd * ln(2.0 * zinv + 1.0 + sqrt((1.0 + zinv) * (1.0 + 3.0 * zinv)))); \
end \
vjlim = vbimin - two_psistar; \
`hypfunction2(V, vjlim, phitd, vjsrh) \
`hypfunction2(V, vbbtlim, phitr, vbbt) \
`hypfunction2(V, 0.0, `epsav, vav) \
end \
if ((AB_i) == 0.0) begin \
ijunbot = 0.0; \
qjunbot = 0.0; \
end else begin \
`juncapfunction(V, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, ijunbot, qjunbot) \
end \
if ((LS_i) == 0.0) begin \
ijunsti = 0.0; \
qjunsti = 0.0; \
end else begin \
`juncapfunction(V, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, ijunsti, qjunsti) \
end \
if ((LG_i) == 0.0) begin \
ijungat = 0.0; \
qjungat = 0.0; \
end else begin \
`juncapfunction(V, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, ijungat, qjungat) \
end
//============================================================================================================
// JUNCAP-express
//
// The macros below are used in the express-version of JUNCAP2
//============================================================================================================
`define relerr 1.0e-3
`define P1(x) ((x) + 1.0)
`define expll(x, xlow, expxlow, xhigh, expxhigh) \
((x) < (xlow)) ? (expxlow) / `P1((xlow) - (x)) : (((x) > (xhigh)) ? (expxhigh) * `P1((x) - (xhigh)) : exp(x))
// The "JuncapExpressInit"-macro below is split into three parts, as some verilog-A compilers cannot handle
// macros beyond a certain size. Moreover, it is useful to limit the list of input and output variables.
// Part 1
`define JuncapExpressInit1(AB_i, LS_i, LG_i, VJUNREF_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim) \
FRACNA = 0.4; \
FRACNB = 0.65; \
FRACI = 0.8; \
/* Sample voltages */ \
V1 = -FRACNA * VJUNREF_i; \
V2 = -FRACNB * VJUNREF_i; \
V3 = -FRACI * VJUNREF_i; \
V4 = 0.1; \
V5 = 0.2; \
/* Evaluate full JUNCAP-model at five voltages */ \
`juncapcommon(V1, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \
I1 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat; \
`juncapcommon(V2, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \
I2 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat; \
`juncapcommon(V3, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \
I3 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat;
// Part 2
`define JuncapExpressInit2(AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim) \
/* Forward currents */ \
`juncapcommon(V4, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \
I4 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat; \
`juncapcommon(V5, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \
I5 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat;
// Part 3
`define JuncapExpressInit3(AB_i, LS_i, LG_i, idsatbot, idsatsti, idsatgat, ISATFOR1, MFOR1, ISATFOR2, MFOR2, ISATREV, MREV, m0flag) \
/* Compute internal parameters from these five (I,V)-values */ \
ISATFOR1 = AB_i * idsatbot + LS_i * idsatsti + LG_i * idsatgat; \
I4_cor = I4 - ISATFOR1 * (exp(V4 * phitdinv * MFOR1) - 1.0); \
I5_cor = I5 - ISATFOR1 * (exp(V5 * phitdinv * MFOR1) - 1.0); \
if ( !( ((AB_i) == 0.0) && ((LS_i) == 0.0) && ((LG_i) == 0.0) ) ) begin \
if ((I4 > 0.0) && (I5 > 0.0)) begin \
if ((((I4_cor / I4) > `relerr) || ((I5_cor / I5) > `relerr)) && (I4_cor > 0.0) && (I5_cor > 0.0) && (I5_cor > I4_cor)) begin \
alphaje = I4_cor / I5_cor; \
MFOR2 = phitd * ln(alphaje) / (V4 - V5); \
ISATFOR2 = I4_cor / (exp(V4 * phitdinv * MFOR2) - 1.0); \
end \
end \
I1_cor = I1 - ISATFOR1 * (exp(V1 * phitdinv * MFOR1) - 1.0) - ISATFOR2 * (exp(V1 * phitdinv * MFOR2) - 1.0); \
I2_cor = I2 - ISATFOR1 * (exp(V2 * phitdinv * MFOR1) - 1.0) - ISATFOR2 * (exp(V2 * phitdinv * MFOR2) - 1.0); \
I3_cor = I3 - ISATFOR1 * (exp(V3 * phitdinv * MFOR1) - 1.0) - ISATFOR2 * (exp(V3 * phitdinv * MFOR2) - 1.0); \
if ((I1 < 0.0) && (I2 < 0.0) && (I3 < 0.0)) begin \
if ((((I1_cor / I1) > `relerr) || ((I2_cor / I2) > `relerr) || ((I3_cor / I3) > `relerr)) \
&& (I1_cor < 0.0) && (I2_cor < 0.0) && (I3_cor < 0.0)) begin \
alphaje = I1_cor / I2_cor; \
m0_rev = -phitd * ln(alphaje) / (V1 - V2); /* zeroth order approximation */ \
tt0 = V2 / (V2 - V1); \
tt1 = phitd * (alphaje - 1.0) * (pow(alphaje, tt0) - 1.0); \
tt0 = V1 / (V1 - V2); \
tt2 = pow(alphaje, tt0) * (V2 - V1) + alphaje * V1 - V2; \
mcor_rev = tt1 / tt2; /* first order Newton correction */ \
MREV = m0_rev + mcor_rev; \
if (abs(V3 * phitdinv * MREV) < 1.0e-6) begin \
/* Taylor approximation needed */ \
/* Note: ISATREV and MREV have different meaning in this situation!! */ \
m0flag = 1.0; \
ISATREV = I3_cor * (1.0 / V3 + 0.5 * phitdinv * MREV); \
MREV = -0.5 * I3_cor * MREV * phitdinv / V3; \
end else begin \
m0flag = 0.0; \
ISATREV = -I3_cor / (exp(-V3 * phitdinv * MREV) - 1.0); \
end \
end \
end \
end
// Part 4
`define JuncapExpressInit4(AB_i, LS_i, LG_i, FJUNQ_i, cjobot, cjosti, cjogat, zflagbot, zflagsti, zflaggat) \
/* Charge model initialization */ \
zfrac = FJUNQ_i * (AB_i * cjobot + LS_i * cjosti + LG_i * cjogat); \
if ((AB_i * cjobot) <= zfrac) begin \
zflagbot = 0.0; \
end \
if ((LS_i * cjosti) <= zfrac) begin \
zflagsti = 0.0; \
end \
if ((LG_i * cjogat) <= zfrac) begin \
zflaggat = 0.0; \
end
// Part 5
`define JuncapExpressInit5(AB_i, LS_i, LG_i, ISATFOR1, ISATFOR2, ISATREV, xhighf1, expxhf1, xhighf2, expxhf2, xhighr, expxhr) \
/* Calculate limits beyond which exponentials are linearly extrapolated */ \
if ( !( ((AB_i) == 0.0) && ((LS_i) == 0.0) && ((LG_i) == 0.0) ) ) begin \
xhighf1 = ln(0.5 * IMAX / (ISATFOR1 + 1.0e-21)); \
xhighf2 = ln(0.5 * IMAX / (ISATFOR2 + 1.0e-21)); \
xhighr = ln(0.5 * IMAX / (abs(ISATREV) + 1.0e-21)); \
end \
xhighf1 = min(xhighf1, `se05); \
expxhf1 = exp(xhighf1); \
xhighf2 = min(xhighf2, `se05); \
expxhf2 = exp(xhighf2); \
xhighr = min(xhighr, `se05); \
expxhr = exp(xhighr);
`define JuncapExpressCurrent(V, MFOR1, ISATFOR1, MFOR2, ISATFOR2, MREV, ISATREV, m0flag, xhighf1, expxhf1, xhighf2, expxhf2, xhighr, expxhr, ijun) \
tm0 = V * phitdinv * MFOR1; \
tm1 = `expll(tm0, -`se05, `ke05, xhighf1, expxhf1); \
ijunfor1 = ISATFOR1 * (tm1 - 1.0); \
tm0 = V * phitdinv * MFOR2; \
tm1 = `expll(tm0, -`se05, `ke05, xhighf2, expxhf2); \
ijunfor2 = ISATFOR2 * (tm1 - 1.0); \
ijunrev = 0.0; \
if (m0flag > 0.0) begin \
ijunrev = V * (ISATREV + V * MREV); \
end else begin \
tm0 = -V * phitdinv * MREV; \
tm1 = `expll(tm0, -`se05, `ke05, xhighr, expxhr); \
ijunrev = -ISATREV * (tm1 - 1.0); \
end \
ijun = ijunfor1 + ijunfor2 + ijunrev;
`define JuncapExpressCharge(V, AB_i, LS_i, LG_i, qprefbot, qprefsti, qprefgat, qpref2bot, qpref2sti, qpref2gat, vbiinvbot, vbiinvsti, vbiinvgat, one_minus_PBOT, one_minus_PSTI, one_minus_PGAT, vfmin, vch, zflagbot, zflagsti, zflaggat, qjunbot, qjunsti, qjungat) \
tmpv = 0.0; \
vjv = 0.0; \
`hypfunction5(V, vfmin, vch, vjv) \
if (zflagbot > 0.5) begin \
`mypower((1.0 - vjv * vbiinvbot), one_minus_PBOT, tmpv) \
qjunbot = qprefbot * (1.0 - tmpv) + qpref2bot * (V - vjv); \
end \
if (zflagsti > 0.5) begin \
`mypower((1.0 - vjv * vbiinvsti), one_minus_PSTI, tmpv) \
qjunsti = qprefsti * (1.0 - tmpv) + qpref2sti * (V - vjv); \
end \
if (zflaggat > 0.5) begin \
`mypower((1.0 - vjv * vbiinvgat), one_minus_PGAT, tmpv) \
qjungat = qprefgat * (1.0 - tmpv) + qpref2gat * (V - vjv); \
end

View File

@ -1,181 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: JUNCAP200_parlist.include
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 200.6.1, July 2020
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
// --------------------------------------------------------------------------------------------------------------
// JUNCAP2 - Common model parameters
// --------------------------------------------------------------------------------------------------------------
`MPRco(IMAX ,1000.0 ,"A" ,`IMAX_cliplow ,inf ,"Maximum current up to which forward current behaves exponentially")
`MPRco(TRJ ,21.0 ,"C" ,`TRJ_cliplow ,inf ,"Reference temperature")
`MPRcc(FREV ,1.0e3 ,"" ,`FREV_cliplow ,`FREV_cliphigh ,"Coefficient for reverse breakdown current limitation")
`IPRcz(IFACTOR ,1.0 ,"" ,"Multiplier for current")
`IPRcz(CFACTOR ,1.0 ,"" ,"Multiplier for depletion capacitance")
// Parameters for source-bulk junction
`ifdef JUNCAP_StandAlone
`MPRco(CJORBOT ,1.0e-3 ,"Fm^-2" ,`CJORBOT_cliplow ,inf ,"Zero-bias capacitance per unit-of-area of bottom component")
`MPRco(CJORSTI ,1.0e-9 ,"Fm^-1" ,`CJORSTI_cliplow ,inf ,"Zero-bias capacitance per unit-of-length of STI-edge component")
`MPRco(CJORGAT ,1.0e-9 ,"Fm^-1" ,`CJORGAT_cliplow ,inf ,"Zero-bias capacitance per unit-of-length of gate-edge component")
`MPRco(VBIRBOT ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of bottom component")
`MPRco(VBIRSTI ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of STI-edge component")
`MPRco(VBIRGAT ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of gate-edge component")
`MPRcc(PBOT ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of bottom component")
`MPRcc(PSTI ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of STI-edge component")
`MPRcc(PGAT ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of gate-edge component")
`MPRnb(PHIGBOT ,1.16 ,"V" ,"Zero-temperature bandgap voltage of bottom component")
`MPRnb(PHIGSTI ,1.16 ,"V" ,"Zero-temperature bandgap voltage of STI-edge component")
`MPRnb(PHIGGAT ,1.16 ,"V" ,"Zero-temperature bandgap voltage of gate-edge component")
`MPRco(IDSATRBOT ,1.0e-12 ,"Am^-2" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of bottom component")
`MPRco(IDSATRSTI ,1.0e-18 ,"Am^-1" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of STI-edge component")
`MPRco(IDSATRGAT ,1.0e-18 ,"Am^-1" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of gate-edge component")
`MPRco(CSRHBOT ,1.0e2 ,"Am^-3" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of bottom component")
`MPRco(CSRHSTI ,1.0e-4 ,"Am^-2" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of STI-edge component")
`MPRco(CSRHGAT ,1.0e-4 ,"Am^-2" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of gate-edge component")
`MPRco(XJUNSTI ,1.0e-7 ,"m" ,`XJUN_cliplow ,inf ,"Junction depth of STI-edge component")
`MPRco(XJUNGAT ,1.0e-7 ,"m" ,`XJUN_cliplow ,inf ,"Junction depth of gate-edge component")
`MPRco(CTATBOT ,1.0e2 ,"Am^-3" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of bottom component")
`MPRco(CTATSTI ,1.0e-4 ,"Am^-2" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of STI-edge component")
`MPRco(CTATGAT ,1.0e-4 ,"Am^-2" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of gate-edge component")
`MPRco(MEFFTATBOT ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of bottom component")
`MPRco(MEFFTATSTI ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of STI-edge component")
`MPRco(MEFFTATGAT ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of gate-edge component")
`MPRco(CBBTBOT ,1.0e-12 ,"AV^-3" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of bottom component")
`MPRco(CBBTSTI ,1.0e-18 ,"AV^-3m" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of STI-edge component")
`MPRco(CBBTGAT ,1.0e-18 ,"AV^-3m" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of gate-edge component")
`MPRnb(FBBTRBOT ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of bottom component")
`MPRnb(FBBTRSTI ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of STI-edge component")
`MPRnb(FBBTRGAT ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of gate-edge component")
`MPRnb(STFBBTBOT ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of bottom component")
`MPRnb(STFBBTSTI ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of STI-edge component")
`MPRnb(STFBBTGAT ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of gate-edge component")
`MPRco(VBRBOT ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of bottom component")
`MPRco(VBRSTI ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of STI-edge component")
`MPRco(VBRGAT ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of gate-edge component")
`MPRco(PBRBOT ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of bottom component")
`MPRco(PBRSTI ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of STI-edge component")
`MPRco(PBRGAT ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of gate-edge component")
`else // JUNCAP_StandAlone
`MPRco(CJORBOT ,1.0e-3 ,"Fm^-2" ,`CJORBOT_cliplow ,inf ,"Zero-bias capacitance per unit-of-area of bottom component for source-bulk junction")
`MPRco(CJORSTI ,1.0e-9 ,"Fm^-1" ,`CJORSTI_cliplow ,inf ,"Zero-bias capacitance per unit-of-length of STI-edge component for source-bulk junction")
`MPRco(CJORGAT ,1.0e-9 ,"Fm^-1" ,`CJORGAT_cliplow ,inf ,"Zero-bias capacitance per unit-of-length of gate-edge component for source-bulk junction")
`MPRco(VBIRBOT ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of bottom component for source-bulk junction")
`MPRco(VBIRSTI ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of STI-edge component for source-bulk junction")
`MPRco(VBIRGAT ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of gate-edge component for source-bulk junction")
`MPRcc(PBOT ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of bottom component for source-bulk junction")
`MPRcc(PSTI ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of STI-edge component for source-bulk junction")
`MPRcc(PGAT ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of gate-edge component for source-bulk junction")
`MPRnb(PHIGBOT ,1.16 ,"V" ,"Zero-temperature bandgap voltage of bottom component for source-bulk junction")
`MPRnb(PHIGSTI ,1.16 ,"V" ,"Zero-temperature bandgap voltage of STI-edge component for source-bulk junction")
`MPRnb(PHIGGAT ,1.16 ,"V" ,"Zero-temperature bandgap voltage of gate-edge component for source-bulk junction")
`MPRco(IDSATRBOT ,1.0e-12 ,"Am^-2" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of bottom component for source-bulk junction")
`MPRco(IDSATRSTI ,1.0e-18 ,"Am^-1" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of STI-edge component for source-bulk junction")
`MPRco(IDSATRGAT ,1.0e-18 ,"Am^-1" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of gate-edge component for source-bulk junction")
`MPRco(CSRHBOT ,1.0e2 ,"Am^-3" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of bottom component for source-bulk junction")
`MPRco(CSRHSTI ,1.0e-4 ,"Am^-2" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of STI-edge component for source-bulk junction")
`MPRco(CSRHGAT ,1.0e-4 ,"Am^-2" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of gate-edge component for source-bulk junction")
`MPRco(XJUNSTI ,1.0e-7 ,"m" ,`XJUN_cliplow ,inf ,"Junction depth of STI-edge component for source-bulk junction")
`MPRco(XJUNGAT ,1.0e-7 ,"m" ,`XJUN_cliplow ,inf ,"Junction depth of gate-edge component for source-bulk junction")
`MPRco(CTATBOT ,1.0e2 ,"Am^-3" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of bottom component for source-bulk junction")
`MPRco(CTATSTI ,1.0e-4 ,"Am^-2" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of STI-edge component for source-bulk junction")
`MPRco(CTATGAT ,1.0e-4 ,"Am^-2" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of gate-edge component for source-bulk junction")
`MPRco(MEFFTATBOT ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of bottom component for source-bulk junction")
`MPRco(MEFFTATSTI ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of STI-edge component for source-bulk junction")
`MPRco(MEFFTATGAT ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of gate-edge component for source-bulk junction")
`MPRco(CBBTBOT ,1.0e-12 ,"AV^-3" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of bottom component for source-bulk junction")
`MPRco(CBBTSTI ,1.0e-18 ,"AV^-3m" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of STI-edge component for source-bulk junction")
`MPRco(CBBTGAT ,1.0e-18 ,"AV^-3m" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of gate-edge component for source-bulk junction")
`MPRnb(FBBTRBOT ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of bottom component for source-bulk junction")
`MPRnb(FBBTRSTI ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of STI-edge component for source-bulk junction")
`MPRnb(FBBTRGAT ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of gate-edge component for source-bulk junction")
`MPRnb(STFBBTBOT ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of bottom component for source-bulk junction")
`MPRnb(STFBBTSTI ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of STI-edge component for source-bulk junction")
`MPRnb(STFBBTGAT ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of gate-edge component for source-bulk junction")
`MPRco(VBRBOT ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of bottom component for source-bulk junction")
`MPRco(VBRSTI ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of STI-edge component for source-bulk junction")
`MPRco(VBRGAT ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of gate-edge component for source-bulk junction")
`MPRco(PBRBOT ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of bottom component for source-bulk junction")
`MPRco(PBRSTI ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of STI-edge component for source-bulk junction")
`MPRco(PBRGAT ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of gate-edge component for source-bulk junction")
`endif // JUNCAP_StandAlone
// Parameters for drain-bulk junction
`ifdef JUNCAP_StandAlone
// do nothing
`else // JUNCAP_StandAlone
`MPRco(CJORBOTD ,1.0e-3 ,"Fm^-2" ,`CJORBOT_cliplow ,inf ,"Zero-bias capacitance per unit-of-area of bottom component for drain-bulk junction")
`MPRco(CJORSTID ,1.0e-9 ,"Fm^-1" ,`CJORSTI_cliplow ,inf ,"Zero-bias capacitance per unit-of-length of STI-edge component for drain-bulk junction")
`MPRco(CJORGATD ,1.0e-9 ,"Fm^-1" ,`CJORGAT_cliplow ,inf ,"Zero-bias capacitance per unit-of-length of gate-edge component for drain-bulk junction")
`MPRco(VBIRBOTD ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of bottom component for drain-bulk junction")
`MPRco(VBIRSTID ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of STI-edge component for drain-bulk junction")
`MPRco(VBIRGATD ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of gate-edge component for drain-bulk junction")
`MPRcc(PBOTD ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of bottom component for drain-bulk junction")
`MPRcc(PSTID ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of STI-edge component for drain-bulk junction")
`MPRcc(PGATD ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of gate-edge component for drain-bulk junction")
`MPRnb(PHIGBOTD ,1.16 ,"V" ,"Zero-temperature bandgap voltage of bottom component for drain-bulk junction")
`MPRnb(PHIGSTID ,1.16 ,"V" ,"Zero-temperature bandgap voltage of STI-edge component for drain-bulk junction")
`MPRnb(PHIGGATD ,1.16 ,"V" ,"Zero-temperature bandgap voltage of gate-edge component for drain-bulk junction")
`MPRco(IDSATRBOTD ,1.0e-12 ,"Am^-2" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of bottom component for drain-bulk junction")
`MPRco(IDSATRSTID ,1.0e-18 ,"Am^-1" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of STI-edge component for drain-bulk junction")
`MPRco(IDSATRGATD ,1.0e-18 ,"Am^-1" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of gate-edge component for drain-bulk junction")
`MPRco(CSRHBOTD ,1.0e2 ,"Am^-3" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of bottom component for drain-bulk junction")
`MPRco(CSRHSTID ,1.0e-4 ,"Am^-2" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of STI-edge component for drain-bulk junction")
`MPRco(CSRHGATD ,1.0e-4 ,"Am^-2" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of gate-edge component for drain-bulk junction")
`MPRco(XJUNSTID ,1.0e-7 ,"m" ,`XJUN_cliplow ,inf ,"Junction depth of STI-edge component for drain-bulk junction")
`MPRco(XJUNGATD ,1.0e-7 ,"m" ,`XJUN_cliplow ,inf ,"Junction depth of gate-edge component for drain-bulk junction")
`MPRco(CTATBOTD ,1.0e2 ,"Am^-3" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of bottom component for drain-bulk junction")
`MPRco(CTATSTID ,1.0e-4 ,"Am^-2" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of STI-edge component for drain-bulk junction")
`MPRco(CTATGATD ,1.0e-4 ,"Am^-2" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of gate-edge component for drain-bulk junction")
`MPRco(MEFFTATBOTD ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of bottom component for drain-bulk junction")
`MPRco(MEFFTATSTID ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of STI-edge component for drain-bulk junction")
`MPRco(MEFFTATGATD ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of gate-edge component for drain-bulk junction")
`MPRco(CBBTBOTD ,1.0e-12 ,"AV^-3" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of bottom component for drain-bulk junction")
`MPRco(CBBTSTID ,1.0e-18 ,"AV^-3m" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of STI-edge component for drain-bulk junction")
`MPRco(CBBTGATD ,1.0e-18 ,"AV^-3m" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of gate-edge component for drain-bulk junction")
`MPRnb(FBBTRBOTD ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of bottom component for drain-bulk junction")
`MPRnb(FBBTRSTID ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of STI-edge component for drain-bulk junction")
`MPRnb(FBBTRGATD ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of gate-edge component for drain-bulk junction")
`MPRnb(STFBBTBOTD ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of bottom component for drain-bulk junction")
`MPRnb(STFBBTSTID ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of STI-edge component for drain-bulk junction")
`MPRnb(STFBBTGATD ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of gate-edge component for drain-bulk junction")
`MPRco(VBRBOTD ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of bottom component for drain-bulk junction")
`MPRco(VBRSTID ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of STI-edge component for drain-bulk junction")
`MPRco(VBRGATD ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of gate-edge component for drain-bulk junction")
`MPRco(PBRBOTD ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of bottom component for drain-bulk junction")
`MPRco(PBRSTID ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of STI-edge component for drain-bulk junction")
`MPRco(PBRGATD ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of gate-edge component for drain-bulk junction")
`endif // JUNCAP_StandAlone
// JUNCAP2-express parameters
`MPRcc(SWJUNEXP ,0.0 ,"" ,0.0 ,1.0 ,"Flag for JUNCAP-express; 0=full model, 1=express model")
`ifdef JUNCAP_StandAlone
`MPRco(VJUNREF ,2.5 ,"V" ,`VJUNREF_cliplow ,inf ,"Typical maximum junction voltage; usually about 2*VSUP")
`MPRco(FJUNQ ,0.03 ,"" ,`FJUNQ_cliplow ,inf ,"Fraction below which junction capacitance components are considered negligible")
`else // JUNCAP_StandAlone
`MPRco(VJUNREF ,2.5 ,"V" ,`VJUNREF_cliplow ,inf ,"Typical maximum source-bulk junction voltage; usually about 2*VSUP")
`MPRco(FJUNQ ,0.03 ,"" ,`FJUNQ_cliplow ,inf ,"Fraction below which source-bulk junction capacitance components are considered negligible")
`MPRco(VJUNREFD ,2.5 ,"V" ,`VJUNREF_cliplow ,inf ,"Typical maximum drain-bulk junction voltage; usually about 2*VSUP")
`MPRco(FJUNQD ,0.03 ,"" ,`FJUNQ_cliplow ,inf ,"Fraction below which drain-bulk junction capacitance components are considered negligible")
`endif // JUNCAP_StandAlone

View File

@ -1,127 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: JUNCAP200_varlist.include
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 200.6.1, July 2020
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
// declaration of variables calculated outside macro "juncapfunction", voltage-independent part
real tkr, tkd, auxt, KBOL_over_QELE, phitr, phitrinv, phitd, phitdinv;
real perfc, berfc, cerfc;
real deltaphigr, deltaphigd, pmax;
real phigrbot, phigrsti, phigrgat, phigdbot, phigdsti, phigdgat;
real ftdbot, ftdsti, ftdgat, idsatbot, idsatsti, idsatgat;
real ubibot, ubisti, ubigat, vbibot, vbisti, vbigat;
real vbibot2, vbisti2, vbigat2, pbot2, psti2, pgat2, vbibot2r, vbisti2r, vbigat2r;
real vbiinvbot, vbiinvsti, vbiinvgat;
real one_minus_PBOT, one_minus_PSTI, one_minus_PGAT;
real one_over_one_minus_PBOT, one_over_one_minus_PSTI, one_over_one_minus_PGAT;
real cjobot, cjosti, cjogat;
real qprefbot, qprefsti, qprefgat, qpref2bot, qpref2sti, qpref2gat;
real wdepnulrbot, wdepnulrsti, wdepnulrgat, wdepnulrinvbot, wdepnulrinvsti, wdepnulrinvgat;
real VBIRBOTinv, VBIRSTIinv, VBIRGATinv;
real deltaEbot, deltaEsti, deltaEgat, atatbot, atatsti, atatgat;
real btatpartbot, btatpartsti, btatpartgat;
real fbbtbot, fbbtsti, fbbtgat;
real alphaav, fstopbot, fstopsti, fstopgat, VBRinvbot, VBRinvsti, VBRinvgat;
real slopebot, slopesti, slopegat;
real vmaxbot, vmaxsti, vmaxgat;
// JUNCAP-Express variables
real SWJUNEXP_i;
real I1, I2, I3, I4, I5;
real I1_cor, I2_cor, I3_cor, I4_cor, I5_cor;
real V1, V2, V3, V4, V5;
real alphaje, m0_rev, mcor_rev;
real tt0, tt1, tt2, tm0, tm1;
real FRACNA, FRACNB, FRACI;
real zfrac;
real ijunfor1, ijunfor2, ijunrev;
`ifdef JUNCAP_StandAlone
// do nothing
`else // JUNCAP_StandAlone
real CJORBOTD_i, CJORSTID_i, CJORGATD_i, VBIRBOTD_i, VBIRSTID_i, VBIRGATD_i;
real PBOTD_i, PSTID_i, PGATD_i, PHIGBOTD_i, PHIGSTID_i, PHIGGATD_i;
real IDSATRBOTD_i, IDSATRSTID_i, IDSATRGATD_i, XJUNSTID_i, XJUNGATD_i;
real CSRHBOTD_i, CSRHSTID_i, CSRHGATD_i, CTATBOTD_i, CTATSTID_i, CTATGATD_i;
real MEFFTATBOTD_i, MEFFTATSTID_i, MEFFTATGATD_i;
real CBBTBOTD_i, CBBTSTID_i, CBBTGATD_i, FBBTRBOTD_i, FBBTRSTID_i, FBBTRGATD_i;
real STFBBTBOTD_i, STFBBTSTID_i, STFBBTGATD_i;
real VBRBOTD_i, VBRSTID_i, VBRGATD_i, PBRBOTD_i, PBRSTID_i, PBRGATD_i;
real VJUNREFD_i, FJUNQD_i;
real phigrbot_d, phigrsti_d, phigrgat_d, phigdbot_d, phigdsti_d, phigdgat_d;
real ftdbot_d, ftdsti_d, ftdgat_d, idsatbot_d, idsatsti_d, idsatgat_d;
real ubibot_d, ubisti_d, ubigat_d, vbibot_d, vbisti_d, vbigat_d;
real vbiinvbot_d, vbiinvsti_d, vbiinvgat_d;
real one_minus_PBOT_d, one_minus_PSTI_d, one_minus_PGAT_d;
real one_over_one_minus_PBOT_d, one_over_one_minus_PSTI_d, one_over_one_minus_PGAT_d;
real cjobot_d, cjosti_d, cjogat_d;
real qprefbot_d, qprefsti_d, qprefgat_d, qpref2bot_d, qpref2sti_d, qpref2gat_d;
real wdepnulrbot_d, wdepnulrsti_d, wdepnulrgat_d, wdepnulrinvbot_d, wdepnulrinvsti_d, wdepnulrinvgat_d;
real VBIRBOTinv_d, VBIRSTIinv_d, VBIRGATinv_d;
real deltaEbot_d, deltaEsti_d, deltaEgat_d, atatbot_d, atatsti_d, atatgat_d;
real btatpartbot_d, btatpartsti_d, btatpartgat_d;
real fbbtbot_d, fbbtsti_d, fbbtgat_d;
real fstopbot_d, fstopsti_d, fstopgat_d, VBRinvbot_d, VBRinvsti_d, VBRinvgat_d;
real slopebot_d, slopesti_d, slopegat_d;
`endif // JUNCAP_StandAlone
//================================================================
// Variables that are different for source and drain side junction
// and have a scope larger than a single macro-call
//================================================================
`ifdef JUNCAP_StandAlone
real AB_i, LS_i, LG_i;
real zflagbot, zflagsti, zflaggat;
real VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim;
// JUNCAP-express variables
real xhighf1, expxhf1, xhighf2, expxhf2, xhighr, expxhr;
// JUNCAP2-express intermediate parameters
real ISATFOR1, MFOR1, ISATFOR2, MFOR2, ISATREV, MREV, m0flag;
`else // JUNCAP_StandAlone
real ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, AS_i, PS_i;
real zflagbot_s, zflagsti_s, zflaggat_s;
real VMAX_s, exp_VMAX_over_phitd_s, vbimin_s, vch_s, vfmin_s, vbbtlim_s;
// JUNCAP-express variables
real xhighf1_s, expxhf1_s, xhighf2_s, expxhf2_s, xhighr_s, expxhr_s, m0flag_s;
// JUNCAP2-express intermediate parameters
real ISATFOR1_s, MFOR1_s, ISATFOR2_s, MFOR2_s, ISATREV_s, MREV_s;
real ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, AD_i, PD_i;
real zflagbot_d, zflagsti_d, zflaggat_d;
real VMAX_d, exp_VMAX_over_phitd_d, vbimin_d, vch_d, vfmin_d, vbbtlim_d;
// JUNCAP-express variables
real xhighf1_d, expxhf1_d, xhighf2_d, expxhf2_d, xhighr_d, expxhr_d, m0flag_d;
// JUNCAP2-express intermediate parameters
real ISATFOR1_d, MFOR1_d, ISATFOR2_d, MFOR2_d, ISATREV_d, MREV_d;
`endif // JUNCAP_StandAlone

View File

@ -1,775 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: PSP103_macrodefs.include
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 103.8.0 (PSP), 200.6.1 (JUNCAP), July 2020
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
/////////////////////////////////////////////
//
// Macros and constants used in PSP
//
/////////////////////////////////////////////
`define PMOS -1
`define NMOS +1
// Some functions
`define MINA(x,y,a) 0.5*((x)+(y)-sqrt(((x)-(y))*((x)-(y))+(a)))
`define MAXA(x,y,a) 0.5*((x)+(y)+sqrt(((x)-(y))*((x)-(y))+(a)))
`define MNE(x,y,a,mne) \
tme1 = 4.0 - (a); \
tme2 = (x) + (y); \
mne = 2.0 / tme1 * (tme2 - sqrt(tme2 * tme2 - tme1 * (x) * (y)));
`define MXE(x,y,a,mxe) \
tme1 = 4.0 - (a); \
tme2 = (x) + (y); \
mxe = 2.0 / tme1 * (tme2 + sqrt(tme2 * tme2 - tme1 * (x) * (y)));
// Physical constants
`define QMN 5.951993
`define QMP 7.448711
// Other constants (PSP-mos)
`define DELTA1 0.02
`define invSqrt2 7.0710678118654746e-01
`define oneSixth 1.6666666666666667e-01
`define LEN 1.0e-6
`define WEN 1.0e-6
/////////////////////////////////////////////////////////////////////////////
//
// Macro definitions.
//
// Note that because at present locally scoped variables
// can only be in named blocks, the intermediate variables
// used in the macros below must be explicitly declared
// as variables in the main code.
//
/////////////////////////////////////////////////////////////////////////////
// Function for parameter definition in the case of separate calculation of charge model in saturation
// --------------------------------------------------------------------------------------------------------------
`define DefACparam(param_i,param_dc,param_ac) \
param_i = (param_dc); \
if ($param_given(param_ac) == 1) \
param_i = (param_ac);
// sigma function used in surface potential and other calculations
// --------------------------------------------------------------------------------------------------------------
// Note: one call uses expressions for arguments so parentheses around the arguments in the expressions are necessary
`define sigma(a,c,tau,eta,y) \
nu = (a) + (c); \
mutau = nu * nu + (tau) * (0.5 * ((c) * (c)) - (a)); \
y = (eta) + (a) * nu * (tau) / (mutau + (nu / mutau) * (tau) * (tau) * (c) * ((c) * (c) * `oneThird - (a)));
// modified version of sigma function, which takes 4 arguments
// --------------------------------------------------------------------------------------------------------------
`define sigma2(a,b,c,tau,eta,y) \
nu = (a) + (c); \
mutau = (nu) * (nu) + (tau) * (0.5 * ((c) * (c)) - (a) * (b)); \
y = (eta) + (a) * nu * (tau) / (mutau + (nu / mutau) * (tau) * (tau) * (c) * ((c) * (c) * `oneThird - (a) * (b)));
// sp_s function: surface potential calculation
// --------------------------------------------------------------------------------------------------------------
`define sp_s(sp,xg,xn,delta) \
if (abs(xg) <= margin) begin \
SP_S_temp1 = inv_xi * inv_xi * `oneSixth * `invSqrt2; \
sp = xg * inv_xi * (1.0 + xg * (1.0 - (delta)) * Gf * SP_S_temp1); \
end else begin \
if (xg < -margin) begin \
SP_S_yg = -xg; \
SP_S_ysub = 1.25 * (SP_S_yg * inv_xi); \
SP_S_eta = 0.5 * (SP_S_ysub + 10 - sqrt((SP_S_ysub - 6.0) * (SP_S_ysub - 6.0) + 64.0)); \
SP_S_temp = SP_S_yg - SP_S_eta; \
SP_S_a = SP_S_temp * SP_S_temp + Gf2*(SP_S_eta + 1.0);\
SP_S_c = 2.0 * SP_S_temp - Gf2; \
SP_S_tau = -SP_S_eta + ln(SP_S_a * inv_Gf2); \
`sigma(SP_S_a, SP_S_c, SP_S_tau, SP_S_eta, SP_S_y0) \
`expl_high(SP_S_y0, SP_S_delta0) \
SP_S_delta1 = 1.0 / SP_S_delta0; \
SP_S_temp = 1.0 / (2.0 + SP_S_y0 * SP_S_y0); \
SP_S_xi0 = SP_S_y0 * SP_S_y0 * SP_S_temp; \
SP_S_xi1 = 4.0 * (SP_S_y0 * SP_S_temp * SP_S_temp); \
SP_S_xi2 = (8.0 * SP_S_temp - 12.0 * SP_S_xi0) * SP_S_temp * SP_S_temp; \
SP_S_temp = SP_S_yg - SP_S_y0; \
SP_S_temp1 = (delta) * SP_S_delta1; \
SP_S_pC = 2.0 * SP_S_temp + Gf2 * (SP_S_delta0 - 1.0 - SP_S_temp1 + (delta) * (1.0 - SP_S_xi1)); \
SP_S_qC = SP_S_temp * SP_S_temp - Gf2 * (SP_S_delta0 - SP_S_y0 - 1.0 + SP_S_temp1 + (delta) * (SP_S_y0 - 1.0 - SP_S_xi0)); \
SP_S_temp = 2.0 - Gf2 * (SP_S_delta0 + SP_S_temp1 - (delta) * SP_S_xi2); \
SP_S_temp = SP_S_pC * SP_S_pC - 2.0 * (SP_S_qC * SP_S_temp); \
sp = -SP_S_y0 - 2.0 * (SP_S_qC / (SP_S_pC + sqrt(SP_S_temp))); \
end else begin \
SP_xg1 = 1.0 / (1.25 + Gf * 7.324648775608221e-001); \
SP_S_A_fac= (xi * 1.25 * SP_xg1 - 1.0) * SP_xg1; \
SP_S_xbar = xg * inv_xi * (1.0 + SP_S_A_fac * xg); \
`expl_low(-SP_S_xbar, SP_S_temp) \
SP_S_w = 1.0 - SP_S_temp; \
SP_S_x1 = xg + Gf2 * 0.5 - Gf * sqrt(xg + Gf2 * 0.25 - SP_S_w); \
SP_S_bx = (xn) + 3.0; \
SP_S_eta = `MINA(SP_S_x1, SP_S_bx, 5.0) - 0.5 * (SP_S_bx - sqrt(SP_S_bx * SP_S_bx + 5.0)); \
SP_S_temp = xg - SP_S_eta; \
SP_S_temp1= exp(-SP_S_eta); \
SP_S_temp2= 1.0 / (2.0 + SP_S_eta * SP_S_eta); \
SP_S_xi0 = SP_S_eta * SP_S_eta * SP_S_temp2; \
SP_S_xi1 = 4.0 * (SP_S_eta * SP_S_temp2 * SP_S_temp2); \
SP_S_xi2 = (8.0 * SP_S_temp2 - 12.0 * SP_S_xi0) * SP_S_temp2 * SP_S_temp2; \
SP_S_a = max(1.0e-40, SP_S_temp * SP_S_temp - Gf2 * (SP_S_temp1 + SP_S_eta - 1.0 - (delta) * (SP_S_eta + 1.0 + SP_S_xi0))); \
SP_S_b = 1.0 - 0.5 * (Gf2 * (SP_S_temp1 - (delta) * SP_S_xi2)); \
SP_S_c = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_temp1 - (delta) * (1.0 + SP_S_xi1)); \
SP_S_tau = (xn) - SP_S_eta + ln(SP_S_a / Gf2); \
`sigma2(SP_S_a, SP_S_b, SP_S_c, SP_S_tau, SP_S_eta, SP_S_x0) \
if (SP_S_x0 < `se05) begin \
SP_S_delta0 = exp(SP_S_x0); \
SP_S_delta1 = 1.0 / SP_S_delta0; \
SP_S_delta0 = (delta) * SP_S_delta0; \
end else begin \
if (SP_S_x0 > (xn) - `se05) begin \
SP_S_delta0 = exp(SP_S_x0 - (xn)); \
SP_S_delta1 = (delta) / SP_S_delta0; \
end else begin \
SP_S_delta0 = `ke05 / `P3((xn) - SP_S_x0 - `se05); \
SP_S_delta1 = `ke05 / `P3(SP_S_x0 - `se05); \
end \
end \
SP_S_temp = 1.0 / (2.0 + SP_S_x0 * SP_S_x0); \
SP_S_xi0 = SP_S_x0 * SP_S_x0 * SP_S_temp; \
SP_S_xi1 = 4.0 * (SP_S_x0 * SP_S_temp * SP_S_temp); \
SP_S_xi2 = (8.0 * SP_S_temp - 12.0 * SP_S_xi0) * SP_S_temp * SP_S_temp; \
SP_S_temp = xg - SP_S_x0; \
SP_S_pC = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_delta1 + SP_S_delta0 - (delta) * (1.0 + SP_S_xi1)); \
SP_S_qC = SP_S_temp * SP_S_temp - Gf2 * (SP_S_delta1 + SP_S_x0 - 1.0 + SP_S_delta0 - (delta) * (SP_S_x0 + 1.0 + SP_S_xi0)); \
SP_S_temp = 2.0 - Gf2 * (SP_S_delta1 + SP_S_delta0 - (delta) * SP_S_xi2); \
SP_S_temp = SP_S_pC * SP_S_pC - 2.0 * (SP_S_qC * SP_S_temp); \
sp = SP_S_x0 + 2.0 * (SP_S_qC / (SP_S_pC + sqrt(SP_S_temp))); \
end \
end
// sp_s_d function: surface potential calculation at drain (subset of function sp_s)
// --------------------------------------------------------------------------------------------------------------
`define sp_s_d(sp,xg,xn,delta) \
if (abs(xg) <= margin) begin \
SP_S_temp1 = inv_xi * inv_xi * `oneSixth * `invSqrt2; \
sp = xg * inv_xi * (1.0 + xg * (1.0 - (delta)) * Gf * SP_S_temp1); \
end else begin \
SP_S_bx = (xn) + 3.0; \
SP_S_eta = `MINA(SP_S_x1, SP_S_bx, 5.0) - 0.5 * (SP_S_bx - sqrt(SP_S_bx * SP_S_bx + 5.0)); \
SP_S_temp = xg - SP_S_eta; \
SP_S_temp1= exp(-SP_S_eta); \
SP_S_temp2= 1.0 / (2.0 + SP_S_eta * SP_S_eta); \
SP_S_xi0 = SP_S_eta * SP_S_eta * SP_S_temp2; \
SP_S_xi1 = 4.0 * (SP_S_eta * SP_S_temp2 * SP_S_temp2); \
SP_S_xi2 = (8.0 * SP_S_temp2 - 12.0 * SP_S_xi0) * SP_S_temp2 * SP_S_temp2; \
SP_S_a = max(1.0e-40, SP_S_temp * SP_S_temp - Gf2 * (SP_S_temp1 + SP_S_eta - 1.0 - (delta) * (SP_S_eta + 1.0 + SP_S_xi0))); \
SP_S_b = 1.0 - 0.5 * (Gf2 * (SP_S_temp1 - (delta) * SP_S_xi2)); \
SP_S_c = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_temp1 - (delta) * (1.0 + SP_S_xi1)); \
SP_S_tau = (xn) - SP_S_eta + ln(SP_S_a / Gf2); \
`sigma2(SP_S_a, SP_S_b, SP_S_c, SP_S_tau, SP_S_eta, SP_S_x0) \
if (SP_S_x0 < `se05) begin \
SP_S_delta0 = exp(SP_S_x0); \
SP_S_delta1 = 1.0 / SP_S_delta0; \
SP_S_delta0 = (delta) * SP_S_delta0; \
end else begin \
if (SP_S_x0 > (xn) - `se05) begin \
SP_S_delta0 = exp(SP_S_x0 - (xn)); \
SP_S_delta1 = (delta) / SP_S_delta0; \
end else begin \
SP_S_delta0 = `ke05 / `P3((xn) - SP_S_x0 - `se05); \
SP_S_delta1 = `ke05 / `P3(SP_S_x0 - `se05); \
end \
end \
SP_S_temp = 1.0 / (2.0 + SP_S_x0 * SP_S_x0); \
SP_S_xi0 = SP_S_x0 * SP_S_x0 * SP_S_temp; \
SP_S_xi1 = 4.0 * (SP_S_x0 * SP_S_temp * SP_S_temp); \
SP_S_xi2 = (8.0 * SP_S_temp-12.0 * SP_S_xi0) * SP_S_temp * SP_S_temp; \
SP_S_temp = xg - SP_S_x0; \
SP_S_pC = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_delta1 + SP_S_delta0 - (delta) * (1.0 + SP_S_xi1)); \
SP_S_qC = SP_S_temp * SP_S_temp - Gf2 * (SP_S_delta1 + SP_S_x0 - 1.0 + SP_S_delta0 - (delta) * (SP_S_x0 + 1.0 + SP_S_xi0)); \
SP_S_temp = 2.0 - Gf2*(SP_S_delta1+SP_S_delta0-(delta)*SP_S_xi2); \
SP_S_temp = SP_S_pC * SP_S_pC - 2.0 * (SP_S_qC * SP_S_temp); \
sp = SP_S_x0 + 2.0 * (SP_S_qC / (SP_S_pC + sqrt(SP_S_temp)));\
end
// sp_ovInit function: surface potential calculation for the overlap regions initialization
// --------------------------------------------------------------------------------------------------------------
`define sp_ovInit(GOV, GOV2, SP_OV_eps2, SP_OV_a, SP_OV_delta1) \
inv_GOV = 1.0 / GOV; \
SP_OV_eps = 3.1 * GOV + 8.5; \
SP_OV_eps2 = SP_OV_eps * SP_OV_eps; \
SP_OV_delta = 0.5 * SP_OV_eps; \
if (inv_GOV < 0.06) begin \
SP_OV_a = 64.0 * inv_GOV; \
end else begin \
if (inv_GOV <= 0.45) begin \
SP_OV_a = 22.0 * inv_GOV + 3.0; \
end else begin \
if (inv_GOV <= 1.6) begin \
SP_OV_a = -7.2 * inv_GOV + 15.5; \
end else begin \
SP_OV_a = GOV; \
end \
end \
end \
SP_OV_delta1 = SP_OV_delta + GOV2 * 0.5 - GOV * sqrt(SP_OV_delta + GOV2 * 0.25 + SP_OV_a);
// qi_edge charge calculation for the edge transistor
// --------------------------------------------------------------------------------------------------------------
`define qi_edge(qieff_edge,xg_edge,xn_edge) \
Q_EDGE_xsth = xbedge + xn_edge; \
Q_EDGE_xth0 = Q_EDGE_xsth + Gfedge * sqrt(Q_EDGE_xsth); \
Q_EDGE_xth = Q_EDGE_xth0 + dxthedge; \
Q_EDGE_n = 1.0 + Gfedge / (2.0 * sqrt(Q_EDGE_xsth)); \
Q_EDGE_n_inv = 1.0 / Q_EDGE_n; \
Q_EDGE_xgt = xg_edge - Q_EDGE_xth; \
if (Q_EDGE_xgt > -12.0) begin \
Q_EDGE_xgt0 = Q_EDGE_xgt + lnGfedge2 - 1.0; \
Q_EDGE_xgt0e = 0.5 * (Q_EDGE_xgt0 + sqrt(Q_EDGE_xgt0 * Q_EDGE_xgt0 + 10.0)); \
Q_EDGE_qi0si = Q_EDGE_xgt - Q_EDGE_n * ln(Q_EDGE_xgt0e) + lnGfedge2; \
Q_EDGE_qi0 = 0.5 * (Q_EDGE_qi0si + sqrt(Q_EDGE_qi0si * Q_EDGE_qi0si + 2.0)); \
`expl_high((Q_EDGE_xgt - Q_EDGE_qi0), Q_EDGE_exp_x) \
Q_EDGE_d0 = Gfedge2 * Q_EDGE_exp_x; \
Q_EDGE_d0p = pow(Q_EDGE_d0, Q_EDGE_n_inv); \
Q_EDGE_sqerr = Q_EDGE_n * Q_EDGE_n + (2.0 * (Q_EDGE_qi0 + Q_EDGE_n) - Q_EDGE_d0p) * Q_EDGE_d0p; \
Q_EDGE_errq = Q_EDGE_n * ((sqrt(Q_EDGE_sqerr) - Q_EDGE_n) / Q_EDGE_d0p - 1.0); \
qieff_edge = Q_EDGE_qi0 - Q_EDGE_errq; \
end else begin \
`expl_low((Q_EDGE_n_inv * (Q_EDGE_xgt + lnGfedge2)), qieff_edge) \
end
// CollapsableR macro: used for parasitic resistances
// --------------------------------------------------------------------------------------------------------------
// Note: if R=0, the Verilog-A compiler should recognize that the corresponding nodes can be collapsed
`define CollapsableR(G, R, SN, N1, N2, Rname) \
if ((R) > 0.0) begin \
I(N1, N2) <+ MULT_i * (G) * V(N1, N2); \
/* line below can be removed if compiler issue occurs */ \
I(N1, N2) <+ white_noise(MULT_i * SN, Rname); \
end else begin \
V(N1, N2) <+ 0.0; \
end
// Local variable declaration (used in SPcalc_dc/SPcalc_ac sections, PSP103_SPCalculation.include and SP macro)
// --------------------------------------------------------------------------------------------------------------
`define SPcalcLocalVarDecl \
real phib, G_0, Vsbstar, cfloc, thesatloc, axloc, alploc; \
real Vsbx, xg, Dnsub, Gf, Gf2, inv_Gf2, xi, inv_xi, Ux, xn_s, delta_ns, margin, x_s, delta_1s, xi0s, xi1s; \
real xi2s, Es, Ds, Ps, Rxcor, xgs, qis, qbs, rhob, GR, Eeffm, Mutmp, Gmob, xitsb, wsat, thesat1, phi_inf; \
real ysat, za, Phi_0, asat, Phi_2, Phi_0_2, Phi0_Phi2, Phi_sat, Vdse, Udse, xn_d, k_ds, delta_nd, x_d, x_ds; \
real pC, qC, dps, xi0d, Ed, Dd, Pd, sqd, qbd, x_m, Em, D_bar, Dm, Pm, xgm, eta_p, sqm, alpha, d0, x_pm, p_pd; \
real q_pd, xi_pd, u_pd, km, km0, qim, qim1, qbm, qeff, qeff1, s1, dL, GdL, Gmob_dL, zsat, Gvsat, Gvsatinv; \
real Voxm, alpha1, H, Vgsinr, Vsginr, Vgdinr, Vdginr; \
real SP_S_temp, SP_S_temp1, SP_S_temp2; \
real SP_S_yg, SP_S_ysub, SP_S_eta, SP_S_a, SP_S_c, SP_S_tau, SP_S_y0, SP_S_delta0, SP_S_delta1, SP_S_xi0; \
real SP_S_xi1, SP_S_xi2, SP_S_pC, SP_S_qC, SP_xg1, SP_S_A_fac, SP_S_xbar, SP_S_w, SP_S_x1, SP_S_bx, SP_S_b; \
real SP_S_x0;
// TempInitialize macro: initialize the temperature dependent variables
// --------------------------------------------------------------------------------------------------------------
`define TempInitialize \
TKD_sq = TKD * TKD; \
delT = TKD - TKR; \
rTn = TKR / TKD; \
ln_rTn = ln(rTn); \
phit = TKD * `KBOL / `QELE; \
inv_phit = 1.0 / phit; \
Eg = 1.179 - 9.025e-5 * TKD - 3.05e-7 * TKD_sq; \
phibFac = (1.045 + 4.5e-4 * TKD) * (0.523 + 1.4e-3 * TKD - 1.48e-6 * TKD_sq) * TKD_sq / 9.0E4; \
phibFac = `MAX(phibFac, 1.0e-3); \
\
/* Parameter for white noise of parasitic resistances */ \
nt0 = 4.0 * `KBOL * TKD;
// TempScaling macro: calculation of temperature dependent variables
// --------------------------------------------------------------------------------------------------------------
`define TempScaling \
phib_dc = Eg + DPHIB_i + 2.0 * phit * ln(NEFF_i * pow(phibFac, -0.75) * 4.0e-26); \
phib_dc = `MAX(phib_dc, 5.0E-2); \
G_0_dc = sqrt(2.0 * `QELE * NEFF_i * EPSSI * inv_phit) / CoxPrime; \
\
/* Poly-silicon depletion */ \
kp = 0.0; \
np = 0.0; \
if (NP_i > 0.0) begin \
arg2max = 8.0e7 / tox_sq; \
np = `MAX(NP_i, arg2max); \
np = `MAX(5.0e24, np); \
kp = 2.0 * CoxPrime * CoxPrime * phit / (`QELE * np * EPSSI); \
end \
\
/* QM corrections */ \
qlim2 = 100.0 * phit * phit; \
if (QMC > 0.0) begin \
qb0 = sqrt(phit * G_0_dc * G_0_dc * phib_dc); \
dphibq = 0.75 * qq * pow(qb0, `twoThirds); \
phib_dc = phib_dc + dphibq; \
G_0_dc = G_0_dc * (1.0 + 2.0 * `twoThirds * dphibq / qb0); \
end \
sqrt_phib_dc = sqrt(phib_dc); \
phix_dc = 0.95 * phib_dc; \
aphi_dc = 0.0025 * phib_dc * phib_dc; \
bphi_dc = aphi_dc; \
phix2 = 0.5 * sqrt(bphi_dc); \
phix1_dc = `MINA(phix_dc - phix2, 0.0, aphi_dc); \
alpha_b = 0.5 * (phib_dc + Eg); \
us1 = sqrt(VSBNUD_i + phib_dc) - sqrt_phib_dc; \
us21 = sqrt(VSBNUD_i + DVSBNUD_i + phib_dc) - sqrt_phib_dc - us1; \
\
/* Additional variables for separate surface potential calculation for CV */ \
phib_ac = Eg + DPHIB_i + DELVTAC_i + 2.0 * phit * ln(NEFFAC_i * pow(phibFac, -0.75) * 4.0e-26); \
phib_ac = `MAX(phib_ac, 5.0e-2); \
G_0_ac = sqrt(2.0 * `QELE * NEFFAC_i * EPSSI * inv_phit) / CoxPrime; \
\
if (QMC > 0.0) begin \
qb0 = sqrt(phit * G_0_ac * G_0_ac * phib_ac); \
dphibq = 0.75 * qq * pow(qb0, `twoThirds); \
phib_ac = phib_ac + dphibq; \
G_0_ac = G_0_ac * (1.0 + 2.0 * `twoThirds * dphibq / qb0); \
end \
\
phix_ac = 0.95 * phib_ac; \
aphi_ac = 0.0025 * phib_ac * phib_ac; \
bphi_ac = aphi_ac; \
phix2 = 0.5 * sqrt(bphi_ac); \
phix1_ac = `MINA(phix_ac - phix2, 0.0, aphi_ac); \
\
/* Temperature scaling of parameters*/ \
VFB_T = VFB_i + STVFB_i * delT * (1.0 + ST2VFB_i * delT)+ DELVTO_i; \
\
/* Interface states parameters*/ \
tf_ct = exp(STCT_i * ln_rTn); \
CT_T = CT_i * tf_ct; \
CTG_T = CTG_i / rTn; \
\
/* Mobility parameters */ \
tf_bet = exp(STBET_i * ln_rTn); \
BETN_T = BETN_i * tf_bet; \
BET_i = FACTUO_i * BETN_T * CoxPrime; \
THEMU_T = THEMU_i * exp(STTHEMU_i * ln_rTn); \
tf_mue = exp(STMUE_i * ln_rTn); \
MUE_T = MUE_i * tf_mue; \
THECS_T = THECS_i * exp(STTHECS_i * ln_rTn); \
tf_cs = exp(STCS_i * ln_rTn); \
CS_T = CS_i * tf_cs; \
tf_xcor = exp(STXCOR_i * ln_rTn); \
XCOR_T = XCOR_i * tf_xcor; \
\
/* Series resistance */ \
tf_ther = exp(STRS_i * ln_rTn); \
RS_T = RS_i * tf_ther; \
THER_i = 2.0 * BET_i * RS_T; \
\
/* Velocity saturation */ \
tf_thesat = exp(STTHESAT_i * ln_rTn); \
THESAT_T = THESAT_i * tf_thesat; \
THESATAC_T = THESATAC_i * tf_thesat; \
\
/* Impact ionization */ \
A2_T = A2_i * exp(-STA2_i * ln_rTn); \
\
/* Noise */ \
nt = FNT_i * 4.0 * `KBOL * TKD; \
Sfl_prefac = phit * phit * BET_i / Cox_over_q; \
\
/* Edge transistor */ \
if ((SWEDGE != 0) && (BETNEDGE_i > 0.0)) begin \
VFBEDGE_T = VFBEDGE_i + STVFBEDGE_i * delT + DELVTOEDGE_i; \
tf_betedge = exp(STBETEDGE_i * ln_rTn); \
BETNEDGE_T = BETNEDGE_i * tf_betedge; \
BETEDGE_i = FACTUOEDGE_i * BETNEDGE_T * CoxPrime; \
phit0edge = phit * (1.0 + CTEDGE_i * rTn); \
phibedge = Eg + DPHIBEDGE_i + 2.0 * phit0edge * ln(NEFFEDGE_i * pow(phibFac, -0.75) * 4.0e-26); \
phibedge = `MAX(phibedge, 5.0e-2); \
Gfedge = sqrt(2.0 * `QELE * NEFFEDGE_i * EPSSI * inv_phit) / CoxPrime; \
Gfedge2 = Gfedge * Gfedge; \
lnGfedge2 = ln(Gfedge2); \
phixedge = 0.95 * phibedge; \
aphiedge = 0.0025 * phibedge * phibedge; \
bphiedge = aphiedge; \
phix2edge = 0.5 * sqrt(bphiedge); \
phix1edge = `MINA(phixedge - phix2edge, 0.0, aphiedge); \
Sfl_prefac_edge = phit * phit * BETEDGE_i / Cox_over_q; \
ntedge = FNTEDGE_i * 4.0 * `KBOL * TKD; \
end else begin \
VFBEDGE_T = 0.0; \
tf_betedge = 1.0; \
BETNEDGE_T = 0.0; \
BETEDGE_i = 0.0; \
phit0edge = phit; \
phibedge = 0.0; \
Gfedge = 1.0; \
Gfedge2 = 1.0; \
lnGfedge2 = 0.0; \
phixedge = 0.0; \
aphiedge = 0.0; \
bphiedge = 0.0; \
phix2edge = 0.0; \
phix1edge = 0.0; \
Sfl_prefac_edge = 0.0; \
ntedge = 1.0; \
end
// Model's core for currents and charges calculation (initially into PSP103_SPCalculation.include)
// --------------------------------------------------------------------------------------------------------------
`define SPCalculation \
\
/* Initialisation of some variables */ \
alpha = 0.0; \
GdL = 1.0; \
dL = 0.0; \
qbm = 0.0; \
dps = 0.0; \
qim = 0.0; \
qim1 = 0.0; \
H = 1.0; \
s1 = 0.0; \
eta_p = 1.0; \
Gvsat = 1.0; \
Gvsatinv = 1.0; \
SP_S_x1 = 0.0; \
x_s = 0.0; \
sqm = 0.0; \
xitsb = 0.0; \
rhob = 0.0; \
Gmob = 1.0; \
Gmob_dL = 1.0; \
Udse = 0.0; \
thesat1 = 0.0; \
Em = 0.0; \
Dm = 0.0; \
Pm = 0.0; \
xgm = 0.0; \
qbs = 0.0; \
qbd = 0.0; \
\
/* Bias definition */ \
Vgb1 = Vgs + Vsbstar - VFB_T; \
Vsbx = Vsbstar + 0.5 * (Vds - Vdsx); \
Vdsp = 2.0 * Vdsx / (1.0 + sqrt(1.0 + CFD_i * Vdsx)); \
delVg = cfloc * Vdsp * (1.0 + CFB_i * Vsbx); \
dphit1 = PSCE_i * (1.0 + PSCED_i * Vdsx) * (1.0 + PSCEB_i * Vsbx); \
Vgb1 = Vgb1 + delVg; \
\
/* Bias dependent body factor */ \
if (DNSUB_i > 0.0) begin \
Dnsub = DNSUB_i * `MAXA(0.0, Vgs + Vsb - VNSUB_i, NSLP_i); \
Gf = G_0 * sqrt(1.0 + Dnsub); \
end else begin \
Gf = G_0; \
end \
Gf2 = Gf * Gf; \
inv_Gf2 = 1.0 / Gf2; \
\
/* Bias dependence of interface states */ \
dCTG = 1.0; \
if (CTG_i > 0.0) begin \
xgct = 2.0 * Vgb1 * inv_phit; \
temp1 = Gf2 + xgct; \
temp2 = `MAXA((temp1 + xgct), 0.0, 5.0); \
xsct0 = 0.5 * (temp1 - Gf * sqrt(temp2)); \
xbct = phib * inv_phit; \
xsbstar = Vsbx * inv_phit; \
temp1 = xbct + xsbstar + 2.0; \
xsct = `MINA(xsct0, temp1, 5.0); \
temp2 = CTG_T * (xsct - (1.0 + CTB_i) * (0.5 * xbct + xsbstar)); \
`expl_low(temp2, dCTG) \
end \
ct_fact = 1.0 + CT_T * dCTG; \
phit1 = phit * ct_fact * (1.0 + dphit1); \
inv_phit1 = 1.0 / phit1; \
xg = Vgb1 * inv_phit1; \
\
/* Surface potential at source side */ \
xi = 1.0 + Gf * `invSqrt2; \
inv_xi = 1.0 / xi; \
Ux = Vsbstar * inv_phit1; \
xn_s = phib * inv_phit1 + Ux; \
if (xn_s < `se) \
delta_ns = exp(-xn_s); \
else \
delta_ns = `ke / `P3(xn_s - `se); \
margin = 1.0e-5 * xi; \
\
`sp_s(x_s, xg, xn_s, delta_ns) \
x_d = x_s; \
x_m = x_s; \
x_ds = 0.0; \
\
/* Core PSP current calculation */ \
Vdsat_lim = 3.912023005 * phit1; \
if (xg <= 0.0) begin \
qis = 0.0; \
xgm = xg - x_s; \
qbs = xgm * phit1; \
qbd = qbs; \
Voxm = xgm * phit1; \
qeff1 = Voxm; \
Vdsat = Vdsat_lim; \
Vdse = Vds; \
end else begin /* (xg > 0) */ \
delta_1s = 0.0; \
temp = 1.0 / (2.0 + x_s * x_s); \
xi0s = x_s * x_s * temp; \
xi1s = 4.0 * (x_s * temp * temp); \
xi2s = (8.0 * temp - 12.0 * xi0s) * temp * temp; \
if (x_s < `se05) begin \
delta_1s = exp(x_s); \
Es = 1.0 / delta_1s; \
delta_1s = delta_ns * delta_1s; \
end else if (x_s > (xn_s - `se05)) begin \
delta_1s = exp(x_s - xn_s); \
Es = delta_ns / delta_1s; \
end else begin \
delta_1s = `ke05 / `P3(xn_s - x_s - `se05); \
Es = `ke05 / `P3(x_s - `se05); \
end \
Ds = delta_1s - delta_ns * (x_s + 1.0 + xi0s); \
if (x_s < 1.0e-5) begin \
Ps = 0.5 * (x_s * x_s * (1.0 - `oneThird * (x_s * (1.0 - 0.25 * x_s)))); \
Ds = `oneSixth * (delta_ns * x_s * x_s * x_s * (1.0 + 1.75 * x_s)); \
temp = sqrt(1.0 - `oneThird * (x_s * (1.0 - 0.25 * x_s))); \
sqm = `invSqrt2 * (x_s * temp); \
alpha = 1.0 + Gf * `invSqrt2 * (1.0 - 0.5 * x_s + `oneSixth * (x_s * x_s)) / temp; \
end else begin \
Ps = x_s - 1.0 + Es; \
sqm = sqrt(Ps); \
alpha = 1.0 + 0.5 * (Gf * (1.0 - Es) / sqm); \
end \
Em = Es; \
Ed = Em; \
Dm = Ds; \
Dd = Dm; \
\
/* Drain saturation voltage */ \
Rxcor = (1.0 + 0.2 * XCOR_T * Vsbx) / (1.0 + XCOR_T * Vsbx); \
if (Ds > `ke05) begin \
xgs = Gf * sqrt(Ps + Ds); \
qis = Gf2 * Ds * phit1 / (xgs + Gf * sqm); \
qbs = sqm * Gf * phit1; \
if (RSB_i < 0.0) begin \
rhob = 1.0 / (1.0 - RSB_i * Vsbx); \
end else begin \
rhob = 1.0 + RSB_i * Vsbx; \
end \
if (RSG_i < 0.0) begin \
temp = 1.0 - RSG_i * qis; \
end else begin \
temp = 1.0 / (1.0 + RSG_i * qis); \
end \
GR = THER_i * (rhob * temp * qis); \
Eeffm = E_eff0 * (qbs + eta_mu * qis); \
temp1 = ln(Ps / (Ps + Ds + 1.0e-14)); \
Mutmp = pow(Eeffm * MUE_T, THEMU_T) + CS_T * exp(0.5 * THECS_T * temp1); \
Gmob = (1.0 + Mutmp + GR) * Rxcor; \
if (THESATB_i < 0.0) begin \
xitsb = 1.0 / (1.0 - THESATB_i * Vsbx); \
end else begin \
xitsb = 1.0 + THESATB_i * Vsbx; \
end \
temp2 = qis * xitsb; \
wsat = 100.0 * (temp2 / (100.0 + temp2)); \
if (THESATG_i < 0.0) begin \
temp = 1.0 / (1.0 - THESATG_i * wsat); \
end else begin \
temp = 1.0 + THESATG_i * wsat; \
end \
thesat1 = thesatloc * (temp / Gmob); \
phi_inf = qis / alpha + phit1; \
ysat = thesat1 * phi_inf * `invSqrt2; \
if (CHNL_TYPE==`PMOS) begin \
ysat = ysat / sqrt(1.0 + ysat); \
end \
za = 2.0 / (1.0 + sqrt(1.0 + 4.0 * ysat)); \
temp1 = za * ysat; \
Phi_0 = phi_inf * za * (1.0 + 0.86 * (temp1 * (1.0 - temp1 * za) / (1.0 + 4.0 * (temp1 * temp1 * za)))); \
asat = xgs + 0.5 * Gf2; \
Phi_2 = 0.98 * (Gf2 * Ds * phit1 / (asat + sqrt(asat * asat - Gf2 * Ds * 0.98))); \
Phi_0_2 = Phi_0 + Phi_2; \
Phi0_Phi2 = 2.0 * (Phi_0 * Phi_2); \
Phi_sat = Phi0_Phi2 / (Phi_0_2 + sqrt(Phi_0_2 * Phi_0_2 - 1.98 * Phi0_Phi2)); \
Vdsat = Phi_sat - phit1 * ln(1.0 + Phi_sat * (Phi_sat - 2.0 * asat * phit1) * inv_Gf2 / (phit1 * phit1 * Ds)); \
end else begin \
Vdsat = Vdsat_lim; \
end \
temp = pow(Vds / Vdsat, axloc); \
temp1 = -1.0 / axloc; \
Vdse = Vds * pow(1.0 + temp, temp1); \
\
/* Surface potential at drain side */ \
Udse = Vdse * inv_phit1; \
xn_d = xn_s + Udse; \
if (Udse < `se) begin \
k_ds = exp(-Udse); \
end else begin \
k_ds = `ke / `P3(Udse - `se); \
end \
delta_nd = delta_ns * k_ds; \
\
`sp_s_d(x_d, xg, xn_d, delta_nd) \
x_ds = x_d - x_s; \
\
/* Approximations for extremely small x_ds: capacitance calculation */ \
if (x_ds < 1.0e-10) begin \
pC = 2.0 * (xg - x_s) + Gf2 * (1.0 - Es + delta_1s * k_ds - delta_nd * (1.0 + xi1s)); \
qC = Gf2 * (1.0 - k_ds) * Ds; \
temp = 2.0 - Gf2 * (Es + delta_1s * k_ds - delta_nd * xi2s); \
temp = pC * pC - 2.0 * (temp * qC); \
x_ds = 2.0 * (qC / (pC + sqrt(temp))); \
x_d = x_s + x_ds; \
end \
dps = x_ds * phit1; \
\
xi0d = x_d * x_d / (2.0 + x_d * x_d); \
if (x_d < `se05) begin \
Ed = exp(-x_d); \
if (x_d < 1.0e-5) begin \
Pd = 0.5 * (x_d * x_d * (1.0 - `oneThird * (x_d * (1.0 - 0.25 * x_d)))); \
temp = sqrt(1.0 - `oneThird * (x_d * (1.0 - 0.25 * x_d))); \
sqd = `invSqrt2 * (x_d * temp); \
Dd = `oneSixth * delta_nd * x_d * x_d * x_d * (1.0 + 1.75 * x_d); \
end else begin \
Pd = x_d - 1.0 + Ed; \
sqd = sqrt(Pd); \
Dd = delta_nd * (1.0 / Ed - x_d - 1.0 - xi0d); \
end \
end else begin \
if (x_d > (xn_d - `se05)) begin \
temp = exp(x_d - xn_d); \
Ed = delta_nd / temp; \
Dd = temp - delta_nd * (x_d + 1.0 + xi0d); \
end else begin \
Ed = `ke05 / `P3(x_d - `se05); \
temp = `ke05 / `P3(xn_d - x_d - `se05); \
Dd = temp - delta_nd * (x_d + 1.0 + xi0d); \
end \
Pd = x_d - 1.0 + Ed; \
sqd = sqrt(Pd); \
end \
qbd = sqd * Gf * phit1; \
\
/* Mid-point surface potential */ \
x_m = 0.5 * (x_s + x_d); \
Em = 0.0; \
temp = Ed * Es; \
if (temp > 0.0) begin \
Em = sqrt(temp); \
end \
D_bar = 0.5 * (Ds + Dd); \
Dm = D_bar + 0.125 * (x_ds * x_ds * (Em - 2.0 * inv_Gf2)); \
\
if (x_m < 1.0e-5) begin \
Pm = 0.5 * (x_m * x_m * (1.0 - `oneThird * (x_m * (1.0 - 0.25 * x_m)))); \
xgm = Gf * sqrt(Dm + Pm); \
\
/* Polysilicon depletion */ \
if (kp > 0.0) begin \
eta_p = 1.0 / sqrt(1.0 + kp * xgm); \
end /* (kp > 0.0) */ \
temp = sqrt(1.0 - `oneThird * (x_m * (1.0 - 0.25 * x_m))); \
sqm = `invSqrt2 * (x_m * temp); \
alpha = eta_p + `invSqrt2 * (Gf * (1.0 - 0.5 * x_m + `oneSixth * (x_m * x_m)) / temp); \
end else begin \
Pm = x_m - 1.0 + Em; \
xgm = Gf * sqrt(Dm + Pm); \
\
/* Polysilicon depletion */ \
if (kp > 0.0) begin \
d0 = 1.0 - Em + 2.0 * (xgm * inv_Gf2); \
eta_p = 1.0 / sqrt(1.0 + kp * xgm); \
temp = eta_p / (eta_p + 1.0); \
x_pm = kp * (temp * temp * Gf2 * Dm); \
p_pd = 2.0 * (xgm - x_pm) + Gf2 * (1.0 - Em + Dm); \
q_pd = x_pm * (x_pm - 2.0 * xgm); \
xi_pd = 1.0 - 0.5 * (Gf2 * (Em + Dm)); \
u_pd = q_pd * p_pd / (p_pd * p_pd - xi_pd * q_pd); \
x_m = x_m + u_pd; \
km = exp(u_pd); \
Em = Em / km; \
Dm = Dm * km; \
Pm = x_m - 1.0 + Em; \
xgm = Gf * sqrt(Dm + Pm); \
km0 = 1.0 - Em + 2.0 * (xgm * eta_p * inv_Gf2); \
x_ds = x_ds * km * (d0 + D_bar) / (km0 + km * D_bar); \
dps = x_ds * phit1; \
end /* (kp > 0.0) */ \
sqm = sqrt(Pm); \
alpha = eta_p + 0.5 * (Gf * (1.0 - Em) / sqm); \
end \
\
/* Potential midpoint inversion charge */ \
qim = phit1 * (Gf2 * Dm / (xgm + Gf * sqm)); \
qim1 = qim + phit1 * alpha; \
qbm = sqm * Gf * phit1; \
\
/* Series resistance */ \
if (RSG_i < 0.0) begin \
temp = 1.0 - RSG_i * qim; \
end else begin \
temp = 1.0 / (1.0 + RSG_i * qim); \
end \
GR = THER_i * (rhob * temp * qim); \
\
/* Mobility reduction */ \
qeff = qbm + eta_mu * qim; \
qeff1 = qbm + eta_mu1 * qim; \
Eeffm = E_eff0 * qeff; \
temp1 = ln(Pm / (Pm + Dm + 1.0e-14)); \
Mutmp = pow(Eeffm * MUE_T, THEMU_T) + CS_T * exp(0.5 * THECS_T * temp1); \
Gmob = (1.0 + Mutmp + GR) * Rxcor; \
\
/* Channel length modulation */ \
s1 = ln((1.0 + (Vds - dps) * inv_VP) / (1.0 + (Vdse - dps) * inv_VP)); \
dL = alploc * s1; \
GdL = 1.0 / (1.0 + dL + dL * dL); \
\
/* Velocity saturation */ \
temp2 = qim * xitsb; \
wsat = 100.0 * (temp2 / (100.0 + temp2)); \
Gmob_dL = Gmob * GdL; \
if (THESATG_i < 0.0) begin \
temp = 1.0 / (1.0 - THESATG_i * wsat); \
end else begin \
temp = 1.0 + THESATG_i * wsat; \
end \
thesat1 = thesatloc * (temp / Gmob_dL); \
zsat = thesat1 * thesat1 * dps * dps; \
if (CHNL_TYPE == `PMOS) begin \
zsat = zsat / (1.0 + thesat1 * dps); \
end \
Gvsat = 0.5 * (Gmob_dL * (1.0 + sqrt(1.0 + 2.0 * zsat))); \
Gvsatinv = 1.0 / Gvsat; \
\
/* Variables for calculation of intrinsic charges and gate current */ \
Voxm = xgm * phit1; \
temp = Gmob_dL * Gvsatinv; \
alpha1 = alpha * (1.0 + 0.5 * (zsat * temp * temp)); \
H = temp * qim1 / alpha1; \
\
end /* (xg > 0.0) */ \
\
/* Variables for calculation of inner fringe charges */ \
Vgsinr = phit1 * (x_s - xn_s); \
Vsginr = Vgb1 - Vgsinr - qbs; \
Vgdinr = dps + Vgsinr - Vds; \
Vdginr = Vgb1 - Vgdinr - qbd;

File diff suppressed because it is too large Load Diff

View File

@ -1,583 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: PSP103_nqs_macrodefs.include
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 103.8.0 (PSP), 200.6.1 (JUNCAP), July 2020
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
//////////////////////////////////////////
//
// Macros used in PSP-NQS
//
//////////////////////////////////////////
// Function to calculate bulk charge from surface potential
`define PhiToQb(phi,Qb_tmp) \
if (abs(phi) <= margin_ac) \
Qb_tmp = -0.70710678 * phi * Gf_ac * (1.0 - `oneSixth * phi * (1.0 - `oneSixth * phi)); \
else begin \
`expl((-phi), temp) \
Qb_tmp = Gf_ac * sqrt(temp + phi - 1.0); \
if (phi > margin_ac) \
Qb_tmp = -Qb_tmp; \
end
// Function used in fq-macro
`define PhiTod2Qis(xphi,d2Qis) \
if (abs(xphi) <= margin_ac) begin \
Qb_tmp = -0.70710678 * xphi * Gf_ac * (1.0 - `oneSixth * xphi * (1.0 - `oneSixth * xphi)); \
dQbs = -0.70710678 * Gf_ac * (1.0 - `oneThird * xphi * (1.0 - 0.25 * xphi)); \
d2Qis = -0.235702 * Gf_ac * (1.0 - 0.5 * xphi); \
end else begin \
`expl((-xphi),temp) \
Qb_tmp = Gf_ac * sqrt(temp + xphi - 1.0); \
if (xphi > margin_ac) \
Qb_tmp = -Qb_tmp; \
dQbs = 0.5 * Gf_ac * Gf_ac * (1.0 - temp) / Qb_tmp; \
d2Qis = (dQbs * dQbs - 0.5 * Gf_ac * Gf_ac) / Qb_tmp + dQbs; \
end
// Function used in QiToPhi
`define sps(sp, xg) \
if (abs(xg) <= marginp) begin \
sp = xg / a_factrp; \
end else begin \
if (xg < -marginp) begin \
NQS_yg = -xg; \
NQS_z = 1.25 * NQS_yg / a_factrp; \
NQS_eta = (NQS_z + 10.0 - sqrt((NQS_z - 6.0) * (NQS_z - 6.0) + 64.0)) * 0.5; \
NQS_a = (NQS_yg - NQS_eta) * (NQS_yg - NQS_eta) + Gp2 * (NQS_eta + 1.0); \
NQS_c = 2.0 * (NQS_yg - NQS_eta) - Gp2; \
NQS_tau = ln(NQS_a / Gp2) - NQS_eta; \
`sigma(NQS_a, NQS_c, NQS_tau, NQS_eta, NQS_y0) \
`expl(NQS_y0, NQS_D0) \
NQS_xi = 1.0 - Gp2 * NQS_D0 * 0.5; \
NQS_p = 2.0 * (NQS_yg - NQS_y0) + Gp2 * (NQS_D0 - 1.0); \
NQS_q = (NQS_yg - NQS_y0) * (NQS_yg - NQS_y0) + Gp2 * (NQS_y0 + 1.0 - NQS_D0); \
NQS_temp = NQS_p * NQS_p - 4.0 * NQS_xi * NQS_q; \
NQS_w = 2.0 * NQS_q / (NQS_p + sqrt(NQS_temp)); \
sp = -(NQS_y0 + NQS_w); \
end else begin \
NQS_xg1 = 1.0 / ( 1.25 + 7.32464877560822e-01 * Gp); \
NQS_A_fac = (1.25 * a_factrp * NQS_xg1 - 1.0) * NQS_xg1; \
NQS_xbar = xg / a_factrp * (1.0 + NQS_A_fac * xg); \
`expl(-NQS_xbar, NQS_temp) \
NQS_w = 1.0 - NQS_temp; \
NQS_x0 = xg + Gp2 * 0.5 - Gp * sqrt(xg + Gp2 * 0.25 - NQS_w); \
`expl((-NQS_x0), NQS_D0) \
NQS_xi = 1.0 - Gp2 * 0.5 * NQS_D0; \
NQS_p = 2.0 * (xg - NQS_x0) + Gp2 * (1.0 - NQS_D0); \
NQS_q = (xg - NQS_x0) * (xg - NQS_x0) - Gp2 * (NQS_x0 - 1.0 + NQS_D0); \
NQS_temp = NQS_p * NQS_p - 4.0 * NQS_xi * NQS_q; \
NQS_u = 2.0 * NQS_q / (NQS_p + sqrt(NQS_temp)); \
sp = NQS_x0 + NQS_u; \
end \
end
// Function to calculate surface potential from inversion charge
`define QiToPhi(Qi,xg,xphi) \
temp = Qi / pd + xg; \
`sps(xphi,temp)
// Calculation of fk
`define fq(Qi,xg,dQy,d2Qy,fk) \
`QiToPhi(Qi, xg, xphi) \
`PhiTod2Qis(xphi, d2Qis) \
dQis = pd - dQbs; \
dQis_1 = 1.0 / dQis; \
fQi = Qi * dQis_1 - 1.0; \
dfQi = (1.0 - Qi * d2Qis * dQis_1 * dQis_1) * dQis_1; \
fk0 = dfQi * dQy * dQy + fQi * d2Qy; \
dpsy2 = dQy * dQy * dQis_1 * dQis_1; \
zsat_nqs = thesat2 * dpsy2; \
if (CHNL_TYPE == `PMOS) \
zsat_nqs = zsat_nqs / (1.0 + thesat1_ac * dps_ac); \
temp = sqrt(1.0 + 2.0 * zsat_nqs); \
Fvsat = 2.0 / (1.0 + temp); \
temp1 = d2Qy - dpsy2 * d2Qis; \
fk = Fvsat * (fk0 - zsat_nqs * fQi * temp1 * Fvsat / temp);
// Interpolation of surface potential along channel
`define Phiy(y) \
x_m_ac + H_ac * (1.0 - sqrt(1.0 - 2.0 * dps_ac / H_ac * ((y) - ym))) * inv_phit1
// Computing initial (dc) values for internal nodes (from PSP103_InitNQS.include in previous versions)
`define InitNQS \
\
Qp1_0 = 0.0; \
Qp2_0 = 0.0; \
Qp3_0 = 0.0; \
Qp4_0 = 0.0; \
Qp5_0 = 0.0; \
Qp6_0 = 0.0; \
Qp7_0 = 0.0; \
Qp8_0 = 0.0; \
Qp9_0 = 0.0; \
fk1 = 0.0; \
fk2 = 0.0; \
fk3 = 0.0; \
fk4 = 0.0; \
fk5 = 0.0; \
fk6 = 0.0; \
fk7 = 0.0; \
fk8 = 0.0; \
fk9 = 0.0; \
if (SWNQS_i != 0) begin \
dQis = 0.0; \
dQy = 0.0; \
dfQi = 0.0; \
fQi = 0.0; \
d2Qy = 0.0; \
Qp1 = 0.0; \
Qp2 = 0.0; \
Qp3 = 0.0; \
Qp4 = 0.0; \
Qp5 = 0.0; \
Qp6 = 0.0; \
Qp7 = 0.0; \
Qp8 = 0.0; \
Qp9 = 0.0; \
phi_p1 = 0.0; \
phi_p2 = 0.0; \
phi_p3 = 0.0; \
phi_p4 = 0.0; \
phi_p5 = 0.0; \
phi_p6 = 0.0; \
phi_p7 = 0.0; \
phi_p8 = 0.0; \
phi_p9 = 0.0; \
\
/* Setting initial values for charge along the channel from interpolated DC-solution */ \
if (xg_ac > 0.0) begin \
if (SWNQS_i == 1) begin \
phi_p1 = `Phiy(0.5); \
`PhiToQb(phi_p1,Qb_tmp) \
Qp1_0 = -pd * (xg_ac - phi_p1) - Qb_tmp; \
\
end else if (SWNQS_i == 2) begin \
phi_p1 = `Phiy(`oneThird); \
`PhiToQb(phi_p1,Qb_tmp) \
Qp1_0 = -pd * (xg_ac - phi_p1) - Qb_tmp; \
\
phi_p2 = `Phiy(`twoThirds); \
`PhiToQb(phi_p2,Qb_tmp) \
Qp2_0 = -pd * (xg_ac - phi_p2) - Qb_tmp; \
\
if (sigVds < 0) begin \
`swap(Qp1_0, Qp2_0) \
end \
\
end else if (SWNQS_i == 3) begin \
phi_p1 = `Phiy(0.25); \
`PhiToQb(phi_p1,Qb_tmp) \
Qp1_0 = -pd * (xg_ac - phi_p1) - Qb_tmp; \
\
phi_p2 = `Phiy(0.5); \
`PhiToQb(phi_p2,Qb_tmp) \
Qp2_0 = -pd * (xg_ac - phi_p2) - Qb_tmp; \
\
phi_p3 = `Phiy(0.75); \
`PhiToQb(phi_p3,Qb_tmp) \
Qp3_0 = -pd * (xg_ac - phi_p3) - Qb_tmp; \
\
if (sigVds < 0) begin \
`swap(Qp1_0, Qp3_0) \
end \
\
end else if (SWNQS_i == 5) begin \
phi_p1 = `Phiy(`oneSixth); \
`PhiToQb(phi_p1,Qb_tmp) \
Qp1_0 = -pd * (xg_ac - phi_p1) - Qb_tmp; \
\
phi_p2 = `Phiy(`oneThird); \
`PhiToQb(phi_p2,Qb_tmp) \
Qp2_0 = -pd * (xg_ac - phi_p2) - Qb_tmp; \
\
phi_p3 = `Phiy(0.5); \
`PhiToQb(phi_p3,Qb_tmp) \
Qp3_0 = -pd * (xg_ac - phi_p3) - Qb_tmp; \
\
phi_p4 = `Phiy(`twoThirds); \
`PhiToQb(phi_p4,Qb_tmp) \
Qp4_0 = -pd * (xg_ac - phi_p4) - Qb_tmp; \
\
phi_p5 = `Phiy(0.8333333333333333); \
`PhiToQb(phi_p5,Qb_tmp) \
Qp5_0 = -pd * (xg_ac - phi_p5) - Qb_tmp; \
\
if (sigVds < 0.0) begin \
`swap(Qp1_0, Qp5_0) \
`swap(Qp2_0, Qp4_0) \
end \
\
end else if (SWNQS_i == 9) begin \
phi_p1 = `Phiy(0.1); \
`PhiToQb(phi_p1,Qb_tmp) \
Qp1_0 = -pd * (xg_ac - phi_p1) - Qb_tmp; \
\
phi_p2 = `Phiy(0.2); \
`PhiToQb(phi_p2,Qb_tmp) \
Qp2_0 = -pd * (xg_ac - phi_p2) - Qb_tmp; \
\
phi_p3 = `Phiy(0.3); \
`PhiToQb(phi_p3,Qb_tmp) \
Qp3_0 = -pd * (xg_ac - phi_p3) - Qb_tmp; \
\
phi_p4 = `Phiy(0.4); \
`PhiToQb(phi_p4,Qb_tmp) \
Qp4_0 = -pd * (xg_ac - phi_p4) - Qb_tmp; \
\
phi_p5 = `Phiy(0.5); \
`PhiToQb(phi_p5,Qb_tmp) \
Qp5_0 = -pd * (xg_ac - phi_p5) - Qb_tmp; \
\
phi_p6 = `Phiy(0.6); \
`PhiToQb(phi_p6,Qb_tmp) \
Qp6_0 = -pd * (xg_ac - phi_p6) - Qb_tmp; \
\
phi_p7 = `Phiy(0.7); \
`PhiToQb(phi_p7,Qb_tmp) \
Qp7_0 = -pd * (xg_ac - phi_p7) - Qb_tmp; \
\
phi_p8 = `Phiy(0.8); \
`PhiToQb(phi_p8,Qb_tmp) \
Qp8_0 = -pd * (xg_ac - phi_p8) - Qb_tmp; \
\
phi_p9 = `Phiy(0.9); \
`PhiToQb(phi_p9,Qb_tmp) \
Qp9_0 = -pd * (xg_ac - phi_p9) - Qb_tmp; \
\
if (sigVds < 0.0) begin \
`swap(Qp1_0, Qp9_0) \
`swap(Qp2_0, Qp8_0) \
`swap(Qp3_0, Qp7_0) \
`swap(Qp4_0, Qp6_0) \
end \
end \
end /* (x_g >0.0) */ \
end /* (SWNQS_i != 0) */ \
\
x_sp = 0.0; \
x_dp = 0.0; \
Qp0 = 0.0; \
QpN = 0.0; \
if (SWNQS_i != 0) begin \
x_sp = x_m_ac - sigVds * 0.5 * dps_ac * inv_phit1; \
x_dp = x_m_ac + sigVds * 0.5 * dps_ac * inv_phit1; \
Qp0 = 0.0; \
QpN = 0.0; \
if (x_sp > 0.0) begin \
`PhiToQb(x_sp, QbSIGN) \
Qp0 = -pd * (xg_ac - x_sp) - QbSIGN; \
end \
if (x_dp > 0.0) begin \
`PhiToQb(x_dp, QbSIGN) \
QpN = -pd * (xg_ac - x_dp) - QbSIGN; \
end \
end
// Calculate NQS-charge contributions (from PSP103_ChargesNQS.include in previous versions)
`define CalcChargesNQS \
\
Qp1 = vnorm * V(SPLINE1); \
Qp2 = vnorm * V(SPLINE2); \
Qp3 = vnorm * V(SPLINE3); \
Qp4 = vnorm * V(SPLINE4); \
Qp5 = vnorm * V(SPLINE5); \
Qp6 = vnorm * V(SPLINE6); \
Qp7 = vnorm * V(SPLINE7); \
Qp8 = vnorm * V(SPLINE8); \
Qp9 = vnorm * V(SPLINE9); \
\
Tnorm = 0.0; \
\
if (SWNQS_i != 0) begin \
/* Dimension and mobility information is included in Tnorm */ \
Tnorm = MUNQS_i * phit1 * BET_i / (COX_qm * Gmob_dL_ac); \
thesat2 = thesat1_ac * thesat1_ac * phit1 * phit1; \
\
if (SWNQS_i == 1) begin \
dQy = QpN - Qp0; \
d2Qy = 6.0 * (Qp0 + QpN) - 12.0 * Qp1; \
end else if (SWNQS_i == 2) begin \
dQy = (-7.0 * Qp0 - 3.0 * Qp1 + 12.0 * Qp2 - 2.0 * QpN) / 5.0; \
d2Qy = -18.0 / 5.0 * (-4.0 * Qp0 + 9.0 * Qp1 - 6.0 * Qp2 + QpN); \
end else if (SWNQS_i == 3) begin \
dQy = (-13.0 * Qp0 - 6.0 * Qp1 + 24.0 * Qp2 - 6.0 * Qp3 + QpN) / 7.0; \
d2Qy = (180.0 * Qp0 - 408.0 * Qp1 + 288.0 * Qp2 - 72.0 * Qp3 + 12.0 * QpN) / 7.0; \
end else if (SWNQS_i == 5) begin \
dQy = (-181.0 * Qp0 - 84.0 * Qp1 + 24.0 * Qp4 - 6.0 * Qp5 - 90.0 * Qp3 + QpN \
+ 336.0 * Qp2) / 65.0; \
d2Qy = (432.0 * Qp4 - 108.0 * Qp5 - 1620.0 * Qp3 + 18.0 * QpN + 3762.0 * Qp0 \
- 8532.0 * Qp1 + 6048.0 * Qp2) / 65.0; \
end else if (SWNQS_i == 9) begin \
dQy = (1680.0 * Qp6 + 23400.0 * Qp4 + 5.0 * QpN - 87330.0 * Qp3 + 120.0 * Qp8 \
- 450.0 * Qp7 - 81480.0 * Qp1 + 325920.0 * Qp2 \
- 175565.0 * Qp0 - 30.0 * Qp9) / 37829.0 - 30.0 / 181.0 * Qp5; \
d2Qy = (-13500.0 * Qp7 + 702000.0 * Qp4 - 2619900 * Qp3 - 13793100.0 * Qp1 \
+ 9777600.0 * Qp2 + 6081750.0 * Qp0 + 150.0 * QpN + 3600.0 * Qp8 \
- 900.0 * Qp9 + 50400.0 * Qp6) / 37829.0 - 900.0 / 181.0 * Qp5; \
end else begin \
dQy = 0.0; \
d2Qy = 0.0; \
end \
`fq(Qp1, xg_ac, dQy, d2Qy, fk1) \
end else begin \
thesat2 = 0.0; \
end \
\
if (SWNQS_i >= 2) begin \
if (SWNQS_i == 2) begin \
dQy = (2.0 * Qp0 - 12.0 * Qp1 + 3.0 * Qp2 + 7.0 * QpN) / 5.0; \
d2Qy = -18.0 / 5.0 * (-4.0 * QpN + 9.0 * Qp2 - 6.0 * Qp1 + Qp0); \
end else if (SWNQS_i == 3) begin \
dQy = 0.5 * Qp0 - 3.0 * Qp1 + 3.0 * Qp3 - 0.5 * QpN; \
d2Qy = (-48.0 * Qp0 + 288.0 * Qp1 - 480.0 * Qp2 + 288.0 * Qp3 - 48.0 * QpN) / 7.0; \
end else if (SWNQS_i == 5) begin \
dQy = (-291.0 * Qp1 - 6.0 * Qp2 - 84.0 * Qp4 + 21.0 * Qp5) / 65.0 \
+ (630.0 * Qp3 - 7.0 * QpN + 97.0 * Qp0) / 130.0; \
d2Qy = (-1728.0 * Qp4 + 432.0 * Qp5 + 6480.0 * Qp3 - 72.0 * QpN - 1008.0 * Qp0 \
+ 6048.0 * Qp1 - 10152.0 * Qp2) / 65.0; \
end else if (SWNQS_i == 9) begin \
dQy = (-5880.0 * Qp6 - 81900.0 * Qp4 + 305655.0 * Qp3 - 420.0 * Qp8 \
+ 105.0 * Qp9 - 282255.0 * Qp1 + 1575.0 * Qp7 - 5850.0 * Qp2) / 37829.0 \
+ 105.0 / 181.0 * Qp5 + (94085.0 * Qp0 - 35.0 * QpN) / 75658.0; \
d2Qy = (9777600.0 * Qp1 + 54000.0 * Qp7 - 2808000.0 * Qp4 + 10479600.0 * Qp3 \
- 16413000.0 * Qp2 - 1629600.0 * Qp0 - 600.0 * QpN - 14400.0 * Qp8 \
+ 3600.0 * Qp9 - 201600.0 * Qp6) / 37829.0 + 3600.0 * Qp5 / 181.0; \
end else begin \
dQy = 0.0; \
d2Qy = 0.0; \
end \
`fq(Qp2, xg_ac, dQy, d2Qy, fk2) \
end \
\
if (SWNQS_i >= 3) begin \
if (SWNQS_i == 3) begin \
dQy = (13.0 * QpN + 6.0 * Qp3 - 24.0 * Qp2 + 6.0 * Qp1 - Qp0) / 7.0; \
d2Qy = (180.0 * QpN - 408.0 * Qp3 + 288.0 * Qp2 - 72.0 * Qp1 + 12.0 * Qp0) / 7.0; \
end else if (SWNQS_i == 5) begin \
dQy = (QpN - 6.0 * Qp5 + 24.0 * Qp4 - 24.0 * Qp2 + 6.0 * Qp1 - Qp0) / 5.0; \
d2Qy = (1296.0 * (Qp4 + Qp2) - 324.0 * (Qp5 + Qp1) - 2052.0 * Qp3 \
+ 54.0 * (QpN + Qp0)) / 13.0; \
end else if (SWNQS_i == 9) begin \
dQy = (21840.0 * Qp6 + 304200.0 * Qp4 + 65.0 * QpN - 420.0 * Qp3 + 1560.0 * Qp8 \
- 12605.0 * Qp0 - 390.0 * Qp9 + 75630.0 * Qp1 - 5850.0 * Qp7 \
- 302520.0 * Qp2) / 37829.0 - 390.0 / 181.0 * Qp5; \
d2Qy = (-2619900.0 * Qp1 - 202500.0 * Qp7 + 10530000.0 * Qp4 - 16601100.0 * Qp3 \
+ 10479600.0 * Qp2 + 436650.0 * Qp0 + 2250.0 * QpN + 54000.0 * Qp8 \
- 13500.0 * Qp9 + 756000.0 * Qp6) / 37829.0 - 13500.0 * Qp5 / 181.0; \
end else begin \
dQy = 0.0; \
d2Qy = 0.0; \
end \
`fq(Qp3, xg_ac, dQy, d2Qy, fk3) \
end \
\
if (SWNQS_i >= 4) begin \
if (SWNQS_i == 5) begin \
dQy = (-630.0 * Qp3 + 12.0 * Qp4 + 582.0 * Qp5 - 97.0 * QpN + 7.0 * Qp0 \
- 42.0 * Qp1 + 168.0 * Qp2) / 130.0; \
d2Qy = (-10152.0 * Qp4 + 6048.0 * Qp5 + 6480.0 * Qp3 - 1008.0 * QpN \
- 72.0 * Qp0 + 432.0 * Qp1 - 1728.0 * Qp2) / 65.0; \
end else if (SWNQS_i == 9) begin \
dQy = (-81480.0 * Qp6 - 30.0 * Qp4 - 303975.0 * Qp3 - 5820.0 * Qp8 \
+ 1455.0 * Qp9 - 20265.0 * Qp1 + 21825.0 * Qp7 + 81060.0 * Qp2) / 37829.0 \
- 485.0 / 75658.0 * QpN + 1455.0 * Qp5 / 181.0 + 6755.0 * Qp0 / 75658.0; \
d2Qy = (702000.0 * Qp1 + 756000.0 * Qp7 - 16614600.0 * Qp4 + 10530000.0 * Qp3 \
- 2808000.0 * Qp2 - 117000.0 * Qp0 - 8400.0 * QpN - 201600.0 * Qp8 \
+ 50400.0 * Qp9 - 2822400.0 * Qp6) / 37829.0 + 50400.0 * Qp5 / 181.0; \
end else begin \
dQy = 0.0; \
d2Qy = 0.0; \
end \
`fq(Qp4, xg_ac, dQy, d2Qy, fk4) \
end \
\
if (SWNQS_i >= 5) begin \
if (SWNQS_i == 5) begin \
dQy = (-336.0 * Qp4 + 84.0 * Qp5 + 90.0 * Qp3 + 181.0 * QpN - Qp0 + 6.0 * Qp1 \
- 24.0 * Qp2) / 65.0; \
d2Qy = (18.0 * Qp0 + 3762.0 * QpN + 6048.0 * Qp4 + 432.0 * Qp2 - 1620.0 * Qp3 \
- 108.0 * Qp1 - 8532.0 * Qp5) / 65.0; \
end else if (SWNQS_i == 9) begin \
dQy = (1680.0 * (Qp6 - Qp4) + 5.0 * (QpN - Qp0) + 450.0 * (Qp3 - Qp7) \
+ 120.0 * (Qp8 - Qp2) - 30.0 * (Qp9 - Qp1)) / 209.0; \
d2Qy = (-900.0 * (Qp1 + Qp9) - 13500.0 * (Qp7 + Qp3) - 79500.0 * Qp5 \
+ 50400.0 * (Qp4 + Qp6) + 3600.0 * (Qp2 + Qp8) + 150.0 * (Qp0 + QpN)) / 181.0; \
end else begin \
dQy = 0.0; \
d2Qy = 0.0; \
end \
`fq(Qp5, xg_ac, dQy, d2Qy, fk5) \
end \
\
if (SWNQS_i >= 6) begin \
if (SWNQS_i == 9) begin \
dQy = (30.0 * Qp6 + 81480.0 * Qp4 - 21825.0 * Qp3 - 81060.0 * Qp8 + 20265.0 * Qp9 \
- 1455.0 * Qp1 + 303975.0 * Qp7 + 5820.0 * Qp2) / 37829.0 \
-(6755.0 * QpN - 485.0 * Qp0) / 75658.0 - 1455.0 / 181.0 * Qp5; \
d2Qy = (50400.0 * Qp1 + 10530000.0 * Qp7 - 2822400.0 * Qp4 + 756000.0 * Qp3 \
- 201600.0 * Qp2 - 8400.0 * Qp0 - 117000.0 * QpN - 2808000.0 * Qp8 \
+ 702000.0 * Qp9 - 16614600.0 * Qp6) / 37829.0 + 50400.0 * Qp5 / 181.0; \
end else begin \
dQy = 0.0; \
d2Qy = 0.0; \
end \
`fq(Qp6, xg_ac, dQy, d2Qy, fk6) \
end \
\
if (SWNQS_i >= 7) begin \
if (SWNQS_i == 9) begin \
dQy = (-304200.0 * Qp6 - 21840.0 * Qp4 + 12605.0 * QpN + 5850.0 * Qp3 \
+ 302520.0 * Qp8 - 65.0 * Qp0 - 75630.0 * Qp9 + 390.0 * Qp1 + 420.0 * Qp7 \
- 1560.0 * Qp2) / 37829.0 + 390.0 / 181.0 * Qp5; \
d2Qy = (-13500.0 * Qp1 - 16601100.0 * Qp7 + 756000.0 * Qp4 - 202500.0 * Qp3 \
+ 54000.0 * Qp2 + 2250.0 * Qp0 + 436650.0 * QpN + 10479600.0 * Qp8 \
- 2619900.0 * Qp9 + 10530000.0 * Qp6) / 37829.0 - 13500.0 * Qp5 / 181.0; \
end else begin \
dQy = 0.0; \
d2Qy = 0.0; \
end \
`fq(Qp7, xg_ac, dQy, d2Qy, fk7) \
end \
\
if (SWNQS_i >= 8) begin \
if (SWNQS_i == 9) begin \
dQy = (81900.0 * Qp6 + 5880.0 * Qp4 - 1575.0 * Qp3 + 5850.0 * Qp8 + 282255.0 * Qp9 \
- 105.0 * Qp1 - 305655.0 * Qp7 + 420.0 * Qp2) / 37829.0 + (35.0 * Qp0 \
- 94085.0 * QpN) / 75658.0 - 105.0 / 181.0 * Qp5; \
d2Qy = (3600.0 * Qp1 + 10479600.0 * Qp7 - 201600.0 * Qp4 + 54000.0 * Qp3 \
- 14400.0 * Qp2 - 600.0 * Qp0 - 1629600.0 * QpN - 16413000.0 * Qp8 \
+ 9777600.0 * Qp9 - 2808000.0 * Qp6) / 37829.0 + 3600.0 * Qp5 / 181.0; \
end else begin \
dQy = 0.0; \
d2Qy = 0.0; \
end \
`fq(Qp8, xg_ac, dQy, d2Qy, fk8) \
end \
\
if (SWNQS_i >= 9) begin \
if (SWNQS_i == 9) begin \
dQy = (-23400.0 * Qp6 - 1680.0 * Qp4 + 175565.0 * QpN + 450.0 * Qp3 \
- 325920.0 * Qp8 - 5.0 * Qp0 + 81480.0 * Qp9 + 30.0 * Qp1 \
+ 87330.0 * Qp7 - 120.0 * Qp2) / 37829.0 + 30.0 * Qp5 / 181.0; \
d2Qy = (-900.0 * Qp1 - 2619900.0 * Qp7 + 50400.0 * Qp4 - 13500.0 * Qp3 \
+ 3600.0 * Qp2 + 150.0 * Qp0 + 6081750.0 * QpN + 9777600.0 * Qp8 \
- 13793100.0 * Qp9 + 702000.0 * Qp6) / 37829.0 - 900.0 * Qp5 / 181.0; \
end else begin \
dQy = 0.0; \
d2Qy = 0.0; \
end \
`fq(Qp9, xg_ac, dQy, d2Qy, fk9) \
end \
\
/* Terminal charges for NQS */ \
QS_NQS = 0.0; \
QD_NQS = 0.0; \
QG_NQS = 0.0; \
if (SWNQS_i != 0) begin \
if (SWNQS_i == 1) begin \
QS_NQS = (17.0 * Qp0 + 30.0 * Qp1 + QpN) / 96.0; \
QD_NQS = (Qp0 + 30.0 * Qp1 + 17.0 * QpN) / 96.0; \
`QiToPhi(Qp1,xg_ac, temp1) \
QG_NQS = xg_ac - (x_sp + 4.0 * temp1 + x_dp) * `oneSixth; \
end else if (SWNQS_i == 2) begin \
QS_NQS = (11.0 * Qp0 + 24.0 * Qp1 + 9.0 * Qp2 + QpN) / 90.0; \
QD_NQS = (11.0 * QpN + 24.0 * Qp2 + 9.0 * Qp1 + Qp0) / 90.0; \
`QiToPhi(Qp1, xg_ac, temp1) \
`QiToPhi(Qp2, xg_ac, temp2) \
QG_NQS = xg_ac - (x_sp + 3.0 * (temp1 + temp2) + x_dp) * 0.125; \
end else if (SWNQS_i == 3) begin \
QS_NQS = (251.0 * Qp0 + 594.0 * Qp1 + 312.0 * Qp2 + 174.0 * Qp3 + 13.0 * QpN) / 2688.0; \
QD_NQS = (251.0 * QpN + 594.0 * Qp3 + 312.0 * Qp2 + 174.0 * Qp1 + 13.0 * Qp0) / 2688.0; \
`QiToPhi(Qp1, xg_ac, temp1) \
`QiToPhi(Qp2, xg_ac, temp2) \
`QiToPhi(Qp3, xg_ac, temp3) \
QG_NQS = xg_ac - (x_sp + 4.0 * temp1 + 2.0 * temp2 + 4.0 * temp3 + x_dp) / 12.0; \
end else if (SWNQS_i == 5) begin \
QS_NQS = (1187.0 * Qp0 + 43.0 * QpN) / 18720.0 + (503.0 * Qp1 + 172.0 * Qp4 \
+ 87.0 * Qp5 + 265.0 * Qp3 + 328.0 * Qp2) / 3120.0; \
QD_NQS = (1187.0 * QpN + 43.0 * Qp0) / 18720.0 + (503.0 * Qp5 + 172.0 * Qp2 \
+ 87.0 * Qp1 + 265.0 * Qp3 + 328.0 * Qp4) / 3120.0; \
`QiToPhi(Qp1, xg_ac, temp1) \
`QiToPhi(Qp2, xg_ac, temp2) \
`QiToPhi(Qp3, xg_ac, temp3) \
`QiToPhi(Qp4, xg_ac, temp4) \
`QiToPhi(Qp5, xg_ac, temp5) \
QG_NQS = xg_ac - (x_sp + 4.0 * (temp1 + temp3 + temp5) + 2.0 * (temp2 + temp4) + x_dp) / 18.0; \
end else if (SWNQS_i == 9) begin \
QS_NQS = (75653.0 * Qp8 + 225999.0 * Qp4) / 3782900.0 + (151321.0 * Qp9 \
+ 454023.0 * Qp7 + 1073767.0 * Qp3 + 1564569.0 * Qp1) / 15131600.0 \
+ 75623.0 * Qp6 / 1891450.0 + 145.0 * Qp5 / 2896.0 + 72263.0 * Qp2 / 945725.0 \
+ (3504517.0 * Qp0 + 75653.0 * QpN) / 90789600.0; \
QD_NQS = (75653.0 * Qp2 + 225999.0 * Qp6) / 3782900.0 + (151321.0 * Qp1 \
+ 454023.0 * Qp3 + 1073767.0 * Qp7 + 1564569.0 * Qp9) / 15131600.0 \
+ 75623.0 * Qp4 / 1891450.0 + 145.0 * Qp5 / 2896.0 + 72263.0 * Qp8 / 945725.0 \
+ (3504517.0 * QpN + 75653.0 * Qp0) / 90789600.0; \
`QiToPhi(Qp1, xg_ac, temp1) \
`QiToPhi(Qp2, xg_ac, temp2) \
`QiToPhi(Qp3, xg_ac, temp3) \
`QiToPhi(Qp4, xg_ac, temp4) \
`QiToPhi(Qp5, xg_ac, temp5) \
`QiToPhi(Qp6, xg_ac, temp6) \
`QiToPhi(Qp7, xg_ac, temp7) \
`QiToPhi(Qp8, xg_ac, temp8) \
`QiToPhi(Qp9, xg_ac, temp9) \
QG_NQS = xg_ac - (x_sp + 4.0 * (temp1 + temp3 + temp5 + temp7 + temp9) \
+ 2.0 * (temp2 + temp4 + temp6 + temp8) + x_dp) / 30.0; \
end \
QG_NQS = pd * QG_NQS; \
\
if (sigVds > 0) begin \
Qs = COX_qm * phit1 * QS_NQS; \
Qd = COX_qm * phit1 * QD_NQS; \
end else begin \
Qs = COX_qm * phit1 * QD_NQS; \
Qd = COX_qm * phit1 * QS_NQS; \
end \
Qg = COX_qm * phit1 * QG_NQS; \
Qb = -Qg - Qs - Qd; \
end \
\
/* Update internal nodes */ \
V(RES1) <+ vnorm_inv * I(RES1) * r_nqs; \
V(SPLINE1) <+ vnorm_inv * idt(-Tnorm * fk1, Qp1_0); \
V(RES2) <+ vnorm_inv * I(RES2) * r_nqs; \
V(SPLINE2) <+ vnorm_inv * idt(-Tnorm * fk2, Qp2_0); \
V(RES3) <+ vnorm_inv * I(RES3) * r_nqs; \
V(SPLINE3) <+ vnorm_inv * idt(-Tnorm * fk3, Qp3_0); \
V(RES4) <+ vnorm_inv * I(RES4) * r_nqs; \
V(SPLINE4) <+ vnorm_inv * idt(-Tnorm * fk4, Qp4_0); \
V(RES5) <+ vnorm_inv * I(RES5) * r_nqs; \
V(SPLINE5) <+ vnorm_inv * idt(-Tnorm * fk5, Qp5_0); \
V(RES6) <+ vnorm_inv * I(RES6) * r_nqs; \
V(SPLINE6) <+ vnorm_inv * idt(-Tnorm * fk6, Qp6_0); \
V(RES7) <+ vnorm_inv * I(RES7) * r_nqs; \
V(SPLINE7) <+ vnorm_inv * idt(-Tnorm * fk7, Qp7_0); \
V(RES8) <+ vnorm_inv * I(RES8) * r_nqs; \
V(SPLINE8) <+ vnorm_inv * idt(-Tnorm * fk8, Qp8_0); \
V(RES9) <+ vnorm_inv * I(RES9) * r_nqs; \
V(SPLINE9) <+ vnorm_inv * idt(-Tnorm * fk9, Qp9_0);

View File

@ -1,946 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: PSP103_parlist.include
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 103.8.0 (PSP), 200.6.1 (JUNCAP), July 2020
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
// --------------------------------------------------------------------------------------------------------------
// Special model parameters and switch parameters
// --------------------------------------------------------------------------------------------------------------
// Special model parameters, some are also simulator global variables
`MPInb(LEVEL ,103 ,"" ,"Model level")
`MPIty(TYPE ,1 ,"" ,"Channel type parameter, +1=NMOS -1=PMOS")
`MPRco(TR ,21.0 ,"C" ,-273.0 ,inf ,"nominal (reference) temperature")
// Switch parameters that turn models or effects on or off
`MPIcc(SWGEO ,1 ,"" ,0 ,2 ,"Flag for geometrical model, 0=local, 1=global, 2=binning")
`MPIcc(SWIGATE ,0 ,"" ,0 ,2 ,"Flag for gate current: 0=off, 1=on, 2=on+overlaps-parameters")
`MPIcc(SWIMPACT ,0 ,"" ,0 ,1 ,"Flag for impact ionization current, 0=turn off II")
`MPIcc(SWGIDL ,0 ,"" ,0 ,1 ,"Flag for GIDL current, 0=turn off IGIDL")
`MPIcc(SWJUNCAP ,0 ,"" ,0 ,3 ,"Flag for juncap, 0=turn off juncap")
`MPIcc(SWJUNASYM ,0 ,"" ,0 ,1 ,"Flag for asymmetric junctions; 0=symmetric, 1=asymmetric")
`MPIcc(SWNUD ,0 ,"" ,0 ,2 ,"Flag for NUD-effect; 0=off, 1=on, 2=on+CV-correction")
`MPIcc(SWEDGE ,0 ,"" ,0 ,1 ,"Flag for drain current of edge transistors; 0=off, 1=on")
`MPIcc(SWDELVTAC ,0 ,"" ,0 ,1 ,"Flag for separate capacitance calculation; 0=off, 1=on")
`MPIcc(SWQSAT ,0 ,"" ,0 ,1 ,"Flag for separate capacitance calculation in saturation only: 0=off, 1=on")
`MPIcc(SWQPART ,0 ,"" ,0 ,1 ,"Flag for drain/source charge partitioning; 0=linear distribution, 1=source")
`MPIcc(SWIGN ,1 ,"" ,0 ,1 ,"Flag for induced gate noise; 0=off, 1=on")
`ifdef NQSmodel
`MPIcc(SWNQS ,0 ,"" ,0 ,9 ,"Flag for NQS, 0=off, 1, 2, 3, 5, or 9=number of collocation points")
`endif // NQSmodel
`MPRcz(QMC ,1.0 ,"" ,"Quantum-mechanical correction factor")
// --------------------------------------------------------------------------------------------------------------
// PSP local model parameters
// --------------------------------------------------------------------------------------------------------------
// Process parameters
`MPRnb(VFB ,-1.0 ,"V" ,"Flat band voltage at TR")
`MPRnb(STVFB ,5.0e-4 ,"V/K" ,"Temperature dependence of VFB")
`MPRnb(ST2VFB ,0.0 ,"K^-1" ,"Quadratic temperature dependence of VFB")
`MPRco(TOX ,2.0e-09 ,"m" ,1.0e-10 ,inf ,"Gate oxide thickness")
`MPRco(EPSROX ,3.9 ,"" ,1.0 ,inf ,"Relative permittivity of gate dielectric")
`MPRcc(NEFF ,5.0e23 ,"m^-3" ,1.0e20 ,1.0e26 ,"Effective substrate doping")
`MPRcz(FACNEFFAC ,1.0 ,"" ,"Pre-factor for effective substrate doping in separate charge calculation")
`MPRco(GFACNUD ,1.0 ,"" ,0.01 ,inf ,"Body-factor change due to NUD-effect")
`MPRcz(VSBNUD ,0.0 ,"V" ,"Lower Vsb value for NUD-effect")
`MPRco(DVSBNUD ,1.0 ,"V" ,0.1 ,inf ,"Vsb-range for NUD-effect")
`MPRnb(VNSUB ,0.0 ,"V" ,"Effective doping bias-dependence parameter")
`MPRco(NSLP ,0.05 ,"V" ,1.0e-3 ,inf ,"Effective doping bias-dependence parameter")
`MPRcc(DNSUB ,0.0 ,"V^-1" ,0.0 ,1.0 ,"Effective doping bias-dependence parameter")
`MPRnb(DPHIB ,0.0 ,"V" ,"Offset parameter for PHIB")
`MPRnb(DELVTAC ,0.0 ,"V" ,"Offset parameter for PHIB in separate charge calculation")
`MPRcz(NP ,1.0e26 ,"m^-3" ,"Gate poly-silicon doping")
`MPRco(TOXOV ,2.0e-09 ,"m" ,1.0e-10 ,inf ,"Overlap oxide thickness")
`MPRco(TOXOVD ,2.0e-09 ,"m" ,1.0e-10 ,inf ,"Overlap oxide thickness for drain side")
`MPRcc(NOV ,5.0e25 ,"m^-3" ,1.0e23 ,1.0e27 ,"Effective doping of overlap region")
`MPRcc(NOVD ,5.0e25 ,"m^-3" ,1.0e23 ,1.0e27 ,"Effective doping of overlap region for drain side")
// Interface states parameters
`MPRcz(CT ,0.0 ,"" ,"Interface states factor")
`MPRcz(CTG ,0.0 ,"" ,"Gate voltage dependence of interface states factor")
`MPRnb(CTB ,0.0 ,"" ,"Bulk voltage dependence of interface states factor")
`MPRnb(STCT ,1.0 ,"" ,"Geometry-independent temperature dependence of CT")
// DIBL parameters
`MPRcz(CF ,0.0 ,"" ,"DIBL-parameter")
`MPRcz(CFAC ,0.0 ,"" ,"DIBL-parameter of charge model when SWQSAT=1")
`MPRcz(CFD ,0.0 ,"V^-1" ,"Drain voltage dependence of CF")
`MPRcc(CFB ,0.0 ,"V^-1" ,0.0 ,1.0 ,"Back bias dependence of CF")
// Subthreshold slope parameters of short channel transistor
`MPRcz(PSCE ,0.0 ,"" ,"Subthreshold slope coefficient for short channel transistor")
`MPRcc(PSCEB ,0.0 ,"V^-1" ,0.0 ,1.0 ,"Bulk voltage dependence parameter of subthreshold slope coefficient for short channel transistor")
`MPRcz(PSCED ,0.0 ,"V^-1" ,"Drain voltage dependence parameter of subthreshold slope coefficient for short channel transistor")
// Mobility parameters
`MPRcz(BETN ,7.0e-2 ,"m^2/V/s" ,"Channel aspect ratio times zero-field mobility")
`MPRnb(STBET ,1.0 ,"" ,"Temperature dependence of BETN")
`MPRcz(MUE ,0.5 ,"m/V" ,"Mobility reduction coefficient at TR")
`MPRnb(STMUE ,0.0 ,"" ,"Temperature dependence of MUE")
`MPRcz(THEMU ,1.5 ,"" ,"Mobility reduction exponent at TR")
`MPRnb(STTHEMU ,1.5 ,"" ,"Temperature dependence of THEMU")
`MPRcz(CS ,0.0 ,"" ,"Coulomb scattering parameter at TR")
`MPRnb(STCS ,0.0 ,"" ,"Temperature dependence of CS")
`MPRcz(THECS ,2.0 ,"" ,"Coulomb scattering exponent at TR")
`MPRnb(STTHECS ,0.0 ,"" ,"Temperature dependence of THECS")
`MPRcz(XCOR ,0.0 ,"V^-1" ,"Non-universality factor")
`MPRnb(STXCOR ,0.0 ,"" ,"Temperature dependence of XCOR")
`MPRcz(FETA ,1.0 ,"" ,"Effective field parameter")
// Intrinsic series-resistance parameters
`MPRcz(RS ,30.0 ,"Ohm" ,"Series resistance at TR")
`MPRnb(STRS ,1.0 ,"" ,"Temperature dependence of RS")
`MPRcc(RSB ,0.0 ,"V^-1" ,-0.5 ,1.0 ,"Back-bias dependence of series resistance")
`MPRco(RSG ,0.0 ,"V^-1" ,-0.5 ,inf ,"Gate-bias dependence of series resistance")
// Velocity saturation parameters
`MPRcz(THESAT ,1.0 ,"V^-1" ,"Velocity saturation parameter at TR")
`MPRcz(THESATAC ,1.0 ,"V^-1" ,"Velocity saturation parameter at TR of charge model when SWQSAT=1")
`MPRnb(STTHESAT ,1.0 ,"" ,"Temperature dependence of THESAT")
`MPRcc(THESATB ,0.0 ,"V^-1" ,-0.5 ,1.0 ,"Back-bias dependence of velocity saturation")
`MPRco(THESATG ,0.0 ,"V^-1" ,-0.5 ,inf ,"Gate-bias dependence of velocity saturation")
// Saturation voltage parameters
`MPRco(AX ,3.0 ,"" ,2.0 ,inf ,"Linear/saturation transition factor")
`MPRco(AXAC ,3.0 ,"" ,2.0 ,inf ,"Linear/saturation transition factor of charge model when SWQSAT=1")
// Channel length modulation parameters
`MPRcz(ALP ,0.01 ,"" ,"CLM pre-factor")
`MPRcz(ALPAC ,0.01 ,"" ,"CLM pre-factor of charge model when SWQSAT=1")
`MPRcz(ALP1 ,0.0 ,"V" ,"CLM enhancement factor above threshold")
`MPRcz(ALP2 ,0.0 ,"V^-1" ,"CLM enhancement factor below threshold")
`MPRco(VP ,0.05 ,"V" ,1.0e-10 ,inf ,"CLM logarithm dependence factor")
// Impact ionization parameters
`MPRcz(A1 ,1.0 ,"" ,"Impact-ionization pre-factor")
`MPRcz(A2 ,10.0 ,"V" ,"Impact-ionization exponent at TR")
`MPRnb(STA2 ,0.0 ,"V" ,"Temperature dependence of A2")
`MPRcz(A3 ,1.0 ,"" ,"Saturation-voltage dependence of impact-ionization")
`MPRcz(A4 ,0.0 ,"V^-0.5" ,"Back-bias dependence of impact-ionization")
// Gate current parameters
`MPRcc(GCO ,0.0 ,"" ,-10.0 ,10.0 ,"Gate tunnelling energy adjustment")
`MPRcz(IGINV ,0.0 ,"A" ,"Gate channel current pre-factor")
`MPRcz(IGOV ,0.0 ,"A" ,"Gate overlap current pre-factor")
`MPRcz(IGOVD ,0.0 ,"A" ,"Gate overlap current pre-factor for drain side")
`MPRnb(STIG ,2.0 ,"" ,"Temperature dependence of IGINV and IGOV")
`MPRcc(GC2 ,0.375 ,"" ,0.0 ,10.0 ,"Gate current slope factor")
`MPRcc(GC3 ,0.063 ,"" ,-2.0 ,2.0 ,"Gate current curvature factor")
`MPRcc(GC2OV ,0.375 ,"" ,0.0 ,10.0 ,"Gate overlap current slope factor, used only when SWIGATE=2")
`MPRcc(GC3OV ,0.063 ,"" ,-2.0 ,2.0 ,"Gate overlap current curvature factor, used only when SWIGATE=2")
`MPRco(CHIB ,3.1 ,"V" ,1.0 ,inf ,"Tunnelling barrier height")
// Gate induced drain/source leakage parameters
`MPRcz(AGIDL ,0.0 ,"A/V^3" ,"GIDL pre-factor")
`MPRcz(AGIDLD ,0.0 ,"A/V^3" ,"GIDL pre-factor for drain side")
`MPRcz(BGIDL ,41.0 ,"V" ,"GIDL probability factor at TR")
`MPRcz(BGIDLD ,41.0 ,"V" ,"GIDL probability factor at TR for drain side")
`MPRnb(STBGIDL ,0.0 ,"V/K" ,"Temperature dependence of BGIDL")
`MPRnb(STBGIDLD ,0.0 ,"V/K" ,"Temperature dependence of BGIDL for drain side")
`MPRnb(CGIDL ,0.0 ,"" ,"Back-bias dependence of GIDL")
`MPRnb(CGIDLD ,0.0 ,"" ,"Back-bias dependence of GIDL for drain side")
// Charge model parameters
`MPRcz(COX ,1.0e-14 ,"F" ,"Oxide capacitance for intrinsic channel")
`MPRcz(CGOV ,1.0e-15 ,"F" ,"Oxide capacitance for gate-drain/source overlap")
`MPRcz(CGOVD ,1.0e-15 ,"F" ,"Oxide capacitance for gate-drain overlap")
`MPRcc(FCGOVACC ,0.0 ,"" ,0.0 ,1.0 ,"Factor for overlap capacitances in accumulation regime")
`MPRcc(FCGOVACCD ,0.0 ,"" ,0.0 ,1.0 ,"Factor for overlap capacitances in accumulation regime for drain side")
`MPRcc(CGOVACCG ,1.0 ,"" ,0.1 ,1.0 ,"Gate voltage dependence parameter of overlap capacitances in accumulation regime")
`MPRcz(CGBOV ,0.0 ,"F" ,"Oxide capacitance for gate-bulk overlap")
`MPRcz(CINR ,0.0 ,"F" ,"Inner fringe capacitance")
`MPRcz(CINRD ,0.0 ,"F" ,"Inner fringe capacitance for drain side")
`MPRnb(DVFBINR ,0.0 ,"V" ,"Flat-band voltage offset of inner fringe capacitances")
`MPRcc(FCINRDEP ,0.3 ,"" ,0.0 ,1.0 ,"Bias dependence parameter of inner fringe capacitances in depletion regime")
`MPRcz(FCINRACC ,0.5 ,"" ,"Bias dependence parameter of inner fringe capacitances in accumulation regime")
`MPRcc(AXINR ,0.5 ,"" ,0.1 ,4.0 ,"Accumulation/depletion transition factor of inner fringe capacitances")
`MPRcz(CFR ,0.0 ,"F" ,"Outer fringe capacitance")
`MPRcz(CFRD ,0.0 ,"F" ,"Outer fringe capacitance for drain side")
// Noise parameters
`MPRcz(FNT ,1.0 ,"" ,"Thermal noise coefficient")
`MPRcz(FNTEXC ,0.0 ,"" ,"Excess noise coefficient")
`MPRcz(NFA ,8.0e22 ,"V^-1/m^4" ,"First coefficient of flicker noise")
`MPRcz(NFB ,3.0e07 ,"V^-1/m^2" ,"Second coefficient of flicker noise")
`MPRcz(NFC ,0.0 ,"V^-1" ,"Third coefficient of flicker noise")
`MPRcz(EF ,1.0 ,"" ,"Flicker noise frequency exponent")
// Edge transistor parameters
`MPRnb(VFBEDGE ,-1.0 ,"V" ,"Flat band voltage of edge transistors at TR")
`MPRnb(STVFBEDGE ,5.0e-4 ,"V/K" ,"Temperature dependence of VFBEDGE")
`MPRnb(DPHIBEDGE ,0.0 ,"V" ,"Offset parameter for PHIB of edge transistors")
`MPRcc(NEFFEDGE ,5.0e23 ,"m^-3" ,1.0e20 ,1.0e26 ,"Effective substrate doping of edge transistors")
`MPRcz(CTEDGE ,0.0 ,"" ,"Interface states factor of edge transistors")
`MPRcz(BETNEDGE ,5.0e-4 ,"m^2/V/s" ,"Channel aspect ratio times zero-field mobility of edge transistor")
`MPRnb(STBETEDGE ,1.0 ,"" ,"Temperature dependence of BETNEDGE")
`MPRcz(PSCEEDGE ,0.0 ,"" ,"Subthreshold slope coefficient for short channel edge transistors")
`MPRcc(PSCEBEDGE ,0.0 ,"V^-1" ,0.0 ,1.0 ,"Bulk voltage dependence parameter of subthreshold slope coefficient for short channel edge transistors")
`MPRcz(PSCEDEDGE ,0.0 ,"V^-1" ,"Drain voltage dependence parameter of subthreshold slope coefficient for short channel edge transistors")
`MPRcz(CFEDGE ,0.0 ,"" ,"DIBL parameter of edge transistors")
`MPRcz(CFDEDGE ,0.0 ,"V^-1" ,"Drain voltage dependence parameter of DIBL-parameter of edge transistors")
`MPRcc(CFBEDGE ,0.0 ,"V^-1" ,0.0 ,1.0 ,"Bulk voltage dependence parameter of DIBL-parameter of edge transistors")
`MPRcz(FNTEDGE ,1.0 ,"" ,"Thermal noise coefficient of edge transistors")
`MPRcz(NFAEDGE ,8.0e22 ,"V^-1/m^4" ,"First coefficient of flicker noise of edge transistors")
`MPRcz(NFBEDGE ,3.0e07 ,"V^-1/m^2" ,"Second coefficient of flicker noise of edge transistors")
`MPRcz(NFCEDGE ,0.0 ,"V^-1" ,"Third coefficient of flicker noise of edge transistors")
`MPRcz(EFEDGE ,1.0 ,"" ,"Flicker noise frequency exponent of edge transistors")
// NQS parameters
`ifdef NQSmodel
`MPRcz(MUNQS ,1.0 ,"" ,"Relative mobility for NQS modelling")
`endif // NQSmodel
// Parasitic resistance parameters
`MPRcz(RG ,0.0 ,"Ohm" ,"Gate resistance")
`MPRcz(RSE ,0.0 ,"Ohm" ,"External source resistance")
`MPRcz(RDE ,0.0 ,"Ohm" ,"External drain resistance")
`MPRcz(RBULK ,0.0 ,"Ohm" ,"Bulk resistance between node BP and BI")
`MPRcz(RWELL ,0.0 ,"Ohm" ,"Well resistance between node BI and B")
`MPRcz(RJUNS ,0.0 ,"Ohm" ,"Source-side bulk resistance between node BI and BS")
`MPRcz(RJUND ,0.0 ,"Ohm" ,"Drain-side bulk resistance between node BI and BD")
// Self heating effect parameters
`ifdef SelfHeating
`MPRcz(RTH ,0.0 ,"K/W" ,"Thermal resistance")
`MPRcz(CTH ,0.0 ,"J/K" ,"Thermal capacitance")
`MPRnb(STRTH ,0.0 ,"" ,"Temperature sensitivity of RTH")
`endif // SelfHeating
// --------------------------------------------------------------------------------------------------------------
// PSP global model parameters
// --------------------------------------------------------------------------------------------------------------
// Process parameters
`MPRnb(LVARO ,0.0 ,"m" ,"Geom. independent difference between actual and programmed gate length")
`MPRnb(LVARL ,0.0 ,"" ,"Length dependence of LVAR")
`MPRnb(LVARW ,0.0 ,"" ,"Width dependence of LVAR")
`MPRnb(LAP ,0.0 ,"m" ,"Effective channel length reduction per side")
`MPRnb(WVARO ,0.0 ,"m" ,"Geom. independent difference between actual and programmed field-oxide opening")
`MPRnb(WVARL ,0.0 ,"" ,"Length dependence of WVAR")
`MPRnb(WVARW ,0.0 ,"" ,"Width dependence of WVAR")
`MPRnb(WOT ,0.0 ,"m" ,"Effective channel width reduction per side")
`MPRnb(DLQ ,0.0 ,"m" ,"Effective channel length reduction for CV")
`MPRnb(DWQ ,0.0 ,"m" ,"Effective channel width reduction for CV")
`MPRnb(VFBO ,-1.0 ,"V" ,"Geometry-independent flat-band voltage at TR")
`MPRnb(VFBL ,0.0 ,"V" ,"Length dependence of flat-band voltage")
`MPRnb(VFBW ,0.0 ,"V" ,"Width dependence of flat-band voltage")
`MPRnb(VFBLW ,0.0 ,"V" ,"Area dependence of flat-band voltage")
`MPRnb(STVFBO ,5.0e-4 ,"V/K" ,"Geometry-independent temperature dependence of VFB")
`MPRnb(STVFBL ,0.0 ,"V/K" ,"Length dependence of temperature dependence of VFB")
`MPRnb(STVFBW ,0.0 ,"V/K" ,"Width dependence of temperature dependence of VFB")
`MPRnb(STVFBLW ,0.0 ,"V/K" ,"Area dependence of temperature dependence of VFB")
`MPRnb(ST2VFBO ,0.0 ,"K^-1" ,"Quadratic temperature dependence of VFB")
`MPRco(TOXO ,2.0e-9 ,"m" ,1.0e-10 ,inf ,"Gate oxide thickness")
`MPRco(EPSROXO ,3.9 ,"" ,1.0 ,inf ,"Relative permittivity of gate dielectric")
`MPRco(NSUBO ,3.0e23 ,"m^-3" ,1.0e20 ,inf ,"Geometry independent substrate doping")
`MPRnb(NSUBW ,0.0 ,"" ,"Width dependence of background doping NSUBO due to segregation")
`MPRco(WSEG ,1.0e-8 ,"m" ,1.0e-10 ,inf ,"Char. length of segregation of background doping NSUBO")
`MPRcz(NPCK ,1.0e24 ,"m^-3" ,"Pocket doping level")
`MPRnb(NPCKW ,0.0 ,"" ,"Width dependence of pocket doping NPCK due to segregation")
`MPRco(WSEGP ,1.0e-8 ,"m" ,1.0e-10 ,inf ,"Char. length of segregation of pocket doping NPCK")
`MPRco(LPCK ,1.0e-8 ,"m" ,1.0e-10 ,inf ,"Char. length of lateral doping profile")
`MPRnb(LPCKW ,0.0 ,"" ,"Width dependence of char. length of lateral doping profile")
`MPRnb(FOL1 ,0.0 ,"" ,"First length dependence coefficient for short channel body effect")
`MPRnb(FOL2 ,0.0 ,"" ,"Second length dependence coefficient for short channel body effect")
`MPRnb(FACNEFFACO ,1.0 ,"" ,"Geom. independent pre-factor for effective substrate doping in separate charge calculation")
`MPRnb(FACNEFFACL ,0.0 ,"" ,"Length dependence of FACNEFFAC")
`MPRnb(FACNEFFACW ,0.0 ,"" ,"Width dependence of FACNEFFAC")
`MPRnb(FACNEFFACLW ,0.0 ,"" ,"Area dependence of FACNEFFAC")
`MPRnb(GFACNUDO ,1.0 ,"" ,"Geom. independent body-factor change due to NUD-effect")
`MPRnb(GFACNUDL ,0.0 ,"" ,"Length dependence of GFACNUD")
`MPRnb(GFACNUDLEXP ,1.0 ,"" ,"Exponent for length dependence of GFACNUD")
`MPRnb(GFACNUDW ,0.0 ,"" ,"Width dependence of GFACNUD")
`MPRnb(GFACNUDLW ,0.0 ,"" ,"Area dependence of GFACNUD")
`MPRnb(VSBNUDO ,0.0 ,"V" ,"Lower Vsb value for NUD-effect")
`MPRnb(DVSBNUDO ,1.0 ,"V" ,"Vsb range for NUD-effect")
`MPRnb(VNSUBO ,0.0 ,"V" ,"Effective doping bias-dependence parameter")
`MPRnb(NSLPO ,0.05 ,"V" ,"Effective doping bias-dependence parameter")
`MPRnb(DNSUBO ,0.0 ,"V^-1" ,"Effective doping bias-dependence parameter")
`MPRnb(DPHIBO ,0.0 ,"V" ,"Geometry independent offset of PHIB")
`MPRnb(DPHIBL ,0.0 ,"V" ,"Length dependence offset of PHIB")
`MPRnb(DPHIBLEXP ,1.0 ,"" ,"Exponent for length dependence of offset of PHIB")
`MPRnb(DPHIBW ,0.0 ,"V" ,"Width dependence of offset of PHIB")
`MPRnb(DPHIBLW ,0.0 ,"V" ,"Area dependence of offset of PHIB")
`MPRnb(DELVTACO ,0.0 ,"V" ,"Geom. independent offset parameter for PHIB in separate charge calculation")
`MPRnb(DELVTACL ,0.0 ,"V" ,"Length dependence of DELVTAC")
`MPRnb(DELVTACLEXP ,1.0 ,"" ,"Exponent for length dependence of offset of DELVTAC")
`MPRnb(DELVTACW ,0.0 ,"V" ,"Width dependence of DELVTAC")
`MPRnb(DELVTACLW ,0.0 ,"V" ,"Area dependence of DELVTAC")
`MPRnb(NPO ,1.0e26 ,"m^-3" ,"Geometry-independent gate poly-silicon doping")
`MPRnb(NPL ,0.0 ,"" ,"Length dependence of gate poly-silicon doping")
`MPRco(TOXOVO ,2.0e-9 ,"m" ,1.0e-10 ,inf ,"Overlap oxide thickness")
`MPRco(TOXOVDO ,2.0e-9 ,"m" ,1.0e-10 ,inf ,"Overlap oxide thickness for drain side")
`MPRcz(LOV ,0.0 ,"m" ,"Overlap length for gate/drain and gate/source overlap capacitance")
`MPRcz(LOVD ,0.0 ,"m" ,"Overlap length for gate/drain overlap capacitance")
`MPRnb(NOVO ,5.0e25 ,"m^-3" ,"Effective doping of overlap region")
`MPRnb(NOVDO ,5.0e25 ,"m^-3" ,"Effective doping of overlap region for drain side")
// Interface states parameters
`MPRnb(CTO ,0.0 ,"" ,"Geometry-independent interface states factor")
`MPRnb(CTL ,0.0 ,"" ,"Length dependence of interface states factor")
`MPRnb(CTLEXP ,1.0 ,"" ,"Exponent for length dependence of interface states factor")
`MPRnb(CTW ,0.0 ,"" ,"Width dependence of interface states factor")
`MPRnb(CTLW ,0.0 ,"" ,"Area dependence of interface states factor")
`MPRcz(CTGO ,0.0 ,"" ,"Gate voltage dependence of interface states factor")
`MPRnb(CTBO ,0.0 ,"" ,"Bulk voltage dependence of interface states factor")
`MPRnb(STCTO ,1.0 ,"" ,"Geometry-independent temperature dependence of CT")
// DIBL parameters
`MPRnb(CFL ,0.0 ,"" ,"Length dependence of DIBL-parameter")
`MPRnb(CFLEXP ,2.0 ,"" ,"Exponent for length dependence of CF")
`MPRnb(CFW ,0.0 ,"" ,"Width dependence of CF")
`MPRnb(CFACL ,0.0 ,"" ,"Length dependence of DIBL-parameter of charge model when SWQSAT=1")
`MPRnb(CFACLEXP ,2.0 ,"" ,"Exponent for length dependence of CF")
`MPRnb(CFACW ,0.0 ,"" ,"Width dependence of CF")
`MPRcz(CFDO ,0.0 ,"V^-1" ,"Drain voltage dependence of CF")
`MPRnb(CFBO ,0.0 ,"V^-1" ,"Back-bias dependence of CF")
// Subthreshold slope parameters of short channel transistor
`MPRnb(PSCEL ,0.0 ,"" ,"Length dependence of subthreshold slope coefficient for short channel transistor")
`MPRnb(PSCELEXP ,2.0 ,"" ,"Exponent for length dependence of subthreshold slope coefficient for short channel transistor")
`MPRnb(PSCEW ,0.0 ,"" ,"Exponent for length dependence of subthreshold slope coefficient for short channel transistor")
`MPRcc(PSCEBO ,0.0 ,"V^-1" ,0.0 ,1.0 ,"Bulk voltage dependence parameter of subthreshold slope coefficient for short channel transistor")
`MPRcz(PSCEDO ,0.0 ,"V^-1" ,"Drain voltage dependence parameter of subthreshold slope coefficient for short channel transistor")
// Mobility parameters
`MPRcz(UO ,5.0e-2 ,"m^2/V/s" ,"Zero-field mobility at TR")
`MPRnb(FBET1 ,0.0 ,"" ,"Relative mobility decrease due to first lateral profile")
`MPRnb(FBET1W ,0.0 ,"" ,"Width dependence of relative mobility decrease due to first lateral profile")
`MPRco(LP1 ,1.0e-8 ,"m" ,1.0e-10 ,inf ,"Mobility-related characteristic length of first lateral profile")
`MPRnb(LP1W ,0.0 ,"" ,"Width dependence of mobility-related characteristic length of first lateral profile")
`MPRnb(FBET2 ,0.0 ,"" ,"Relative mobility decrease due to second lateral profile")
`MPRco(LP2 ,1.0e-8 ,"m" ,1.0e-10 ,inf ,"Mobility-related characteristic length of second lateral profile")
`MPRnb(BETW1 ,0.0 ,"" ,"First higher-order width scaling coefficient of BETN")
`MPRnb(BETW2 ,0.0 ,"" ,"Second higher-order width scaling coefficient of BETN")
`MPRco(WBET ,1.0e-9 ,"m" ,1.0e-10 ,inf ,"Characteristic width for width scaling of BETN")
`MPRnb(STBETO ,1.0 ,"" ,"Geometry independent temperature dependence of BETN")
`MPRnb(STBETL ,0.0 ,"" ,"Length dependence of temperature dependence of BETN")
`MPRnb(STBETW ,0.0 ,"" ,"Width dependence of temperature dependence of BETN")
`MPRnb(STBETLW ,0.0 ,"" ,"Area dependence of temperature dependence of BETN")
`MPRnb(MUEO ,0.5 ,"m/V" ,"Geometry independent mobility reduction coefficient at TR")
`MPRnb(MUEW ,0.0 ,"" ,"Width dependence of mobility reduction coefficient at TR")
`MPRnb(STMUEO ,0.0 ,"" ,"Temperature dependence of MUE")
`MPRnb(THEMUO ,1.5 ,"" ,"Mobility reduction exponent at TR")
`MPRnb(STTHEMUO ,1.5 ,"" ,"Temperature dependence of THEMU")
`MPRnb(CSO ,0.0 ,"" ,"Geometry independent coulomb scattering parameter at TR")
`MPRnb(CSL ,0.0 ,"" ,"Length dependence of CS")
`MPRnb(CSLEXP ,1.0 ,"" ,"Exponent for length dependence of CS")
`MPRnb(CSW ,0.0 ,"" ,"Width dependence of CS")
`MPRnb(CSLW ,0.0 ,"" ,"Area dependence of CS")
`MPRnb(STCSO ,0.0 ,"" ,"Temperature dependence of CS")
`MPRcz(THECSO ,2.0 ,"" ,"Coulomb scattering exponent at TR")
`MPRnb(STTHECSO ,0.0 ,"" ,"Temperature dependence of THECS")
`MPRnb(XCORO ,0.0 ,"V^-1" ,"Geometry independent non-universality parameter")
`MPRnb(XCORL ,0.0 ,"" ,"Length dependence of non-universality parameter")
`MPRnb(XCORW ,0.0 ,"" ,"Width dependence of non-universality parameter")
`MPRnb(XCORLW ,0.0 ,"" ,"Area dependence of non-universality parameter")
`MPRnb(STXCORO ,0.0 ,"" ,"Temperature dependence of XCOR")
`MPRnb(FETAO ,1.0 ,"" ,"Effective field parameter")
// Intrinsic series-resistance parameters
`MPRnb(RSW1 ,50.0 ,"Ohm" ,"Source/drain series resistance for 1 um wide channel at TR")
`MPRnb(RSW2 ,0.0 ,"" ,"Higher-order width scaling of RS")
`MPRnb(STRSO ,1.0 ,"" ,"Temperature dependence of RS")
`MPRnb(RSBO ,0.0 ,"V^-1" ,"Back-bias dependence of series resistance")
`MPRnb(RSGO ,0.0 ,"V^-1" ,"Gate-bias dependence of series resistance")
// Velocity saturation parameters
`MPRnb(THESATO ,0.0 ,"V^-1" ,"Geometry independent velocity saturation parameter at TR")
`MPRnb(THESATL ,0.05 ,"V^-1" ,"Length dependence of THESAT")
`MPRnb(THESATLEXP ,1.0 ,"" ,"Exponent for length dependence of THESAT")
`MPRnb(THESATW ,0.0 ,"" ,"Width dependence of THESAT")
`MPRnb(THESATLW ,0.0 ,"" ,"Area dependence of THESAT")
`MPRnb(THESATACO ,0.0 ,"V^-1" ,"Geometry independent velocity saturation parameter at TR of charge model when SWQSAT=1")
`MPRnb(THESATACL ,0.05 ,"V^-1" ,"Length dependence of THESATAC")
`MPRnb(THESATACLEXP ,1.0 ,"" ,"Exponent for length dependence of THESATAC")
`MPRnb(THESATACW ,0.0 ,"" ,"Width dependence of THESATAC")
`MPRnb(THESATACLW ,0.0 ,"" ,"Area dependence of THESATAC")
`MPRnb(STTHESATO ,1.0 ,"" ,"Geometry independent temperature dependence of THESAT")
`MPRnb(STTHESATL ,0.0 ,"" ,"Length dependence of temperature dependence of THESAT")
`MPRnb(STTHESATW ,0.0 ,"" ,"Width dependence of temperature dependence of THESAT")
`MPRnb(STTHESATLW ,0.0 ,"" ,"Area dependence of temperature dependence of THESAT")
`MPRnb(THESATBO ,0.0 ,"V^-1" ,"Back-bias dependence of velocity saturation")
`MPRnb(THESATGO ,0.0 ,"V^-1" ,"Gate-bias dependence of velocity saturation")
// Saturation voltage parameters
`MPRnb(AXO ,18.0 ,"" ,"Geometry independent linear/saturation transition factor")
`MPRcz(AXL ,0.4 ,"" ,"Length dependence of AX")
`MPRnb(AXACO ,18.0 ,"" ,"Geometry independent linear/saturation transition factor of charge model when SWQSAT=1")
`MPRcz(AXACL ,0.4 ,"" ,"Length dependence of AXAC")
// Channel length modulation parameters
`MPRnb(ALPL ,5.0e-4 ,"" ,"Length dependence of ALP")
`MPRnb(ALPLEXP ,1.0 ,"" ,"Exponent for length dependence of ALP")
`MPRnb(ALPW ,0.0 ,"" ,"Width dependence of ALP")
`MPRnb(ALPACL ,5.0e-4 ,"" ,"Length dependence of ALPAC")
`MPRnb(ALPACLEXP ,1.0 ,"" ,"Exponent for length dependence of ALPAC")
`MPRnb(ALPACW ,0.0 ,"" ,"Width dependence of ALPAC")
`MPRnb(ALP1L1 ,0.0 ,"V" ,"Length dependence of CLM enhancement factor above threshold")
`MPRnb(ALP1LEXP ,0.5 ,"" ,"Exponent for length dependence of ALP1")
`MPRcz(ALP1L2 ,0.0 ,"" ,"Second_order length dependence of ALP1")
`MPRnb(ALP1W ,0.0 ,"" ,"Width dependence of ALP1")
`MPRnb(ALP2L1 ,0.0 ,"V^-1" ,"Length dependence of CLM enhancement factor below threshold")
`MPRnb(ALP2LEXP ,0.5 ,"" ,"Exponent for length dependence of ALP2")
`MPRcz(ALP2L2 ,0.0 ,"" ,"Second_order length dependence of ALP2")
`MPRnb(ALP2W ,0.0 ,"" ,"Width dependence of ALP2")
`MPRnb(VPO ,0.05 ,"V" ,"CLM logarithmic dependence parameter")
// Weak-avalanche parameters
`MPRnb(A1O ,1.0 ,"" ,"Geometry independent impact-ionization pre-factor")
`MPRnb(A1L ,0.0 ,"" ,"Length dependence of A1")
`MPRnb(A1W ,0.0 ,"" ,"Width dependence of A1")
`MPRnb(A2O ,10.0 ,"V" ,"Impact-ionization exponent at TR")
`MPRnb(STA2O ,0.0 ,"V" ,"Temperature dependence of A2")
`MPRnb(A3O ,1.0 ,"" ,"Geometry independent saturation-voltage dependence of II")
`MPRnb(A3L ,0.0 ,"" ,"Length dependence of A3")
`MPRnb(A3W ,0.0 ,"" ,"Width dependence of A3")
`MPRnb(A4O ,0.0 ,"V^-0.5" ,"Geometry independent back-bias dependence of II")
`MPRnb(A4L ,0.0 ,"" ,"Length dependence of A4")
`MPRnb(A4W ,0.0 ,"" ,"Width dependence of A4")
// Gate current parameters
`MPRnb(GCOO ,0.0 ,"" ,"Gate tunnelling energy adjustment")
`MPRnb(IGINVLW ,0.0 ,"A" ,"Gate channel current pre-factor for 1 um^2 channel area")
`MPRnb(IGOVW ,0.0 ,"A" ,"Gate overlap current pre-factor for 1 um wide channel")
`MPRnb(IGOVDW ,0.0 ,"A" ,"Gate overlap current pre-factor for 1 um wide channel for drain side")
`MPRnb(STIGO ,2.0 ,"" ,"Temperature dependence of IGINV and IGOV")
`MPRnb(GC2O ,0.375 ,"" ,"Gate current slope factor")
`MPRnb(GC3O ,0.063 ,"" ,"Gate current curvature factor")
`MPRnb(GC2OVO ,0.375 ,"" ,"Gate overlap current slope factor, used only when SWIGATE=2")
`MPRnb(GC3OVO ,0.063 ,"" ,"Gate overlap current curvature factor, used only when SWIGATE=2")
`MPRnb(CHIBO ,3.1 ,"V" ,"Tunnelling barrier height")
// Gate induced drain/source leakage parameters
`MPRnb(AGIDLW ,0.0 ,"A/V^3" ,"Width dependence of GIDL pre-factor")
`MPRnb(AGIDLDW ,0.0 ,"A/V^3" ,"Width dependence of GIDL pre-factor for drain side")
`MPRnb(BGIDLO ,41.0 ,"V" ,"GIDL probability factor at TR")
`MPRnb(BGIDLDO ,41.0 ,"V" ,"GIDL probability factor at TR for drain side")
`MPRnb(STBGIDLO ,0.0 ,"V/K" ,"Temperature dependence of BGIDL")
`MPRnb(STBGIDLDO ,0.0 ,"V/K" ,"Temperature dependence of BGIDL for drain side")
`MPRnb(CGIDLO ,0.0 ,"" ,"Back-bias dependence of GIDL")
`MPRnb(CGIDLDO ,0.0 ,"" ,"Back-bias dependence of GIDL for drain side")
// Charge model parameters
`MPRcc(FCGOVACCO ,0.0 ,"" ,0.0 ,1.0 ,"Factor for overlap capacitances in accumulation regime")
`MPRcc(FCGOVACCDO ,0.0 ,"" ,0.0 ,1.0 ,"Factor for overlap capacitances in accumulation regime for drain side")
`MPRcc(CGOVACCGO ,1.0 ,"" ,0.1 ,1.0 ,"Gate voltage dependence parameter of overlap capacitances in accumulation regime")
`MPRnb(CGBOVL ,0.0 ,"F" ,"Oxide capacitance for gate-bulk overlap for 1 um long channel")
`MPRcz(CINRW ,0.0 ,"F" ,"Inner fringe capacitance for 1 um wide channel")
`MPRcz(CINRDW ,0.0 ,"F" ,"Inner fringe capacitance for 1 um wide channel for drain side")
`MPRnb(DVFBINRO ,0.0 ,"V" ,"Flat-band voltage offset of inner fringe capacitances")
`MPRcc(FCINRDEPO ,0.3 ,"" ,0.0 ,1.0 ,"Bias dependence parameter of inner fringe capacitances in depletion regime")
`MPRcz(FCINRACCO ,0.5 ,"" ,"Bias dependence parameter of inner fringe capacitances in accumulation regime")
`MPRcc(AXINRO ,0.5 ,"" ,0.1 ,4.0 ,"Accumulation/depletion transition factor of inner fringe capacitances")
`MPRnb(CFRW ,0.0 ,"F" ,"Outer fringe capacitance for 1 um wide channel")
`MPRnb(CFRDW ,0.0 ,"F" ,"Outer fringe capacitance for 1 um wide channel for drain side")
// Noise model parameters
`MPRnb(FNTO ,1.0 ,"" ,"Thermal noise coefficient")
`MPRcz(FNTEXCL ,0.0 ,"" ,"Length dependence coefficient of excess noise")
`MPRnb(NFALW ,8.0e22 ,"V^-1/m^4" ,"First coefficient of flicker noise for 1 um^2 channel area")
`MPRnb(NFBLW ,3.0e7 ,"V^-1/m^2" ,"Second coefficient of flicker noise for 1 um^2 channel area")
`MPRnb(NFCLW ,0.0 ,"V^-1" ,"Third coefficient of flicker noise for 1 um^2 channel area")
`MPRnb(EFO ,1.0 ,"" ,"Flicker noise frequency exponent")
`MPRnb(LINTNOI ,0.0 ,"m" ,"Length offset for flicker noise")
`MPRnb(ALPNOI ,2.0 ,"" ,"Exponent for length offset for flicker noise")
// Edge transistor parameters
`MPRcz(WEDGE ,1.0e-8 ,"m" ,"Electrical width of edge transistor per side")
`MPRcz(WEDGEW ,0.0 ,"" ,"Width dependence of edge WEDGE")
`MPRnb(VFBEDGEO ,-1.0 ,"V" ,"Geometry-independent flat-band voltage of edge transistors at TR")
`MPRnb(STVFBEDGEO ,5.0e-4 ,"V/K" ,"Geometry-independent temperature dependence of VFBEDGE")
`MPRnb(STVFBEDGEL ,0.0 ,"V/K" ,"Length dependence of temperature dependence of VFBEDGE")
`MPRnb(STVFBEDGEW ,0.0 ,"V/K" ,"Width dependence of temperature dependence of VFBEDGE")
`MPRnb(STVFBEDGELW ,0.0 ,"V/K" ,"Area dependence of temperature dependence of VFBEDGE")
`MPRnb(DPHIBEDGEO ,0.0 ,"V" ,"Geometry independent of edge transistor PHIB offset")
`MPRnb(DPHIBEDGEL ,0.0 ,"V" ,"Length dependence of edge transistor PHIB offset")
`MPRnb(DPHIBEDGELEXP ,1.0 ,"" ,"Exponent for length dependence of edge transistor PHIB offset")
`MPRnb(DPHIBEDGEW ,0.0 ,"V" ,"Width dependence of edge transistor PHIB offset")
`MPRnb(DPHIBEDGELW ,0.0 ,"V" ,"Area dependence of edge transistor PHIB offset")
`MPRco(NSUBEDGEO ,5.0e23 ,"m^-3" ,1.0e20 ,inf ,"Geometry independent substrate doping of edge transistors")
`MPRnb(NSUBEDGEL ,0.0 ,"" ,"Length dependence of edge transistor substrate doping")
`MPRnb(NSUBEDGELEXP ,1.0 ,"" ,"Exponent for length dependence of edge transistor substrate doping")
`MPRnb(NSUBEDGEW ,0.0 ,"" ,"Width dependence of edge transistor substrate doping")
`MPRnb(NSUBEDGELW ,0.0 ,"" ,"Area dependence of edge transistor substrate doping")
`MPRnb(CTEDGEO ,0.0 ,"" ,"Geometry-independent interface states factor of edge transistors")
`MPRnb(CTEDGEL ,0.0 ,"" ,"Length dependence of interface states factor of edge transistors")
`MPRnb(CTEDGELEXP ,1.0 ,"" ,"Exponent for length dependence of interface states factor of edge transistors")
`MPRnb(FBETEDGE ,0.0 ,"" ,"Length dependence of edge transistor mobility")
`MPRco(LPEDGE ,1.0e-8 ,"m" ,1.0e-10 ,inf ,"Exponent for length dependence of edge transistor mobility")
`MPRnb(BETEDGEW ,0.0 ,"" ,"Width scaling coefficient of edge transistor mobility")
`MPRnb(STBETEDGEO ,1.0 ,"" ,"Geometry independent temperature dependence of BETNEDGE")
`MPRnb(STBETEDGEL ,0.0 ,"" ,"Length dependence of temperature dependence of BETNEDGE")
`MPRnb(STBETEDGEW ,0.0 ,"" ,"Width dependence of temperature dependence of BETNEDGE")
`MPRnb(STBETEDGELW ,0.0 ,"" ,"Area dependence of temperature dependence of BETNEDGE")
`MPRnb(PSCEEDGEL ,0.0 ,"" ,"Length dependence of subthreshold slope coefficient for short channel edge transistors")
`MPRnb(PSCEEDGELEXP ,2.0 ,"" ,"Exponent for length dependence of subthreshold slope coefficient for short channel edge transistors")
`MPRnb(PSCEEDGEW ,0.0 ,"" ,"Exponent for length dependence of subthreshold slope coefficient for short channel edge transistor")
`MPRcc(PSCEBEDGEO ,0.0 ,"V^-1" ,0.0 ,1.0 ,"Bulk voltage dependence parameter of subthreshold slope coefficient for short channel edge transistors")
`MPRcz(PSCEDEDGEO ,0.0 ,"V^-1" ,"Drain voltage dependence parameter of subthreshold slope coefficient for short channel edge transistors")
`MPRnb(CFEDGEL ,0.0 ,"" ,"Length dependence of DIBL-parameter of edge transistors")
`MPRnb(CFEDGELEXP ,2.0 ,"" ,"Exponent for length dependence of DIBL-parameter of edge transistors")
`MPRnb(CFEDGEW ,0.0 ,"" ,"Width dependence of DIBL-parameter of edge transistors")
`MPRcz(CFDEDGEO ,0.0 ,"V^-1" ,"Drain voltage dependence parameter of DIBL-parameter of edge transistors")
`MPRcc(CFBEDGEO ,0.0 ,"V^-1" ,0.0 ,1.0 ,"Bulk voltage dependence parameter of DIBL-parameter of edge transistors")
`MPRnb(FNTEDGEO ,1.0 ,"" ,"Thermal noise coefficient")
`MPRnb(NFAEDGELW ,8.0e22 ,"V^-1/m^4" ,"First coefficient of flicker noise for 1 um^2 channel area")
`MPRnb(NFBEDGELW ,3.0e7 ,"V^-1/m^2" ,"Second coefficient of flicker noise for 1 um^2 channel area")
`MPRnb(NFCEDGELW ,0.0 ,"V^-1" ,"Third coefficient of flicker noise for 1 um^2 channel area")
`MPRnb(EFEDGEO ,1.0 ,"" ,"Flicker noise frequency exponent")
// Well proximity effect parameters
`MPRnb(KVTHOWEO ,0.0 ,"" ,"Geometrical independent threshold shift parameter")
`MPRnb(KVTHOWEL ,0.0 ,"" ,"Length dependent threshold shift parameter")
`MPRnb(KVTHOWEW ,0.0 ,"" ,"Width dependent threshold shift parameter")
`MPRnb(KVTHOWELW ,0.0 ,"" ,"Area dependent threshold shift parameter")
`MPRnb(KUOWEO ,0.0 ,"" ,"Geometrical independent mobility degradation factor")
`MPRnb(KUOWEL ,0.0 ,"" ,"Length dependent mobility degradation factor")
`MPRnb(KUOWEW ,0.0 ,"" ,"Width dependent mobility degradation factor")
`MPRnb(KUOWELW ,0.0 ,"" ,"Area dependent mobility degradation factor")
// --------------------------------------------------------------------------------------------------------------
// PSP global model parameters (binning)
// --------------------------------------------------------------------------------------------------------------
// Process parameters
`MPRnb(POVFB ,-1.0 ,"V" ,"Coefficient for the geometry independent part of VFB")
`MPRnb(PLVFB ,0.0 ,"V" ,"Coefficient for the length dependence of VFB")
`MPRnb(PWVFB ,0.0 ,"V" ,"Coefficient for the width dependence of VFB")
`MPRnb(PLWVFB ,0.0 ,"V" ,"Coefficient for the length times width dependence of VFB")
`MPRnb(POSTVFB ,5.0e-4 ,"V/K" ,"Coefficient for the geometry independent part of STVFB")
`MPRnb(PLSTVFB ,0.0 ,"V/K" ,"Coefficient for the length dependence of STVFB")
`MPRnb(PWSTVFB ,0.0 ,"V/K" ,"Coefficient for the width dependence of STVFB")
`MPRnb(PLWSTVFB ,0.0 ,"V/K" ,"Coefficient for the length times width dependence of STVFB")
`MPRnb(POST2VFB ,0.0 ,"K^-1" ,"Coefficient for the geometry independent part of ST2VFB")
`MPRnb(POTOX ,2.0e-9 ,"m" ,"Coefficient for the geometry independent part of TOX")
`MPRnb(POEPSROX ,3.9 ,"" ,"Coefficient for the geometry independent part of EPSOX")
`MPRnb(PONEFF ,5.0e23 ,"m^-3" ,"Coefficient for the geometry independent part of NEFF")
`MPRnb(PLNEFF ,0.0 ,"m^-3" ,"Coefficient for the length dependence of NEFF")
`MPRnb(PWNEFF ,0.0 ,"m^-3" ,"Coefficient for the width dependence of NEFF")
`MPRnb(PLWNEFF ,0.0 ,"m^-3" ,"Coefficient for the length times width dependence of NEFF")
`MPRnb(POFACNEFFAC ,1.0 ,"" ,"Coefficient for the geometry independent part of FACNEFFAC")
`MPRnb(PLFACNEFFAC ,0.0 ,"" ,"Coefficient for the length dependence of FACNEFFAC")
`MPRnb(PWFACNEFFAC ,0.0 ,"" ,"Coefficient for the width dependence of FACNEFFAC")
`MPRnb(PLWFACNEFFAC ,0.0 ,"" ,"Coefficient for the length times width dependence of FACNEFFAC")
`MPRnb(POGFACNUD ,1.0 ,"" ,"Coefficient for the geometry independent part of GFACNUD")
`MPRnb(PLGFACNUD ,0.0 ,"" ,"Coefficient for the length dependence of GFACNUD")
`MPRnb(PWGFACNUD ,0.0 ,"" ,"Coefficient for the width dependence of GFACNUD")
`MPRnb(PLWGFACNUD ,0.0 ,"" ,"Coefficient for the length times width dependence of GFACNUD")
`MPRnb(POVSBNUD ,0.0 ,"V" ,"Coefficient for the geometry independent part of VSBNUD")
`MPRnb(PODVSBNUD ,1.0 ,"V" ,"Coefficient for the geometry independent part of DVSBNUD")
`MPRnb(POVNSUB ,0.0 ,"V" ,"Coefficient for the geometry independent part of VNSUB")
`MPRnb(PONSLP ,0.05 ,"V" ,"Coefficient for the geometry independent part of NSLP")
`MPRnb(PODNSUB ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of DNSUB")
`MPRnb(PODPHIB ,0.0 ,"V" ,"Coefficient for the geometry independent part of DPHIB")
`MPRnb(PLDPHIB ,0.0 ,"V" ,"Coefficient for the length dependence of DPHIB")
`MPRnb(PWDPHIB ,0.0 ,"V" ,"Coefficient for the width dependence of DPHIB")
`MPRnb(PLWDPHIB ,0.0 ,"V" ,"Coefficient for the length times width dependence of DPHIB")
`MPRnb(PODELVTAC ,0.0 ,"V" ,"Coefficient for the geometry independent part of DELVTAC")
`MPRnb(PLDELVTAC ,0.0 ,"V" ,"Coefficient for the length dependence of DELVTAC")
`MPRnb(PWDELVTAC ,0.0 ,"V" ,"Coefficient for the width dependence of DELVTAC")
`MPRnb(PLWDELVTAC ,0.0 ,"V" ,"Coefficient for the length times width dependence of DELVTAC")
`MPRnb(PONP ,1.0e26 ,"m^-3" ,"Coefficient for the geometry independent part of NP")
`MPRnb(PLNP ,0.0 ,"m^-3" ,"Coefficient for the length dependence of NP")
`MPRnb(PWNP ,0.0 ,"m^-3" ,"Coefficient for the width dependence of NP")
`MPRnb(PLWNP ,0.0 ,"m^-3" ,"Coefficient for the length times width dependence of NP")
`MPRnb(POTOXOV ,2.0e-09 ,"m" ,"Coefficient for the geometry independent part of TOXOV")
`MPRnb(POTOXOVD ,2.0e-09 ,"m" ,"Coefficient for the geometry independent part of TOXOV for drain side")
`MPRnb(PONOV ,5.0e25 ,"m^-3" ,"Coefficient for the geometry independent part of NOV")
`MPRnb(PLNOV ,0.0 ,"m^-3" ,"Coefficient for the length dependence of NOV")
`MPRnb(PWNOV ,0.0 ,"m^-3" ,"Coefficient for the width dependence of NOV")
`MPRnb(PLWNOV ,0.0 ,"m^-3" ,"Coefficient for the length times width dependence of NOV")
`MPRnb(PONOVD ,5.0e25 ,"m^-3" ,"Coefficient for the geometry independent part of NOV for drain side")
`MPRnb(PLNOVD ,0.0 ,"m^-3" ,"Coefficient for the length dependence of NOV for drain side")
`MPRnb(PWNOVD ,0.0 ,"m^-3" ,"Coefficient for the width dependence of NOV for drain side")
`MPRnb(PLWNOVD ,0.0 ,"m^-3" ,"Coefficient for the length times width dependence of NOV for drain side")
// Interface states parameters
`MPRnb(POCT ,0.0 ,"" ,"Coefficient for the geometry independent part of CT")
`MPRnb(PLCT ,0.0 ,"" ,"Coefficient for the length dependence of CT")
`MPRnb(PWCT ,0.0 ,"" ,"Coefficient for the width dependence of CT")
`MPRnb(PLWCT ,0.0 ,"" ,"Coefficient for the length times width dependence of CT")
`MPRnb(POCTG ,0.0 ,"" ,"Coefficient for the geometry independent part of CTG")
`MPRnb(POCTB ,0.0 ,"" ,"Coefficient for the geometry independent part of CTB")
`MPRnb(POSTCT ,1.0 ,"" ,"Coefficient for the geometry independent part of STCT")
// DIBL parameters
`MPRnb(POCF ,0.0 ,"" ,"Coefficient for the geometry independent part of CF")
`MPRnb(PLCF ,0.0 ,"" ,"Coefficient for the length dependence of CF")
`MPRnb(PWCF ,0.0 ,"" ,"Coefficient for the width dependence of CF")
`MPRnb(PLWCF ,0.0 ,"" ,"Coefficient for the length times width dependence of CF")
`MPRnb(POCFAC ,0.0 ,"" ,"Coefficient for the geometry independent part of CFAC")
`MPRnb(PLCFAC ,0.0 ,"" ,"Coefficient for the length dependence of CFAC")
`MPRnb(PWCFAC ,0.0 ,"" ,"Coefficient for the width dependence of CFAC")
`MPRnb(PLWCFAC ,0.0 ,"" ,"Coefficient for the length times width dependence of CFAC")
`MPRnb(POCFD ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of CFD")
`MPRnb(POCFB ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of CFB")
// Subthreshold slope parameters of short channel transistor
`MPRnb(POPSCE ,0.0 ,"" ,"Coefficient for the geometry independent part of PSCE")
`MPRnb(PLPSCE ,0.0 ,"" ,"Coefficient for the length dependence of PSCE")
`MPRnb(PWPSCE ,0.0 ,"" ,"Coefficient for the width dependence of PSCE")
`MPRnb(PLWPSCE ,0.0 ,"" ,"Coefficient for the length times width dependence of PSCE")
`MPRnb(POPSCEB ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of PSCEB")
`MPRnb(POPSCED ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of PSCED")
// Mobility parameters
`MPRnb(POBETN ,7.0e-2 ,"m^2/V/s" ,"Coefficient for the geometry independent part of BETN")
`MPRnb(PLBETN ,0.0 ,"m^2/V/s" ,"Coefficient for the length dependence of BETN")
`MPRnb(PWBETN ,0.0 ,"m^2/V/s" ,"Coefficient for the width dependence of BETN")
`MPRnb(PLWBETN ,0.0 ,"m^2/V/s" ,"Coefficient for the length times width dependence of BETN")
`MPRnb(POSTBET ,1.0 ,"" ,"Coefficient for the geometry independent part of STBET")
`MPRnb(PLSTBET ,0.0 ,"" ,"Coefficient for the length dependence of STBET")
`MPRnb(PWSTBET ,0.0 ,"" ,"Coefficient for the width dependence of STBET")
`MPRnb(PLWSTBET ,0.0 ,"" ,"Coefficient for the length times width dependence of STBET")
`MPRnb(POMUE ,0.5 ,"m/V" ,"Coefficient for the geometry independent part of MUE")
`MPRnb(PLMUE ,0.0 ,"m/V" ,"Coefficient for the length dependence of MUE")
`MPRnb(PWMUE ,0.0 ,"m/V" ,"Coefficient for the width dependence of MUE")
`MPRnb(PLWMUE ,0.0 ,"m/V" ,"Coefficient for the length times width dependence of MUE")
`MPRnb(POSTMUE ,0.0 ,"" ,"Coefficient for the geometry independent part of STMUE")
`MPRnb(POTHEMU ,1.5 ,"" ,"Coefficient for the geometry independent part of THEMU")
`MPRnb(POSTTHEMU ,1.5 ,"" ,"Coefficient for the geometry independent part of STTHEMU")
`MPRnb(POCS ,0.0 ,"" ,"Coefficient for the geometry independent part of CS")
`MPRnb(PLCS ,0.0 ,"" ,"Coefficient for the length dependence of CS")
`MPRnb(PWCS ,0.0 ,"" ,"Coefficient for the width dependence of CS")
`MPRnb(PLWCS ,0.0 ,"" ,"Coefficient for the length times width dependence of CS")
`MPRnb(POSTCS ,0.0 ,"" ,"Coefficient for the geometry independent part of STCS")
`MPRnb(POTHECS ,2.0 ,"" ,"Coefficient for the geometry independent part of THECS")
`MPRnb(POSTTHECS ,0.0 ,"" ,"Coefficient for the geometry independent part of STHTECS")
`MPRnb(POXCOR ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of XCOR")
`MPRnb(PLXCOR ,0.0 ,"V^-1" ,"Coefficient for the length dependence of XCOR")
`MPRnb(PWXCOR ,0.0 ,"V^-1" ,"Coefficient for the width dependence of XCOR")
`MPRnb(PLWXCOR ,0.0 ,"V^-1" ,"Coefficient for the length times width dependence of XCOR")
`MPRnb(POSTXCOR ,0.0 ,"" ,"Coefficient for the geometry independent part of STXCOR")
`MPRnb(POFETA ,1.0 ,"" ,"Coefficient for the geometry independent part of FETA")
// Intrinsic series-resistance parameters
`MPRnb(PORS ,30.0 ,"Ohm" ,"Coefficient for the geometry independent part of RS")
`MPRnb(PLRS ,0.0 ,"Ohm" ,"Coefficient for the length dependence of RS")
`MPRnb(PWRS ,0.0 ,"Ohm" ,"Coefficient for the width dependence of RS")
`MPRnb(PLWRS ,0.0 ,"Ohm" ,"Coefficient for the length times width dependence of RS")
`MPRnb(POSTRS ,1.0 ,"" ,"Coefficient for the geometry independent part of STRS")
`MPRnb(PORSB ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of RSB")
`MPRnb(PORSG ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of RSG")
// Velocity saturation parameters
`MPRnb(POTHESAT ,1.0 ,"V^-1" ,"Coefficient for the geometry independent part of THESAT")
`MPRnb(PLTHESAT ,0.0 ,"V^-1" ,"Coefficient for the length dependence of THESAT")
`MPRnb(PWTHESAT ,0.0 ,"V^-1" ,"Coefficient for the width dependence of THESAT")
`MPRnb(PLWTHESAT ,0.0 ,"V^-1" ,"Coefficient for the length times width dependence of THESAT")
`MPRnb(POTHESATAC ,1.0 ,"V^-1" ,"Coefficient for the geometry independent part of THESATAC")
`MPRnb(PLTHESATAC ,0.0 ,"V^-1" ,"Coefficient for the length dependence of THESATAC")
`MPRnb(PWTHESATAC ,0.0 ,"V^-1" ,"Coefficient for the width dependence of THESATAC")
`MPRnb(PLWTHESATAC ,0.0 ,"V^-1" ,"Coefficient for the length times width dependence of THESATAC")
`MPRnb(POSTTHESAT ,1.0 ,"" ,"Coefficient for the geometry independent part of STTHESAT")
`MPRnb(PLSTTHESAT ,0.0 ,"" ,"Coefficient for the length dependence of STTHESAT")
`MPRnb(PWSTTHESAT ,0.0 ,"" ,"Coefficient for the width dependence of STTHESAT")
`MPRnb(PLWSTTHESAT ,0.0 ,"" ,"Coefficient for the length times width dependence of STTHESAT")
`MPRnb(POTHESATB ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of THESATB")
`MPRnb(PLTHESATB ,0.0 ,"V^-1" ,"Coefficient for the length dependence of THESATB")
`MPRnb(PWTHESATB ,0.0 ,"V^-1" ,"Coefficient for the width dependence of THESATB")
`MPRnb(PLWTHESATB ,0.0 ,"V^-1" ,"Coefficient for the length times width dependence of THESATB")
`MPRnb(POTHESATG ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of THESATG")
`MPRnb(PLTHESATG ,0.0 ,"V^-1" ,"Coefficient for the length dependence of THESATG")
`MPRnb(PWTHESATG ,0.0 ,"V^-1" ,"Coefficient for the width dependence of THESATG")
`MPRnb(PLWTHESATG ,0.0 ,"V^-1" ,"Coefficient for the length times width dependence of THESATG")
// Saturation voltage parameters
`MPRnb(POAX ,3.0 ,"" ,"Coefficient for the geometry independent part of AX")
`MPRnb(PLAX ,0.0 ,"" ,"Coefficient for the length dependence of AX")
`MPRnb(PWAX ,0.0 ,"" ,"Coefficient for the width dependence of AX")
`MPRnb(PLWAX ,0.0 ,"" ,"Coefficient for the length times width dependence of AX")
`MPRnb(POAXAC ,3.0 ,"" ,"Coefficient for the geometry independent part of AXAC")
`MPRnb(PLAXAC ,0.0 ,"" ,"Coefficient for the length dependence of AXAC")
`MPRnb(PWAXAC ,0.0 ,"" ,"Coefficient for the width dependence of AXAC")
`MPRnb(PLWAXAC ,0.0 ,"" ,"Coefficient for the length times width dependence of AXAC")
// Channel length modulation parameters
`MPRnb(POALP ,1.0e-2 ,"" ,"Coefficient for the geometry independent part of ALP")
`MPRnb(PLALP ,0.0 ,"" ,"Coefficient for the length dependence of ALP")
`MPRnb(PWALP ,0.0 ,"" ,"Coefficient for the width dependence of ALP")
`MPRnb(PLWALP ,0.0 ,"" ,"Coefficient for the length times width dependence of ALP")
`MPRnb(POALPAC ,1.0e-2 ,"" ,"Coefficient for the geometry independent part of ALPAC")
`MPRnb(PLALPAC ,0.0 ,"" ,"Coefficient for the length dependence of ALPAC")
`MPRnb(PWALPAC ,0.0 ,"" ,"Coefficient for the width dependence of ALPAC")
`MPRnb(PLWALPAC ,0.0 ,"" ,"Coefficient for the length times width dependence of ALPAC")
`MPRnb(POALP1 ,0.0 ,"V" ,"Coefficient for the geometry independent part of ALP1")
`MPRnb(PLALP1 ,0.0 ,"V" ,"Coefficient for the length dependence of ALP1")
`MPRnb(PWALP1 ,0.0 ,"V" ,"Coefficient for the width dependence of ALP1")
`MPRnb(PLWALP1 ,0.0 ,"V" ,"Coefficient for the length times width dependence of ALP1")
`MPRnb(POALP2 ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of ALP2")
`MPRnb(PLALP2 ,0.0 ,"V^-1" ,"Coefficient for the length dependence of ALP2")
`MPRnb(PWALP2 ,0.0 ,"V^-1" ,"Coefficient for the width dependence of ALP2")
`MPRnb(PLWALP2 ,0.0 ,"V^-1" ,"Coefficient for the length times width dependence of ALP2")
`MPRnb(POVP ,0.05 ,"V" ,"Coefficient for the geometry independent part of VP")
// Impact ionization parameters
`MPRnb(POA1 ,1.0 ,"" ,"Coefficient for the geometry independent part of A1")
`MPRnb(PLA1 ,0.0 ,"" ,"Coefficient for the length dependence of A1")
`MPRnb(PWA1 ,0.0 ,"" ,"Coefficient for the width dependence of A1")
`MPRnb(PLWA1 ,0.0 ,"" ,"Coefficient for the length times width dependence of A1")
`MPRnb(POA2 ,10.0 ,"V" ,"Coefficient for the geometry independent part of A2")
`MPRnb(POSTA2 ,0.0 ,"V" ,"Coefficient for the geometry independent part of STA2")
`MPRnb(POA3 ,1.0 ,"" ,"Coefficient for the geometry independent part of A3")
`MPRnb(PLA3 ,0.0 ,"" ,"Coefficient for the length dependence of A3")
`MPRnb(PWA3 ,0.0 ,"" ,"Coefficient for the width dependence of A3")
`MPRnb(PLWA3 ,0.0 ,"" ,"Coefficient for the length times width dependence of A3")
`MPRnb(POA4 ,0.0 ,"V^-0.5" ,"Coefficient for the geometry independent part of A4")
`MPRnb(PLA4 ,0.0 ,"V^-0.5" ,"Coefficient for the length dependence of A4")
`MPRnb(PWA4 ,0.0 ,"V^-0.5" ,"Coefficient for the width dependence of A4")
`MPRnb(PLWA4 ,0.0 ,"V^-0.5" ,"Coefficient for the length times width dependence of A4")
`MPRnb(POGCO ,0.0 ,"" ,"Coefficient for the geometry independent part of GCO")
// Gate current parameters
`MPRnb(POIGINV ,0.0 ,"A" ,"Coefficient for the geometry independent part of IGINV")
`MPRnb(PLIGINV ,0.0 ,"A" ,"Coefficient for the length dependence of IGINV")
`MPRnb(PWIGINV ,0.0 ,"A" ,"Coefficient for the width dependence of IGINV")
`MPRnb(PLWIGINV ,0.0 ,"A" ,"Coefficient for the length times width dependence of IGINV")
`MPRnb(POIGOV ,0.0 ,"A" ,"Coefficient for the geometry independent part of IGOV")
`MPRnb(PLIGOV ,0.0 ,"A" ,"Coefficient for the length dependence of IGOV")
`MPRnb(PWIGOV ,0.0 ,"A" ,"Coefficient for the width dependence of IGOV")
`MPRnb(PLWIGOV ,0.0 ,"A" ,"Coefficient for the length times width dependence of IGOV")
`MPRnb(POIGOVD ,0.0 ,"A" ,"Coefficient for the geometry independent part of IGOV for drain side")
`MPRnb(PLIGOVD ,0.0 ,"A" ,"Coefficient for the length dependence of IGOV for drain side")
`MPRnb(PWIGOVD ,0.0 ,"A" ,"Coefficient for the width dependence of IGOV for drain side")
`MPRnb(PLWIGOVD ,0.0 ,"A" ,"Coefficient for the length times width dependence of IGOV for drain side")
`MPRnb(POSTIG ,2.0 ,"" ,"Coefficient for the geometry independent part of STIG")
`MPRnb(POGC2 ,0.375 ,"" ,"Coefficient for the geometry independent part of GC2")
`MPRnb(POGC3 ,0.063 ,"" ,"Coefficient for the geometry independent part of GC3")
`MPRnb(POGC2OV ,0.375 ,"" ,"Coefficient for the geometry independent part of GC2OV, used only when SWIGATE=2")
`MPRnb(POGC3OV ,0.063 ,"" ,"Coefficient for the geometry independent part of GC3OV, used only when SWIGATE=2")
`MPRnb(POCHIB ,3.1 ,"V" ,"Coefficient for the geometry independent part of CHIB")
// Gate-induced drain/source leakage parameters
`MPRnb(POAGIDL ,0.0 ,"A/V^3" ,"Coefficient for the geometry independent part of AGIDL")
`MPRnb(PLAGIDL ,0.0 ,"A/V^3" ,"Coefficient for the length dependence of AGIDL")
`MPRnb(PWAGIDL ,0.0 ,"A/V^3" ,"Coefficient for the width dependence of AGIDL")
`MPRnb(PLWAGIDL ,0.0 ,"A/V^3" ,"Coefficient for the length times width dependence of AGIDL")
`MPRnb(POAGIDLD ,0.0 ,"A/V^3" ,"Coefficient for the geometry independent part of AGIDL for drain side")
`MPRnb(PLAGIDLD ,0.0 ,"A/V^3" ,"Coefficient for the length dependence of AGIDL for drain side")
`MPRnb(PWAGIDLD ,0.0 ,"A/V^3" ,"Coefficient for the width dependence of AGIDL for drain side")
`MPRnb(PLWAGIDLD ,0.0 ,"A/V^3" ,"Coefficient for the length times width dependence of AGIDL for drain side")
`MPRnb(POBGIDL ,41.0 ,"V" ,"Coefficient for the geometry independent part of BGIDL")
`MPRnb(POBGIDLD ,41.0 ,"V" ,"Coefficient for the geometry independent part of BGIDL for drain side")
`MPRnb(POSTBGIDL ,0.0 ,"V/K" ,"Coefficient for the geometry independent part of STBGIDL")
`MPRnb(POSTBGIDLD ,0.0 ,"V/K" ,"Coefficient for the geometry independent part of STBGIDL for drain side")
`MPRnb(POCGIDL ,0.0 ,"" ,"Coefficient for the geometry independent part of CGIDL")
`MPRnb(POCGIDLD ,0.0 ,"" ,"Coefficient for the geometry independent part of CGIDL for drain side")
// Charge model parameters
`MPRnb(POCOX ,1.0e-14 ,"F" ,"Coefficient for the geometry independent part of COX")
`MPRnb(PLCOX ,0.0 ,"F" ,"Coefficient for the length dependence of COX")
`MPRnb(PWCOX ,0.0 ,"F" ,"Coefficient for the width dependence of COX")
`MPRnb(PLWCOX ,0.0 ,"F" ,"Coefficient for the length times width dependence of COX")
`MPRnb(POCGOV ,1.0e-15 ,"F" ,"Coefficient for the geometry independent part of CGOV")
`MPRnb(PLCGOV ,0.0 ,"F" ,"Coefficient for the length dependence of CGOV")
`MPRnb(PWCGOV ,0.0 ,"F" ,"Coefficient for the width dependence of CGOV")
`MPRnb(PLWCGOV ,0.0 ,"F" ,"Coefficient for the length times width dependence of CGOV")
`MPRnb(POCGOVD ,1.0e-15 ,"F" ,"Coefficient for the geometry independent part of CGOV for drain side")
`MPRnb(PLCGOVD ,0.0 ,"F" ,"Coefficient for the length dependence of CGOV for drain side")
`MPRnb(PWCGOVD ,0.0 ,"F" ,"Coefficient for the width dependence of CGOV for drain side")
`MPRnb(PLWCGOVD ,0.0 ,"F" ,"Coefficient for the length times width dependence of CGOV for drain side")
`MPRnb(POFCGOVACC ,0.0 ,"" ,"Coefficient for the geometry independent part of FCGOVACC")
`MPRnb(POFCGOVACCD ,0.0 ,"" ,"Coefficient for the geometry independent part of FCGOVACC for drain side")
`MPRnb(POCGOVACCG ,1.0 ,"" ,"Coefficient for the geometry independent part of CGOVACCG")
`MPRnb(POCGBOV ,0.0 ,"F" ,"Coefficient for the geometry independent part of CGBOV")
`MPRnb(PLCGBOV ,0.0 ,"F" ,"Coefficient for the length dependence of CGBOV")
`MPRnb(PWCGBOV ,0.0 ,"F" ,"Coefficient for the width dependence of CGBOV")
`MPRnb(PLWCGBOV ,0.0 ,"F" ,"Coefficient for the length times width dependence of CGBOV")
`MPRnb(POCINR ,0.0 ,"F" ,"Coefficient for the geometry independent part of CINR")
`MPRnb(PLCINR ,0.0 ,"F" ,"Coefficient for the length dependence of CINR")
`MPRnb(PWCINR ,0.0 ,"F" ,"Coefficient for the width dependence of CINR")
`MPRnb(PLWCINR ,0.0 ,"F" ,"Coefficient for the length times width dependence of CINR")
`MPRnb(POCINRD ,0.0 ,"F" ,"Coefficient for the geometry independent part of CINR for drain side")
`MPRnb(PLCINRD ,0.0 ,"F" ,"Coefficient for the length dependence of CINR for drain side")
`MPRnb(PWCINRD ,0.0 ,"F" ,"Coefficient for the width dependence of CINR for drain side")
`MPRnb(PLWCINRD ,0.0 ,"F" ,"Coefficient for the length times width dependence of CINR for drain side")
`MPRnb(PODVFBINR ,0.0 ,"V" ,"Coefficient for the geometry independent part of DVFBINR")
`MPRnb(POFCINRDEP ,0.3 ,"" ,"Coefficient for the geometry independent part of FCINRDEP")
`MPRnb(POFCINRACC ,0.5 ,"" ,"Coefficient for the geometry independent part of FCINRACC")
`MPRnb(POAXINR ,0.5 ,"" ,"Coefficient for the geometry independent part of AXINR")
`MPRnb(POCFR ,0.0 ,"F" ,"Coefficient for the geometry independent part of CFR")
`MPRnb(PLCFR ,0.0 ,"F" ,"Coefficient for the length dependence of CFR")
`MPRnb(PWCFR ,0.0 ,"F" ,"Coefficient for the width dependence of CFR")
`MPRnb(PLWCFR ,0.0 ,"F" ,"Coefficient for the length times width dependence of CFR")
`MPRnb(POCFRD ,0.0 ,"F" ,"Coefficient for the geometry independent part of CFR for drain side")
`MPRnb(PLCFRD ,0.0 ,"F" ,"Coefficient for the length dependence of CFR for drain side")
`MPRnb(PWCFRD ,0.0 ,"F" ,"Coefficient for the width dependence of CFR for drain side")
`MPRnb(PLWCFRD ,0.0 ,"F" ,"Coefficient for the length times width dependence of CFR for drain side")
// Noise model parameters
`MPRnb(POFNT ,1.0 ,"" ,"Coefficient for the geometry independent part of FNT")
`MPRnb(POFNTEXC ,0.0 ,"" ,"Coefficient for the geometry independent part of FNTEXC")
`MPRnb(PLFNTEXC ,0.0 ,"" ,"Coefficient for the length dependence of FNTEXC")
`MPRnb(PWFNTEXC ,0.0 ,"" ,"Coefficient for the width dependence of FNTEXC")
`MPRnb(PLWFNTEXC ,0.0 ,"" ,"Coefficient for the length times width dependence of FNTEXC")
`MPRnb(PONFA ,8.0e22 ,"V^-1/m^4" ,"Coefficient for the geometry independent part of NFA")
`MPRnb(PLNFA ,0.0 ,"V^-1/m^4" ,"Coefficient for the length dependence of NFA")
`MPRnb(PWNFA ,0.0 ,"V^-1/m^4" ,"Coefficient for the width dependence of NFA")
`MPRnb(PLWNFA ,0.0 ,"V^-1/m^4" ,"Coefficient for the length times width dependence of NFA")
`MPRnb(PONFB ,3.0e7 ,"V^-1/m^2" ,"Coefficient for the geometry independent part of NFB")
`MPRnb(PLNFB ,0.0 ,"V^-1/m^2" ,"Coefficient for the length dependence of NFB")
`MPRnb(PWNFB ,0.0 ,"V^-1/m^2" ,"Coefficient for the width dependence of NFB")
`MPRnb(PLWNFB ,0.0 ,"V^-1/m^2" ,"Coefficient for the length times width dependence of NFB")
`MPRnb(PONFC ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of NFC")
`MPRnb(PLNFC ,0.0 ,"V^-1" ,"Coefficient for the length dependence of NFC")
`MPRnb(PWNFC ,0.0 ,"V^-1" ,"Coefficient for the width dependence of NFC")
`MPRnb(PLWNFC ,0.0 ,"V^-1" ,"Coefficient for the length times width dependence of NFC")
`MPRnb(POEF ,1.0 ,"" ,"Coefficient for the flicker noise frequency exponent")
// Edge transistor parameters
`MPRnb(POVFBEDGE ,-1.0 ,"V" ,"Coefficient for the geometry independent part of VFBEDGE")
`MPRnb(POSTVFBEDGE ,0.0 ,"V/K" ,"Coefficient for the geometry independent part of STVFBEDGE")
`MPRnb(PLSTVFBEDGE ,0.0 ,"V/K" ,"Coefficient for the length dependence of STVFBEDGE")
`MPRnb(PWSTVFBEDGE ,0.0 ,"V/K" ,"Coefficient for the width dependence of STVFBEDGE")
`MPRnb(PLWSTVFBEDGE ,0.0 ,"V/K" ,"Coefficient for the length times width dependence of STVFBEDGE")
`MPRnb(PODPHIBEDGE ,0.0 ,"V" ,"Coefficient for the geometry independent part of DPHIBEDGE")
`MPRnb(PLDPHIBEDGE ,0.0 ,"V" ,"Coefficient for the length dependence of DPHIBEDGE")
`MPRnb(PWDPHIBEDGE ,0.0 ,"V" ,"Coefficient for the width dependence of DPHIBEDGE")
`MPRnb(PLWDPHIBEDGE ,0.0 ,"V" ,"Coefficient for the length times width dependence of DPHIBEDGE")
`MPRnb(PONEFFEDGE ,5.0e23 ,"m^-3" ,"Coefficient for the geometry independent part of NEFFEDGE")
`MPRnb(PLNEFFEDGE ,0.0 ,"m^-3" ,"Coefficient for the length dependence of NEFFEDGE")
`MPRnb(PWNEFFEDGE ,0.0 ,"m^-3" ,"Coefficient for the width dependence of NEFFEDGE")
`MPRnb(PLWNEFFEDGE ,0.0 ,"m^-3" ,"Coefficient for the length times width dependence of NEFFEDGE")
`MPRnb(POCTEDGE ,0.0 ,"" ,"Coefficient for the geometry independent part of CTEDGE")
`MPRnb(PLCTEDGE ,0.0 ,"" ,"Coefficient for the length dependence of CTEDGE")
`MPRnb(PWCTEDGE ,0.0 ,"" ,"Coefficient for the width dependence of CTEDGE")
`MPRnb(PLWCTEDGE ,0.0 ,"" ,"Coefficient for the length times width dependence of CTEDGE")
`MPRnb(POBETNEDGE ,5.0e-4 ,"m^2/V/s" ,"Coefficient for the geometry independent part of BETNEDGE")
`MPRnb(PLBETNEDGE ,0.0 ,"m^2/V/s" ,"Coefficient for the length dependence of BETNEDGE")
`MPRnb(PWBETNEDGE ,0.0 ,"m^2/V/s" ,"Coefficient for the width dependence of BETNEDGE")
`MPRnb(PLWBETNEDGE ,0.0 ,"m^2/V/s" ,"Coefficient for the length times width dependence of BETNEDGE")
`MPRnb(POSTBETEDGE ,1.0 ,"" ,"Coefficient for the geometry independent part of STBETEDGE")
`MPRnb(PLSTBETEDGE ,0.0 ,"" ,"Coefficient for the length dependence of STBETEDGE")
`MPRnb(PWSTBETEDGE ,0.0 ,"" ,"Coefficient for the width dependence of STBETEDGE")
`MPRnb(PLWSTBETEDGE ,0.0 ,"" ,"Coefficient for the length times width dependence of STBETEDGE")
`MPRnb(POPSCEEDGE ,0.0 ,"" ,"Coefficient for the geometry independent part of PSCEEDGE")
`MPRnb(PLPSCEEDGE ,0.0 ,"" ,"Coefficient for the length dependence of PSCEEDGE")
`MPRnb(PWPSCEEDGE ,0.0 ,"" ,"Coefficient for the width dependence of PSCEEDGE")
`MPRnb(PLWPSCEEDGE ,0.0 ,"" ,"Coefficient for the length times width dependence of PSCEEDGE")
`MPRnb(POPSCEBEDGE ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of PSCEBEDGE")
`MPRnb(POPSCEDEDGE ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of PSCEDEDGE")
`MPRnb(POCFEDGE ,0.0 ,"" ,"Coefficient for the geometry independent part of CFEDGE")
`MPRnb(PLCFEDGE ,0.0 ,"" ,"Coefficient for the length dependence of CFEDGE")
`MPRnb(PWCFEDGE ,0.0 ,"" ,"Coefficient for the width dependence of CFEDGE")
`MPRnb(PLWCFEDGE ,0.0 ,"" ,"Coefficient for the length times width dependence of CFEDGE")
`MPRnb(POCFDEDGE ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of CFDEDGE")
`MPRnb(POCFBEDGE ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of CFBEDGE")
`MPRnb(POFNTEDGE ,1.0 ,"" ,"Coefficient for the geometry independent part of FNTEDGE")
`MPRnb(PONFAEDGE ,8.0e22 ,"V^-1/m^4" ,"Coefficient for the geometry independent part of NFAEDGE")
`MPRnb(PLNFAEDGE ,0.0 ,"V^-1/m^4" ,"Coefficient for the length dependence of NFAEDGE")
`MPRnb(PWNFAEDGE ,0.0 ,"V^-1/m^4" ,"Coefficient for the width dependence of NFAEDGE")
`MPRnb(PLWNFAEDGE ,0.0 ,"V^-1/m^4" ,"Coefficient for the length times width dependence of NFAEDGE")
`MPRnb(PONFBEDGE ,3.0e7 ,"V^-1/m^2" ,"Coefficient for the geometry independent part of NFBEDGE")
`MPRnb(PLNFBEDGE ,0.0 ,"V^-1/m^2" ,"Coefficient for the length dependence of NFBEDGE")
`MPRnb(PWNFBEDGE ,0.0 ,"V^-1/m^2" ,"Coefficient for the width dependence of NFBEDGE")
`MPRnb(PLWNFBEDGE ,0.0 ,"V^-1/m^2" ,"Coefficient for the length times width dependence of NFBEDGE")
`MPRnb(PONFCEDGE ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of NFCEDGE")
`MPRnb(PLNFCEDGE ,0.0 ,"V^-1" ,"Coefficient for the length dependence of NFCEDGE")
`MPRnb(PWNFCEDGE ,0.0 ,"V^-1" ,"Coefficient for the width dependence of NFCEDGE")
`MPRnb(PLWNFCEDGE ,0.0 ,"V^-1" ,"Coefficient for the length times width dependence of NFCEDGE")
`MPRnb(POEFEDGE ,1.0 ,"" ,"Coefficient for the geometry independent part of EFEDGE")
// Well proximity effect parameters
`MPRnb(POKVTHOWE ,0.0 ,"" ,"Coefficient for the geometry independent part of KVTHOWE")
`MPRnb(PLKVTHOWE ,0.0 ,"" ,"Coefficient for the length dependence part of KVTHOWE")
`MPRnb(PWKVTHOWE ,0.0 ,"" ,"Coefficient for the width dependence part of KVTHOWE")
`MPRnb(PLWKVTHOWE ,0.0 ,"" ,"Coefficient for the length times width dependence part of KVTHOWE")
`MPRnb(POKUOWE ,0.0 ,"" ,"Coefficient for the geometry independent part of KUOWE")
`MPRnb(PLKUOWE ,0.0 ,"" ,"Coefficient for the length dependence part of KUOWE")
`MPRnb(PWKUOWE ,0.0 ,"" ,"Coefficient for the width dependence part of KUOWE")
`MPRnb(PLWKUOWE ,0.0 ,"" ,"Coefficient for the length times width dependence part of KUOWE")
// `Dummy' parameters for binning-set labeling
`MPRnb(LMIN ,0 ,"m" ,"Dummy parameter to label binning set")
`MPRnb(LMAX ,1.0 ,"m" ,"Dummy parameter to label binning set")
`MPRnb(WMIN ,0.0 ,"m" ,"Dummy parameter to label binning set")
`MPRnb(WMAX ,1.0 ,"m" ,"Dummy parameter to label binning set")
// --------------------------------------------------------------------------------------------------------------
// Parameters that occur in both global and binning model
// --------------------------------------------------------------------------------------------------------------
// NQS parameters
`ifdef NQSmodel
`MPRnb(MUNQSO ,1.0 ,"" ,"Relative mobility for NQS modelling")
`endif // NQSmodel
// Parasitic resistance parameters
`MPRnb(RGO ,0.0 ,"Ohm" ,"Gate resistance")
`MPRcz(RINT ,0.0 ,"Ohm m^2" ,"Contact resistance between silicide and ploy")
`MPRcz(RVPOLY ,0.0 ,"Ohm m^2" ,"Vertical poly resistance")
`MPRcz(RSHG ,0.0 ,"Ohm/sq" ,"Gate electrode diffusion sheet resistance")
`MPRnb(DLSIL ,0.0 ,"m" ,"Silicide extension over the physical gate length")
`MPRnb(RSH ,0.0 ,"Ohm/sq" ,"Sheet resistance of source diffusion")
`MPRnb(RSHD ,0.0 ,"Ohm/sq" ,"Sheet resistance of drain diffusion")
`MPRnb(RBULKO ,0.0 ,"Ohm" ,"Bulk resistance between node BP and BI")
`MPRnb(RWELLO ,0.0 ,"Ohm" ,"Well resistance between node BI and B")
`MPRnb(RJUNSO ,0.0 ,"Ohm" ,"Source-side bulk resistance between node BI and BS")
`MPRnb(RJUNDO ,0.0 ,"Ohm" ,"Drain-side bulk resistance between node BI and BD")
// Self heating effect parameters
`ifdef SelfHeating
`MPRnb(RTHO ,0.0 ,"K/W" ,"Geometry independent part of thermal resistance")
`MPRnb(RTHW1 ,0.0 ,"K/W" ,"Width dependence of thermal resistance")
`MPRnb(RTHW2 ,0.0 ,"" ,"Offset in width dependence of thermal resistance")
`MPRnb(RTHLW ,0.0 ,"" ,"Length-correction to width dependence of thermal resistance")
`MPRnb(CTHO ,0.0 ,"J/K" ,"Geometry independent part of thermal capacitance")
`MPRnb(CTHW1 ,0.0 ,"J/K" ,"Width dependence of thermal capacitance")
`MPRnb(CTHW2 ,0.0 ,"" ,"Offset in width dependence of thermal capacitance")
`MPRnb(CTHLW ,0.0 ,"" ,"Length-correction to width dependence of thermal capacitance")
`MPRnb(STRTHO ,0.0 ,"" ,"Temperature sensitivity of RTH")
`endif // SelfHeating
// Stress model parameters
`MPRcc(SAREF ,1.0e-6 ,"m" ,1.0e-9 ,inf ,"Reference distance between OD-edge and poly from one side")
`MPRcc(SBREF ,1.0e-6 ,"m" ,1.0e-9 ,inf ,"Reference distance between OD-edge and poly from other side")
`MPRnb(WLOD ,0.0 ,"m" ,"Width parameter")
`MPRnb(KUO ,0.0 ,"m" ,"Mobility degradation/enhancement coefficient")
`MPRcc(KVSAT ,0.0 ,"m" ,-1.0 ,1.0 ,"Saturation velocity degradation/enhancement coefficient")
`MPRcc(KVSATAC ,0.0 ,"m" ,-1.0 ,1.0 ,"Saturation velocity degradation/enhancement coefficient of charge model when SWQSAT=1")
`MPRnb(TKUO ,0.0 ,"" ,"Temperature dependence of KUO")
`MPRnb(LKUO ,0.0 ,"m^LLODKUO" ,"Length dependence of KUO")
`MPRnb(WKUO ,0.0 ,"m^WLODKUO" ,"Width dependence of KUO")
`MPRnb(PKUO ,0.0 ,"m^(LLODKUO+WLODKUO)" ,"Cross-term dependence of KUO")
`MPRcz(LLODKUO ,0.0 ,"" ,"Length parameter for UO stress effect")
`MPRcz(WLODKUO ,0.0 ,"" ,"Width parameter for UO stress effect")
`MPRnb(KVTHO ,0.0 ,"Vm" ,"Threshold shift parameter")
`MPRnb(LKVTHO ,0.0 ,"m^LLODVTH" ,"Length dependence of KVTHO")
`MPRnb(WKVTHO ,0.0 ,"m^WLODVTH" ,"Width dependence of KVTHO")
`MPRnb(PKVTHO ,0.0 ,"m^(LLODVTH+WLODVTH)" ,"Cross-term dependence of KVTHO")
`MPRcz(LLODVTH ,0.0 ,"" ,"Length parameter for VTH-stress effect")
`MPRcz(WLODVTH ,0.0 ,"" ,"Width parameter for VTH-stress effect")
`MPRnb(STETAO ,0.0 ,"m" ,"Eta0 shift factor related to VTHO change")
`MPRcz(LODETAO ,1.0 ,"" ,"Eta0 shift modification factor for stress effect")
// Well proximity effect parameters
`MPRoz(SCREF ,1.0e-6 ,"m" ,"Distance between OD-edge and well edge of a reference device")
`MPRnb(WEB ,0.0 ,"" ,"Coefficient for SCB")
`MPRnb(WEC ,0.0 ,"" ,"Coefficient for SCC")
// --------------------------------------------------------------------------------------------------------------
// Other Parameters
// --------------------------------------------------------------------------------------------------------------
`MPRnb(DTA ,0.0 ,"K" ,"Temperature offset w.r.t. ambient temperature")

View File

@ -1,850 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: PSP103_scaling.include
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 103.8.0 (PSP), 200.6.1 (JUNCAP), July 2020
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
// ******************************* Transistor geometry *******************************
iL = `LEN / L_i;
iW = `WEN / W_i;
delLPS = LVARO * (1.0 + LVARL * iL) * (1.0 + LVARW * iW);
delWOD = WVARO * (1.0 + WVARL * iL) * (1.0 + WVARW * iW);
if (SWGEO == 2) begin
delLPS = LVARO * (1.0 + LVARL * iL);
delWOD = WVARO * (1.0 + WVARW * iW);
end
LE = `CLIP_LOW(L_i + delLPS - 2.0 * LAP, 1.0e-9);
WE = `CLIP_LOW(W_i + delWOD - 2.0 * WOT, 1.0e-9);
LEcv = `CLIP_LOW(L_i + delLPS - 2.0 * LAP + DLQ, 1.0e-9);
WEcv = `CLIP_LOW(W_i + delWOD - 2.0 * WOT + DWQ, 1.0e-9);
Lcv = `CLIP_LOW(L_i + delLPS + DLQ, 1.0e-9);
Wcv = `CLIP_LOW(W_i + delWOD + DWQ, 1.0e-9);
iLE = `LEN / LE;
iWE = `WEN / WE;
// ******************************* Geometry for multi-finger devices *******************************
L_f = `CLIP_LOW(L_i + delLPS, 1.0e-9);
L_slif = `CLIP_LOW(L_f + DLSIL, 1.0e-9);
W_f = `CLIP_LOW(W_i + delWOD, 1.0e-9);
XGWE = `CLIP_LOW(XGW_i - 0.5 * delWOD, 1.0e-9);
// ******************************* Local model parameters *******************************
// Process parameters
VFB_p = VFB;
STVFB_p = STVFB;
ST2VFB_p = ST2VFB;
TOX_p = TOX;
EPSROX_p = EPSROX;
NEFF_p = NEFF;
FACNEFFAC_p = FACNEFFAC;
GFACNUD_p = GFACNUD;
VSBNUD_p = VSBNUD;
DVSBNUD_p = DVSBNUD;
VNSUB_p = VNSUB;
NSLP_p = NSLP;
DNSUB_p = DNSUB;
DPHIB_p = DPHIB;
DELVTAC_p = DELVTAC;
NP_p = NP;
TOXOV_p = TOXOV;
TOXOVD_p = TOXOVD;
NOV_p = NOV;
NOVD_p = NOVD;
// Interface states parameters
CT_p = CT;
CTG_p = CTG;
CTB_p = CTB;
STCT_p = STCT;
// Subthreshold slope parameters of short channel transistor
PSCE_p = PSCE;
PSCED_p = PSCED;
PSCEB_p = PSCEB;
// DIBL parameters
CF_p = CF;
`DefACparam(CFAC_p, CF, CFAC)
CFD_p = CFD;
CFB_p = CFB;
// Mobility parameters
BETN_p = BETN;
STBET_p = STBET;
MUE_p = MUE;
STMUE_p = STMUE;
THEMU_p = THEMU;
STTHEMU_p = STTHEMU;
CS_p = CS;
STCS_p = STCS;
THECS_p = THECS;
STTHECS_p = STTHECS;
XCOR_p = XCOR;
STXCOR_p = STXCOR;
FETA_p = FETA;
// Intrinsic series resistance parameters
RS_p = RS;
STRS_p = STRS;
RSB_p = RSB;
RSG_p = RSG;
// Saturation voltage parameters
THESAT_p = THESAT;
`DefACparam(THESATAC_p, THESAT, THESATAC)
STTHESAT_p = STTHESAT;
THESATB_p = THESATB;
THESATG_p = THESATG;
// Saturation voltage parameters
AX_p = AX;
`DefACparam(AXAC_p, AX, AXAC)
// Channel length modulation parameters
ALP_p = ALP;
`DefACparam(ALPAC_p, ALP, ALPAC)
ALP1_p = ALP1;
ALP2_p = ALP2;
VP_p = VP;
// Impact ionization parameters
A1_p = A1;
A2_p = A2;
STA2_p = STA2;
A3_p = A3;
A4_p = A4;
// Gate current parameters
GCO_p = GCO;
IGINV_p = IGINV;
IGOV_p = IGOV;
IGOVD_p = IGOVD;
STIG_p = STIG;
GC2_p = GC2;
GC3_p = GC3;
GC2OV_p = GC2OV;
GC3OV_p = GC3OV;
CHIB_p = CHIB;
// Gate-induced drain leakage parameters
AGIDL_p = AGIDL;
AGIDLD_p = AGIDLD;
BGIDL_p = BGIDL;
BGIDLD_p = BGIDLD;
STBGIDL_p = STBGIDL;
STBGIDLD_p = STBGIDLD;
CGIDL_p = CGIDL;
CGIDLD_p = CGIDLD;
// Charge model parameters
COX_p = COX;
CGOV_p = CGOV;
CGOVD_p = CGOVD;
FCGOVACC_p = FCGOVACC;
FCGOVACCD_p = FCGOVACCD;
CGOVACCG_p = CGOVACCG;
CGBOV_p = CGBOV;
CINR_p = CINR;
CINRD_p = CINRD;
DVFBINR_p = DVFBINR;
FCINRDEP_p = FCINRDEP;
FCINRACC_p = FCINRACC;
AXINR_p = AXINR;
CFR_p = CFR;
CFRD_p = CFRD;
// Noise model parameters
FNT_p = FNT;
FNTEXC_p = FNTEXC;
NFA_p = NFA;
NFB_p = NFB;
NFC_p = NFC;
EF_p = EF;
// Edge transistor parameters
VFBEDGE_p = VFBEDGE;
STVFBEDGE_p = STVFBEDGE;
DPHIBEDGE_p = DPHIBEDGE;
NEFFEDGE_p = NEFFEDGE;
CTEDGE_p = CTEDGE;
BETNEDGE_p = BETNEDGE;
STBETEDGE_p = STBETEDGE;
PSCEEDGE_p = PSCEEDGE;
PSCEBEDGE_p = PSCEBEDGE;
PSCEDEDGE_p = PSCEDEDGE;
CFEDGE_p = CFEDGE;
CFDEDGE_p = CFDEDGE;
CFBEDGE_p = CFBEDGE;
FNTEDGE_p = FNTEDGE;
NFAEDGE_p = NFAEDGE;
NFBEDGE_p = NFBEDGE;
NFCEDGE_p = NFCEDGE;
EFEDGE_p = EFEDGE;
// Parasitic resistance parameters
RG_p = RG;
RSE_p = RSE;
RDE_p = RDE;
RWELL_p = RWELL;
RBULK_p = RBULK;
RJUNS_p = RJUNS;
RJUND_p = RJUND;
// SHE parameters
`ifdef SelfHeating
RTH_p = RTH;
CTH_p = CTH;
STRTH_p = STRTH;
`endif // SelfHeating
// NQS parameters
`ifdef NQSmodel
MUNQS_p = MUNQS;
`endif // NQSmodel
// ******************************* Global model parameters ******************************
if (SWGEO == 1) begin
// Process parameters
VFB_p = VFBO + VFBL * iLE + VFBW * iWE + VFBLW * iLE * iWE;
STVFB_p = STVFBO + STVFBL * iLE + STVFBW * iWE + STVFBLW * iLE * iWE;
ST2VFB_p = ST2VFBO;
TOX_p = TOXO;
EPSROX_p = EPSROXO;
NSUB0e = NSUBO * `MAX(( 1.0 + NSUBW * iWE * ln( 1.0 + WE / WSEG )), 1.0e-03);
NPCKe = NPCK * `MAX(( 1.0 + NPCKW * iWE * ln( 1.0 + WE / WSEGP )), 1.0e-03);
LPCKe = LPCK * `MAX(( 1.0 + LPCKW * iWE * ln( 1.0 + WE / WSEGP )), 1.0e-03);
if (LE > (2.0 * LPCKe)) begin
AA = 7.5e10;
BB = sqrt(NSUB0e + 0.5 * NPCKe) - sqrt(NSUB0e);
NSUB = sqrt(NSUB0e) + AA * ln(1.0 + 2.0 * LPCKe / LE * (exp(BB / AA) - 1.0));
NSUB = NSUB * NSUB;
end else begin
if (LE >= LPCKe) begin
NSUB = NSUB0e + NPCKe * LPCKe / LE;
end else begin // LE < LPCK
NSUB = NSUB0e + NPCKe * (2.0 - LE / LPCKe);
end
end
NEFF_p = NSUB * (1.0 - FOL1 * iLE - FOL2 * iLE * iLE);
FACNEFFAC_p = FACNEFFACO + FACNEFFACL * iLE + FACNEFFACW * iWE + FACNEFFACLW * iLE * iWE;
GFACNUD_p = GFACNUDO + GFACNUDL * pow(iLE, GFACNUDLEXP) + GFACNUDW * iWE + GFACNUDLW * iLE * iWE;
VSBNUD_p = VSBNUDO;
DVSBNUD_p = DVSBNUDO;
VNSUB_p = VNSUBO;
NSLP_p = NSLPO;
DNSUB_p = DNSUBO;
DPHIB_p = DPHIBO + DPHIBL * pow(iLE, DPHIBLEXP) + DPHIBW * iWE + DPHIBLW * iLE * iWE;
DELVTAC_p = DELVTACO + DELVTACL * pow(iLE, DELVTACLEXP) + DELVTACW * iWE + DELVTACLW * iLE * iWE;
NP_p = NPO * `MAX(1.0e-6, (1.0 + NPL * iLE));
TOXOV_p = TOXOVO;
TOXOVD_p = TOXOVDO;
NOV_p = NOVO;
NOVD_p = NOVDO;
// Interface states parameters
CT_p = (CTO + CTL * pow(iLE, CTLEXP)) * (1.0 + CTW * iWE) * (1.0 + CTLW * iLE * iWE);
CTG_p = CTGO;
CTB_p = CTBO;
STCT_p = STCTO;
// DIBL parameters
CF_p = CFL * pow(iLE, CFLEXP) * (1.0 + CFW * iWE);
CFAC_p = CFACL_i * pow(iLE, CFACLEXP_i) * (1.0 + CFACW_i * iWE);
CFD_p = CFDO;
CFB_p = CFBO;
// Subthreshold slope parameters of short channel transistor
PSCE_p = PSCEL * pow(iLE, PSCELEXP) * (1.0 + PSCEW * iWE);
PSCED_p = PSCEDO;
PSCEB_p = PSCEBO;
// Mobility parameters
FBET1e = FBET1 * (1.0 + FBET1W * iWE);
LP1e = LP1 * `MAX(1.0 + LP1W * iWE, 1.0e-03);
GPE = 1.0 + FBET1e * LP1e / LE * (1.0 - exp(-LE / LP1e)) + FBET2 * LP2 / LE * (1.0 - exp(-LE / LP2));
GPE = `MAX(GPE, 1.0e-15);
GWE = 1.0 + BETW1 * iWE + BETW2 * iWE * ln(1.0 + WE / WBET);
BETN_p = UO * WE / (GPE * LE) * GWE;
STBET_p = STBETO + STBETL * iLE + STBETW * iWE + STBETLW * iLE * iWE;
MUE_p = MUEO * (1.0 + MUEW * iWE);
STMUE_p = STMUEO;
THEMU_p = THEMUO;
STTHEMU_p = STTHEMUO;
CS_p = (CSO + CSL * pow(iLE, CSLEXP)) * (1.0 + CSW * iWE) * (1.0 + CSLW * iLE * iWE);
STCS_p = STCSO;
THECS_p = THECSO;
STTHECS_p = STTHECSO;
XCOR_p = XCORO * (1.0 + XCORL * iLE) * (1.0 + XCORW * iWE) * (1.0 + XCORLW * iLE * iWE);
STXCOR_p = STXCORO;
FETA_p = FETAO;
// Intrinsic series resistance parameters
RS_p = RSW1 * iWE * (1.0 + RSW2 * iWE);
STRS_p = STRSO;
RSB_p = RSBO;
RSG_p = RSGO;
// Velocity saturation parameters
THESAT_p = (THESATO + THESATL * GWE / GPE * pow(iLE, THESATLEXP)) * (1.0 + THESATW * iWE) * (1.0 + THESATLW * iLE * iWE);
THESATAC_p = (THESATACO_i + THESATACL_i * GWE / GPE * pow(iLE, THESATACLEXP_i)) * (1.0 + THESATACW_i * iWE) * (1.0 + THESATACLW_i * iLE * iWE);
STTHESAT_p = STTHESATO + STTHESATL * iLE + STTHESATW * iWE + STTHESATLW * iLE * iWE;
THESATB_p = THESATBO;
THESATG_p = THESATGO;
// Saturation voltage parameters
AX_p = AXO / (1.0 + AXL * iLE);
AXAC_p = AXACO_i / (1.0 + AXACL_i * iLE);
// Channel length modulation parameters
ALP_p = ALPL * pow(iLE, ALPLEXP) * (1.0 + ALPW * iWE);
ALPAC_p = ALPACL_i * pow(iLE, ALPACLEXP_i) * (1.0 + ALPACW_i * iWE);
tmpx = pow(iLE, ALP1LEXP);
ALP1_p = ALP1L1 * tmpx * (1.0 + ALP1W * iWE) / (1.0 + ALP1L2 * iLE * tmpx);
tmpx = pow(iLE, ALP2LEXP);
ALP2_p = ALP2L1 * tmpx * (1.0 + ALP2W * iWE) / (1.0 + ALP2L2 * iLE * tmpx);
VP_p = VPO;
// Impact ionization parameters
A1_p = A1O * (1.0 + A1L * iLE) * (1.0 + A1W * iWE);
A2_p = A2O;
STA2_p = STA2O;
A3_p = A3O * (1.0 + A3L * iLE) * (1.0 + A3W * iWE);
A4_p = A4O * (1.0 + A4L * iLE) * (1.0 + A4W * iWE);
// Gate current parameters
GCO_p = GCOO;
IGINV_p = IGINVLW / (iWE * iLE);
IGOV_p = IGOVW * LOV / (`LEN * iWE);
IGOVD_p = IGOVDW * LOVD / (`LEN * iWE);
STIG_p = STIGO;
GC2_p = GC2O;
GC3_p = GC3O;
GC2OV_p = GC2OVO;
GC3OV_p = GC3OVO;
CHIB_p = CHIBO;
// Gate-induced drain leakage parameters
AGIDL_p = AGIDLW * LOV / (`LEN * iWE);
AGIDLD_p = AGIDLDW * LOVD / (`LEN * iWE);
BGIDL_p = BGIDLO;
BGIDLD_p = BGIDLDO;
STBGIDL_p = STBGIDLO;
STBGIDLD_p = STBGIDLDO;
CGIDL_p = CGIDLO;
CGIDLD_p = CGIDLDO;
// Charge model parameters
COX_p = `EPSO * EPSROXO * WEcv * LEcv / TOXO;
CGOV_p = `EPSO * EPSROXO * WEcv * LOV / TOXOVO;
CGOVD_p = `EPSO * EPSROXO * WEcv * LOVD / TOXOVDO;
FCGOVACC_p = FCGOVACCO;
FCGOVACCD_p = FCGOVACCDO;
CGOVACCG_p = CGOVACCGO;
CGBOV_p = CGBOVL * Lcv / `LEN;
CINR_p = CINRW * Wcv / `WEN;
CINRD_p = CINRDW * Wcv / `WEN;
DVFBINR_p = DVFBINRO;
FCINRDEP_p = FCINRDEPO;
FCINRACC_p = FCINRACCO;
AXINR_p = AXINRO;
CFR_p = CFRW * Wcv / `WEN;
CFRD_p = CFRDW * Wcv / `WEN;
// Noise model parameters
temp0 = 1.0 - 2.0 * LINTNOI * iLE / `LEN;
Lnoi = `MAX(temp0, 1.0e-3);
Lred = 1.0 / pow(Lnoi, ALPNOI);
FNT_p = FNTO;
FNTEXC_p = FNTEXCL * BETN_p * BETN_p * iWE * iWE;
NFA_p = Lred * iWE * iLE * NFALW;
NFB_p = Lred * iWE * iLE * NFBLW;
NFC_p = Lred * iWE * iLE * NFCLW;
EF_p = EFO;
// Edge transistors parameters
WE_edge = 2.0 * WEDGE + WEDGEW * WE;
iWE_edge = `WEN / WE_edge;
VFBEDGE_p = VFBEDGEO;
STVFBEDGE_p = STVFBEDGEO + STVFBEDGEL * iLE + STVFBEDGEW * iWE + STVFBEDGELW * iLE * iWE;
DPHIBEDGE_p = DPHIBEDGEO + DPHIBEDGEL * pow(iLE, DPHIBEDGELEXP) + DPHIBEDGEW * iWE + DPHIBEDGELW * iLE * iWE;
NEFFEDGE_p = NSUBEDGEO * (1.0 + NSUBEDGEL * pow(iLE, NSUBEDGELEXP)) * ( 1.0 + NSUBEDGEW * iWE) * ( 1.0 + NSUBEDGELW * iLE * iWE);
CTEDGE_p = CTEDGEO + CTEDGEL * pow(iLE, CTEDGELEXP);
GPE_edge = 1.0 + FBETEDGE * LPEDGE / LE * (1.0 - exp(-LE / LPEDGE));
GPE_edge = `MAX(GPE_edge, 1.0e-15);
BETNEDGE_p = UO * WE_edge / (GPE_edge * LE) * (1.0 + BETEDGEW * iWE);
STBETEDGE_p = STBETEDGEO + STBETEDGEL * iLE + STBETEDGEW * iWE + STBETEDGELW * iLE * iWE;
PSCEEDGE_p = PSCEEDGEL * pow(iLE, PSCEEDGELEXP) * (1.0 + PSCEEDGEW * iWE);
PSCEBEDGE_p = PSCEBEDGEO;
PSCEDEDGE_p = PSCEDEDGEO;
CFEDGE_p = CFEDGEL * pow(iLE, CFEDGELEXP) * (1.0 + CFEDGEW * iWE);
CFDEDGE_p = CFDEDGEO;
CFBEDGE_p = CFBEDGEO;
FNTEDGE_p = FNTEDGEO;
NFAEDGE_p = iWE_edge * iLE * NFAEDGELW;
NFBEDGE_p = iWE_edge * iLE * NFBEDGELW;
NFCEDGE_p = iWE_edge * iLE * NFCEDGELW;
EFEDGE_p = EFEDGEO;
end
// Well proximity effect parameters
KVTHOWE = KVTHOWEO + KVTHOWEL * iLE + KVTHOWEW * iWE + KVTHOWELW * iLE * iWE;
KUOWE = KUOWEO + KUOWEL * iLE + KUOWEW * iWE + KUOWELW * iLE * iWE;
// ****************************** Binning model parameters ******************************
if (SWGEO == 2) begin
// Auxiliary variables
iLEWE = iLE * iWE;
iiLE = LE / `LEN;
iiWE = WE / `WEN;
iiLEWE = iiLE * iiWE;
iiiLEWE = iiWE / iiLE;
// Auxiliary variables for COX only
iiLEcv = LEcv / `LEN;
iiWEcv = WEcv / `WEN;
iiLEWEcv = iiLEcv * iiWEcv;
// Auxiliary variables for CGOV only
iLEcv = `LEN / LEcv;
iiiLEWEcv = iiWEcv / iiLEcv;
// Auxiliary variables for CGBOV only
iiLcv = Lcv / `LEN;
iiWcv = Wcv / `WEN;
iiLWcv = iiLcv * iiWcv;
// Auxiliary variables for CFR only
iLcv = `LEN / Lcv;
iiiLWcv = iiWcv / iiLcv;
// Process parameters
VFB_p = POVFB + iLE * PLVFB + iWE * PWVFB + iLEWE * PLWVFB;
STVFB_p = POSTVFB + iLE * PLSTVFB + iWE * PWSTVFB + iLEWE * PLWSTVFB;
ST2VFB_p = POST2VFB;
TOX_p = POTOX;
EPSROX_p = POEPSROX;
NEFF_p = PONEFF + iLE * PLNEFF + iWE * PWNEFF + iLEWE * PLWNEFF;
FACNEFFAC_p = POFACNEFFAC + iLE * PLFACNEFFAC + iWE * PWFACNEFFAC + iLEWE * PLWFACNEFFAC;
GFACNUD_p = POGFACNUD + PLGFACNUD * iLE + PWGFACNUD * iWE + PLWGFACNUD * iLE * iWE;
VSBNUD_p = POVSBNUD;
DVSBNUD_p = PODVSBNUD;
VNSUB_p = POVNSUB;
NSLP_p = PONSLP;
DNSUB_p = PODNSUB;
DPHIB_p = PODPHIB + iLE * PLDPHIB + iWE * PWDPHIB + iLEWE * PLWDPHIB;
DELVTAC_p = PODELVTAC + iLE * PLDELVTAC + iWE * PWDELVTAC + iLEWE * PLWDELVTAC;
NP_p = PONP + iLE * PLNP + iWE * PWNP + iLEWE * PLWNP;
TOXOV_p = POTOXOV;
TOXOVD_p = POTOXOVD;
NOV_p = PONOV + iLE * PLNOV + iWE * PWNOV + iLEWE * PLWNOV;
NOVD_p = PONOVD + iLE * PLNOVD + iWE * PWNOVD + iLEWE * PLWNOVD;
// Interface states parameters
CT_p = POCT + iLE * PLCT + iWE * PWCT + iLEWE * PLWCT;
CTG_p = POCTG;
CTB_p = POCTB;
STCT_p = POSTCT;
// DIBL parameters
CF_p = POCF + iLE * PLCF + iWE * PWCF + iLEWE * PLWCF;
CFAC_p = POCFAC_i + iLE * PLCFAC_i + iWE * PWCFAC_i + iLEWE * PLWCFAC_i;
CFD_p = POCFD;
CFB_p = POCFB;
// Subthreshold slope parameters of short channel transistor
PSCE_p = POPSCE + iLE * PLPSCE + iWE * PWPSCE + iLEWE * PLWPSCE;
PSCEB_p = POPSCEB;
PSCED_p = POPSCED;
// Mobility parameters
BETN_p = iiWE * iLE * (POBETN + iLE * PLBETN + iWE * PWBETN + iLEWE * PLWBETN);
STBET_p = POSTBET + iLE * PLSTBET + iWE * PWSTBET + iLEWE * PLWSTBET;
MUE_p = POMUE + iLE * PLMUE + iWE * PWMUE + iLEWE * PLWMUE;
STMUE_p = POSTMUE;
THEMU_p = POTHEMU;
STTHEMU_p = POSTTHEMU;
CS_p = POCS + iLE * PLCS + iWE * PWCS + iLEWE * PLWCS;
STCS_p = POSTCS;
THECS_p = POTHECS;
STTHECS_p = POSTTHECS;
XCOR_p = POXCOR + iLE * PLXCOR + iWE * PWXCOR + iLEWE * PLWXCOR;
STXCOR_p = POSTXCOR;
FETA_p = POFETA;
// Intrinsic series resistance parameters
RS_p = PORS + iLE * PLRS + iWE * PWRS + iLEWE * PLWRS;
STRS_p = POSTRS;
RSB_p = PORSB;
RSG_p = PORSG;
// Velocity saturation parameters
THESAT_p = POTHESAT + iLE * PLTHESAT + iWE * PWTHESAT + iLEWE * PLWTHESAT;
THESATAC_p = POTHESATAC_i + iLE * PLTHESATAC_i + iWE * PWTHESATAC_i + iLEWE * PLWTHESATAC_i;
STTHESAT_p = POSTTHESAT + iLE * PLSTTHESAT + iWE * PWSTTHESAT + iLEWE * PLWSTTHESAT;
THESATB_p = POTHESATB + iLE * PLTHESATB + iWE * PWTHESATB + iLEWE * PLWTHESATB;
THESATG_p = POTHESATG + iLE * PLTHESATG + iWE * PWTHESATG + iLEWE * PLWTHESATG;
// Saturation voltage parameters
AX_p = POAX + iLE * PLAX + iWE * PWAX + iLEWE * PLWAX;
AXAC_p = POAXAC_i + iLE * PLAXAC_i + iWE * PWAXAC_i + iLEWE * PLWAXAC_i;
// Channel length modulation parameters
ALP_p = POALP + iLE * PLALP + iWE * PWALP + iLEWE * PLWALP;
ALPAC_p = POALPAC_i + iLE * PLALPAC_i + iWE * PWALPAC_i + iLEWE * PLWALPAC_i;
ALP1_p = POALP1 + iLE * PLALP1 + iWE * PWALP1 + iLEWE * PLWALP1;
ALP2_p = POALP2 + iLE * PLALP2 + iWE * PWALP2 + iLEWE * PLWALP2;
VP_p = POVP;
// Impact ionization parameters
A1_p = POA1 + iLE * PLA1 + iWE * PWA1 + iLEWE * PLWA1;
A2_p = POA2;
STA2_p = POSTA2;
A3_p = POA3 + iLE * PLA3 + iWE * PWA3 + iLEWE * PLWA3;
A4_p = POA4 + iLE * PLA4 + iWE * PWA4 + iLEWE * PLWA4;
GCO_p = POGCO;
// Gate current parameters
IGINV_p = POIGINV + iiLE * PLIGINV + iiWE * PWIGINV + iiLEWE * PLWIGINV;
IGOV_p = POIGOV + iLE * PLIGOV + iiWE * PWIGOV + iiiLEWE * PLWIGOV;
IGOVD_p = POIGOVD + iLE * PLIGOVD + iiWE * PWIGOVD + iiiLEWE * PLWIGOVD;
STIG_p = POSTIG;
GC2_p = POGC2;
GC3_p = POGC3;
GC2OV_p = POGC2OV;
GC3OV_p = POGC3OV;
CHIB_p = POCHIB;
// Gate-induced drain leakage parameters
AGIDL_p = POAGIDL + iLE * PLAGIDL + iiWE * PWAGIDL + iiiLEWE * PLWAGIDL;
AGIDLD_p = POAGIDLD + iLE * PLAGIDLD + iiWE * PWAGIDLD + iiiLEWE * PLWAGIDLD;
BGIDL_p = POBGIDL;
BGIDLD_p = POBGIDLD;
STBGIDL_p = POSTBGIDL;
STBGIDLD_p = POSTBGIDLD;
CGIDL_p = POCGIDL;
CGIDLD_p = POCGIDLD;
// Charge model parameters
COX_p = POCOX + iiLEcv * PLCOX + iiWEcv * PWCOX + iiLEWEcv * PLWCOX;
CGOV_p = POCGOV + iLEcv * PLCGOV + iiWEcv * PWCGOV + iiiLEWEcv * PLWCGOV;
CGOVD_p = POCGOVD + iLEcv * PLCGOVD + iiWEcv * PWCGOVD + iiiLEWEcv * PLWCGOVD;
FCGOVACC_p = POFCGOVACC;
FCGOVACCD_p = POFCGOVACCD;
CGOVACCG_p = POCGOVACCG;
CGBOV_p = POCGBOV + iiLcv * PLCGBOV + iiWcv * PWCGBOV + iiLWcv * PLWCGBOV;
CINR_p = POCINR + iLcv * PLCINR + iiWcv * PWCINR + iiiLWcv * PLWCINR;
CINRD_p = POCINRD + iLcv * PLCINRD + iiWcv * PWCINRD + iiiLWcv * PLWCINRD;
DVFBINR_p = PODVFBINR;
FCINRDEP_p = POFCINRDEP;
FCINRACC_p = POFCINRACC;
AXINR_p = POAXINR;
CFR_p = POCFR + iLcv * PLCFR + iiWcv * PWCFR + iiiLWcv * PLWCFR;
CFRD_p = POCFRD + iLcv * PLCFRD + iiWcv * PWCFRD + iiiLWcv * PLWCFRD;
// Noise model parameters
FNT_p = POFNT;
FNTEXC_p = iLE * iLE * (POFNTEXC + iLE * PLFNTEXC + iWE * PWFNTEXC + iLEWE * PLWFNTEXC);
NFA_p = PONFA + iLE * PLNFA + iWE * PWNFA + iLEWE * PLWNFA;
NFB_p = PONFB + iLE * PLNFB + iWE * PWNFB + iLEWE * PLWNFB;
NFC_p = PONFC + iLE * PLNFC + iWE * PWNFC + iLEWE * PLWNFC;
EF_p = POEF;
// Edge transistor parameters
VFBEDGE_p = POVFBEDGE;
STVFBEDGE_p = POSTVFBEDGE + iLE * PLSTVFBEDGE + iWE * PWSTVFBEDGE + iLEWE * PLWSTVFBEDGE;
DPHIBEDGE_p = PODPHIBEDGE + iLE * PLDPHIBEDGE + iWE * PWDPHIBEDGE + iLEWE * PLWDPHIBEDGE;
NEFFEDGE_p = PONEFFEDGE + iLE * PLNEFFEDGE + iWE * PWNEFFEDGE + iLEWE * PLWNEFFEDGE;
CTEDGE_p = POCTEDGE + iLE * PLCTEDGE + iWE * PWCTEDGE + iLEWE * PLWCTEDGE;
BETNEDGE_p = iLE * (POBETNEDGE + iLE * PLBETNEDGE + iWE * PWBETNEDGE + iLEWE * PLWBETNEDGE);
STBETEDGE_p = POSTBETEDGE + iLE * PLSTBETEDGE + iWE * PWSTBETEDGE + iLEWE * PLWSTBETEDGE;
PSCEEDGE_p = POPSCEEDGE + iLE * PLPSCEEDGE + iWE * PWPSCEEDGE + iLEWE * PLWPSCEEDGE;
PSCEBEDGE_p = POPSCEBEDGE;
PSCEDEDGE_p = POPSCEDEDGE;
CFEDGE_p = POCFEDGE + iLE * PLCFEDGE + iWE * PWCFEDGE + iLEWE * PLWCFEDGE;
CFDEDGE_p = POCFDEDGE;
CFBEDGE_p = POCFBEDGE;
FNTEDGE_p = POFNTEDGE;
NFAEDGE_p = PONFAEDGE + iLE * PLNFAEDGE + iWE * PWNFAEDGE + iLEWE * PLWNFAEDGE;
NFBEDGE_p = PONFBEDGE + iLE * PLNFBEDGE + iWE * PWNFBEDGE + iLEWE * PLWNFBEDGE;
NFCEDGE_p = PONFCEDGE + iLE * PLNFCEDGE + iWE * PWNFCEDGE + iLEWE * PLWNFCEDGE;
EFEDGE_p = POEFEDGE;
// Well proximity effect parameters
KVTHOWE = POKVTHOWE + iLE * PLKVTHOWE + iWE * PWKVTHOWE + iLEWE * PLWKVTHOWE;
KUOWE = POKUOWE + iLE * PLKUOWE + iWE * PWKUOWE + iLEWE * PLWKUOWE;
end
if ((SWGEO == 1) || (SWGEO == 2)) begin
// Parasitic resistance parameters
RG_p = RSHG * (`oneThird * W_f / NGCON_i + XGWE) / (NGCON_i * L_slif) + (RINT + RVPOLY) / (W_f * L_f) + NF_i * RGO;
RSH_i = `CLIP_LOW(RSH, 0.0);
RSHD_i = `CLIP_LOW(RSHD, 0.0);
if (SWJUNASYM == 0) begin
RSHD_i = RSH_i;
end
RSE_p = NRS * RSH_i;
RDE_p = NRD * RSHD_i;
RWELL_p = NF_i * RWELLO;
RBULK_p = NF_i * RBULKO;
RJUNS_p = NF_i * RJUNSO;
RJUND_p = NF_i * RJUNDO;
// Self heating effect parameters
`ifdef SelfHeating
deltaRth = RTHW2 + WE / `WEN * (1.0 + RTHLW * LE / `LEN);
deltaRth = `MAX(deltaRth, 1.0e-6);
RTH_p = RTHO + RTHW1 / deltaRth;
CTH_p = CTHO + CTHW1 * (CTHW2 + WE / `WEN * (1.0 + CTHLW * LE / `LEN));
STRTH_p = STRTHO;
`endif // SelfHeating
// NQS parameters
`ifdef NQSmodel
MUNQS_p = MUNQSO;
`endif // NQSmodel
// Mechanical stress model
tmpa = 0.0;
tmpb = 0.0;
loop = 0.0;
if ((SA_i > 0.0) && (SB_i > 0.0) && ((NF_i == 1.0) || ((NF_i > 1.0) && (SD_i > 0.0)))) begin
while (loop < (NF_i - 0.5)) begin
tmpa = tmpa + 1.0 / (SA_i + 0.5 * L_i + loop * (SD_i + L_i));
tmpb = tmpb + 1.0 / (SB_i + 0.5 * L_i + loop * (SD_i + L_i));
loop = loop + 1.0;
end
Invsa = tmpa * invNF;
Invsb = tmpb * invNF;
Invsaref = 1.0 / (SAREF + 0.5 * L_i);
Invsbref = 1.0 / (SBREF + 0.5 * L_i);
Lx = `MAX(L_i + delLPS, 1.0e-9);
Wx = `MAX(W_i + delWOD + WLOD, 1.0e-9);
templ = 1.0 / pow(Lx, LLODKUO);
tempw = 1.0 / pow(Wx, WLODKUO);
Kstressu0 = (1.0 + LKUO * templ + WKUO * tempw + PKUO * templ * tempw) * (1.0 + TKUO * (rTa - 1.0));
rhobeta = KUO * (Invsa + Invsb) / Kstressu0;
rhobetaref = KUO * (Invsaref + Invsbref) / Kstressu0;
templ = 1.0 / pow(Lx, LLODVTH);
tempw = 1.0 / pow(Wx, WLODVTH);
Kstressvth0 = 1.0 + LKVTHO * templ + WKVTHO * tempw + PKVTHO * templ * tempw;
temp0 = Invsa + Invsb - Invsaref - Invsbref;
// Parameter adaptations
temp00 = (1.0 + rhobeta) / (1.0 + rhobetaref);
BETN_p = BETN_p * temp00;
THESAT_p = THESAT_p * temp00 * (1.0 + KVSAT * rhobetaref) / (1.0 + KVSAT * rhobeta);
THESATAC_p = THESATAC_p * temp00 * (1.0 + KVSATAC_i * rhobetaref) / (1.0 + KVSATAC_i * rhobeta);
BETNEDGE_p = BETNEDGE_p * temp00;
temp00 = KVTHO * temp0 / Kstressvth0;
VFB_p = VFB_p + temp00;
VFBEDGE_p = VFBEDGE_p + temp00;
temp00 = STETAO * temp0 / pow(Kstressvth0, LODETAO);
CF_p = CF_p + temp00;
CFAC_p = CFAC_p + temp00;
CFEDGE_p = CFEDGE_p + temp00;
end
// Well proximity effect equations
if ((SCA_i > 0.0) || (SCB_i > 0.0) || (SCC_i > 0.0) || (SC_i > 0.0)) begin
if ((SCA_i == 0.0) && (SCB_i == 0.0) && (SCC_i == 0.0)) begin
temp0 = SC_i + W_i;
temp00 = 1.0 / SCREF;
SCA_i = SCREF * SCREF / (SC_i * temp0);
SCB_i = ((0.1 * SC_i + 0.01 * SCREF) * exp(-10.0 * SC_i * temp00) - (0.1 * temp0 + 0.01 * SCREF) * exp(-10.0 * temp0 * temp00)) / W_i;
SCC_i = ((0.05 * SC_i + 0.0025 * SCREF) * exp(-20.0 * SC_i * temp00) - (0.05 * temp0 + 0.0025 * SCREF) * exp(-20.0 * temp0 * temp00)) / W_i;
end
// Parameter adaptations
temp0 = SCA_i + WEB * SCB_i + WEC * SCC_i;
VFB_p = VFB_p + KVTHOWE * temp0;
BETN_p = BETN_p * (1.0 + KUOWE * temp0);
VFBEDGE_p = VFBEDGE_p + KVTHOWE * temp0;
BETNEDGE_p = BETNEDGE_p * (1.0 + KUOWE * temp0);
end
end
// ******************************* Internal parameters (including temperature scaling) *******************************
VFB_i = VFB_p;
STVFB_i = STVFB_p;
ST2VFB_i = ST2VFB_p;
TOX_i = `CLIP_LOW(TOX_p, 1.0e-10);
EPSROX_i = `CLIP_LOW(EPSROX_p, 1.0);
NEFF_i = `CLIP_BOTH(NEFF_p, 1.0e20, 1.0e26);
FACNEFFAC_i = `CLIP_LOW(FACNEFFAC_p, 0.0);
GFACNUD_i = `CLIP_LOW(GFACNUD_p, 0.01);
VSBNUD_i = `CLIP_LOW(VSBNUD_p, 0.0);
DVSBNUD_i = `CLIP_LOW(DVSBNUD_p, 0.1);
VNSUB_i = VNSUB_p;
NSLP_i = `CLIP_LOW(NSLP_p, 1.0e-3);
DNSUB_i = `CLIP_BOTH(DNSUB_p, 0.0, 1.0);
DPHIB_i = DPHIB_p;
DELVTAC_i = DELVTAC_p;
NP_i = `CLIP_LOW(NP_p, 0.0);
TOXOV_i = `CLIP_LOW(TOXOV_p, 1.0e-10);
TOXOVD_i = `CLIP_LOW(TOXOVD_p, 1.0e-10);
NOV_i = `CLIP_BOTH(NOV_p, 1.0e23, 1.0e27);
NOVD_i = `CLIP_BOTH(NOVD_p, 1.0e23, 1.0e27);
CT_i = `CLIP_LOW(CT_p, 0.0);
CTG_i = `CLIP_LOW(CTG_p, 0.0);
CTB_i = CTB_p;
STCT_i = STCT_p;
CF_i = `CLIP_LOW(CF_p, 0.0);
CFAC_i = `CLIP_LOW(CFAC_p, 0.0);
CFD_i = `CLIP_LOW(CFD_p, 0.0);
CFB_i = `CLIP_BOTH(CFB_p, 0.0, 1.0);
PSCE_i = `CLIP_LOW(PSCE_p, 0.0);
PSCEB_i = `CLIP_BOTH(PSCEB_p, 0.0, 1.0);
PSCED_i = `CLIP_LOW(PSCED_p, 0.0);
BETN_i = `CLIP_LOW(BETN_p, 0.0);
STBET_i = STBET_p;
MUE_i = `CLIP_LOW(MUE_p, 0.0);
STMUE_i = STMUE_p;
THEMU_i = `CLIP_LOW(THEMU_p, 0.0);
STTHEMU_i = STTHEMU_p;
CS_i = `CLIP_LOW(CS_p, 0.0);
STCS_i = STCS_p;
THECS_i = `CLIP_LOW(THECS_p, 0.0);
STTHECS_i = STTHECS_p;
XCOR_i = `CLIP_LOW(XCOR_p, 0.0);
STXCOR_i = STXCOR_p;
FETA_i = `CLIP_LOW(FETA_p, 0.0);
RS_i = `CLIP_LOW(RS_p, 0.0);
STRS_i = STRS_p;
RSB_i = `CLIP_BOTH(RSB_p, -0.5, 1.0);
RSG_i = `CLIP_LOW(RSG_p, -0.5);
THESAT_i = `CLIP_LOW(THESAT_p, 0.0);
THESATAC_i = `CLIP_LOW(THESATAC_p, 0.0);
STTHESAT_i = STTHESAT_p;
THESATB_i = `CLIP_BOTH(THESATB_p, -0.5, 1.0);
THESATG_i = `CLIP_LOW(THESATG_p, -0.5);
AX_i = `CLIP_LOW(AX_p, 2.0);
AXAC_i = `CLIP_LOW(AXAC_p, 2.0);
ALP_i = `CLIP_LOW(ALP_p, 0.0);
ALPAC_i = `CLIP_LOW(ALPAC_p, 0.0);
ALP1_i = `CLIP_LOW(ALP1_p, 0.0);
ALP2_i = `CLIP_LOW(ALP2_p, 0.0);
VP_i = `CLIP_LOW(VP_p, 1.0e-10);
A1_i = `CLIP_LOW(A1_p, 0.0);
A2_i = `CLIP_LOW(A2_p, 0.0);
STA2_i = STA2_p;
A3_i = `CLIP_LOW(A3_p, 0.0);
A4_i = `CLIP_LOW(A4_p, 0.0);
GCO_i = `CLIP_BOTH(GCO_p, -10.0, 10.0);
IGINV_i = `CLIP_LOW(IGINV_p, 0.0);
IGOV_i = `CLIP_LOW(IGOV_p, 0.0);
IGOVD_i = `CLIP_LOW(IGOVD_p, 0.0);
STIG_i = STIG_p;
GC2_i = `CLIP_BOTH(GC2_p, 0.0, 10.0);
GC3_i = `CLIP_BOTH(GC3_p, -10.0, 10.0);
GC2OV_i = GC2_i;
GC3OV_i = GC3_i;
if (SWIGATE == 2) begin
GC2OV_i = `CLIP_BOTH(GC2OV_p, 0.0, 10.0);
GC3OV_i = `CLIP_BOTH(GC3OV_p, -10.0, 10.0);
end
CHIB_i = `CLIP_LOW(CHIB_p, 1.0);
AGIDL_i = `CLIP_LOW(AGIDL_p, 0.0);
AGIDLD_i = `CLIP_LOW(AGIDLD_p, 0.0);
BGIDL_i = `CLIP_LOW(BGIDL_p, 0.0);
BGIDLD_i = `CLIP_LOW(BGIDLD_p, 0.0);
STBGIDL_i = STBGIDL_p;
STBGIDLD_i = STBGIDLD_p;
CGIDL_i = CGIDL_p;
CGIDLD_i = CGIDLD_p;
COX_i = `CLIP_LOW(COX_p, 0.0);
CGOV_i = `CLIP_LOW(CGOV_p, 0.0);
CGOVD_i = `CLIP_LOW(CGOVD_p, 0.0);
FCGOVACC_i = `CLIP_BOTH(FCGOVACC_p, 0.0, 1.0);
FCGOVACCD_i = `CLIP_BOTH(FCGOVACCD_p, 0.0, 1.0);
CGOVACCG_i = `CLIP_BOTH(CGOVACCG_p, 0.1, 1.0);
CGBOV_i = `CLIP_LOW(CGBOV_p, 0.0);
CINR_i = `CLIP_LOW(CINR_p, 0.0);
CINRD_i = `CLIP_LOW(CINRD_p, 0.0);
DVFBINR_i = DVFBINR_p;
FCINRDEP_i = `CLIP_BOTH(FCINRDEP_p, 0.0, 1.0);
FCINRACC_i = `CLIP_BOTH(FCINRACC_p, 0.0, 1.0);
AXINR_i = `CLIP_BOTH(AXINR_p, 1.0e-2, 1.0);
CFR_i = `CLIP_LOW(CFR_p, 0.0);
CFRD_i = `CLIP_LOW(CFRD_p, 0.0);
FNT_i = `CLIP_LOW(FNT_p, 0.0);
FNTEXC_i = `CLIP_LOW(FNTEXC_p, 0.0);
NFA_i = `CLIP_LOW(NFA_p, 0.0);
NFB_i = `CLIP_LOW(NFB_p, 0.0);
NFC_i = `CLIP_LOW(NFC_p, 0.0);
EF_i = `CLIP_LOW(EF_p, 0.0);
VFBEDGE_i = VFBEDGE_p;
STVFBEDGE_i = STVFBEDGE_p;
DPHIBEDGE_i = DPHIBEDGE_p;
NEFFEDGE_i = `CLIP_BOTH(NEFFEDGE_p, 1.0e20, 1.0e26);
CTEDGE_i = `CLIP_LOW(CTEDGE_p, 0.0);
BETNEDGE_i = `CLIP_LOW(BETNEDGE_p, 0.0);
STBETEDGE_i = STBETEDGE_p;
PSCEEDGE_i = `CLIP_LOW(PSCEEDGE_p, 0.0);
PSCEBEDGE_i = `CLIP_BOTH(PSCEBEDGE_p, 0.0, 1.0);
PSCEDEDGE_i = `CLIP_LOW(PSCEDEDGE_p, 0.0);
CFEDGE_i = `CLIP_LOW(CFEDGE_p, 0.0);
CFDEDGE_i = `CLIP_LOW(CFDEDGE_p, 0.0);
CFBEDGE_i = `CLIP_BOTH(CFBEDGE_p, 0.0, 1.0);
FNTEDGE_i = `CLIP_LOW(FNTEDGE_p, 0.0);
NFAEDGE_i = `CLIP_LOW(NFAEDGE_p, 0.0);
NFBEDGE_i = `CLIP_LOW(NFBEDGE_p, 0.0);
NFCEDGE_i = `CLIP_LOW(NFCEDGE_p, 0.0);
EFEDGE_i = `CLIP_LOW(EFEDGE_p, 0.0);
RG_i = `CLIP_LOW(RG_p, 0.0);
RSE_i = `CLIP_LOW(RSE_p, 0.0);
RDE_i = `CLIP_LOW(RDE_p, 0.0);
RBULK_i = `CLIP_LOW(RBULK_p, 0.0);
RJUNS_i = `CLIP_LOW(RJUNS_p, 0.0);
RJUND_i = `CLIP_LOW(RJUND_p, 0.0);
RWELL_i = `CLIP_LOW(RWELL_p, 0.0);
`ifdef SelfHeating
RTH_i = `CLIP_LOW(RTH_p, 1.0e-4);
CTH_i = `CLIP_LOW(CTH_p, 0.0);
STRTH_i = STRTH_p;
`endif // SelfHeating
MULT_i = `CLIP_LOW(MULT * NF_i, 0.0); // Note: NF_i is set to 1 for local model
FACTUO_i = FACTUO;
DELVTO_i = DELVTO;
FACTUOEDGE_i = FACTUOEDGE;
DELVTOEDGE_i = DELVTOEDGE;
`ifdef NQSmodel
MUNQS_i = `CLIP_LOW(MUNQS_p, 0.0);
`endif // NQSmodel
// Ignore drain-side values in case of symmetric junctions
if (SWJUNASYM == 0) begin
TOXOVD_i = TOXOV_i;
NOVD_i = NOV_i;
AGIDLD_i = AGIDL_i;
BGIDLD_i = BGIDL_i;
STBGIDLD_i = STBGIDL_i;
CGIDLD_i = CGIDL_i;
IGOVD_i = IGOV_i;
CGOVD_i = CGOV_i;
FCGOVACCD_i = FCGOVACC_i;
CINRD_i = CINR_i;
CFRD_i = CFR_i;
end

View File

@ -1,297 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: juncap200.va
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 200.6.1, July 2020
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
`include "discipline.h"
`include "Common103_macrodefs.include"
`include "JUNCAP200_macrodefs.include"
`define JUNCAP_StandAlone
// Note: some verilog-A compilers have problems handling the ddx-operator,
// which occurs in definition of OP-output variables. If the line below is
// commented out, all OP-output variables using the ddx-operator are skipped.
`define OPderiv
/////////////////////////////////////////////////////////////////////////////
//
// Start of JUNCAP2 model code
//
/////////////////////////////////////////////////////////////////////////////
module JUNCAP200(A,K);
// --------------------------------------------------------------------------------------------------------------
// Node definitions
// --------------------------------------------------------------------------------------------------------------
inout A,K;
electrical A,K;
// --------------------------------------------------------------------------------------------------------------
// Special model parameters and switch parameters
// --------------------------------------------------------------------------------------------------------------
`MPInb(LEVEL ,200 ,"" ,"Model level must be 200")
`MPIty(TYPE ,1 ,"" ,"Type parameter, in output value 1 reflects n-type, -1 reflects p-type")
`MPRnb(DTA ,0.0 ,"K" ,"Temperature offset with respect to ambient temperature")
// --------------------------------------------------------------------------------------------------------------
// Instance parameters
// --------------------------------------------------------------------------------------------------------------
`IPRco(AB ,1.0e-12 ,"m^2" ,`AB_cliplow ,inf ,"Junction area")
`IPRco(LS ,1.0e-6 ,"m" ,`LS_cliplow ,inf ,"STI-edge part of junction perimeter")
`IPRco(LG ,1.0e-6 ,"m" ,`LG_cliplow ,inf ,"Gate-edge part of junction perimeter")
`IPRco(MULT ,1.0 ,"" ,`MULT_cliplow ,inf ,"Number of devices in parallel")
// --------------------------------------------------------------------------------------------------------------
// JUNCAP2 model parameters
// --------------------------------------------------------------------------------------------------------------
`include "JUNCAP200_parlist.include"
// --------------------------------------------------------------------------------------------------------------
// Variables
// --------------------------------------------------------------------------------------------------------------
real MULT_i;
real EPSSI;
`include "JUNCAP200_varlist.include"
// --------------------------------------------------------------------------------------------------------------
// Variables for operating point info
// --------------------------------------------------------------------------------------------------------------
`OPP(vak ,"V" ,"Voltage between anode and cathode")
`ifdef OPderiv
`OPP(cj ,"F" ,"Total source junction capacitance")
`OPP(cjbot ,"F" ,"Junction capacitance (bottom component)")
`OPP(cjgat ,"F" ,"Junction capacitance (gate-edge component)")
`OPP(cjsti ,"F" ,"Junction capacitance (STI-edge component)")
`endif // OPderiv
`OPP(ij ,"A" ,"Total source junction current")
`OPP(ijbot ,"A" ,"Junction current (bottom component)")
`OPP(ijgat ,"A" ,"Junction current (gate-edge component)")
`OPP(ijsti ,"A" ,"Junction current (STI-edge component)")
`OPP(si ,"A^2/Hz" ,"Total junction current noise spectral density")
// local parameters after scaling, T-scaling, and clipping
`OPP(idsatsbot ,"A" ,"Total bottom saturation current")
`OPP(idsatssti ,"A" ,"Total STI-edge saturation current")
`OPP(idsatsgat ,"A" ,"Total gate-edge saturation current")
`OPP(cjosbot ,"F" ,"Total bottom capacity")
`OPP(cjossti ,"F" ,"Total STI-edge capacity")
`OPP(cjosgat ,"F" ,"Total gate-edge capacity")
`OPP(vbisbot ,"V" ,"built-in voltage of the bottom junction")
`OPP(vbissti ,"V" ,"built-in voltage of the STI-edge junction")
`OPP(vbisgat ,"V" ,"built-in voltage of the gate-edge junction")
// --------------------------------------------------------------------------------------------------------------
// Analog block with all calculations and contribs
// --------------------------------------------------------------------------------------------------------------
analog begin
// --------------------------------------------------------------------------------------------------------------
// Definition of bias/instance independent model variables
// --------------------------------------------------------------------------------------------------------------
begin : initial_model
EPSSI = `EPSO * `EPSRSI;
`include "JUNCAP200_InitModel.include"
end // initial_model
// --------------------------------------------------------------------------------------------------------------
// Definition of instance dependent and bias independent variables
// --------------------------------------------------------------------------------------------------------------
begin : initial_instance
// Clipping of the local model parameters
AB_i = `CLIP_LOW(AB, `AB_cliplow);
LS_i = `CLIP_LOW(LS, `LS_cliplow);
LG_i = `CLIP_LOW(LG, `LG_cliplow);
MULT_i = `CLIP_LOW(MULT, `MULT_cliplow);
exp_VMAX_over_phitd = 0.0;
`JuncapInitInstance(AB_i, LS_i, LG_i, idsatbot, idsatsti, idsatgat, vbibot, vbisti, vbigat, PBOT, PSTI, PGAT, VBIRBOT, VBIRSTI, VBIRGAT, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim)
// Initialization of (global) variables; required for some verilog-A compilers
ISATFOR1 = 0.0;
MFOR1 = 1.0;
MFOR2 = 1.0;
ISATFOR2 = 0.0;
MREV = 1.0;
ISATREV = 0.0;
m0flag = 0.0;
xhighf1 = 0.0;
expxhf1 = 0.0;
xhighf2 = 0.0;
expxhf2 = 0.0;
xhighr = 0.0;
expxhr = 0.0;
m0_rev = 0.0;
mcor_rev = 0.0;
I1_cor = 0.0;
I2_cor = 0.0;
I3_cor = 0.0;
I4_cor = 0.0;
I5_cor = 0.0;
tt0 = 0.0;
tt1 = 0.0;
tt2 = 0.0;
zfrac = 0.0;
zflagbot = 1.0;
zflagsti = 1.0;
zflaggat = 1.0;
alphaje = 0.0;
if (SWJUNEXP_i == 1.0) begin : JUNCAPexpressInit
// Note: the variables in the macro below are (re-)declared locally, to keep them separated from their globally declared counterparts.
// This trick allows one to use the "juncapcommon" macro both in the JUNCAP-express initialization and in the full-JUNCAP evalutation,
// while in the former the verilog-A compiler will still consider the variables as voltage-INdependent. This is essential to avoid
// recomputation of the JUNCAP-express initialization at each bias-step.
`LocalGlobalVars
// results computed here are not used elsewhere
real ijunbot, ijunsti, ijungat, qjunbot, qjunsti, qjungat;
// Initialization of (local) variables; required for some verilog-A compilers
`JuncapLocalVarInit
// Computation of JUNCAP-express internal parameters
`JuncapExpressInit1(AB_i, LS_i, LG_i, VJUNREF, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT, CTATBOT, vbibot, wdepnulrbot, VBIRBOTinv, PBOT, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT, VBIRBOT, wdepnulrinvbot, fbbtbot, VBRBOT, VBRinvbot, PBRBOT, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI, CTATSTI, vbisti, wdepnulrsti, VBIRSTIinv, PSTI, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI, VBIRSTI, wdepnulrinvsti, fbbtsti, VBRSTI, VBRinvsti, PBRSTI, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT, CTATGAT, vbigat, wdepnulrgat, VBIRGATinv, PGAT, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT, VBIRGAT, wdepnulrinvgat, fbbtgat, VBRGAT, VBRinvgat, PBRGAT, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim)
`JuncapExpressInit2(AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT, CTATBOT, vbibot, wdepnulrbot, VBIRBOTinv, PBOT, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT, VBIRBOT, wdepnulrinvbot, fbbtbot, VBRBOT, VBRinvbot, PBRBOT, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI, CTATSTI, vbisti, wdepnulrsti, VBIRSTIinv, PSTI, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI, VBIRSTI, wdepnulrinvsti, fbbtsti, VBRSTI, VBRinvsti, PBRSTI, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT, CTATGAT, vbigat, wdepnulrgat, VBIRGATinv, PGAT, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT, VBIRGAT, wdepnulrinvgat, fbbtgat, VBRGAT, VBRinvgat, PBRGAT, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim)
`JuncapExpressInit3(AB_i, LS_i, LG_i, idsatbot, idsatsti, idsatgat, ISATFOR1, MFOR1, ISATFOR2, MFOR2, ISATREV, MREV, m0flag)
`JuncapExpressInit4(AB_i, LS_i, LG_i, FJUNQ, cjobot, cjosti, cjogat, zflagbot, zflagsti, zflaggat)
`JuncapExpressInit5(AB_i, LS_i, LG_i, ISATFOR1, ISATFOR2, ISATREV, xhighf1, expxhf1, xhighf2, expxhf2, xhighr, expxhr)
end // JUNCAPexpressInit
end // initial_instance
begin : evaluateblock
// Local variables
real ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat, ijun, qjun, jnoise, VAK;
// Variable initializing
ijun = 0.0;
ijunbot = 0.0;
ijunsti = 0.0;
ijungat = 0.0;
// --------------------------------------------------------------------------------------------------------------
// DC and AC bias dependent quantities (calculations for current and charge contributions)
// --------------------------------------------------------------------------------------------------------------
begin : evaluateStaticDynamic
// Fix: add here variables declaration; required for some verilog-A compilers
`LocalGlobalVars
// Fix: initialization of (local) variables; required for some verilog-A compilers
`JuncapLocalVarInit
qjunbot = 0.0;
qjunsti = 0.0;
qjungat = 0.0;
VAK = TYPE * V(A, K);
if (SWJUNEXP_i == 1.0) begin
`JuncapExpressCurrent(VAK, MFOR1, ISATFOR1, MFOR2, ISATFOR2, MREV, ISATREV, m0flag, xhighf1, expxhf1, xhighf2, expxhf2, xhighr, expxhr, ijun)
begin : evaluateDynamic
real tmpv, vjv;
`JuncapExpressCharge(VAK, AB_i, LS_i, LG_i, qprefbot, qprefsti, qprefgat, qpref2bot, qpref2sti, qpref2gat, vbiinvbot, vbiinvsti, vbiinvgat, one_minus_PBOT, one_minus_PSTI, one_minus_PGAT, vfmin, vch, zflagbot, zflagsti, zflaggat, qjunbot, qjunsti, qjungat)
end
end else begin
`juncapcommon(VAK, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT, CTATBOT, vbibot, wdepnulrbot, VBIRBOTinv, PBOT, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT, VBIRBOT, wdepnulrinvbot, fbbtbot, VBRBOT, VBRinvbot, PBRBOT, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI, CTATSTI, vbisti, wdepnulrsti, VBIRSTIinv, PSTI, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI, VBIRSTI, wdepnulrinvsti, fbbtsti, VBRSTI, VBRinvsti, PBRSTI, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT, CTATGAT, vbigat, wdepnulrgat, VBIRGATinv, PGAT, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT, VBIRGAT, wdepnulrinvgat, fbbtgat, VBRGAT, VBRinvgat, PBRGAT, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat)
ijun = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat;
end
qjun = AB_i * qjunbot + LS_i * qjunsti + LG_i * qjungat;
end // evaluateStaticDynamic
// --------------------------------------------------------------------------------------------------------------
// Current contributions
// --------------------------------------------------------------------------------------------------------------
begin : loadStatic
I(A, K) <+ (TYPE * MULT_i) * ijun;
end // loadStatic
// --------------------------------------------------------------------------------------------------------------
// ddt() contribs from charges
// --------------------------------------------------------------------------------------------------------------
begin : loadDynamic
I(A, K) <+ ddt((TYPE * MULT_i) * qjun);
end // loadDynamic
// --------------------------------------------------------------------------------------------------------------
// Noise
// --------------------------------------------------------------------------------------------------------------
begin : noise
jnoise = (2 * `QELE) * abs(ijun);
I(A, K) <+ white_noise(MULT_i * jnoise, "shot");
end // noise
// --------------------------------------------------------------------------------------------------------------
// Operating point info
// --------------------------------------------------------------------------------------------------------------
begin : OPinfo
vak = VAK;
`ifdef OPderiv
cjbot = TYPE * MULT_i * AB_i * ddx(qjunbot, V(A));
cjgat = TYPE * MULT_i * LG_i * ddx(qjungat, V(A));
cjsti = TYPE * MULT_i * LS_i * ddx(qjunsti, V(A));
cj = cjbot + cjgat + cjsti;
`endif // OPderiv
if (SWJUNEXP_i == 1.0) begin
ijbot = 0.0;
ijgat = 0.0;
ijsti = 0.0;
idsatsbot = 0.0;
idsatssti = 0.0;
idsatsgat = 0.0;
end else begin
ijbot = MULT_i * AB_i * ijunbot;
ijgat = MULT_i * LG_i * ijungat;
ijsti = MULT_i * LS_i * ijunsti;
idsatsbot = MULT_i * AB_i * idsatbot;
idsatssti = MULT_i * LS_i * idsatsti;
idsatsgat = MULT_i * LG_i * idsatgat;
end
ij = MULT_i * ijun;
si = MULT_i * jnoise;
cjosbot = MULT_i * AB_i * cjobot;
cjossti = MULT_i * LS_i * cjosti;
cjosgat = MULT_i * LG_i * cjogat;
vbisbot = vbibot;
vbissti = vbisti;
vbisgat = vbigat;
end // OPinfo
end // evaluateblock
end // analogBlock
endmodule

View File

@ -1,50 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: psp103.va
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 103.8.0 (PSP), 200.6.1 (JUNCAP), July 2020
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
`include "discipline.h"
`include "Common103_macrodefs.include"
`include "JUNCAP200_macrodefs.include"
`include "PSP103_macrodefs.include"
// Note: some verilog-A compilers have problems handling the ddx-operator,
// which occurs in definition of OP-output variables. If the line below is
// commented out, all OP-output variables using the ddx-operator are skipped.
`define OPderiv
/////////////////////////////////////////////////////////////////////////////
//
// PSP global model code
//
/////////////////////////////////////////////////////////////////////////////
module PSP103VA(D, G, S, B);
`include "PSP103_module.include"
endmodule

View File

@ -1,54 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: psp103_nqs.va
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 103.8.0 (PSP), 200.6.1 (JUNCAP), July 2020
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
`include "discipline.h"
`define NQSmodel true
`include "Common103_macrodefs.include"
`include "JUNCAP200_macrodefs.include"
`include "PSP103_macrodefs.include"
// Note: some verilog-A compilers have problems handling the ddx-operator,
// which occurs in definition of OP-output variables. If the line below is
// commented out, all OP-output variables using the ddx-operator are skipped.
`define OPderiv
/////////////////////////////////////////////////////////////////////////////
//
// PSP global model code
//
/////////////////////////////////////////////////////////////////////////////
`include "PSP103_nqs_macrodefs.include"
module PSPNQS103VA(D, G, S, B);
`include "PSP103_module.include"
endmodule

View File

@ -1,52 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: psp103t.va
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 103.8.0 (PSP), 200.6.1 (JUNCAP), July 2020
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
`include "discipline.h"
`define SelfHeating true
`include "Common103_macrodefs.include"
`include "JUNCAP200_macrodefs.include"
`include "PSP103_macrodefs.include"
// Note: some verilog-A compilers have problems handling the ddx-operator,
// which occurs in definition of OP-output variables. If the line below is
// commented out, all OP-output variables using the ddx-operator are skipped.
`define OPderiv
/////////////////////////////////////////////////////////////////////////////
//
// PSP global model code
//
/////////////////////////////////////////////////////////////////////////////
module PSP103TVA(D, G, S, B, DT);
`include "PSP103_module.include"
endmodule

View File

@ -1,263 +0,0 @@

======================================================================================
======================================================================================
Silicon Integration Initiative (Si2)
Compact Model Coalition In-Code Statement
Software is distributed as is, completely without warranty or service support. The
Commissariat a l'energie atomique et aux energies alternatives (CEA), NXP
Semiconductors, and Delft University of Technology, along with their employees are
not liable for the condition or performance of the software.
NXP Semiconductors, Delft University of Technology, and CEA own the copyright and
grant users a perpetual, irrevocable, worldwide, non-exclusive, royalty-free license
with respect to the software as set forth below.
NXP Semiconductors, Delft University of Technology, and CEA hereby disclaim all
implied warranties.
NXP Semiconductors, Delft University of Technology, and CEA grant the users the right
to modify, copy, and redistribute the software and documentation, both within the
user's organization and externally, subject to the following restrictions:
1. The users agree not to charge for the NXP Semiconductors, Delft University of
Technology, and CEA-developed code itself but may charge for additions,
extensions, or support.
2. In any product based on the software, the users agree to acknowledge NXP
Semiconductors, Delft University of Technology, and CEA that developed the
software. This acknowledgement shall appear in the product documentation.
3. Redistributions to others of source code and documentation must retain the
copyright notice, disclaimer, and list of conditions.
4. Redistributions to others in binary form must reproduce the copyright notice,
disclaimer, and list of conditions in the documentation and/or other materials
provided with the distribution.
CMC In-Code Statement Revision: 103.8.0 (PSP), 07/01/2020
200.6.1 (JUNCAP),07/01/2020
======================================================================================
======================================================================================
Authors: G.D.J. Smit, A.J. Scholten, and D.B.M. Klaassen (NXP Semiconductors)
O. Rozeau, S. Martinie and T. Poiroux (CEA-Leti)
Former contributers:
G. Gildenblat, W. Yao, Z. Zhu, X. Li and W. Wu (Arizona State University)
R. van Langevelde (Philips Research)
R. van der Toorn (Delft University of Technology)
J.C. Barbé (CEA-Leti)
The most recent version of the model code, the documentation, and contact
information can be found on:
http://www.cea.fr/cea-tech/leti/pspsupport
======================================================================================
======================================================================================
This package consists of the following files:
- releasenotesPSP103.txt This file
- psp103.va Main file for PSP model
- psp103t.va Main file for PSP model with self heating
- psp103_nqs.va Main file for PSP model with NQS-effects
- juncap200.va Main file for JUNCAP2 stand-alone model
- Common103_macrodefs.include Common macro definitions
- PSP103_macrodefs.include Macro definitions for PSP
- PSP103_module.include Actual model code for intrinsic MOS model
- PSP103_parlist.include Model parameter list for PSP model
- PSP103_scaling.include Geometry scaling equations for PSP model
- PSP103_nqs_macrodefs.include All macro definitions for PSP-NQS
- JUNCAP200_macrodefs.include Macro definitions for JUNCAP2 model
- JUNCAP200_parlist.include JUNCAP2 parameter list
- JUNCAP200_varlist.include JUNCAP2 variable declarations
- JUNCAP200_InitModel.include JUNCAP2 model initialization code
======================================================================================
======================================================================================
Usage
-----
Depending which model one wants to use, one should compile one of the four .va-files
(psp103.va, psp103t.va, psp103_nqs.va, and juncap200.va). The module names are
"PSP103VA", "PSP103TVA", and "PSPNQS103VA" (for QS, self heating, and NQS,
respectively), and "JUNCAP200" for the JUNCAP2-model.
======================================================================================
======================================================================================
Release notes vA-code of PSP 103.8.0 (July 2020)
---------------------------------------------------------
Changes include:
- New inner fringe charges model with its associated parameters
- Model of overlaps inversion charge with its associated parameters
- New implementation of gmin conductance
- Minor modification on code files organization: The contents of PSP103_ChargesNQS.include
and PSP103_InitNQS.include are now calculated as macros in PSP103_nqs_macrodefs.include
- Fix on the sign of flicker noise sources (including edge transistor)
- Minor code cleaning
- PSP103_macrodefs.include:
- GMIN constant is canceled and replaced by a controled variable by the simulator
- TempScaling macro: QMC_i is replaced by QMC (lines 323 and 344). SWEDGE_i is replaced
by SWEDGE (line 396)
- SPCalculation macro:
- Initialization of Em, Dm, Pm, qbs and qbd (lines 459 to 464)
- Calculation of qbs and qbd in accumulation (lines 524 and 525)
- Addition of Pd and sqd calculations (lines from 647 to 649, 652, 653, from 666
to 667)
- Calculation of qbd in inversion (line 669)
- Calculation of Vgsinr, Vsginr, Vgdinr and Vdginr (lines 768 to 772)
- PSP103_module.include:
- The unused variable inorm for NQS is removed
- Global declaration of new variables (lines 167 to 168, 185 to 186, 229, 230 to 231 and
241): FCGOVACC_p, FCGOVACCD_p, CGOVACCG_p, CINR_p, CINRD_p, DVFBINR_p, FCINRDEP_p,
FCINRACC_p, AXINR_p, FCGOVACC_i, FCGOVACCD_i, CGOVACCG_i, CINR_i, CINRD_i, DVFBINR_i,
FCINRDEP_i, FCINRACC_i, AXINR_i, dxgb_ov_s, dxgb_ov_d, Vinr_max, ainr, xgb_ov
- New declarations of OP variables related to new features (lines 457 to 466):
lp_fcgovacc, lp_fcgovaccd, lp_cgovaccg, lp_cinr, lp_cinrd, lp_dvfbinr, lp_fcinrdep,
lp_fcinracc, lp_axinr
- initial_model section:
- Canceled variables related to clipped parameters by using declaration functions:
SWGEO_i, SWIGATE_i, SWIMPACT_i, SWGIDL_i, SWJUNCAP_i, SWJUNASYM_i, SWNUD_i,
SWEDGE_i, SWDELVTAC_i, SWQSAT_i, SWQPART_i, SWIGN_i, QMC_i, TOXO_i, EPSROXO_i,
NSUBO_i, WSEG_i, NPCK_i, WSEGP_i, LPCK_i, TOXOVO_i, TOXOVDO_i, LOV_i, LOVD_i,
LP1_i, LP2_i, WBET_i, AXL_i, ALP1L2_i, ALP2L2_i, SAREF_i, SBREF_i, KVSAT_i,
LLODKUO_i, WLODKUO_i, LLODVTH_i, WLODVTH_i, LODETAO_i, SCREF_i, WEB_i, WEC_i,
RSHG_i, RINT_i, RVPOLY_i, NSUBEDGEO_i, LPEDGE_i, TR_i
=> these variables <PARNAME>_i are replaced by their associated parameters <PARNAME>
- RSH_i and RSHD_i variables are now calculated in PSP103_scaling.include
- gmin definition using defined value by the simulator (line 624)
- initial_instance section:
- Clipping function are now unused for SCA_i, SCB_, SCC_i (lines 668 to 670)
- Addition of new variables for overlap inversion charge dxgb_ov_th, dxgb_ov_s and
dxgb_ov_d (lines 715 and 717)
- Addition of new variables for inner fringe charges Vinr_max and ainr (lines 761 to
766)
- The initializations of juncap variables (ysq, terfc, erfcpos, etc.) are now done
using a macro JuncapLocalVarInit in JUNCAP200_macrodefs.include (line 926)
- Variables <PARNAME>_i of juncap model are replaced by the model parameters <PARNAME>
(lines 939 to 933)
- evaluateblock section:
- Addition of variable declarations related to inner fringe charges and overlap
inversion charge (lines 949 to 955)
- evaluateStatic section:
- New variable xgb_ov related to overlap inversion charge (line 1017)
- Calculation of Vgb1_dc, Vgsinr_dc, Vsginr_dc, Vgdinr_dc and Vdginr_dc (lines 1074,
from 1097 to 1100)
- evaluateDynamic section:
- Declarations of variables related to inner fringe charges and overlap inversion
charge (lines 1316 and 1317)
- Affectations of Vgb1_ac, Vgsinr_ac, Vsginr_ac, Vgdinr_ac and Vdginr_ac (lines 1354, from
1367 to 1371, 1378, from 1391 to 1395)
- Part for inner fringe charges calculation (lines 1436 to 1485)
- Part for overlap inversion charge calculation (lines 1490 to 1529)
- evaluateStaticDynamic section:
- Variables declaration for juncap using LocalGlobalVars macro required for some VA compilers
(line 1565)
- Initialization of juncap variables using JuncapLocalVarInit macro (line 1568)
- Initalization of NQS using InitNQS macro (line 1609)
- loadStatic section:
- New current schemes of gmin (lines 1656 and 1657)
- loadStaticDynamic section:
- Implementation of NQS charges using CalcChargesNQS macro (line 1668)
- noise section:
- Fix on the sign of flicker noise source (line 1880)
- Fix on the sign of flicker noise source of edge transistor (line 1885)
- OPinfo section:
- Affectations of OP variables lp_fcgovacc, lp_fcgovaccd, lp_cinr, lp_cinrd, lp_dvfbinr
lp_fcinrdep, lp_fcinracc, lp_axinr (lines from 2225 to 2227 and from 2229 to 2234)
- PSP103_parlist.include:
- New local parameters for inversion of overlaps: FCGOVACC, FCGOVACCD, CGOVACCG
- New local parameters for inner fringe charges: CINR, CINRD, DVFBINR, FCINRDEP, FCINRACC,
AXINR
- New global parameters for inversion of overlaps: FCGOVACCO, FCGOVACCDO, CGOVACCGO
- New global parameters for inner fringe charges: CINRW, CINRDW, DVFBINRO, FCINRDEPO,
FCINRACCO, AXINRO
- New binning parameters for inversion of overlaps: POFCGOVACC, POFCGOVACCD, POCGOVACCG
- New binning parameters for inner fringe charges: POCINR, PLCINR, PWCINR, PLWCINR,
POCINRD, PLCINRD, PWCINRD, PLWCINRD, POFCINRDEP, POFCINRACC, PODVFBINR, POAXINR
- Fix on SCREF parameter declaration to avoid the null value (division by zero in the code)
(line 938)
- PSP103_scaling.include:
- Variables related to clipped global parameters and switches <PARNAME>_i are replaced
by their associated parameters <PARNAME>
- New internal local parameters related to inversion of overlaps with associated scaling
rules: FCGOVACC_p, FCGOVACCD_p, CGOVACCG_p, FCGOVACC_i, FCGOVACCD_i, CGOVACCG_i
- New internal local parameters related to inner fringe charges with associated scaling
rules: CINRD_p, CINR_p, DVFBINR_p, FCINRDEP_p, FCINRACC_p, AXINR_p, CINRD_i, CINR_i,
DVFBINR_i, FCINRDEP_i, FCINRACC_i, AXINR_i
- RSH_i, RSHD_i are now calculated in this file
- PSP103_nqs_macrodefs.include:
- Includes PSP103_InitNQS.include file as a new macro called "InitNQS"
- Includes PSP103_ChargesNQS.include file as a new macro called "CalcChargesNQS"
- PSP103_InitNQS.include: canceled file
- PSP103_ChargesNQS.include: canceled file
PSP 103.8.0 is backwards compatible with the previous version, PSP 103.7.0
======================================================================================
======================================================================================
Release notes vA-code of JUNCAP 200.6.1 (July 2020)
---------------------------------------------------------
Change includes:
- Fix typo of LS and LG parameter units
- Minor code changes
- JUNCAP200_varlist.include:
- Several declaration are canceled related to the simplification of clipped variables
(TRJ_i, IMAX_i, FREV_i, IFACTOR_i, CFACTOR_i, etc.)
- Variables declaration using LocalGlobalVars macro is removed
- JUNCAP200_macrodefs.include:
- Addition of local variables initialization: JuncapLocalVarInit macro
- Variables related to clipped parameters and switches <PARNAME>_i are replaced by
their associated parameters <PARNAME>
- JUNCAP200_InitModel.include:
- Canceled variables related to clipped parameters by using declaration functions:
TRJ_i, IMAX_i, FREV_i, IFACTOR_i, CFACTOR_i, CJORBOT_i, CJORSTI_i,
CJORGAT_i, VBIRBOT_i, VBIRSTI_i, VBIRGAT_i, PBOT_i, PSTI_i, PGAT_i, PHIGBOT_i,
PHIGSTI_i, PHIGGAT_i, IDSATRBOT_i, IDSATRSTI_i, IDSATRGAT_i, XJUNSTI_i, XJUNGAT_i,
CSRHBOT_i, CSRHSTI_i, CSRHGAT_i, CTATBOT_i, CTATSTI_i, CTATGAT_i, MEFFTATBOT_i,
MEFFTATSTI_i, MEFFTATGAT_i, CBBTBOT_i, CBBTSTI_i, CBBTGAT_i, FBBTRBOT_i,
FBBTRSTI_i, FBBTRGAT_i, STFBBTBOT_i, STFBBTSTI_i, STFBBTGAT_i, VBRBOT_i, VBRSTI_i,
VBRGAT_i, PBRBOT_i, PBRSTI_i, PBRGAT_i, VJUNREF_i, FJUNQ_i
- juncap200.va:
- Fix typo of LS and LG parameter units (lines 65 and 66)
- Variables related to clipped parameters and switches <PARNAME>_i are replaced by
their associated parameters <PARNAME>
- The initializations of juncap variables (ysq, terfc, erfcpos, etc.) are now done
using a macro JuncapLocalVarInit in JUNCAP200_macrodefs.include (line 181)
- Variables declaration for juncap using LocalGlobalVars macro required for some VA compilers
(line 211)
- Initialization of juncap variables using JuncapLocalVarInit macro (line 214)
- Initialization of qjunbot, qjunsti and qjungat (lines from 215 to 217)
JUNCAP 200.6.1 is backwards compatible with the previous version, JUNCAP 200.6.0
=====================================================================================
======================================================================================
The authors want to thank Laurent Lemaitre and Colin McAndrew (Freescale)
for their help with ADMS and the implementation of the model code. Geoffrey
Coram (Analog Devices) is acknowledged for input concerning the Verilog-A
implementation of the model.

View File

@ -1,250 +0,0 @@
//
// This file is the top-level declaration for the following CMC Verilog-A models:
//
// r2_cmc CMC 2-terminal resistor model
// r2_et_cmc CMC 2-terminal resistor model with self-heating
//
//
// Physical constants and other generally useful numbers
//
`include "discipline.h"
`define TABS_NIST2004 2.73150000e+02 // (NIST2004) 0C in K
`define QQ_NIST2004 1.60217653e-19 // (NIST2004) mag. of electronic charge (C)
`define KB_NIST2004 1.38065050e-23 // (NIST2004) Boltzmann constant (J/K)
`define oneThird 3.3333333333333333e-01
//
// Clipping macros, these smoothly limit to lower, upper, or both lower and upper
// limits. Rather than using a sqrt or log-exp form, which affects values
// everywhere, these use a conditional form that is continuous in function
// and derivative. If a value is not clipped then no exp() evaluation occurs.
// Smooth limiting is preferable to hard limiting (although latter can still
// be useful for enforcing parameter limits) for bias dependent quantities
// as derivatives do not become zero or have discontinuities.
//
`define CLIPL0p1(XCLIP,X,LOWER) \
if (X<(LOWER+0.1)) \
XCLIP = LOWER+0.1*exp(10.0*(X-LOWER)-1.0); \
else \
XCLIP = X;
`define CLIPU0p1(XCLIP,X,UPPER) \
if (X>(UPPER-0.1)) \
XCLIP = UPPER-0.1*exp(10.0*(UPPER-X)-1.0); \
else \
XCLIP = X;
`define CLIPB0p1(XCLIP,X,LOWER,UPPER) \
if (X<(LOWER+0.1)) \
XCLIP = LOWER+0.1*exp(10.0*(X-LOWER)-1.0); \
else if (X>(UPPER-0.1)) \
XCLIP = UPPER-0.1*exp(10.0*(UPPER-X)-1.0); \
else \
XCLIP = X;
`define CLIPL1p0(XCLIP,X,LOWER) \
if (X<(LOWER+1.0)) \
XCLIP = LOWER+exp(X-LOWER-1.0); \
else \
XCLIP = X;
`define CLIPU1p0(XCLIP,X,UPPER) \
if (X>(UPPER-1.0)) \
XCLIP = UPPER-exp(UPPER-X-1.0); \
else \
XCLIP = X;
`define CLIPB1p0(XCLIP,X,LOWER,UPPER) \
if (X<(LOWER+1.0)) \
XCLIP = LOWER+exp(X-LOWER-1.0); \
else if (X>(UPPER-1.0)) \
XCLIP = UPPER-exp(UPPER-X-1.0); \
else \
XCLIP = X;
`ifdef insideADMS
`ifdef notInsideADMS
`undef notInsideADMS
`endif
`else
`define notInsideADMS
`endif
`ifdef __VAMS_COMPACT_MODELING__
`ifdef not__VAMS_COMPACT_MODELING__
`undef not__VAMS_COMPACT_MODELING__
`endif
`else
`define not__VAMS_COMPACT_MODELING__
`endif
//
// Conditional definitions of macros so that the code will work with
// Verilog-A 2.1 and 2.2, and ADMS. The "des" description argument is intended to
// be a short description, the "inf" information argument is intended to be
// a detailed description (e.g. for display as part of on-line help).
//
// MPR model parameter real
// MPI model parameter integer
// IPR instance parameter real
// IPI instance parameter integer
// IPM instance parameter mFactor (multiplicity, implicit for LRM2.2)
// OPP operating point parameter, includes units and description for printing
//
// There are some issues with passing range directives with some compilers,
// so for each parameter declaration there are 5 versions:
// cc closed lower bound, closed upper bound
// co closed lower bound, open upper bound
// oc open lower bound, closed upper bound
// oo open lower bound, open upper bound
// nb no bounds
//
`ifdef __VAMS_COMPACT_MODELING__
`define ALIAS(alias,parameter) aliasparam alias = parameter;
`define ERROR(str) \
begin \
$strobe(str); \
$finish(1); \
end
`define WARNING(str) $strobe(str);
`define OPP(nam,uni,des) (*units=uni, desc=des*) real nam;
`define MPRcc(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 MPRoo(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from(lwr:upr);
`define MPRnb(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def;
`define MPIcc(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 MPIoo(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from(lwr:upr);
`define MPInb(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def;
`define IPRcc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[lwr:upr];
`define IPRco(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[lwr:upr);
`define IPRoc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from(lwr:upr];
`define IPRoo(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from(lwr:upr);
`define IPRnb(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def;
`define IPIcc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[lwr:upr];
`define IPIco(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[lwr:upr);
`define IPIoc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from(lwr:upr];
`define IPIoo(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from(lwr:upr);
`define IPInb(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def;
`define IPM
`define TESTGIVEN(parameter) $param_given(parameter)
`define GIVEN(parameter,variable,true,false) \
begin \
if ($param_given(parameter)) \
variable = true; \
else \
variable = false; \
end
`define SCALE \
begin \
if ($param_given(scale)) \
scaleFac = scale; \
else \
scaleFac = $simparam("scale",1.0); \
end
`define SHRINKL \
begin \
if ($param_given(shrink)) \
shrinkL = 1.0-0.01*shrink; \
else \
shrinkL = 1.0-0.01*$simparam("shrink",0.0); \
end
`define RTHRESH \
begin \
if ($param_given(rthresh)) \
rthrR2 = rthresh; \
else \
rthrR2 = $simparam("rthresh",1.0e-03); \
end
`else // not__VAMS_COMPACT_MODELING__
`define ALIAS(alias,parameter)
`ifdef insideADMS
`define ERROR(str) \
begin \
$strobe(str); \
$finish(1); \
end
`define WARNING(str) $strobe(str);
`define OPP(nam,uni,des) real nam (*units=uni desc=des ask="yes"*);
`define MPRcc(nam,def,uni,lwr,upr,des) parameter real nam=def from[lwr:upr] (*units=uni ask="yes" info=des*);
`define MPRco(nam,def,uni,lwr,upr,des) parameter real nam=def from[lwr:upr) (*units=uni ask="yes" info=des*);
`define MPRoc(nam,def,uni,lwr,upr,des) parameter real nam=def from(lwr:upr] (*units=uni ask="yes" info=des*);
`define MPRoo(nam,def,uni,lwr,upr,des) parameter real nam=def from(lwr:upr) (*units=uni ask="yes" info=des*);
`define MPRnb(nam,def,uni, des) parameter real nam=def (*units=uni ask="yes" info=des*);
`define MPIcc(nam,def,uni,lwr,upr,des) parameter integer nam=def from[lwr:upr] (*units=uni ask="yes" info=des*);
`define MPIco(nam,def,uni,lwr,upr,des) parameter integer nam=def from[lwr:upr) (*units=uni ask="yes" info=des*);
`define MPIoc(nam,def,uni,lwr,upr,des) parameter integer nam=def from(lwr:upr] (*units=uni ask="yes" info=des*);
`define MPIoo(nam,def,uni,lwr,upr,des) parameter integer nam=def from(lwr:upr) (*units=uni ask="yes" info=des*);
`define MPInb(nam,def,uni, des) parameter integer nam=def (*units=uni ask="yes" info=des*);
`define IPRcc(nam,def,uni,lwr,upr,des) parameter real nam=def from[lwr:upr] (*units=uni type="instance" ask="yes" info=des*);
`define IPRco(nam,def,uni,lwr,upr,des) parameter real nam=def from[lwr:upr) (*units=uni type="instance" ask="yes" info=des*);
`define IPRoc(nam,def,uni,lwr,upr,des) parameter real nam=def from(lwr:upr] (*units=uni type="instance" ask="yes" info=des*);
`define IPRoo(nam,def,uni,lwr,upr,des) parameter real nam=def from(lwr:upr) (*units=uni type="instance" ask="yes" info=des*);
`define IPRnb(nam,def,uni, des) parameter real nam=def (*units=uni type="instance" ask="yes" info=des*);
`define IPIcc(nam,def,uni,lwr,upr,des) parameter integer nam=def from[lwr:upr] (*units=uni type="instance" ask="yes" info=des*);
`define IPIco(nam,def,uni,lwr,upr,des) parameter integer nam=def from[lwr:upr) (*units=uni type="instance" ask="yes" info=des*);
`define IPIoc(nam,def,uni,lwr,upr,des) parameter integer nam=def from(lwr:upr] (*units=uni type="instance" ask="yes" info=des*);
`define IPIoo(nam,def,uni,lwr,upr,des) parameter integer nam=def from(lwr:upr) (*units=uni type="instance" ask="yes" info=des*);
`define IPInb(nam,def,uni, des) parameter integer nam=def (*units=uni type="instance" ask="yes" info=des*);
`define IPM parameter real m=1 from(0:inf) (*units="" type="instance" ask="yes" info="multiplicity factor"*);
`define TESTGIVEN(parameter) $given(parameter)
`define GIVEN(parameter,variable,true,false) \
begin \
if ($given(parameter)) \
variable = true; \
else \
variable = false; \
end
`define SCALE \
begin \
if ($given(scale)) \
scaleFac = scale; \
else \
scaleFac = $scale; \
end
`define SHRINKL \
begin \
if ($given(shrink)) \
shrinkL = 1.0-0.01*shrink; \
else \
shrinkL = $shrinkl("m"); \
end
`define RTHRESH rthrR2 = rthresh;
`else // notInsideADMS
`define ERROR(str) \
begin \
$strobe(str); \
$finish(1); \
end
`define WARNING(str) $strobe(str);
`define OPP(nam,uni,des) real nam;
`define MPRcc(nam,def,uni,lwr,upr,des) parameter real nam=def from[lwr:upr];
`define MPRco(nam,def,uni,lwr,upr,des) parameter real nam=def from[lwr:upr);
`define MPRoc(nam,def,uni,lwr,upr,des) parameter real nam=def from(lwr:upr];
`define MPRoo(nam,def,uni,lwr,upr,des) parameter real nam=def from(lwr:upr);
`define MPRnb(nam,def,uni, des) parameter real nam=def;
`define MPIcc(nam,def,uni,lwr,upr,des) parameter integer nam=def from[lwr:upr];
`define MPIco(nam,def,uni,lwr,upr,des) parameter integer nam=def from[lwr:upr);
`define MPIoc(nam,def,uni,lwr,upr,des) parameter integer nam=def from(lwr:upr];
`define MPIoo(nam,def,uni,lwr,upr,des) parameter integer nam=def from(lwr:upr);
`define MPInb(nam,def,uni, des) parameter integer nam=def;
`define IPRcc(nam,def,uni,lwr,upr,des) parameter real nam=def from[lwr:upr];
`define IPRco(nam,def,uni,lwr,upr,des) parameter real nam=def from[lwr:upr);
`define IPRoc(nam,def,uni,lwr,upr,des) parameter real nam=def from(lwr:upr];
`define IPRoo(nam,def,uni,lwr,upr,des) parameter real nam=def from(lwr:upr);
`define IPRnb(nam,def,uni, des) parameter real nam=def;
`define IPIcc(nam,def,uni,lwr,upr,des) parameter integer nam=def from[lwr:upr];
`define IPIco(nam,def,uni,lwr,upr,des) parameter integer nam=def from[lwr:upr);
`define IPIoc(nam,def,uni,lwr,upr,des) parameter integer nam=def from(lwr:upr];
`define IPIoo(nam,def,uni,lwr,upr,des) parameter integer nam=def from(lwr:upr);
`define IPInb(nam,def,uni, des) parameter integer nam=def;
`define IPM parameter real m=1 from(0:inf);
`define TESTGIVEN(parameter) 1
`define GIVEN(parameter,variable,true,false) variable = true;
`define SCALE scaleFac = scale;
`define SHRINKL shrinkL = 1.0-0.01*shrink;
`define RTHRESH rthrR2 = rthresh;
`endif
`endif

View File

@ -1,888 +0,0 @@
`include "cmcModels.inc"
//
// Set up two versions of the model (which is defined in the
// file r2_cmc_core.va), an isothermal model and an electrothermal model.
//
//`define electroThermal
`define LEVEL 1002
`define GFORM // if GFORM is defined an I=V*g formulation is used, else a V=I*r formulation is used
`define VERSION 1.0
`define REVISION 0.0
//
// r2[_et]_cmc: Compact Model Council (CMC) 2-terminal Resistor Model
//
// This is the 2-terminal resistor model developed by the resistor
// subcommittee of the CMC. The goal was to have a standard 2-terminal
// resistor model with standard parameter names and a standard,
// numerically well behaved nonlinearity model.
//
// The nonlinearity model is that proposed by Agere Systems
// (from Kausar Banoo, Kumud Singhal, and Hermann Gummel).
//
// A self-heating (electro-thermal) version is included via conditionals.
// It is anticipated that this will be provided as a separate
// form of the model (r2_et_cmc where "et" means electro-thermal)
// and the local temperature rise terminal will be made available
// optionally, this has been requested for resistors in power
// technologies. The non-self-heating form, r2_cmc, is expected to
// be available as a new level model (the level number assigned
// depending on what level models are already available within
// a simulator, the value of 2 used here is an example).
//
//
// Version 1.0
// Revision 0.0
// Date 2005 Nov 12
// Comments Model as approved at Oct 2005 CMC meeting
// - notes from Agere systems added to documentation
//
// Version 1.0
// Revision 0.0_preview3
// Date 2005 Oct 08
// Comments Updates based on second round of comments
// - electrothermal model name changed to r2_et_cmc so the
// _cmc tag would be at the end
// - top-level calling structure changed to make addition
// of other models more structured, and have all information
// directly relevant to r2[_et]_cmc in this file
// - LEVEL and other parameters moved to this file rather than
// the top-level file for the same reason, and LEVEL was
// set to the value 1002
// - single line if statements have begin ... end added for safety
// and consistency of style
// - linear TC added for flicker noise coefficient
// - notes and documentation added that
// tc1, tc2, c1, c2, isnoisy
// should be both instance and model parameters
// - tc1e and tc2e (the effective temperature coefficients of resistance)
// were updated to include a width dependence and to
// have a length dependence that varies with c1 and c2
// - added an instance parameter switch sw_et to enable the self-heating
// model to be turned off
// - added min and max parameters for length and width, and if
// a drawn geometry is outside these limits then a warning is issued
// - handling of tmin and tmax changed:
// specific clipping limits added (used for self-heating)
// warnings added if ambient temperature is outside the limits
// clipping of temperature to limits changed to be smooth
// - temperature coefficient of resistance clamped smoothly
// rather than having a hard limit
//
// Version 1.0
// Revision 0.0_preview2
// Date 2005 Sep 02
// Comments Updates based on first round of comments
// - changed name to r2_cmc from cmc_r2
// - fixed up improperly defined variables
// - modified some names for consistency with documentation
// - set up a top-level file that up both
// isoThermal and electroThermal versions are defined
// - set switch to resistance form to be done based on
// resistance at tnom, so the form does not change
// during a temperature sweep
// - fixed errors in LRM2.2 code
//
// Version 1.0
// Revision 0.0_preview1
// Date 2005 Jul 01
// Comments Initial code for review by CMC resistor subcommittee
//
//
// Instance parameters are:
// m multiplicity factor (number in parallel, implicit for LRM2.2)
// w design width of resistor body
// l design length of resistor body
// r resistance (per segment, total resistance is r/m)
// c1 contact at terminal 1: 0=no 1=yes
// c2 contact at terminal 2: 0=no 1=yes
// trise local temperature delta to ambient (before self-heating)
// isnoisy switch for noise: 0=no 1=yes
//
//
// The c1 and c2 parameters control the addition of "end" effects
// to the model. If these are both zero ("no contact") then no end
// effects are added. If only one is non-zero 1/2 the end effects are
// added. If both are non-zero full end effects are added. This
// is to facilitate the implementation of multi-section models in a
// subckt. c1=c2=0 for all internal sections, c1=0,c2=1 for the
// "left" end segment, c1=1,c2=0 for the "right" end segment.
//
// The basic nonlinearity is:
//
// R=R0*(1-p2-p3+p2*sqrt(1+(q2*E)**2)+p3*cbrt(1+(q3*abs(E))**3))
//
// where cbrt() is the cube root operation. The use
// of abs(E) leads to a singularity in higher order derivatives,
// but because of the power of the term it does not show up
// until the 4th derivative of the current.
//
// For q3*abs(E) somewhat greater than 1, the p3,q3 term
// leads a resistance factor of (1+p3*(q3*abs(E)-1)) so p3*q3
// is in essence a first order field coefficient of
// resistance.
// For q2*E somewhat less than 1, the p2,q2 term leads to a
// resistance factor (1+0.5*p2*(q2*E)**2) so 0.5*p2*q2**2 is in essence
// a second order field coefficient of resistance.
// The bias dependent nonlinearity is done via field rather than voltage,
// to get reasonable scaling with length.
//
// There is no explicit handling of end resistances, they are assumed
// to be accounted for by xl. If there is a difference between the TC's
// of the end resistance compared to the body resistance, it can be shown that
// TC_overall=TC_body+Rend*(TC_end-TC_body)/(rsh*(L+xl))
// therefore a 1/length term is included for the TCs to allow this effect
// to be modeled.
//
// Some Verilog-A compilers have difficulties handling the contrib type
// switch based on resistance value. Conditional switches have been
// put in this code to handle this for now. Comment out the `define GFORM
// line at the top to switch to the resistance form.
//
//
// Usage with model:
// instanceId (n1 n2) modelName l=L w=W [trise=TRISE] [m]
// model modelName r[esistor]
// + level=assignedLevelForR2_CmcModel
// + param=value
// OR (for simulators that use model names rather than levels)
// model modelName r2_cmc
// + param=value
// (NOTE: specify any two of w,l,r and the other will be calculated).
//
// Usage without model:
// instanceId (n1 n2) r[esistor] r=value [trise=TRISE] [m]
//
// If this model is used with only r specified, then the geometry is taken
// to be w/l=1um/1um and these values are used for 1/f noise calculation.
// Note that this then means the 1/f noise is not geometry dependent,
// which is incorrect. For proper modeling of 1/f noise you
// should use the form where two of w,l,r are specified as instance parameters.
//
// The following parameters should be treated as model or instance parameters,
// with instance parameter specification over-riding model parameter specification:
// tc1
// tc2
// c1
// c2
// isnoisy
// There is no construct in Verilog-A for denoting this, but this should be
// implemented as such within a simulator.
//
//
// Verilog-A Notes:
//
// 1. It is expected that, to be able to handle small- and zero-value resistances,
// the model implementation will transform from an I=G*V form for higher resistance
// values to a V=I*R form for lower resistance values. The switch should be based
// on zero-bias resistance, not voltage (and, for the self-heating version temperature)
// dependent resistance, to avoid changing the model formulation during simulation.
// The "G" or "R" formulation should be determined once at set-up and kept from then on.
// The current and voltage calculations are separated from noise calculations,
// to partition code for implementation efficiency. This causes errors with some
// Verilog-A compilers, as they think the contribution type can switch between
// various parts of the code. Therefore the switch is done using the macro `GFORM,
// and commented equivalent Verilog-A code is included, to indicate the intent.
//
// 2. There is no way to implement the LRM2.2 $param_given() function in
// LRM2.1 code, the concept is not part of the language. Therefore the
// model ONLY works with w,l specified as instance parameters when run
// in an LRM2.1 compliant compiler. Also, although the "m" parameter is
// known for LRM2.2, it apparently still needs to be declared explicity
// as a model parameter.
//
// 3. When testing with the R form of the model, there are some differences in
// simulation results w.r.t. the G form of the model, which was used to generate
// the reference test results. These appear to be from slight differences in convergence.
//
// Apologies for the nested conditionals. It makes the code hard to read, but is
// needed as there are different possible forms (isothermal, electrothermal;
// conductance form, resistance form) as well as different syntax for different
// language versions.
//
// There is no `ifndef XXX in Verilog-A, the "notXXX" macros are defined for convenience.
//
`ifdef electroThermal
`ifdef notElectroThermal
`undef notElectroThermal
`endif
`else
`define notElectroThermal
`endif
`ifdef electroThermal
module r2_et_cmc(n1,n2);
`else
module r2_cmc(n1,n2);
`endif
//`ifdef insideADMS
// (*
// info="r2_cmc two-terminal resistor model"
// version=`VERSION
// revision=`REVISION
// spice:prefix="r"
// spice:level=`LEVEL
// *)
//`endif
//;
//
// Node definitions (if the self-heating modeling is selected, the
// local temperature rise node is internal, and not external)
//
inout n1,n2;
electrical n1;
electrical n2;
`ifdef electroThermal
electrical dt;
`endif
//
// Branch definitions
//
branch (n1,n2) b_r; // resistance
branch (n1,n2) b_n; // separate definition for noise, which is always a current contribution
`ifdef electroThermal
branch (dt) b_rth; // thermal resistance
branch (dt) b_ith; // thermal generation, 2nd definition is to fool floating node detection in some compilers
`endif
//
// Instance parameters
//
`IPM
`IPRco( w , 1.0e-06,"m" , 0.0, inf, "design width of resistor body")
`IPRco( l , 1.0e-06,"m" , 0.0, inf, "design length of resistor body")
`IPRco( r , 100.0 ,"Ohm" , 0.0, inf, "resistance (per segment, total resistance is r/m)")
`IPIcc( c1 , 1 ,"" , 0, 1, "contact at terminal 1: 0=no 1=yes")
`IPIcc( c2 , 1 ,"" , 0, 1, "contact at terminal 2: 0=no 1=yes")
`IPRnb( trise , 0.0 ,"degC" , "local temperature delta to ambient (before self-heating)")
`IPIcc( isnoisy , 1 ,"" , 0, 1, "switch for noise: 0=no and 1=yes")
`ifdef electroThermal
`IPIcc( sw_et , 1 ,"" , 0, 1, "switch for turning off self-heating: 0=exclude and 1=include")
`endif
//
// Special model parameters, some may be simulator global parameters
//
`MPRnb( version , `VERSION ,"" , "model version")
`MPRnb( revision, `REVISION,"" , "model revision (subversion)")
`MPRoc( scale , 1.0 ,"" , 0.0, 1.0, "scale factor for instance geometries")
`MPRco( shrink , 0.0 ,"%" , 0.0, 100.0, "shrink percentage for instance geometries")
`MPRcc( tmin ,-100.0 ,"degC" ,-250.0, 27.0, "minimum ambient temperature")
`MPRcc( tmax , 500.0 ,"degC" , 27.0,1000.0, "maximum ambient temperature")
`MPRoo( rthresh , 1.0e-03,"Ohm" , 0.0, inf, "threshold to switch to resistance form")
//
// Model parameters
//
`MPRnb( level , `LEVEL ,"" , "model level")
`MPRcc( tnom , 27.0 ,"degC" ,-250.0,1000.0, "nominal (reference) temperature")
`MPRoo( rsh , 100.0 ,"Ohm/sq" , 0.0, inf, "sheet resistance")
`MPRco( lmin , 0.0 ,"um" , 0.0, inf, "minimum allowed drawn length")
`MPRoo( lmax , 9.9e09 ,"um" , 0.0, inf, "maximum allowed drawn length")
`MPRco( wmin , 0.0 ,"um" , 0.0, inf, "minimum allowed drawn width")
`MPRoo( wmax , 9.9e09 ,"um" , 0.0, inf, "maximum allowed drawn width")
`MPRnb( xw , 0.0 ,"um" , "width offset (total)")
`MPRnb( xl , 0.0 ,"um" , "length offset (total)")
`MPRnb( dxle , 0.0 ,"um" , "length delta for field calculation")
`MPIcc( sw_efgeo, 0 ,"" , 0, 1, "switch for electric field geometry calculation: 0=design and 1=effective")
`MPRco( q3 , 0.0 ,"um/V" , 0.0, inf, "1/field at which the linear field coefficient activates")
`MPRco( p3 , 0.0 ,"" , 0.0, 1.0, "linear field coefficient factor: EC1=p3*q3")
`MPRco( q2 , 0.0 ,"um/V" , 0.0, inf, "1/field at which the quadratic field coefficient activates")
`MPRco( p2 , 0.0 ,"" , 0.0,1.0-p3, "quadratic field coefficient factor: EC2=0.5*p2*q2^2")
`MPRco( kfn , 0.0 ,"" , 0.0, inf, "flicker noise coefficient (unit depends on afn)")
`MPRoo( afn , 2.0 ,"" , 0.0, inf, "flicker noise current exponent")
`MPRoo( bfn , 1.0 ,"" , 0.0, inf, "flicker noise 1/f exponent")
`MPIcc( sw_fngeo, 0 ,"" , 0, 1, "switch for flicker noise geometry calculation: 0=design and 1=effective")
`MPRoo( jmax , 100.0 ,"A/um" , 0.0, inf, "maximum current density")
`MPRcc( tminclip,-100.0 ,"degC" ,-250.0, 27.0, "clip minimum temperature")
`MPRcc( tmaxclip, 500.0 ,"degC" , 27.0,1000.0, "clip maximum temperature")
`MPRnb( tc1 , 0.0 ,"/K" , "resistance linear TC")
`MPRnb( tc2 , 0.0 ,"/K^2" , "resistance quadratic TC")
`MPRnb( tc1l , 0.0 ,"um/K" , "resistance linear TC length coefficient")
`MPRnb( tc2l , 0.0 ,"um/K^2" , "resistance quadratic TC length coefficient")
`MPRnb( tc1w , 0.0 ,"um/K" , "resistance linear TC width coefficient")
`MPRnb( tc2w , 0.0 ,"um/K^2" , "resistance quadratic TC width coefficient")
`MPRnb( tc1kfn , 0.0 ,"" , "flicker noise coefficient linear TC")
`ifdef electroThermal
`MPRoo( gth0 , 1.0e+06,"W/K" , 0.0, inf, "thermal conductance fixed component")
`MPRco( gthp , 0.0 ,"W/K/um" , 0.0, inf, "thermal conductance perimeter component")
`MPRco( gtha , 0.0 ,"W/K/um^2" , 0.0, inf, "thermal conductance area component")
`MPRco( cth0 , 0.0 ,"s*W/K" , 0.0, inf, "thermal capacitance fixed component")
`MPRco( cthp , 0.0 ,"s*W/K/um" , 0.0, inf, "thermal capacitance perimeter component")
`MPRco( ctha , 0.0 ,"s*W/K/um^2", 0.0, inf, "thermal capacitance area component")
`endif
//
// Supported aliases for parameters
//
`ALIAS(dtemp,trise)
`ALIAS(dta,trise)
//
// These variables will be displayed as part of operating point information.
//
`OPP( v ,"V" ,"voltage across resistor")
`OPP( i ,"A" ,"current through resistor")
`OPP( power_dis ,"W" ,"dissipated power")
`OPP( leff_um ,"um" ,"effective electrical length in um")
`OPP( weff_um ,"um" ,"effective electrical width in um")
`OPP( r0 ,"Ohm" ,"zero-bias resistance (per segment)")
`OPP( r_dc ,"Ohm" ,"DC resistance (including bias dependence and m)")
`OPP( r_ac ,"Ohm" ,"AC resistance (including bias dependence and m)")
`ifdef electroThermal
`OPP( rth ,"K/W" ,"thermal resistance")
`OPP( cth ,"s*W/K","thermal capacitance")
`OPP( dt_et ,"K" ,"self-heating temperature rise")
`endif
`ifdef notInsideADMS
analog begin : analogBlock
`endif
real tiniK,tdevK,scaleFac,shrinkL,delt,tcr,xleff;
real lFactor,l_um,w_um,l_umForE,g0,r0_t,g0_t,kfn_t;
real sqrf,cbrf,tdevC,wn,fn,rthrR2;
real rFactor,vin,E,q2E,q3E,tc1e,tc2e;
integer GFORM;
`ifdef __VAMS_COMPACT_MODELING__
`ifdef GFORM
real g_ac;
`else
real drfdv;
`endif
`else
real drfdv,g_ac;
`endif
`ifdef electroThermal
real gth,Vrth,Ith,Irth,Qcth,p_um,a_um2,dg0dt,tmp1;
`endif
//
// Code independent of bias or instance parameters
//
`ifdef insideADMS
analog begin
@(initial_model) begin
`else
begin : initializeModel
`endif
if (level!=`LEVEL) begin
`ERROR("ERROR: r2 model called with incorrect level parameter")
end
`SCALE
`SHRINKL
`RTHRESH
lFactor = shrinkL*scaleFac*1.0e6; // conversion factor from instance l to um
tiniK = `TABS_NIST2004+tnom;
tdevC = $temperature+trise-`TABS_NIST2004; // device temperature
if (tdevC<tmin) begin
`WARNING("WARNING: ambient temperature is lower than allowed minimum");
end
if (tdevC>tmax) begin
`WARNING("WARNING: ambient temperature is higher than allowed maximum");
end
`ifdef notElectroThermal
`CLIPB1p0(tdevC,tdevC,tminclip,tmaxclip);
tdevK = tdevC+`TABS_NIST2004;
delt = tdevK-tiniK; // temperature w.r.t. tnom
kfn_t = (1+delt*tc1kfn)*kfn;
if (kfn_t<0.0) begin
kfn_t = 0.0;
end
`endif
end // initializeModel
//
// Code independent of bias but dependent on instance parameters
//
`ifdef insideADMS
@(initial_instance) begin
`else
begin : initializeInstance
`endif
if (c1&&c2) begin
xleff = xl; // contacted at both ends, use full xl
end else if (c1||c2) begin
xleff = xl*0.5; // contacted at one end, include 1/2 of xl effect
end else begin
xleff = 0.0; // not contacted
end
//
// For geometric processing, the order of importance is taken to be
// w,l,r. The evaluation of whether a V contrib should be used, for
// low resistance, rather than the usual I contrib, is based on
// calculations at nominal temperature and zero bias, and so will
// not cause a formulation switch with bias. The cases where
// conductance or resistance are zero is handled.
//
if (`TESTGIVEN(l)&&`TESTGIVEN(r)&&!`TESTGIVEN(w)) begin
//
// If l and r are specified, but w is not, then calculate w
// (if w is also specified, this over-rides the specified r)
//
if (r==0.0||l==0.0) begin
l_um = 0.0;
leff_um = 0.0;
w_um = w*lFactor;
weff_um = w_um+xw; // this could be negative, but has no effect so is not flagged as `ERROR
r0 = 0.0;
g0 = 1.0e99; // cannot set to inf
end else begin
l_um = l*lFactor;
leff_um = l_um+xleff;
if (leff_um<0.0) begin
`ERROR("ERROR: calculated effective r2_cmc resistor length is < 0.0")
end
if (leff_um>0.0) begin
weff_um = (rsh/r)*leff_um;
w_um = weff_um-xw;
if (w_um<=0.0) begin
`ERROR("ERROR: calculated design r2_cmc resistor width is <= 0.0")
end
r0 = r;
g0 = 1.0/r0;
end else begin
w_um = w*lFactor;
weff_um = w_um+xw; // this could be negative, but has no effect so is not flagged as `ERROR
r0 = 0.0;
g0 = 1.0e99; // cannot set to inf
end
end
end else if (`TESTGIVEN(r)&&!`TESTGIVEN(l)) begin
//
// If r is specified, but l is not, calculate l based on either
// a specified or the default w (it does not matter which),
// this also handles the case of usage without a .model card
//
if (r==0.0) begin
l_um = 0.0;
leff_um = 0.0;
w_um = w*lFactor;
weff_um = w_um+xw; // this could be negative, but has no effect so is not flagged as `ERROR
r0 = 0.0;
g0 = 1.0e99; // cannot set to inf
end else if (w==0.0) begin
w_um = 0.0;
weff_um = 0.0;
l_um = l*lFactor;
leff_um = l_um+xleff; // this could be negative, but has no effect so is not flagged as `ERROR
r0 = 1.0e99; // cannot set to inf
g0 = 0.0;
end else begin
w_um = w*lFactor;
weff_um = w_um+xw;
if (weff_um<0.0) begin
`ERROR("ERROR: calculated effective r2_cmc resistor width is < 0.0")
end
if (weff_um>0.0) begin
leff_um = (r/rsh)*weff_um;
l_um = leff_um-xleff;
if (l_um<=0.0) begin
`ERROR("ERROR: calculated design r2_cmc resistor length is <= 0.0")
end
r0 = r;
g0 = 1.0/r0;
end else begin
l_um = l*lFactor;
leff_um = l_um+xleff; // this could be negative, but has no effect so is not flagged as `ERROR
r0 = 1.0e99; // cannot set to inf
g0 = 0.0;
end
end
end else begin
//
// For all other cases, r is calculated as a function of
// geometry, either specified or default. Either l and w
// are both specified, in which case they over-ride
// specification of r, or else r is not specified.
//
if (w==0.0) begin
w_um = 0.0;
weff_um = 0.0;
l_um = l*lFactor;
leff_um = l_um+xleff; // this could be negative, but has no effect so is not flagged as `ERROR
r0 = 1.0e99; // cannot set to inf
g0 = 0.0;
end else if (l==0.0) begin
l_um = 0.0;
leff_um = 0.0;
w_um = w*lFactor;
weff_um = w_um+xw; // this could be negative, but has no effect so is not flagged as `ERROR
r0 = 0.0;
g0 = 1.0e99; // cannot set to inf
end else begin
w_um = w*lFactor;
weff_um = w_um+xw;
if (weff_um<0.0) begin
`ERROR("ERROR: calculated effective r2_cmc resistor width is < 0.0")
end
l_um = l*lFactor;
leff_um = l_um+xleff;
if (weff_um>0.0) begin
if (leff_um<0.0) begin
`ERROR("ERROR: calculated effective r2_cmc resistor length is < 0.0")
end
if (leff_um>0.0) begin
r0 = rsh*(leff_um/weff_um);
g0 = 1.0/r0;
end else begin
r0 = 0.0;
g0 = 1.0e99; // cannot set to inf
end
end else begin
r0 = 1.0e99; // cannot set to inf, also don't need to check if(leff_um>0.0) for this case
g0 = 0.0;
end
end
end
if (l_um<lmin) begin
`WARNING("WARNING: drawn length is smaller than allowed minimum");
end
if (l_um>lmax) begin
`WARNING("WARNING: drawn length is greater than allowed maximum");
end
if (w_um<wmin) begin
`WARNING("WARNING: drawn width is smaller than allowed minimum");
end
if (w_um>wmax) begin
`WARNING("WARNING: drawn width is greater than allowed maximum");
end
if (sw_efgeo) begin
l_umForE = leff_um+dxle;
end else begin
l_umForE = l_um+dxle;
end
if (l_umForE<=0.0&&r0>0.0&&(p2>0.0||p3>0.0)) begin
`ERROR("ERROR: calculated effective r2_cmc resistor length for E calculation is < 0.0")
end
tc1e = tc1;
tc2e = tc2;
if (leff_um>0.0) begin
if (c1&&c2) begin
tc1e = tc1e+tc1l/leff_um;
tc2e = tc2e+tc2l/leff_um;
end else if (c1||c2) begin
tc1e = tc1e+0.5*tc1l/leff_um;
tc2e = tc2e+0.5*tc2l/leff_um;
end
end
if (weff_um>0.0) begin
tc1e = tc1e+tc1w/weff_um;
tc2e = tc2e+tc2w/weff_um;
end
`ifdef __VAMS_COMPACT_MODELING__
if (r0>(rthrR2/$mfactor)) begin
`else
if (r0>(rthrR2/m)) begin
`endif
GFORM = 1;
end else begin
GFORM = 0;
end
`ifdef electroThermal
if (c1&&c2) begin
p_um = 2.0*(l_um+w_um);
end else if (c1||c2) begin
p_um = 2.0*l_um+w_um;
end else begin
p_um = 2.0*l_um;
end
a_um2 = l_um*w_um;
gth = gth0+gthp*p_um+gtha*a_um2;
cth = cth0+cthp*p_um+ctha*a_um2;
`else // notElectroThermal
tcr = (1+delt*(tc1e+delt*tc2e));
`CLIPL0p1(tcr,tcr,0.01)
r0_t = r0*tcr;
g0_t = g0/tcr;
`endif
end // initialInstance
//
// DC bias dependent quantities
//
// Note that for the resistance form the expression for v(i)
// is implicit in v because of the voltage dependence of conductance.
// For efficiency the nonlinearity is not computed if the
// field coefficients are zero.
//
begin : evaluateStatic
`ifdef electroThermal
Vrth = sw_et*V(b_rth);
tdevC = tdevC+Vrth;
`CLIPB1p0(tdevC,tdevC,tminclip,tmaxclip);
tdevK = tdevC+`TABS_NIST2004;
delt = tdevK-tiniK; // temperature w.r.t. tnom
tcr = (1+delt*(tc1e+delt*tc2e));
`CLIPL0p1(tcr,tcr,0.01)
r0_t = r0*tcr;
g0_t = g0/tcr;
kfn_t = (1+delt*tc1kfn)*kfn;
if (kfn_t<0.0) begin
kfn_t = 0.0;
end
`endif
vin = V(b_r);
if (r0>0.0&&(p2>0.0||p3>0.0)) begin
E = vin/l_umForE;
q2E = q2*E;
sqrf = sqrt(1.0+q2E*q2E);
q3E = q3*abs(E);
cbrf = pow((1.0+q3E*q3E*q3E),`oneThird);
rFactor = 1.0-p2-p3+p2*sqrf+p3*cbrf;
end else
rFactor = 1.0;
r_dc = r0_t*rFactor;
`ifdef GFORM // if (GFORM) begin
v = vin;
i = v/r_dc;
`else // end else begin // RFORM
`ifdef __VAMS_COMPACT_MODELING__
i = I(b_r);
`else
i = I(b_r)/m; // need per-segment value
`endif
v = i*r_dc;
`endif // end
`ifdef electroThermal
Ith = -v*i; // power generation, negative as it flows from dt to 0
Irth = Vrth*gth;
`endif
if (weff_um>0.0) begin
if (abs(i/weff_um)>jmax) begin
`WARNING("WARNING: current density is greater than specified by jmax");
end
end
end // evaluateStatic
begin : evaluateDynamic
`ifdef electroThermal
Qcth = Vrth*cth;
`endif
end // evaluateDynamic
begin : loadStatic
`ifdef GFORM // if (GFORM) begin
`ifdef __VAMS_COMPACT_MODELING__
I(b_r) <+ i;
`else
I(b_r) <+ i*m;
`endif
`else // end else begin // RFORM
V(b_r) <+ v;
`endif // end
`ifdef electroThermal
`ifdef __VAMS_COMPACT_MODELING__
I(b_rth) <+ Irth;
I(b_ith) <+ Ith;
`else
I(b_rth) <+ Irth*m;
I(b_ith) <+ Ith*m;
`endif
`endif
end // loadStatic
begin : loadDynamic
`ifdef electroThermal
`ifdef __VAMS_COMPACT_MODELING__
I(b_rth) <+ ddt(Qcth);
`else
I(b_rth) <+ ddt(Qcth*m);
`endif
`endif
end // loadDynamic
//
// Noise contributions
//
`ifdef insideADMS
@(noise) begin
`else
begin : noise
`endif
if (isnoisy&&r0>0.0&&g0>0.0) begin
wn = 4.0*`KB_NIST2004*tdevK*g0_t/rFactor;
if (sw_fngeo&&leff_um>0.0&&weff_um>0.0) begin
fn = kfn_t*pow(abs(i/weff_um),afn)*weff_um/leff_um;
end else if (l_um>0.0&&w_um>0.0) begin
fn = kfn_t*pow(abs(i/w_um),afn)*w_um/l_um;
end else begin
fn = 0.0;
end
end else begin
wn = 0.0;
fn = 0.0;
end
`ifdef not__VAMS_COMPACT_MODELING__
wn = wn*m;
fn = fn*m;
`endif
I(b_n) <+ white_noise(wn,"white noise");
I(b_n) <+ flicker_noise(fn,bfn,"1/f noise");
end // noise
//
// Useful quantities to display for OP and other purposes
//
// LRM2.2 allows use of ddx() which means explicit, hand-coded
// calculation of derivatives is not required. However for the
// electroThermal model the derivatives need to be calculated
// as the total derivative is required for display, not just
// the partial with respect to terminal voltages or branch
// currents (which is all that is available from ddx()).
//
// For: i=v*g0_t/rf(v) (where rf is a short-hand for rFactor)
// g_ac=di_dv=g0_t/rf-g0_t*v*drf_dv/rf^2=(g0_t-i*drf_dv)/rf
//
// For: v=i*r0_t*rf(v)
// r_ac=dv_di=r0_t*rf+i*r0_t*drf_dv*dv_di=ddx(v,I(b_r))+(v*drf_dv/rf)*r_ac
// therefore
// r_ac=ddx(v,I(b_r))/(1-v*drf_dv/rf)
//
// For the electroThermal conductance form model:
// i=v*g0(t)/rf(v)
// g0(t)=g0/tcr=g0/(1+delt*(tc1e+delt*tc2e))
// delt=i*v/gth
// therefore
// ddelt_dv=i/gth+(v/gth)*di_dv
// dg0_dt=ddx(g0_t,V(dt))=g0(t)*(tc1e+2*delt*tc2e)/tcr
// di_dv=ddx(i,V(n1))+(v/rf)*dg0_dt*di_dv
// g_ac=(ddx(i,V(n1))+i*v*dg0_dt/(gth*rf))/(1-v*v*dg0_dt/(gth*rf))
// which is what is implemented below.
//
// For the electroThermal resistance form model:
// v=i*r0(t)*rf(v)
// r0(t)=r0*tcr=r0*(1+delt*(tc1e+delt*tc2e))
// delt=i*v/gth
// therefore
// ddelt_i=v/gth+(i/gth)*dv_di
// dr0_dt=ddx(r0_t,V(dt))=r0*(tc1e+2*delt*tc2e)
// dv_di=ddx(v,I(b_r))+i*r0*drf_dv*dv_di+i*rf*dr0_dt*ddelt_di
// r_ac=(ddx(v,I(b_r))+v*i*rf*dr0_dt/gth)/(1-v*drf_dv/rf-i*i*rf*dr0_dt/gth)
// which is what is implemented below.
//
begin : postProcess
power_dis = i*v;
if (r0>0.0&&g0>0.0) begin
r_dc = r0_t*rFactor;
`ifdef __VAMS_COMPACT_MODELING__
`ifdef GFORM // if (GFORM) begin
g_ac = ddx(i,V(n1));
`ifdef electroThermal
dg0dt = ddx(g0_t,V(dt));
tmp1 = v*dg0dt/(gth*rFactor);
if ((1.0-v*tmp1)!=0.0) begin
g_ac = (g_ac+i*tmp1)/(1.0-v*tmp1); // denominator is zero in thermal runaway, cannot happen if tcr>0
end else begin
g_ac = 1.0e99;
end
`endif
if (g_ac!=0.0) begin
r_ac = 1.0/g_ac;
end else begin
r_ac = 1.0e99;
end
`else // end else begin // RFORM
drfdv = ddx(rFactor,V(n1));
`ifdef electroThermal
dg0dt = 1.0/ddx(r0_t,V(dt));
tmp1 = i*rFactor/(dg0dt*gth);
if ((1.0-v*drfdv/rFactor-i*tmp1)!=0.0) begin
r_ac = (ddx(v,I(b_r))+v*tmp1)/(1.0-v*drfdv/rFactor-i*tmp1);
end else begin
r_ac = 1.0e99;
end
`else // notElectroThermal
r_ac = ddx(v,I(b_r))/(1.0-v*drfdv/rFactor);
`endif
`endif // end
`else // not__VAMS_COMPACT_MODELING__
if ((p2>0.0||p3>0.0)) begin
if (vin>=0.0)
drfdv = (p2*q2*q2E/sqrf+p3*q3*q3E*q3E/(cbrf*cbrf))/l_umForE;
else
drfdv = (p2*q2*q2E/sqrf-p3*q3*q3E*q3E/(cbrf*cbrf))/l_umForE;
g_ac = (g0_t-i*drfdv)/rFactor;
end else
g_ac = 1.0/r_dc;
`ifdef electroThermal
dg0dt = -g0_t*(tc1e+2.0*delt*tc2e)/tcr;
tmp1 = v*dg0dt/(gth*rFactor);
if ((1.0-v*tmp1)!=0.0) begin
g_ac = (g_ac+i*tmp1)/(1.0-v*tmp1); // denominator is zero in thermal runaway, cannot happen if tcr>0
end else begin
g_ac = 1.0e99;
end
`endif
if (g_ac!=0.0) begin
r_ac = 1.0/g_ac;
end else begin
r_ac = 1.0e99;
end
`endif
end else begin
r_dc = r0; // this is 1.0e99 if g0==0.0, cannot set to inf
r_ac = r0; // this is 1.0e99 if g0==0.0, cannot set to inf
end
`ifdef __VAMS_COMPACT_MODELING__
// i = $mfactor*i;
// power = $mfactor*power;
// r_dc = r_dc/$mfactor;
// r_ac = r_ac/$mfactor;
i = 1*i;
power_dis = 1*power_dis;
r_dc = r_dc/1;
r_ac = r_ac/1;
`else // not__VAMS_COMPACT_MODELING__
i = m*i;
power_dis = m*power_dis;
r_dc = r_dc/m;
r_ac = r_ac/m;
`endif
`ifdef electroThermal
dt_et = Vrth;
`ifdef __VAMS_COMPACT_MODELING__
// rth = 1.0/(gth*$mfactor);
// cth = cth*$mfactor;
rth = 1.0/(gth*1);
cth = cth*1;
`else // not__VAMS_COMPACT_MODELING__
rth = 1.0/(gth*m);
cth = cth*m;
`endif
`endif
end // postProcess
end // analog
endmodule