rm vacode
This commit is contained in:
parent
51d732a7ba
commit
35b1cc59e3
|
|
@ -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
|
||||
|
|
@ -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
|
|
@ -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.
|
||||
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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;
|
||||
|
|
@ -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];
|
||||
|
|
@ -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
|
|
@ -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
|
|
@ -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.
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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;
|
||||
|
|
@ -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" )
|
||||
|
|
@ -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
|
||||
|
|
@ -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;
|
||||
|
|
@ -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);
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
|
@ -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);
|
||||
|
||||
|
|
@ -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")
|
||||
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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.
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
Loading…
Reference in New Issue