verilog-a files in adms removed
for testing with downloadable distribution
This commit is contained in:
parent
bf4921951b
commit
9c5a2d0810
|
|
@ -1,42 +0,0 @@
|
|||
# -*- makefile -*-
|
||||
# (compile "make -i -f my.mak to")
|
||||
|
||||
CFLAGS=-I ../../../../../include -I ../../../../../../../w32/src/include
|
||||
|
||||
SRCS = \
|
||||
r2_cmcacld.c r2_cmc.analogfunction.c r2_cmcask.c r2_cmc.c r2_cmcdel.c r2_cmcdest.c r2_cmcguesstopology.c r2_cmcinit.c r2_cmcload.c r2_cmcmask.c r2_cmcmdel.c r2_cmcmpar.c r2_cmcnoise.c r2_cmcpar.c r2_cmcpzld.c r2_cmcsetup.c r2_cmctemp.c r2_cmctrunc.c
|
||||
|
||||
to : $(SRCS:%.c=%.o)
|
||||
|
||||
scripts = \
|
||||
-x \
|
||||
-e ../../admst/adms.implicit.xml \
|
||||
-e ../../admst/ngspiceVersion.xml \
|
||||
-e ../../admst/analogfunction.xml \
|
||||
-e ../../admst/ngspiceMODULEitf.h.xml \
|
||||
-e ../../admst/ngspiceMODULEinit.c.xml \
|
||||
-e ../../admst/ngspiceMODULEinit.h.xml \
|
||||
-e ../../admst/ngspiceMODULEext.h.xml \
|
||||
-e ../../admst/ngspiceMODULEdefs.h.xml \
|
||||
-e ../../admst/ngspiceMODULEask.c.xml \
|
||||
-e ../../admst/ngspiceMODULEmask.c.xml \
|
||||
-e ../../admst/ngspiceMODULEpar.c.xml \
|
||||
-e ../../admst/ngspiceMODULEmpar.c.xml \
|
||||
-e ../../admst/ngspiceMODULEload.c.xml \
|
||||
-e ../../admst/ngspiceMODULEacld.c.xml \
|
||||
-e ../../admst/ngspiceMODULEpzld.c.xml \
|
||||
-e ../../admst/ngspiceMODULEtemp.c.xml \
|
||||
-e ../../admst/ngspiceMODULEtrunc.c.xml \
|
||||
-e ../../admst/ngspiceMODULEsetup.c.xml \
|
||||
-e ../../admst/ngspiceMODULEdel.c.xml \
|
||||
-e ../../admst/ngspiceMODULEmdel.c.xml \
|
||||
-e ../../admst/ngspiceMODULEdest.c.xml \
|
||||
-e ../../admst/ngspiceMODULEnoise.c.xml \
|
||||
-e ../../admst/ngspiceMODULEguesstopology.c.xml \
|
||||
-e ../../admst/ngspiceMODULE.hxx.xml \
|
||||
-e ../../admst/ngspiceMODULE.c.xml
|
||||
|
||||
$(SRCS) : do
|
||||
|
||||
do : r2_cmc.va
|
||||
../../../../../../adms/ADMS/admsXml/admsXml $(scripts) $<
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
`include "constants.vams"
|
||||
`include "disciplines.vams"
|
||||
|
||||
module r2_cmc(d, s);
|
||||
inout d, s;
|
||||
|
||||
electrical d, s;
|
||||
|
||||
real Taa, Txx;
|
||||
|
||||
analog begin
|
||||
|
||||
Taa = 0;
|
||||
|
||||
// Txx = 0;
|
||||
Txx = Taa;
|
||||
|
||||
Taa = V(d,s);
|
||||
|
||||
Taa = Txx;
|
||||
Taa = 0;
|
||||
|
||||
I(d,s) <+ Taa;
|
||||
end
|
||||
|
||||
endmodule
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,117 +0,0 @@
|
|||
// ********************************************************
|
||||
// **** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016 *****/
|
||||
// * BSIM Common Multi-Gate Model Equations (Verilog-A)
|
||||
// ********************************************************
|
||||
//
|
||||
// ********************************************************
|
||||
// * Copyright 2016 Regents of the University of California.
|
||||
// * All rights reserved.
|
||||
// *
|
||||
// * Project Director: Prof. Chenming Hu.
|
||||
// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu, Sourabh Khandelwal
|
||||
// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao,
|
||||
// * Ali Niknejad, Chenming Hu
|
||||
// ********************************************************
|
||||
// ********************************************************
|
||||
// * NONDISCLOSURE STATEMENT
|
||||
// Software is distributed as is, completely without warranty or service
|
||||
// support. The University of California and its employees are not liable
|
||||
// for the condition or performance of the software.
|
||||
// The University of California owns the copyright and grants users a perpetual,
|
||||
// irrevocable, worldwide, non-exclusive, royalty-free license with
|
||||
// respect to the software as set forth below.
|
||||
// The University of California hereby disclaims all implied warranties.
|
||||
// The University of California grants 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 University of California code
|
||||
// itself but may charge for additions, extensions, or support.
|
||||
// 2. In any product based on the software, the users agree to acknowledge
|
||||
// the University of California that developed the software. This
|
||||
// acknowledgment shall appear in the product documentation.
|
||||
// 3. The users agree to obey all U.S. Government restrictions governing
|
||||
// redistribution or export of the software.
|
||||
// 4. The users agree to reproduce any copyright notice which appears on
|
||||
// the software on any copy or modification of such made available
|
||||
// to others
|
||||
// Agreed to on __Jan 01, 2016__________________
|
||||
// By: ___University of California, Berkeley____
|
||||
// ___Chenming Hu_____________________
|
||||
// ___Professor in Graduate School _______
|
||||
// ********************************************************
|
||||
|
||||
|
||||
`include "constants.vams"
|
||||
`include "disciplines.vams"
|
||||
|
||||
/**************************************************************/
|
||||
/* SHMOD is a model parameter */
|
||||
/* SHMOD = 1 : Self-heating turned on */
|
||||
/* SHMOD = 0 : Self-heating turned off */
|
||||
/* */
|
||||
/* RDSMOD is a model parameter */
|
||||
/* RDSMOD = 1 : External source/drain resistance model */
|
||||
/* RDSMOD = 0 : Internal source/drain resistance model */
|
||||
/* RDSMOD = 2 : Internal Bias Dependent and Bias Independent part of source/drain resistance */
|
||||
/* */
|
||||
/* NQSMOD is a model parameter */
|
||||
/* NQSMOD = 1 : NQS Resistance / gi node turned on */
|
||||
/* NQSMOD = 0 : NQS Resistance / gi node turned off */
|
||||
/* */
|
||||
/* RGATEMOD is a model parameter */
|
||||
/* RGATEMOD = 1 : Gate Resistance / ge node turned on */
|
||||
/* RGATEMOD = 0 : Gate Resistance / ge node turned off */
|
||||
/**************************************************************/
|
||||
//
|
||||
// In Verilog-A the number of internal nodes cannot be controlled by
|
||||
// a model parameter. Therefore we use `define statements
|
||||
// to control it. Comment the following lines whenever
|
||||
// possible for best computational efficiency.
|
||||
`define __OPINFO__
|
||||
`define __DEBUG__
|
||||
`define __SHMOD__
|
||||
`define __RDSMOD__
|
||||
//`define __NQSMOD1__
|
||||
//`define __NQSMOD2__
|
||||
`define __RGATEMOD__
|
||||
`define __TNOIMOD1__ //Correlated Thermal Noise Switch
|
||||
|
||||
`include "common_defs.include"
|
||||
`include "bsimcmg_cfringe.include"
|
||||
|
||||
|
||||
module bsimcmg(d, g, s, e, t);
|
||||
inout g, d, s, e, t;
|
||||
electrical g, d, s, e;
|
||||
electrical si, di;
|
||||
|
||||
`ifdef __NQSMOD1__
|
||||
electrical gi;
|
||||
`endif
|
||||
|
||||
`ifdef __NQSMOD2__
|
||||
electrical q;
|
||||
`endif
|
||||
|
||||
`ifdef __RGATEMOD__
|
||||
electrical ge;
|
||||
`endif
|
||||
|
||||
`ifdef __SHMOD__
|
||||
thermal t;
|
||||
branch (t) rth_branch;
|
||||
branch (t) ith_branch;
|
||||
`else
|
||||
thermal t;
|
||||
`endif
|
||||
|
||||
// Internal node controlled by Correlated Thermal Noise Switch
|
||||
`ifdef __TNOIMOD1__
|
||||
electrical N;
|
||||
`endif
|
||||
|
||||
`include "bsimcmg_body.include"
|
||||
|
||||
|
||||
endmodule
|
||||
|
||||
|
|
@ -1,756 +0,0 @@
|
|||
// ********************************************************
|
||||
// **** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016 ****/
|
||||
// * BSIM Common Multi-Gate Model Equations (Verilog-A)
|
||||
// ********************************************************
|
||||
//
|
||||
// ********************************************************
|
||||
// * Copyright 2016 Regents of the University of California.
|
||||
// * All rights reserved.
|
||||
// *
|
||||
// * Project Director: Prof. Chenming Hu.
|
||||
// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu, Sourabh Khandelwal
|
||||
// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao,
|
||||
// * Ali Niknejad, Chenming Hu
|
||||
// ********************************************************
|
||||
// ********************************************************
|
||||
// * NONDISCLOSURE STATEMENT
|
||||
// Software is distributed as is, completely without warranty or service
|
||||
// support. The University of California and its employees are not liable
|
||||
// for the condition or performance of the software.
|
||||
// The University of California owns the copyright and grants users a perpetual,
|
||||
// irrevocable, worldwide, non-exclusive, royalty-free license with
|
||||
// respect to the software as set forth below.
|
||||
// The University of California hereby disclaims all implied warranties.
|
||||
// The University of California grants 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 University of California code
|
||||
// itself but may charge for additions, extensions, or support.
|
||||
// 2. In any product based on the software, the users agree to acknowledge
|
||||
// the University of California that developed the software. This
|
||||
// acknowledgment shall appear in the product documentation.
|
||||
// 3. The users agree to obey all U.S. Government restrictions governing
|
||||
// redistribution or export of the software.
|
||||
// 4. The users agree to reproduce any copyright notice which appears on
|
||||
// the software on any copy or modification of such made available
|
||||
// to others
|
||||
// Agreed to on __Jan 01, 2016_________________
|
||||
// By: ___University of California, Berkeley____
|
||||
// ___Chenming Hu_____________________
|
||||
// ___Professor in Graduate School _______
|
||||
// ********************************************************
|
||||
`MPRnb( LNBODY ,0.0 ,"m^-2" ,"" )
|
||||
`MPRnb( NNBODY ,0.0 ,"m^-2" ,"" )
|
||||
`MPRnb( PNBODY ,0.0 ,"m^-1" ,"" )
|
||||
|
||||
`MPRnb( LPHIG ,0.0 ,"m*eV" ,"" )
|
||||
`MPRnb( NPHIG ,0.0 ,"m*eV" ,"" )
|
||||
`MPRnb( PPHIG ,0.0 ,"(m^2)*eV" ,"" )
|
||||
|
||||
`MPRnb( LNGATE ,0.0 ,"m^-2" ,"" )
|
||||
`MPRnb( NNGATE ,0.0 ,"m^-2" ,"" )
|
||||
`MPRnb( PNGATE ,0.0 ,"m^-1" ,"" )
|
||||
|
||||
`MPRnb( LCIT ,0.0 ,"F/m" ,"" )
|
||||
`MPRnb( NCIT ,0.0 ,"F/m" ,"" )
|
||||
`MPRnb( PCIT ,0.0 ,"F" ,"" )
|
||||
|
||||
`MPRnb( LCITR ,LCIT ,"" ,"" )
|
||||
`MPRnb( NCITR ,NCIT ,"" ,"" )
|
||||
`MPRnb( PCITR ,PCIT ,"" ,"" )
|
||||
|
||||
`MPRnb( LCDSC ,0.0 ,"F/m" ,"" )
|
||||
`MPRnb( NCDSC ,0.0 ,"F/m" ,"" )
|
||||
`MPRnb( PCDSC ,0.0 ,"F" ,"" )
|
||||
|
||||
`MPRnb( LCDSCD ,0.0 ,"F/m" ,"" )
|
||||
`MPRnb( NCDSCD ,0.0 ,"F/m" ,"" )
|
||||
`MPRnb( PCDSCD ,0.0 ,"F" ,"" )
|
||||
|
||||
`MPRnb( LCDSCDR ,LCDSCD ,"F/m" ,"" )
|
||||
`MPRnb( NCDSCDR ,NCDSCD ,"F/m" ,"" )
|
||||
`MPRnb( PCDSCDR ,PCDSCD ,"F" ,"" )
|
||||
|
||||
`MPRnb( LDVT0 ,0.0 ,"" ,"" )
|
||||
`MPRnb( NDVT0 ,0.0 ,"" ,"" )
|
||||
`MPRnb( PDVT0 ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LDVT1 ,0.0 ,"" ,"" )
|
||||
`MPRnb( NDVT1 ,0.0 ,"" ,"" )
|
||||
`MPRnb( PDVT1 ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LDVT1SS ,LDVT1 ,"" ,"" )
|
||||
`MPRnb( NDVT1SS ,NDVT1 ,"" ,"" )
|
||||
`MPRnb( PDVT1SS ,PDVT1 ,"" ,"" )
|
||||
|
||||
`MPRnb( LPHIN ,0.0 ,"m*V" ,"" )
|
||||
`MPRnb( NPHIN ,0.0 ,"m*V" ,"" )
|
||||
`MPRnb( PPHIN ,0.0 ,"(m^2)*V" ,"" )
|
||||
|
||||
`MPRnb( LETA0 ,0.0 ,"" ,"" )
|
||||
`MPRnb( NETA0 ,0.0 ,"" ,"" )
|
||||
`MPRnb( PETA0 ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LETA0R ,LETA0 ,"" ,"" )
|
||||
`MPRnb( NETA0R ,NETA0 ,"" ,"" )
|
||||
`MPRnb( PETA0R ,PETA0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LDSUB ,0.0 ,"" ,"" )
|
||||
`MPRnb( NDSUB ,0.0 ,"" ,"" )
|
||||
`MPRnb( PDSUB ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LK1RSCE ,0.0 ,"m*V^(1/2)" ,"" )
|
||||
`MPRnb( NK1RSCE ,0.0 ,"m*V^(1/2)" ,"" )
|
||||
`MPRnb( PK1RSCE ,0.0 ,"(m^2)*V^(1/2)" ,"" )
|
||||
|
||||
`MPRnb( LLPE0 ,0.0 ,"m^2" ,"" )
|
||||
`MPRnb( NLPE0 ,0.0 ,"m^2" ,"" )
|
||||
`MPRnb( PLPE0 ,0.0 ,"m^3" ,"" )
|
||||
|
||||
`MPRnb( LDVTSHIFT ,0.0 ,"m*V" ,"" )
|
||||
`MPRnb( NDVTSHIFT ,0.0 ,"m*V" ,"" )
|
||||
`MPRnb( PDVTSHIFT ,0.0 ,"(m^2)*V" ,"" )
|
||||
|
||||
`MPRnb( LDVTSHIFTR ,LDVTSHIFT ,"" ,"" )
|
||||
`MPRnb( NDVTSHIFTR ,NDVTSHIFT ,"" ,"" )
|
||||
`MPRnb( PDVTSHIFTR ,PDVTSHIFT ,"" ,"" )
|
||||
|
||||
`MPRnb( LPHIBE ,0.0 ,"m*V" ,"" )
|
||||
`MPRnb( NPHIBE ,0.0 ,"m*V" ,"" )
|
||||
`MPRnb( PPHIBE ,0.0 ,"(m^2)*V" ,"" )
|
||||
|
||||
`MPRnb( LK0 ,0.0 ,"m*V" ,"" )
|
||||
`MPRnb( NK0 ,0.0 ,"m*V" ,"" )
|
||||
`MPRnb( PK0 ,0.0 ,"(m^2)*V" ,"" )
|
||||
|
||||
`MPRnb( LK01 ,0.0 ,"(m*V)/K" ,"" )
|
||||
`MPRnb( NK01 ,0.0 ,"(m*V)/K" ,"" )
|
||||
`MPRnb( PK01 ,0.0 ,"(m^2*V)/K" ,"" )
|
||||
|
||||
`MPRnb( LK0SI ,0.0 ,"" ,"" )
|
||||
`MPRnb( NK0SI ,0.0 ,"" ,"" )
|
||||
`MPRnb( PK0SI ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LK0SI1 ,0.0 ,"m/K" ,"" )
|
||||
`MPRnb( NK0SI1 ,0.0 ,"m/K" ,"" )
|
||||
`MPRnb( PK0SI1 ,0.0 ,"(m^2)/K" ,"" )
|
||||
|
||||
`MPRnb( LK1 ,0.0 ,"m*V^(1/2)" ,"" )
|
||||
`MPRnb( NK1 ,0.0 ,"m*V^(1/2)" ,"" )
|
||||
`MPRnb( PK1 ,0.0 ,"(m^2)*V^(1/2)" ,"" )
|
||||
|
||||
`MPRnb( LK11 ,0.0 ,"(m*V^(-1/2))/K" ,"" )
|
||||
`MPRnb( NK11 ,0.0 ,"(m*V^(-1/2))/K" ,"" )
|
||||
`MPRnb( PK11 ,0.0 ,"(m^2*V^(-1/2))/K" ,"" )
|
||||
|
||||
`MPRnb( LK2SI ,LK0SI ,"" ,"" )
|
||||
`MPRnb( NK2SI ,NK0SI ,"" ,"" )
|
||||
`MPRnb( PK2SI ,PK0SI ,"" ,"" )
|
||||
|
||||
`MPRnb( LK2SI1 ,LK0SI1 ,"" ,"" )
|
||||
`MPRnb( NK2SI1 ,NK0SI1 ,"" ,"" )
|
||||
`MPRnb( PK2SI1 ,PK0SI1 ,"" ,"" )
|
||||
|
||||
`MPRnb( LK0SISAT ,0.0 ,"" ,"" )
|
||||
`MPRnb( NK0SISAT ,0.0 ,"" ,"" )
|
||||
`MPRnb( PK0SISAT ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LK0SISAT1 ,0.0 ,"" ,"" )
|
||||
`MPRnb( NK0SISAT1 ,0.0 ,"" ,"" )
|
||||
`MPRnb( PK0SISAT1 ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LK2SISAT ,LK0SISAT ,"" ,"" )
|
||||
`MPRnb( NK2SISAT ,NK0SISAT ,"" ,"" )
|
||||
`MPRnb( PK2SISAT ,PK0SISAT ,"" ,"" )
|
||||
|
||||
`MPRnb( LK2SISAT1 ,LK0SISAT1 ,"" ,"" )
|
||||
`MPRnb( NK2SISAT1 ,NK0SISAT1 ,"" ,"" )
|
||||
`MPRnb( PK2SISAT1 ,PK0SISAT1 ,"" ,"" )
|
||||
|
||||
`MPRnb( LK2SAT ,0.0 ,"" ,"" )
|
||||
`MPRnb( NK2SAT ,0.0 ,"" ,"" )
|
||||
`MPRnb( PK2SAT ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LK2SAT1 ,0.0 ,"" ,"" )
|
||||
`MPRnb( NK2SAT1 ,0.0 ,"" ,"" )
|
||||
`MPRnb( PK2SAT1 ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LK2 ,0.0 ,"" ,"" )
|
||||
`MPRnb( NK2 ,0.0 ,"" ,"" )
|
||||
`MPRnb( PK2 ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LK21 ,0.0 ,"" ,"" )
|
||||
`MPRnb( NK21 ,0.0 ,"" ,"" )
|
||||
`MPRnb( PK21 ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LDVTB ,0.0 ,"" ,"" )
|
||||
`MPRnb( NDVTB ,0.0 ,"" ,"" )
|
||||
`MPRnb( PDVTB ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LLPEB ,0.0 ,"" ,"" )
|
||||
`MPRnb( NLPEB ,0.0 ,"" ,"" )
|
||||
`MPRnb( PLPEB ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LQMFACTOR ,0.0 ,"" ,"" )
|
||||
`MPRnb( NQMFACTOR ,0.0 ,"" ,"" )
|
||||
`MPRnb( PQMFACTOR ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LQMTCENCV ,0.0 ,"" ,"" )
|
||||
`MPRnb( NQMTCENCV ,0.0 ,"" ,"" )
|
||||
`MPRnb( PQMTCENCV ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LQMTCENCVA ,0.0 ,"" ,"" )
|
||||
`MPRnb( NQMTCENCVA ,0.0 ,"" ,"" )
|
||||
`MPRnb( PQMTCENCVA ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LVSAT ,0.0 ,"(m^2)/s" ,"" )
|
||||
`MPRnb( NVSAT ,0.0 ,"(m^2)/s" ,"" )
|
||||
`MPRnb( PVSAT ,0.0 ,"(m^3)/s" ,"" )
|
||||
|
||||
`MPRnb( LVSATR ,LVSAT ,"" ,"" )
|
||||
`MPRnb( NVSATR ,NVSAT ,"" ,"" )
|
||||
`MPRnb( PVSATR ,PVSAT ,"" ,"" )
|
||||
|
||||
`MPRnb( LVSAT1 ,LVSAT ,"" ,"" )
|
||||
`MPRnb( NVSAT1 ,NVSAT ,"" ,"" )
|
||||
`MPRnb( PVSAT1 ,PVSAT ,"" ,"" )
|
||||
|
||||
`MPRnb( LVSAT1R ,LVSAT1 ,"(m^2)/s" ,"" )
|
||||
`MPRnb( NVSAT1R ,NVSAT1 ,"(m^2)/s" ,"" )
|
||||
`MPRnb( PVSAT1R ,PVSAT1 ,"(m^3)/s" ,"" )
|
||||
|
||||
`MPRnb( LPSAT ,0.0 ,"" ,"" )
|
||||
`MPRnb( NPSAT ,0.0 ,"" ,"" )
|
||||
`MPRnb( PPSAT ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LDELTAVSAT ,0.0 ,"" ,"" )
|
||||
`MPRnb( NDELTAVSAT ,0.0 ,"" ,"" )
|
||||
`MPRnb( PDELTAVSAT ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LKSATIV ,0.0 ,"" ,"" )
|
||||
`MPRnb( NKSATIV ,0.0 ,"" ,"" )
|
||||
`MPRnb( PKSATIV ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LKSATIVR ,LKSATIV ,"" ,"" )
|
||||
`MPRnb( NKSATIVR ,NKSATIV ,"" ,"" )
|
||||
`MPRnb( PKSATIVR ,PKSATIV ,"" ,"" )
|
||||
|
||||
`MPRnb( LVSATCV ,0.0 ,"(m^2)/s" ,"" )
|
||||
`MPRnb( NVSATCV ,0.0 ,"(m^2)/s" ,"" )
|
||||
`MPRnb( PVSATCV ,0.0 ,"(m^3)/s" ,"" )
|
||||
|
||||
`MPRnb( LPSATCV ,0.0 ,"" ,"" )
|
||||
`MPRnb( NPSATCV ,0.0 ,"" ,"" )
|
||||
`MPRnb( PPSATCV ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LDELTAVSATCV ,0.0 ,"" ,"" )
|
||||
`MPRnb( NDELTAVSATCV ,0.0 ,"" ,"" )
|
||||
`MPRnb( PDELTAVSATCV ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LMEXP ,0.0 ,"" ,"" )
|
||||
`MPRnb( NMEXP ,0.0 ,"" ,"" )
|
||||
`MPRnb( PMEXP ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LMEXPR ,LMEXP ,"" ,"" )
|
||||
`MPRnb( NMEXPR ,NMEXP ,"" ,"" )
|
||||
`MPRnb( PMEXPR ,PMEXP ,"" ,"" )
|
||||
|
||||
`MPRnb( LPTWG ,0.0 ,"m*(V^-2)" ,"" )
|
||||
`MPRnb( NPTWG ,0.0 ,"m*(V^-2)" ,"" )
|
||||
`MPRnb( PPTWG ,0.0 ,"m^2*(V^-2)" ,"" )
|
||||
|
||||
`MPRnb( LPTWGR ,LPTWG ,"m*(V^-2)" ,"" )
|
||||
`MPRnb( NPTWGR ,NPTWG ,"m*(V^-2)" ,"" )
|
||||
`MPRnb( PPTWGR ,PPTWG ,"m^2*(V^-2)" ,"" )
|
||||
|
||||
`MPRnb( LU0 ,0.0 ,"(m^3)/V*s" ,"" )
|
||||
`MPRnb( NU0 ,0.0 ,"(m^3)/V*s" ,"" )
|
||||
`MPRnb( PU0 ,0.0 ,"(m^4)/V*s" ,"" )
|
||||
|
||||
`MPRnb( LU0R ,LU0 ,"" ,"" )
|
||||
`MPRnb( NU0R ,NU0 ,"" ,"" )
|
||||
`MPRnb( PU0R ,PU0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LETAMOB ,0.0 ,"" ,"" )
|
||||
`MPRnb( NETAMOB ,0.0 ,"" ,"" )
|
||||
`MPRnb( PETAMOB ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LUP ,0.0 ,"m*(um^LPA)" ,"" )
|
||||
`MPRnb( NUP ,0.0 ,"m*(um^LPA)" ,"" )
|
||||
`MPRnb( PUP ,0.0 ,"m^2*(um^LPA)" ,"" )
|
||||
|
||||
`MPRnb( LUPR ,LUP ,"" ,"" )
|
||||
`MPRnb( NUPR ,NUP ,"" ,"" )
|
||||
`MPRnb( PUPR ,PUP ,"" ,"" )
|
||||
|
||||
`MPRnb( LUA ,0.0 ,"m*((cm/MV)^EU)" ,"" )
|
||||
`MPRnb( NUA ,0.0 ,"m*((cm/MV)^EU)" ,"" )
|
||||
`MPRnb( PUA ,0.0 ,"m^2*((cm/MV)^EU)" ,"" )
|
||||
|
||||
`MPRnb( LUAR ,LUA ,"" ,"" )
|
||||
`MPRnb( NUAR ,NUA ,"" ,"" )
|
||||
`MPRnb( PUAR ,PUA ,"" ,"" )
|
||||
|
||||
`MPRnb( LUC ,0.0 ,"" ,"" )
|
||||
`MPRnb( NUC ,0.0 ,"" ,"" )
|
||||
`MPRnb( PUC ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LUCR ,LUC ,"" ,"" )
|
||||
`MPRnb( NUCR ,NUC ,"" ,"" )
|
||||
`MPRnb( PUCR ,PUC ,"" ,"" )
|
||||
|
||||
`MPRnb( LEU ,0.0 ,"m*(cm/MV)" ,"" )
|
||||
`MPRnb( NEU ,0.0 ,"m*(cm/MV)" ,"" )
|
||||
`MPRnb( PEU ,0.0 ,"m^2*(cm/MV)" ,"" )
|
||||
|
||||
`MPRnb( LEUR ,LEU ,"" ,"" )
|
||||
`MPRnb( NEUR ,NEU ,"" ,"" )
|
||||
`MPRnb( PEUR ,PEU ,"" ,"" )
|
||||
|
||||
`MPRnb( LUD ,0.0 ,"m*(cm/MV)" ,"" )
|
||||
`MPRnb( NUD ,0.0 ,"m*(cm/MV)" ,"" )
|
||||
`MPRnb( PUD ,0.0 ,"m^2*(cm/MV)" ,"" )
|
||||
|
||||
`MPRnb( LUDR ,LUD ,"" ,"" )
|
||||
`MPRnb( NUDR ,NUD ,"" ,"" )
|
||||
`MPRnb( PUDR ,PUD ,"" ,"" )
|
||||
|
||||
`MPRnb( LUCS ,0.0 ,"" ,"" )
|
||||
`MPRnb( NUCS ,0.0 ,"" ,"" )
|
||||
`MPRnb( PUCS ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LPCLM ,0.0 ,"" ,"" )
|
||||
`MPRnb( NPCLM ,0.0 ,"" ,"" )
|
||||
`MPRnb( PPCLM ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LPCLMR ,LPCLM ,"" ,"" )
|
||||
`MPRnb( NPCLMR ,NPCLM ,"" ,"" )
|
||||
`MPRnb( PPCLMR ,PPCLM ,"" ,"" )
|
||||
|
||||
`MPRnb( LPCLMG ,0.0 ,"" ,"" )
|
||||
`MPRnb( NPCLMG ,0.0 ,"" ,"" )
|
||||
`MPRnb( PPCLMG ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LPCLMCV ,LPCLM ,"" ,"" )
|
||||
`MPRnb( NPCLMCV ,NPCLM ,"" ,"" )
|
||||
`MPRnb( PPCLMCV ,PPCLM ,"" ,"" )
|
||||
|
||||
`MPRnb( LA1 ,0.0 ,"m*(V^-2)" ,"" )
|
||||
`MPRnb( NA1 ,0.0 ,"m*(V^-2)" ,"" )
|
||||
`MPRnb( PA1 ,0.0 ,"m^2*(V^-2)" ,"" )
|
||||
|
||||
`MPRnb( LA11 ,0.0 ,"m*(V^-2/K)" ,"" )
|
||||
`MPRnb( NA11 ,0.0 ,"m*(V^-2/K)" ,"" )
|
||||
`MPRnb( PA11 ,0.0 ,"m^2*(V^-2/K)" ,"" )
|
||||
|
||||
`MPRnb( LA2 ,0.0 ,"m*(V^-1)" ,"" )
|
||||
`MPRnb( NA2 ,0.0 ,"m*(V^-1)" ,"" )
|
||||
`MPRnb( PA2 ,0.0 ,"m^2*(V^-1)" ,"" )
|
||||
|
||||
`MPRnb( LA21 ,0.0 ,"m*(V^-1/K)" ,"" )
|
||||
`MPRnb( NA21 ,0.0 ,"m*(V^-1/K)" ,"" )
|
||||
`MPRnb( PA21 ,0.0 ,"m^2*(V^-1/K)" ,"" )
|
||||
|
||||
`MPRnb( LRDSW ,0.0 ,"m*(ohm-um^WR)" ,"" )
|
||||
`MPRnb( NRDSW ,0.0 ,"m*(ohm-um^WR)" ,"" )
|
||||
`MPRnb( PRDSW ,0.0 ,"(m^2)*(ohm-um^WR)" ,"" )
|
||||
|
||||
`MPRnb( LRSW ,0.0 ,"m*(ohm-um^WR)" ,"" )
|
||||
`MPRnb( NRSW ,0.0 ,"m*(ohm-um^WR)" ,"" )
|
||||
`MPRnb( PRSW ,0.0 ,"(m^2)*(ohm-um^WR)" ,"" )
|
||||
|
||||
`MPRnb( LRDW ,0.0 ,"m*(ohm-um^WR)" ,"" )
|
||||
`MPRnb( NRDW ,0.0 ,"m*(ohm-um^WR)" ,"" )
|
||||
`MPRnb( PRDW ,0.0 ,"(m^2)*(ohm-um^WR)" ,"" )
|
||||
|
||||
`MPRnb( LPRWGS ,0.0 ,"m/V" ,"" )
|
||||
`MPRnb( NPRWGS ,0.0 ,"m/V" ,"" )
|
||||
`MPRnb( PPRWGS ,0.0 ,"(m^2)/V" ,"" )
|
||||
|
||||
`MPRnb( LPRWGD ,0.0 ,"m/V" ,"" )
|
||||
`MPRnb( NPRWGD ,0.0 ,"m/V" ,"" )
|
||||
`MPRnb( PPRWGD ,0.0 ,"(m^2)/V" ,"" )
|
||||
|
||||
`MPRnb( LWR ,0.0 ,"" ,"" )
|
||||
`MPRnb( NWR ,0.0 ,"" ,"" )
|
||||
`MPRnb( PWR ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LPDIBL1 ,0.0 ,"" ,"" )
|
||||
`MPRnb( NPDIBL1 ,0.0 ,"" ,"" )
|
||||
`MPRnb( PPDIBL1 ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LPDIBL1R ,LPDIBL1 ,"" ,"" )
|
||||
`MPRnb( NPDIBL1R ,NPDIBL1 ,"" ,"" )
|
||||
`MPRnb( PPDIBL1R ,PPDIBL1 ,"" ,"" )
|
||||
|
||||
`MPRnb( LPDIBL2 ,0.0 ,"" ,"" )
|
||||
`MPRnb( NPDIBL2 ,0.0 ,"" ,"" )
|
||||
`MPRnb( PPDIBL2 ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LPDIBL2R ,LPDIBL2 ,"" ,"" )
|
||||
`MPRnb( NPDIBL2R ,NPDIBL2 ,"" ,"" )
|
||||
`MPRnb( PPDIBL2R ,PPDIBL2 ,"" ,"" )
|
||||
|
||||
`MPRnb( LDROUT ,0.0 ,"" ,"" )
|
||||
`MPRnb( NDROUT ,0.0 ,"" ,"" )
|
||||
`MPRnb( PDROUT ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LPVAG ,0.0 ,"" ,"" )
|
||||
`MPRnb( NPVAG ,0.0 ,"" ,"" )
|
||||
`MPRnb( PPVAG ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LAIGBINV ,0.0 ,"(F*s^2/g)^0.5" ,"" )
|
||||
`MPRnb( NAIGBINV ,0.0 ,"(F*s^2/g)^0.5" ,"" )
|
||||
`MPRnb( PAIGBINV ,0.0 ,"((F*s^2/g)^0.5)*m" ,"" )
|
||||
|
||||
`MPRnb( LAIGBINV1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" )
|
||||
`MPRnb( NAIGBINV1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" )
|
||||
`MPRnb( PAIGBINV1 ,0.0 ,"((F*s^2/g)^0.5)*(m/K)" ,"" )
|
||||
|
||||
`MPRnb( LBIGBINV ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" )
|
||||
`MPRnb( NBIGBINV ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" )
|
||||
`MPRnb( PBIGBINV ,0.0 ,"((F*s^2/g)^0.5)*(m/V)" ,"" )
|
||||
|
||||
`MPRnb( LCIGBINV ,0.0 ,"m/V" ,"" )
|
||||
`MPRnb( NCIGBINV ,0.0 ,"m/V" ,"" )
|
||||
`MPRnb( PCIGBINV ,0.0 ,"(m^2)/V" ,"" )
|
||||
|
||||
`MPRnb( LEIGBINV ,0.0 ,"m*V" ,"" )
|
||||
`MPRnb( NEIGBINV ,0.0 ,"m*V" ,"" )
|
||||
`MPRnb( PEIGBINV ,0.0 ,"(m^2)*V" ,"" )
|
||||
|
||||
`MPRnb( LNIGBINV ,0.0 ,"" ,"" )
|
||||
`MPRnb( NNIGBINV ,0.0 ,"" ,"" )
|
||||
`MPRnb( PNIGBINV ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LAIGBACC ,0.0 ,"(F*s^2/g)^0.5" ,"" )
|
||||
`MPRnb( NAIGBACC ,0.0 ,"(F*s^2/g)^0.5" ,"" )
|
||||
`MPRnb( PAIGBACC ,0.0 ,"((F*s^2/g)^0.5)*m" ,"" )
|
||||
|
||||
`MPRnb( LAIGBACC1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" )
|
||||
`MPRnb( NAIGBACC1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" )
|
||||
`MPRnb( PAIGBACC1 ,0.0 ,"((F*s^2/g)^0.5)*(m/K)" ,"" )
|
||||
|
||||
`MPRnb( LBIGBACC ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" )
|
||||
`MPRnb( NBIGBACC ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" )
|
||||
`MPRnb( PBIGBACC ,0.0 ,"((F*s^2/g)^0.5)*(m/V)" ,"" )
|
||||
|
||||
`MPRnb( LCIGBACC ,0.0 ,"m/V" ,"" )
|
||||
`MPRnb( NCIGBACC ,0.0 ,"m/V" ,"" )
|
||||
`MPRnb( PCIGBACC ,0.0 ,"(m^2)/V" ,"" )
|
||||
|
||||
`MPRnb( LNIGBACC ,0.0 ,"" ,"" )
|
||||
`MPRnb( NNIGBACC ,0.0 ,"" ,"" )
|
||||
`MPRnb( PNIGBACC ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LAIGC ,0.0 ,"(F*s^2/g)^0.5" ,"" )
|
||||
`MPRnb( NAIGC ,0.0 ,"(F*s^2/g)^0.5" ,"" )
|
||||
`MPRnb( PAIGC ,0.0 ,"((F*s^2/g)^0.5)*m" ,"" )
|
||||
|
||||
`MPRnb( LAIGC1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" )
|
||||
`MPRnb( NAIGC1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" )
|
||||
`MPRnb( PAIGC1 ,0.0 ,"((F*s^2/g)^0.5)*(m/K)" ,"" )
|
||||
|
||||
`MPRnb( LBIGC ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" )
|
||||
`MPRnb( NBIGC ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" )
|
||||
`MPRnb( PBIGC ,0.0 ,"((F*s^2/g)^0.5)*(m/V)" ,"" )
|
||||
|
||||
`MPRnb( LCIGC ,0.0 ,"m/V" ,"" )
|
||||
`MPRnb( NCIGC ,0.0 ,"m/V" ,"" )
|
||||
`MPRnb( PCIGC ,0.0 ,"(m^2)/V" ,"" )
|
||||
|
||||
`MPRnb( LPIGCD ,0.0 ,"" ,"" )
|
||||
`MPRnb( NPIGCD ,0.0 ,"" ,"" )
|
||||
`MPRnb( PPIGCD ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LAIGS ,0.0 ,"(F*s^2/g)^0.5" ,"" )
|
||||
`MPRnb( NAIGS ,0.0 ,"(F*s^2/g)^0.5" ,"" )
|
||||
`MPRnb( PAIGS ,0.0 ,"((F*s^2/g)^0.5)*m" ,"" )
|
||||
|
||||
`MPRnb( LAIGS1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" )
|
||||
`MPRnb( NAIGS1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" )
|
||||
`MPRnb( PAIGS1 ,0.0 ,"((F*s^2/g)^0.5)*(m/K)" ,"" )
|
||||
|
||||
`MPRnb( LBIGS ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" )
|
||||
`MPRnb( NBIGS ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" )
|
||||
`MPRnb( PBIGS ,0.0 ,"((F*s^2/g)^0.5)*(m/V)" ,"" )
|
||||
|
||||
`MPRnb( LCIGS ,0.0 ,"m/V" ,"" )
|
||||
`MPRnb( NCIGS ,0.0 ,"m/V" ,"" )
|
||||
`MPRnb( PCIGS ,0.0 ,"(m^2)/V" ,"" )
|
||||
|
||||
`MPRnb( LAIGD ,LAIGS ,"(F*s^2/g)^0.5" ,"" )
|
||||
`MPRnb( NAIGD ,NAIGS ,"(F*s^2/g)^0.5" ,"" )
|
||||
`MPRnb( PAIGD ,PAIGS ,"((F*s^2/g)^0.5)*m" ,"" )
|
||||
|
||||
`MPRnb( LAIGD1 ,LAIGS1 ,"((F*s^2/g)^0.5)/K" ,"" )
|
||||
`MPRnb( NAIGD1 ,NAIGS1 ,"((F*s^2/g)^0.5)/K" ,"" )
|
||||
`MPRnb( PAIGD1 ,PAIGS1 ,"((F*s^2/g)^0.5)*(m/K)" ,"" )
|
||||
|
||||
`MPRnb( LBIGD ,LBIGS ,"((F*s^2/g)^0.5)/V" ,"" )
|
||||
`MPRnb( NBIGD ,NBIGS ,"((F*s^2/g)^0.5)/V" ,"" )
|
||||
`MPRnb( PBIGD ,PBIGS ,"((F*s^2/g)^0.5)*(m/V)" ,"" )
|
||||
|
||||
`MPRnb( LCIGD ,LCIGS ,"m/V" ,"" )
|
||||
`MPRnb( NCIGD ,NCIGS ,"m/V" ,"" )
|
||||
`MPRnb( PCIGD ,PCIGS ,"(m^2)/V" ,"" )
|
||||
|
||||
`MPRnb( LNTOX ,0.0 ,"" ,"" )
|
||||
`MPRnb( NNTOX ,0.0 ,"" ,"" )
|
||||
`MPRnb( PNTOX ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LPOXEDGE ,0.0 ,"" ,"" )
|
||||
`MPRnb( NPOXEDGE ,0.0 ,"" ,"" )
|
||||
`MPRnb( PPOXEDGE ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LAGISL ,0.0 ,"m/ohm" ,"" )
|
||||
`MPRnb( NAGISL ,0.0 ,"m/ohm" ,"" )
|
||||
`MPRnb( PAGISL ,0.0 ,"(m^2)/ohm" ,"" )
|
||||
|
||||
`MPRnb( LBGISL ,0.0 ,"V" ,"" )
|
||||
`MPRnb( NBGISL ,0.0 ,"V" ,"" )
|
||||
`MPRnb( PBGISL ,0.0 ,"m*V" ,"" )
|
||||
|
||||
`MPRnb( LCGISL ,0.0 ,"m*(V^3)" ,"" )
|
||||
`MPRnb( NCGISL ,0.0 ,"m*(V^3)" ,"" )
|
||||
`MPRnb( PCGISL ,0.0 ,"(m^2)*(V^3)" ,"" )
|
||||
|
||||
`MPRnb( LEGISL ,0.0 ,"m*V" ,"" )
|
||||
`MPRnb( NEGISL ,0.0 ,"m*V" ,"" )
|
||||
`MPRnb( PEGISL ,0.0 ,"(m^2)*V" ,"" )
|
||||
|
||||
`MPRnb( LPGISL ,0.0 ,"" ,"" )
|
||||
`MPRnb( NPGISL ,0.0 ,"" ,"" )
|
||||
`MPRnb( PPGISL ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LAGIDL ,LAGISL ,"m/ohm" ,"" )
|
||||
`MPRnb( NAGIDL ,NAGISL ,"m/ohm" ,"" )
|
||||
`MPRnb( PAGIDL ,PAGISL ,"(m^2)/ohm" ,"" )
|
||||
|
||||
`MPRnb( LBGIDL ,LBGISL ,"V" ,"" )
|
||||
`MPRnb( NBGIDL ,NBGISL ,"V" ,"" )
|
||||
`MPRnb( PBGIDL ,PBGISL ,"m*V" ,"" )
|
||||
|
||||
`MPRnb( LCGIDL ,LCGISL ,"m*(V^3)" ,"" )
|
||||
`MPRnb( NCGIDL ,NCGISL ,"m*(V^3)" ,"" )
|
||||
`MPRnb( PCGIDL ,PCGISL ,"(m^2)*(V^3)" ,"" )
|
||||
|
||||
`MPRnb( LEGIDL ,LEGISL ,"m*V" ,"" )
|
||||
`MPRnb( NEGIDL ,NEGISL ,"m*V" ,"" )
|
||||
`MPRnb( PEGIDL ,PEGISL ,"(m^2)*V" ,"" )
|
||||
|
||||
`MPRnb( LPGIDL ,LPGISL ,"" ,"" )
|
||||
`MPRnb( NPGIDL ,NPGISL ,"" ,"" )
|
||||
`MPRnb( PPGIDL ,PPGISL ,"" ,"" )
|
||||
|
||||
`MPRnb( LALPHA0 ,0.0 ,"(m^2)/V" ,"" )
|
||||
`MPRnb( NALPHA0 ,0.0 ,"(m^2)/V" ,"" )
|
||||
`MPRnb( PALPHA0 ,0.0 ,"(m^3)/V" ,"" )
|
||||
|
||||
`MPRnb( LALPHA1 ,0.0 ,"m/V" ,"" )
|
||||
`MPRnb( NALPHA1 ,0.0 ,"m/V" ,"" )
|
||||
`MPRnb( PALPHA1 ,0.0 ,"(m^2)/V" ,"" )
|
||||
|
||||
`MPRnb( LALPHAII0 ,0.0 ,"(m^2)/V" ,"" )
|
||||
`MPRnb( NALPHAII0 ,0.0 ,"(m^2)/V" ,"" )
|
||||
`MPRnb( PALPHAII0 ,0.0 ,"(m^3)/V" ,"" )
|
||||
|
||||
`MPRnb( LALPHAII1 ,0.0 ,"m/V" ,"" )
|
||||
`MPRnb( NALPHAII1 ,0.0 ,"m/V" ,"" )
|
||||
`MPRnb( PALPHAII1 ,0.0 ,"(m^2)/V" ,"" )
|
||||
|
||||
`MPRnb( LBETA0 ,0.0 ,"m/V" ,"" )
|
||||
`MPRnb( NBETA0 ,0.0 ,"m/V" ,"" )
|
||||
`MPRnb( PBETA0 ,0.0 ,"(m^2)/V" ,"" )
|
||||
|
||||
`MPRnb( LBETAII0 ,0.0 ,"m/V" ,"" )
|
||||
`MPRnb( NBETAII0 ,0.0 ,"m/V" ,"" )
|
||||
`MPRnb( PBETAII0 ,0.0 ,"(m^2)/V" ,"" )
|
||||
|
||||
`MPRnb( LBETAII1 ,0.0 ,"" ,"" )
|
||||
`MPRnb( NBETAII1 ,0.0 ,"" ,"" )
|
||||
`MPRnb( PBETAII1 ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LBETAII2 ,0.0 ,"m*V" ,"" )
|
||||
`MPRnb( NBETAII2 ,0.0 ,"m*V" ,"" )
|
||||
`MPRnb( PBETAII2 ,0.0 ,"(m^2)*V" ,"" )
|
||||
|
||||
`MPRnb( LESATII ,0.0 ,"V" ,"" )
|
||||
`MPRnb( NESATII ,0.0 ,"V" ,"" )
|
||||
`MPRnb( PESATII ,0.0 ,"m*V" ,"" )
|
||||
|
||||
`MPRnb( LLII ,0.0 ,"(m^2)*V" ,"" )
|
||||
`MPRnb( NLII ,0.0 ,"(m^2)*V" ,"" )
|
||||
`MPRnb( PLII ,0.0 ,"(m^3)*V" ,"" )
|
||||
|
||||
`MPRnb( LSII0 ,0.0 ,"m/V" ,"" )
|
||||
`MPRnb( NSII0 ,0.0 ,"m/V" ,"" )
|
||||
`MPRnb( PSII0 ,0.0 ,"(m^2)/V" ,"" )
|
||||
|
||||
`MPRnb( LSII1 ,0.0 ,"" ,"" )
|
||||
`MPRnb( NSII1 ,0.0 ,"" ,"" )
|
||||
`MPRnb( PSII1 ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LSII2 ,0.0 ,"m*V" ,"" )
|
||||
`MPRnb( NSII2 ,0.0 ,"m*V" ,"" )
|
||||
`MPRnb( PSII2 ,0.0 ,"(m^2)*V" ,"" )
|
||||
|
||||
`MPRnb( LSIID ,0.0 ,"m*V" ,"" )
|
||||
`MPRnb( NSIID ,0.0 ,"m*V" ,"" )
|
||||
`MPRnb( PSIID ,0.0 ,"(m^2)*V" ,"" )
|
||||
|
||||
`MPRnb( LCFS ,0.0 ,"F" ,"" )
|
||||
`MPRnb( NCFS ,0.0 ,"F" ,"" )
|
||||
`MPRnb( PCFS ,0.0 ,"F*m" ,"" )
|
||||
|
||||
`MPRnb( LCFD ,LCFS ,"F" ,"" )
|
||||
`MPRnb( NCFD ,NCFS ,"F" ,"" )
|
||||
`MPRnb( PCFD ,PCFS ,"F*m" ,"" )
|
||||
|
||||
`MPRnb( LCOVS ,0.0 ,"F" ,"" )
|
||||
`MPRnb( NCOVS ,0.0 ,"F" ,"" )
|
||||
`MPRnb( PCOVS ,0.0 ,"F*m" ,"" )
|
||||
|
||||
`MPRnb( LCOVD ,LCOVS ,"F" ,"" )
|
||||
`MPRnb( NCOVD ,NCOVS ,"F" ,"" )
|
||||
`MPRnb( PCOVD ,PCOVS ,"F*m" ,"" )
|
||||
|
||||
`MPRnb( LCGSL ,0.0 ,"F" ,"" )
|
||||
`MPRnb( NCGSL ,0.0 ,"F" ,"" )
|
||||
`MPRnb( PCGSL ,0.0 ,"F*m" ,"" )
|
||||
|
||||
`MPRnb( LCGDL ,LCGSL ,"F" ,"" )
|
||||
`MPRnb( NCGDL ,NCGSL ,"F" ,"" )
|
||||
`MPRnb( PCGDL ,PCGSL ,"F*m" ,"" )
|
||||
|
||||
`MPRnb( LCKAPPAS ,0.0 ,"m*V" ,"" )
|
||||
`MPRnb( NCKAPPAS ,0.0 ,"m*V" ,"" )
|
||||
`MPRnb( PCKAPPAS ,0.0 ,"(m^2)*V" ,"" )
|
||||
|
||||
`MPRnb( LCKAPPAD ,LCKAPPAS ,"m*V" ,"" )
|
||||
`MPRnb( NCKAPPAD ,NCKAPPAS ,"m*V" ,"" )
|
||||
`MPRnb( PCKAPPAD ,PCKAPPAS ,"(m^2)*V" ,"" )
|
||||
|
||||
`MPRnb( LCGBL ,0.0 ,"F" ,"" )
|
||||
`MPRnb( NCGBL ,0.0 ,"F" ,"" )
|
||||
`MPRnb( PCGBL ,0.0 ,"F*m" ,"" )
|
||||
|
||||
`MPRnb( LCKAPPAB ,0.0 ,"m*V" ,"" )
|
||||
`MPRnb( NCKAPPAB ,0.0 ,"m*V" ,"" )
|
||||
`MPRnb( PCKAPPAB ,0.0 ,"(m^2)*V" ,"" )
|
||||
|
||||
`MPRnb( LNTGEN ,0.0 ,"" ,"" )
|
||||
`MPRnb( NNTGEN ,0.0 ,"" ,"" )
|
||||
`MPRnb( PNTGEN ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LAIGEN ,0.0 ,"(m^-2)*(V^-1)" ,"" )
|
||||
`MPRnb( NAIGEN ,0.0 ,"(m^-2)*(V^-1)" ,"" )
|
||||
`MPRnb( PAIGEN ,0.0 ,"(m^-1)*(V^-1)" ,"" )
|
||||
|
||||
`MPRnb( LBIGEN ,0.0 ,"(m^-2)*(V^-3)" ,"" )
|
||||
`MPRnb( NBIGEN ,0.0 ,"(m^-2)*(V^-3)" ,"" )
|
||||
`MPRnb( PBIGEN ,0.0 ,"(m^-1)*(V^-3)" ,"" )
|
||||
|
||||
`MPRnb( LXRCRG1 ,0.0 ,"" ,"" )
|
||||
`MPRnb( NXRCRG1 ,0.0 ,"" ,"" )
|
||||
`MPRnb( PXRCRG1 ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LXRCRG2 ,0.0 ,"" ,"" )
|
||||
`MPRnb( NXRCRG2 ,0.0 ,"" ,"" )
|
||||
`MPRnb( PXRCRG2 ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LUTE ,0.0 ,"" ,"" )
|
||||
`MPRnb( NUTE ,0.0 ,"" ,"" )
|
||||
`MPRnb( PUTE ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LUTER ,LUTE ,"" ,"" )
|
||||
`MPRnb( NUTER ,NUTE ,"" ,"" )
|
||||
`MPRnb( PUTER ,PUTE ,"" ,"" )
|
||||
|
||||
`MPRnb( LUTL ,0.0 ,"" ,"" )
|
||||
`MPRnb( NUTL ,0.0 ,"" ,"" )
|
||||
`MPRnb( PUTL ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LUTLR ,LUTL ,"" ,"" )
|
||||
`MPRnb( NUTLR ,NUTL ,"" ,"" )
|
||||
`MPRnb( PUTLR ,PUTL ,"" ,"" )
|
||||
|
||||
`MPRnb( LEMOBT ,0.0 ,"" ,"" )
|
||||
`MPRnb( NEMOBT ,0.0 ,"" ,"" )
|
||||
`MPRnb( PEMOBT ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LUA1 ,0.0 ,"" ,"" )
|
||||
`MPRnb( NUA1 ,0.0 ,"" ,"" )
|
||||
`MPRnb( PUA1 ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LUA1R ,LUA1 ,"" ,"" )
|
||||
`MPRnb( NUA1R ,NUA1 ,"" ,"" )
|
||||
`MPRnb( PUA1R ,PUA1 ,"" ,"" )
|
||||
|
||||
`MPRnb( LUC1 ,0.0 ,"" ,"" )
|
||||
`MPRnb( NUC1 ,0.0 ,"" ,"" )
|
||||
`MPRnb( PUC1 ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LUC1R ,LUC1 ,"" ,"" )
|
||||
`MPRnb( NUC1R ,NUC1 ,"" ,"" )
|
||||
`MPRnb( PUC1R ,PUC1 ,"" ,"" )
|
||||
|
||||
`MPRnb( LUD1 ,0.0 ,"" ,"" )
|
||||
`MPRnb( NUD1 ,0.0 ,"" ,"" )
|
||||
`MPRnb( PUD1 ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LUD1R ,LUD1 ,"" ,"" )
|
||||
`MPRnb( NUD1R ,NUD1 ,"" ,"" )
|
||||
`MPRnb( PUD1R ,PUD1 ,"" ,"" )
|
||||
|
||||
`MPRnb( LUCSTE ,0.0 ,"" ,"" )
|
||||
`MPRnb( NUCSTE ,0.0 ,"" ,"" )
|
||||
`MPRnb( PUCSTE ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LPTWGT ,0.0 ,"m/K" ,"" )
|
||||
`MPRnb( NPTWGT ,0.0 ,"m/K" ,"" )
|
||||
`MPRnb( PPTWGT ,0.0 ,"(m^2)/K" ,"" )
|
||||
|
||||
`MPRnb( LAT ,0.0 ,"m/K" ,"" )
|
||||
`MPRnb( NAT ,0.0 ,"m/K" ,"" )
|
||||
`MPRnb( PAT ,0.0 ,"(m^2)/K" ,"" )
|
||||
|
||||
`MPRnb( LATR ,LAT ,"" ,"" )
|
||||
`MPRnb( NATR ,NAT ,"" ,"" )
|
||||
`MPRnb( PATR ,PAT ,"" ,"" )
|
||||
|
||||
`MPRnb( LATCV ,0.0 ,"m/K" ,"" )
|
||||
`MPRnb( NATCV ,0.0 ,"m/K" ,"" )
|
||||
`MPRnb( PATCV ,0.0 ,"(m^2)/K" ,"" )
|
||||
|
||||
`MPRnb( LSTTHETASAT ,0.0 ,"" ,"" )
|
||||
`MPRnb( NSTTHETASAT ,0.0 ,"" ,"" )
|
||||
`MPRnb( PSTTHETASAT ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LPRT ,0.0 ,"m/K" ,"" )
|
||||
`MPRnb( NPRT ,0.0 ,"m/K" ,"" )
|
||||
`MPRnb( PPRT ,0.0 ,"(m^2)/K" ,"" )
|
||||
|
||||
`MPRnb( LKT1 ,0.0 ,"m*V" ,"" )
|
||||
`MPRnb( NKT1 ,0.0 ,"m*V" ,"" )
|
||||
`MPRnb( PKT1 ,0.0 ,"(m^2)*V" ,"" )
|
||||
|
||||
`MPRnb( LTSS ,0.0 ,"" ,"" )
|
||||
`MPRnb( NTSS ,0.0 ,"" ,"" )
|
||||
`MPRnb( PTSS ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LIIT ,0.0 ,"" ,"" )
|
||||
`MPRnb( NIIT ,0.0 ,"" ,"" )
|
||||
`MPRnb( PIIT ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LTII ,0.0 ,"" ,"" )
|
||||
`MPRnb( NTII ,0.0 ,"" ,"" )
|
||||
`MPRnb( PTII ,0.0 ,"" ,"" )
|
||||
|
||||
`MPRnb( LTGIDL ,0.0 ,"m/K" ,"" )
|
||||
`MPRnb( NTGIDL ,0.0 ,"m/K" ,"" )
|
||||
`MPRnb( PTGIDL ,0.0 ,"(m^2)/K" ,"" )
|
||||
|
||||
`MPRnb( LIGT ,0.0 ,"" ,"" )
|
||||
`MPRnb( NIGT ,0.0 ,"" ,"" )
|
||||
`MPRnb( PIGT ,0.0 ,"" ,"" )
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,117 +0,0 @@
|
|||
// ********************************************************
|
||||
// **** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016****/
|
||||
// * BSIM Common Multi-Gate Model Equations (Verilog-A)
|
||||
// ********************************************************
|
||||
//
|
||||
// ********************************************************
|
||||
// * Copyright 2016 Regents of the University of California.
|
||||
// * All rights reserved.
|
||||
// *
|
||||
// * Project Director: Prof. Chenming Hu.
|
||||
// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu, Sourabh Khandelwal,
|
||||
// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao,
|
||||
// * Ali Niknejad, Chenming Hu
|
||||
// ********************************************************
|
||||
// ********************************************************
|
||||
// * NONDISCLOSURE STATEMENT
|
||||
// Software is distributed as is, completely without warranty or service
|
||||
// support. The University of California and its employees are not liable
|
||||
// for the condition or performance of the software.
|
||||
// The University of California owns the copyright and grants users a perpetual,
|
||||
// irrevocable, worldwide, non-exclusive, royalty-free license with
|
||||
// respect to the software as set forth below.
|
||||
// The University of California hereby disclaims all implied warranties.
|
||||
// The University of California grants 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 University of California code
|
||||
// itself but may charge for additions, extensions, or support.
|
||||
// 2. In any product based on the software, the users agree to acknowledge
|
||||
// the University of California that developed the software. This
|
||||
// acknowledgment shall appear in the product documentation.
|
||||
// 3. The users agree to obey all U.S. Government restrictions governing
|
||||
// redistribution or export of the software.
|
||||
// 4. The users agree to reproduce any copyright notice which appears on
|
||||
// the software on any copy or modification of such made available
|
||||
// to others
|
||||
// Agreed to on __Jan 01, 2016__________________
|
||||
// By: ___University of California, Berkeley____
|
||||
// ___Chenming Hu_____________________
|
||||
// ___Professor in Graduate School _______
|
||||
// ********************************************************
|
||||
|
||||
// ********************************************************
|
||||
// Macro for the geometry-dependent fringing capacitance
|
||||
// model
|
||||
// ********************************************************
|
||||
|
||||
/*
|
||||
(while (re-search-forward
|
||||
(rx bow
|
||||
(or "Hr" "Lr" "Hgdelta" "Lmax" "y" "x"
|
||||
"CcgSat" "Cnon" "TT1" "Ccg1" "r1cf" "Rcf" "Ccg2"
|
||||
"Ccg" "C1" "C2" "C3" "Cfglog" "dcf" "TT0"
|
||||
"TT2" "Cfgsat" "delta" "xCfg")
|
||||
eow)
|
||||
nil t)
|
||||
(replace-match "x42_\\&" t))
|
||||
*/
|
||||
|
||||
`define Cfringe_2d_vars() \
|
||||
real x42_Hr, x42_Lr, x42_Hgdelta, x42_Lmax, x42_y, x42_x; \
|
||||
real x42_CcgSat, x42_Cnon, x42_TT1, x42_Ccg1, x42_r1cf, x42_Rcf, x42_Ccg2; \
|
||||
real x42_Ccg, x42_C1, x42_C2, x42_C3, x42_Cfglog, x42_dcf, x42_TT0; \
|
||||
real x42_TT2, x42_Cfgsat, x42_delta, Cfg;
|
||||
|
||||
`define Cfringe_2d(block_name, Hg, Hc, Lext, Wfin, Lc, Lg, Tox, Cf1, Cgg) \
|
||||
begin : block_name \
|
||||
x42_Hr = 2.3 + 0.2 * ((Hg) + (Tox)) / (Hc); \
|
||||
x42_Lr = 1.05; \
|
||||
x42_Hgdelta = abs((Hg) + (Tox) - (Hc)); \
|
||||
x42_Lmax = (Lext) * x42_Lr; \
|
||||
\
|
||||
x42_y = min((Hc), (Hg) + (Tox)); \
|
||||
x42_x = (Lext) / (x42_Hr + 1.0); \
|
||||
x42_Cnon = 1.7e12; \
|
||||
x42_CcgSat = epssp * (x42_y - x42_x) / (Lext); \
|
||||
x42_TT1 = x42_Cnon * x42_CcgSat; \
|
||||
if(x42_TT1 > `EXPL_THRESHOLD) \
|
||||
x42_Ccg1 = x42_CcgSat; \
|
||||
else \
|
||||
x42_Ccg1 = 1.0 / x42_Cnon * ln(1.0 + lexp(x42_TT1)); \
|
||||
\
|
||||
x42_r1cf = 0.5 * \
|
||||
min((Hc) / ((Hg) + (Tox)), ((Hg) + (Tox)) / (Hc)); \
|
||||
x42_Rcf = x42_Hgdelta * x42_r1cf; \
|
||||
x42_Ccg2 = epssp * 2 / `M_PI * \
|
||||
ln(((Lext) + 0.5 * `M_PI * x42_Rcf) / (Lext)); \
|
||||
\
|
||||
x42_Ccg = (Wfin) * (x42_Ccg1 + x42_Ccg2); \
|
||||
\
|
||||
x42_x = x42_Lmax / (Hg); \
|
||||
x42_C1 = 4.0 / (sqrt(2.0 * (x42_x + 1)) * `M_PI); \
|
||||
x42_C2 = sqrt((Tox) * (Tox) + 2.0 * (Hg) * (Tox) + \
|
||||
(Hg) * (Hg) * (x42_x + 1)) * sqrt(x42_x + 1) + (Tox) + \
|
||||
(Hg) * x42_x + (Hg); \
|
||||
x42_C3 = (Tox) * sqrt((x42_x + 1) * (x42_x + 4)) + Tox * (x42_x + 2); \
|
||||
x42_Cfglog = epssp * (x42_C1 * ln(x42_C2 / x42_C3) + 12.27); \
|
||||
\
|
||||
x42_dcf = x42_Hr * x42_Lr; \
|
||||
x42_TT0 = sqrt(x42_dcf * x42_dcf + 1.0); \
|
||||
x42_TT1 = sqrt((x42_dcf * x42_dcf + 1) * ((x42_dcf * (Tox)) * (x42_dcf * (Tox)) + \
|
||||
2 * x42_dcf * x42_Lmax * (Tox) + (x42_dcf * x42_dcf + 1) * x42_Lmax * x42_Lmax)) \
|
||||
+ x42_dcf * (Tox) + x42_dcf * x42_dcf * x42_Lmax + x42_Lmax; \
|
||||
x42_TT2 = (x42_TT0 + 1.0) * (x42_dcf * (Tox)); \
|
||||
x42_Cfgsat = 2.0 * epssp * sqrt(2) / `M_PI * (Cf1) * x42_dcf \
|
||||
/ x42_TT0 * ln(x42_TT1 / x42_TT2); \
|
||||
\
|
||||
x42_delta = 1.2e-12; \
|
||||
x42_TT1 = x42_Cfgsat - x42_Cfglog - x42_delta; \
|
||||
Cfg = (Wfin) * (x42_Cfgsat - 0.5 * (x42_TT1 + \
|
||||
sqrt(x42_TT1 * x42_TT1 + 4 * x42_delta * x42_Cfgsat))); \
|
||||
Cgg = x42_Ccg + Cfg; \
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,89 +0,0 @@
|
|||
// ********************************************************
|
||||
// **** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016 ****/
|
||||
// * BSIM Common Multi-Gate Model Equations (Verilog-A)
|
||||
// ********************************************************
|
||||
//
|
||||
// ********************************************************
|
||||
// * Copyright 2016 Regents of the University of California.
|
||||
// * All rights reserved.
|
||||
// *
|
||||
// * Project Director: Prof. Chenming Hu.
|
||||
// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu,
|
||||
// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao,
|
||||
// * Ali Niknejad, Chenming Hu
|
||||
// ********************************************************
|
||||
// ********************************************************
|
||||
// * NONDISCLOSURE STATEMENT
|
||||
// Software is distributed as is, completely without warranty or service
|
||||
// support. The University of California and its employees are not liable
|
||||
// for the condition or performance of the software.
|
||||
// The University of California owns the copyright and grants users a perpetual,
|
||||
// irrevocable, worldwide, non-exclusive, royalty-free license with
|
||||
// respect to the software as set forth below.
|
||||
// The University of California hereby disclaims all implied warranties.
|
||||
// The University of California grants 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 University of California code
|
||||
// itself but may charge for additions, extensions, or support.
|
||||
// 2. In any product based on the software, the users agree to acknowledge
|
||||
// the University of California that developed the software. This
|
||||
// acknowledgment shall appear in the product documentation.
|
||||
// 3. The users agree to obey all U.S. Government restrictions governing
|
||||
// redistribution or export of the software.
|
||||
// 4. The users agree to reproduce any copyright notice which appears on
|
||||
// the software on any copy or modification of such made available
|
||||
// to others
|
||||
// Agreed to on __Jan 01, 2016_________________
|
||||
// By: ___University of California, Berkeley____
|
||||
// ___Chenming Hu_____________________
|
||||
// ___Professor in Graduate School _______
|
||||
// ********************************************************
|
||||
// *** Quasi Static CV Model ***
|
||||
|
||||
T11 = (2.0*qia+nVtm)/DvsatCV;//G
|
||||
qg = qia+dqi*dqi/(6.0*T11);//qc
|
||||
qd = -0.5*(qia-(dqi/(6.0))*(1.0-(dqi/T11)*(1+dqi/(5.0*T11))));//qd
|
||||
// Including CLM in qg and qd
|
||||
inv_MclmCV = 1.0 / MclmCV;
|
||||
qg = inv_MclmCV * qg + (MclmCV - 1.0) * qid;
|
||||
qd = inv_MclmCV * inv_MclmCV * qd + 0.5 * (MclmCV - inv_MclmCV) * qid;
|
||||
|
||||
//Calculating partition for NQSMOD2
|
||||
`ifdef __NQSMOD2__
|
||||
if(NQSMOD == 2) xdpart = qd / qg;
|
||||
else xdpart = 0;
|
||||
`endif
|
||||
|
||||
qs = -qg-qd; //from charge conservation qs = -qg-qd;
|
||||
T6 = NFINtotal*WeffCV0 * LeffCV * coxeff;
|
||||
|
||||
qg = T6*qg;
|
||||
qd = T6*qd;
|
||||
qs = T6*qs;
|
||||
qinv = qg ;
|
||||
if(BULKMOD != 0) begin
|
||||
T1 = NFINtotal * WeffCV0 * LeffCV_acc * cox_acc;
|
||||
T7 = qi_acc_for_QM;//qbulk
|
||||
T10 = T7 * T1;
|
||||
qg_acc = - T10;
|
||||
qb_acc = T10;
|
||||
T1 = NFINtotal * WeffCV0 * LeffCV * cox;
|
||||
T2 = qba - qi_acc_for_QM;
|
||||
T10 = T1*T2;
|
||||
qg_acc = qg_acc - T10;
|
||||
qb_acc = qb_acc + T10;
|
||||
T1 = NFINtotal * WeffCV0 * LeffCV * cox;
|
||||
T2 = (nq-1.0)*0.5*(qia+(dqi*dqi/(6.0*T11)));
|
||||
T10 = T1*T2;
|
||||
qg_acc = qg_acc - T10;
|
||||
qb_acc = qb_acc + T10;
|
||||
end
|
||||
|
||||
// if vds is negative, physical charge on qd is qs
|
||||
if (sigvds < 0) begin
|
||||
T1 = qd;
|
||||
qd = qs;
|
||||
qs = T1;
|
||||
end
|
||||
|
||||
|
|
@ -1,84 +0,0 @@
|
|||
// *******************************************************
|
||||
// **** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016 ****/
|
||||
// * BSIM Common Multi-Gate Model Equations (Verilog-A)
|
||||
// ********************************************************
|
||||
//
|
||||
// ********************************************************
|
||||
// * Copyright 2016 Regents of the University of California.
|
||||
// * All rights reserved.
|
||||
// *
|
||||
// * Project Director: Prof. Chenming Hu.
|
||||
// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu, Sourabh Khandelwal
|
||||
// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao,
|
||||
// * Ali Niknejad, Chenming Hu
|
||||
// ********************************************************
|
||||
// ********************************************************
|
||||
// * NONDISCLOSURE STATEMENT
|
||||
// Software is distributed as is, completely without warranty or service
|
||||
// support. The University of California and its employees are not liable
|
||||
// for the condition or performance of the software.
|
||||
// The University of California owns the copyright and grants users a perpetual,
|
||||
// irrevocable, worldwide, non-exclusive, royalty-free license with
|
||||
// respect to the software as set forth below.
|
||||
// The University of California hereby disclaims all implied warranties.
|
||||
// The University of California grants 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 University of California code
|
||||
// itself but may charge for additions, extensions, or support.
|
||||
// 2. In any product based on the software, the users agree to acknowledge
|
||||
// the University of California that developed the software. This
|
||||
// acknowledgment shall appear in the product documentation.
|
||||
// 3. The users agree to obey all U.S. Government restrictions governing
|
||||
// redistribution or export of the software.
|
||||
// 4. The users agree to reproduce any copyright notice which appears on
|
||||
// the software on any copy or modification of such made available
|
||||
// to others
|
||||
// Agreed to on __Jan 01, 2016_________________
|
||||
// By: ___University of California, Berkeley____
|
||||
// ___Chenming Hu_____________________
|
||||
// ___Professor in Graduate School _______
|
||||
// ********************************************************
|
||||
// Source-Drain Resistance Model
|
||||
case(RDSMOD)
|
||||
1: begin
|
||||
Rdsi = 0.0;
|
||||
Dr = 1.0;
|
||||
|
||||
T2 = vgs_noswap - vfbsd;
|
||||
T3 = sqrt(T2 * T2 + 1.0e-1);
|
||||
vgs_eff = 0.5 * (T2 + T3);
|
||||
T4 = 1.0 + PRWGS_i * vgs_eff;
|
||||
T1 = 1.0 / T4;
|
||||
T0 = 0.5 * (T1 + sqrt(T1 * T1 + 0.01));
|
||||
T5 = RSW_i * (1.0 + RSDR_a * lexp(0.5 * PRSDR * lln(V(si,s) * V(si,s) + 1.0E-6)));
|
||||
Rsource = rdstemp * (RSourceGeo + (RSWMIN_i + T5 * T0) * WeffWRFactor);
|
||||
|
||||
T2 = vgd_noswap - vfbsd;
|
||||
T3 = sqrt(T2 * T2 + 1.0e-1);
|
||||
vgd_eff = 0.5 * (T2 + T3);
|
||||
T4 = 1.0 + PRWGD_i * vgd_eff;
|
||||
T1 = 1.0 / T4;
|
||||
T0 = 0.5 * (T1 + sqrt(T1 * T1 + 0.01));
|
||||
T5 = RDW_i * (1.0 + RDDR_a * lexp(0.5 * PRDDR * lln(V(di,d) * V(di,d) + 1.0E-6)));
|
||||
Rdrain = rdstemp * (RDrainGeo + (RDWMIN_i + T5 * T0) * WeffWRFactor);
|
||||
end
|
||||
0: begin
|
||||
Rsource = RSourceGeo;
|
||||
Rdrain = RDrainGeo;
|
||||
T4 = 1.0 + PRWGS_i * qia;
|
||||
T1 = 1.0 / T4;
|
||||
T0 = 0.5 * (T1 + sqrt(T1 * T1 + 0.01));
|
||||
Rdsi = rdstemp * (RDSWMIN_i + RDSW_i * T0) * WeffWRFactor;
|
||||
Dr = 1.0 + (NFINtotal) * beta * ids0_ov_dqi / (Dmob * Dvsat) * Rdsi;
|
||||
end
|
||||
2: begin
|
||||
T4 = 1.0 + PRWGS_i * qia;
|
||||
T1 = 1.0 / T4;
|
||||
T0 = 0.5 * (T1 + sqrt(T1 * T1 + 0.01));
|
||||
Rdsi = rdstemp * (RSourceGeo + RDrainGeo + RDSWMIN_i + RDSW_i * T0) * WeffWRFactor;
|
||||
Dr = 1.0 + (NFINtotal) * beta * ids0_ov_dqi / (Dmob * Dvsat) * Rdsi;
|
||||
Rsource = 0.0;
|
||||
Rdrain = 0.0;
|
||||
end
|
||||
endcase
|
||||
|
|
@ -1,185 +0,0 @@
|
|||
// ********************************************************
|
||||
// **** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016 ****/
|
||||
// * BSIM Common Multi-Gate Model Equations (Verilog-A)
|
||||
// ********************************************************
|
||||
//
|
||||
// ********************************************************
|
||||
// * Copyright 2016 Regents of the University of California.
|
||||
// * All rights reserved.
|
||||
// *
|
||||
// * Project Director: Prof. Chenming Hu.
|
||||
// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu, Sourabh Khandelwal
|
||||
// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao,
|
||||
// * Ali Niknejad, Chenming Hu
|
||||
// ********************************************************
|
||||
// ********************************************************
|
||||
// * NONDISCLOSURE STATEMENT
|
||||
// Software is distributed as is, completely without warranty or service
|
||||
// support. The University of California and its employees are not liable
|
||||
// for the condition or performance of the software.
|
||||
// The University of California owns the copyright and grants users a perpetual,
|
||||
// irrevocable, worldwide, non-exclusive, royalty-free license with
|
||||
// respect to the software as set forth below.
|
||||
// The University of California hereby disclaims all implied warranties.
|
||||
// The University of California grants 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 University of California code
|
||||
// itself but may charge for additions, extensions, or support.
|
||||
// 2. In any product based on the software, the users agree to acknowledge
|
||||
// the University of California that developed the software. This
|
||||
// acknowledgment shall appear in the product documentation.
|
||||
// 3. The users agree to obey all U.S. Government restrictions governing
|
||||
// redistribution or export of the software.
|
||||
// 4. The users agree to reproduce any copyright notice which appears on
|
||||
// the software on any copy or modification of such made available
|
||||
// to others
|
||||
// Agreed to on __Jan 01, 2016__________________
|
||||
// By: ___University of California, Berkeley____
|
||||
// ___Chenming Hu_____________________
|
||||
// ___Professor in Graduate School _______
|
||||
// ********************************************************
|
||||
|
||||
// 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 MEXPQM 4
|
||||
`define DELTA_1 0.02
|
||||
`define DELTA_ASYMM 0.04
|
||||
`define CONSTCtoK (273.15)
|
||||
`define REFTEMP (300.15) /* 27 degrees C */
|
||||
|
||||
|
||||
// Model type definitions
|
||||
`define ntype 1
|
||||
`define ptype 0
|
||||
|
||||
// Physical Constants
|
||||
`define q 1.60219e-19 // Coul
|
||||
`define EPS0 8.8542e-12 // F/m
|
||||
`define HBAR 1.05457e-34 // Joule-sec
|
||||
`define MEL 9.11e-31 // kg
|
||||
`define KboQ 8.617087e-5 // Joule / degree
|
||||
|
||||
// Mathematical functions
|
||||
//`define SINH(x) (0.5 * (lexp(x) - lexp(-(x))))
|
||||
`define COSH(x) (0.5 * (lexp(x) + lexp(-(x))))
|
||||
//`define TANH(x) ((lexp(x) - lexp(-(x))) / (lexp(x) + lexp(-(x))))
|
||||
`define COT(x) ((x)>=`M_PI/2 ? 0 : ((x)<=-`M_PI/2 ? 0 : 1.0/tan(x)))
|
||||
|
||||
// Junction capacitance
|
||||
//ex:(ves_jct, Czbs, PBS_t, SBS, MJS, MJS2, Qes1)
|
||||
`define BSIM6JunctnCap(vex, 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 /*second-step junction*/ \
|
||||
vec = PB * (1.0 - lexp((1.0 / MJ) * lln(1.0/SJ))); /*Switch over voltage*/\
|
||||
pb2 = PB * SJ * MJ2 / MJ / lexp(- (1.0 + MJ) * lln(1.0 - vec / PB)); /*PB for second doping region*/\
|
||||
if (vex > vec) begin \
|
||||
arg = 1.0 - T1; \
|
||||
if (MJ == 0.5) sarg = 1.0 / sqrt(arg); \
|
||||
else sarg = lexp(-MJ * lln(arg)); \
|
||||
Qej = PB * Cz * (1.0 - arg * sarg) / (1.0 - MJ); \
|
||||
end else begin /*vex < vec*/ \
|
||||
arg = 1.0 - vec / PB; \
|
||||
if (MJ == 0.5) sarg = 1.0 / sqrt(arg); \
|
||||
else sarg = lexp(-MJ * lln(arg)); \
|
||||
Qec = PB * Cz * (1.0 - arg * sarg) / (1.0 - MJ); \
|
||||
arg = 1.0 - (vex - vec) / pb2; \
|
||||
if (MJ2 == 0.5) sarg = 1.0 / sqrt(arg); \
|
||||
else sarg = lexp(-MJ2 * lln(arg)); \
|
||||
Qej = Qec + SJ * pb2 * Cz * (1.0 - arg * sarg) / (1.0 - MJ2); \
|
||||
end \
|
||||
end else begin /*single junction*/ \
|
||||
arg = 1.0 - T1; \
|
||||
if (MJ == 0.5) sarg = 1.0 / sqrt(arg); \
|
||||
else sarg = lexp(-MJ * lln(arg)); \
|
||||
Qej = PB * Cz * (1.0 - arg * sarg) / (1.0 - MJ); \
|
||||
end \
|
||||
end else begin /*vex/PB>=0.9*/ \
|
||||
T2 = lexp(-MJ * lln(0.1)); \
|
||||
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); /*Quadratic equation for Qej when vex/PB>=0.9*/\
|
||||
end \
|
||||
end else begin \
|
||||
Qej = 0.0; \
|
||||
end \
|
||||
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)
|
||||
//
|
||||
// IPM instance parameter mFactor(multiplicity, implicit for LRM2.2)
|
||||
// OPP operating point parameter, includes units and description for printing
|
||||
//
|
||||
`define ALIAS(alias,paramName) aliasparam alias = paramName ;
|
||||
`define OPP(nam,uni,des) (*units=uni, desc=des*) 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);
|
||||
|
||||
`ifdef EXPLICIT_MFACTOR
|
||||
`define IPM (*units="" , type="instance", desc="multiplicity factor"*) parameter real m=1.0 from(0.0:inf) ;
|
||||
`define MFACTOR_USE m
|
||||
`else //
|
||||
`define IPM
|
||||
`define MFACTOR_USE 1.0
|
||||
`endif
|
||||
|
|
@ -1,677 +0,0 @@
|
|||
// EPFL-EKV version 2.6: A Verilog-A description.
|
||||
// The intrinsic device is coded according to the official manual
|
||||
// (revision II) available at https://ekv.epfl.ch/model.
|
||||
|
||||
// License information for this implementation:
|
||||
|
||||
// Copyright Ivan Riis Nielsen 2006, Dietmar Warning 2009
|
||||
|
||||
// This model implementation is licensed according to the modified (3-clause) BSD license:
|
||||
/*
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
//Default simulator: Spectre
|
||||
|
||||
`ifdef insideADMS
|
||||
`define P(txt) (*txt*)
|
||||
`define PGIVEN(p) $given(p)
|
||||
`define INITIAL_MODEL @(initial_model)
|
||||
`define INSTANCE @(initial_instance)
|
||||
`define NOISE @(noise)
|
||||
`else
|
||||
`define P(txt) (txt)
|
||||
`define PGIVEN(p) p
|
||||
`define INITIAL_MODEL
|
||||
`define INSTANCE
|
||||
`define NOISE
|
||||
`endif
|
||||
|
||||
//ADS
|
||||
//`include "constants.vams"
|
||||
//`include "disciplines.vams"
|
||||
//`include "compact.vams"
|
||||
|
||||
//Spectre
|
||||
`include "constants.h"
|
||||
`include "discipline.h"
|
||||
|
||||
`define NMOS 1
|
||||
`define PMOS -1
|
||||
|
||||
`define EPSSI `P_EPS0*11.7
|
||||
`define EPSOX `P_EPS0*3.9
|
||||
`define TREF 300.15
|
||||
|
||||
`define SQR(x) ((x)*(x))
|
||||
|
||||
`define VT(temp) (`P_K*temp/`P_Q)
|
||||
`define EG(temp) (1.16-0.000702*`SQR(temp)/(temp+1108))
|
||||
`define NI(temp) (1.45e16*(temp/`TREF)*exp(`EG(`TREF)/(2*`VT(`TREF))-`EG(temp)/(2*`VT(temp))))
|
||||
|
||||
|
||||
`define oneThird 3.3333333333333333e-01
|
||||
|
||||
// Constants needed in safe exponential function (called "expl")
|
||||
`define se05 2.3025850929940458e+02
|
||||
`define ke05 1.0e-100
|
||||
`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
|
||||
// to avoid overflows and underflows and retain C-3 continuity
|
||||
`define expl(x, res) \
|
||||
if (abs(x) < `se05) begin\
|
||||
res = exp(x); \
|
||||
end else begin \
|
||||
if ((x) < -`se05) begin\
|
||||
res = `ke05 / `P3(-`se05 - (x)); \
|
||||
end else begin\
|
||||
res = `ke05inv * `P3((x) - `se05); \
|
||||
end \
|
||||
end
|
||||
|
||||
|
||||
module ekv (d,g,s,b);
|
||||
|
||||
// Node definitions
|
||||
|
||||
inout d,g,s,b;
|
||||
electrical d,g,s,b,di,si;
|
||||
|
||||
// Model parameters
|
||||
|
||||
parameter integer nmos=1 from [0:1] `P(desc="MOS type : nmos:0");
|
||||
parameter integer pmos=1 from [0:1] `P(desc="MOS type : pmos:0");
|
||||
parameter integer MTYPE=(nmos==0 ? (pmos==0 ? 0 : 1) : (pmos==0 ? -1 : 1));
|
||||
parameter real TNOM=27 from (-273.15:inf)
|
||||
`P(desc="Nominal temperature [degC]");
|
||||
parameter real IMAX=1 from (0:inf)
|
||||
`P(desc="Maximum forward junction current before linearization [A]");
|
||||
|
||||
// - intrinsic model (optional, section 4.2.1)
|
||||
parameter real TOX=0 from [0:inf)
|
||||
`P(desc="Oxide thickness [m]");
|
||||
parameter real NSUB=0 from [0:inf)
|
||||
`P(desc="Channel doping [cm^-3]");
|
||||
parameter real VFB=1001.0 from (-inf:inf) // use 1001V as "not specified"
|
||||
`P(desc="Flat-band voltage [V]");
|
||||
parameter real UO=0 from [0:inf)
|
||||
`P(desc="Low-field mobility [cm^2/Vs]");
|
||||
parameter real VMAX=0 from [0:inf)
|
||||
`P(desc="Saturation velocity [m/s]");
|
||||
parameter real THETA=0 from [0:inf)
|
||||
`P(desc="Mobility reduction coefficient [V^-1]");
|
||||
|
||||
// - intrinsic model (process related, section 4.1)
|
||||
parameter real COX=((TOX>0) ? (`EPSOX/TOX) : 0.7m) from [0:inf)
|
||||
`P(desc="Oxide capacitance [F/m^2]");
|
||||
parameter real XJ=0.1u from [1n:inf)
|
||||
`P(desc="Junction depth [m]");
|
||||
parameter real DL=0 from (-inf:inf)
|
||||
`P(desc="Length correction [m]");
|
||||
parameter real DW=0 from (-inf:inf)
|
||||
`P(desc="Width correction [m]");
|
||||
|
||||
// - intrinsic model (basic, section 4.2)
|
||||
parameter real GAMMA=((NSUB>0) ? (sqrt(2*`P_Q*`EPSSI*NSUB*1e6)/COX) : 1) from [0:inf)
|
||||
`P(desc="Body effect parameter [V^0.5]");
|
||||
parameter real PHI=((NSUB>0) ? (2*`VT((TNOM+273.15))*ln(max(NSUB,1)*1e6/`NI((TNOM+273.15)))) : 0.7) from [0.1:inf)
|
||||
`P(desc="Bulk Fermi potential (*2) [V]");
|
||||
parameter real VTO=((VFB<1000.0) ? (VFB+MTYPE*(PHI+GAMMA*sqrt(PHI))) : 0.5) from (-inf:inf)
|
||||
`P(desc="Long-channel threshold voltage [V]");
|
||||
parameter real KP=((UO>0) ? (UO*1e-4*COX) : 50u) from (0:inf)
|
||||
`P(desc="Transconductance parameter [A/V^2]");
|
||||
parameter real UCRIT=(((VMAX>0) && (UO>0)) ? (VMAX/(UO*1e-4)) : 2e6 ) from [100k:inf)
|
||||
`P(desc="Longitudinal critical field [V/m]");
|
||||
parameter real E0=((THETA>0) ? 0 : 1e12) from [100k:inf)
|
||||
`P(desc="Mobility reduction coefficient [V/m]");
|
||||
|
||||
// - intrinsic model (channel length modulation and charge sharing, section 4.3)
|
||||
parameter real LAMBDA=0.5 from [0:inf)
|
||||
`P(desc="Depletion length coefficient (CLM)");
|
||||
parameter real WETA=0.25 from (-inf:inf)
|
||||
`P(desc="Narrow-channel effect coefficient");
|
||||
parameter real LETA=0.1 from (-inf:inf)
|
||||
`P(desc="Short-channel effect coefficient");
|
||||
|
||||
// - intrinsic model (reverse short channel effect, section 4.4)
|
||||
parameter real Q0=0 from (-inf:inf)
|
||||
`P(desc="RSCE peak charge density [C/m^2]");
|
||||
parameter real LK=0.29u from [10n:inf)
|
||||
`P(desc="RSCE characteristic length [m]");
|
||||
|
||||
// - intrinsic model (impact ionization, section 4.5)
|
||||
parameter real IBA=0 from (-inf:inf)
|
||||
`P(desc="First impact ionization coefficient [m^-1]");
|
||||
parameter real IBB=3e8 from [1e8:inf)
|
||||
`P(desc="Second impact ionization coefficient [V/m]");
|
||||
parameter real IBN=1 from [0.1:inf)
|
||||
`P(desc="Saturation voltage factor for impact ionization");
|
||||
|
||||
// - intrinsic model (temperature, section 4.6)
|
||||
parameter real TCV=1m from (-inf:inf)
|
||||
`P(desc="Threshold voltage TC [V/K]");
|
||||
parameter real BEX=-1.5 from (-inf:inf)
|
||||
`P(desc="Mobility temperature exponent");
|
||||
parameter real UCEX=0.8 from (-inf:inf)
|
||||
`P(desc="Longitudinal critical field temperature exponent");
|
||||
parameter real IBBT=9e-4 from (-inf:inf)
|
||||
`P(desc="Temperature coefficient for IBB [K^-1]");
|
||||
|
||||
// - intrinsic model (matching, section 4.7)
|
||||
parameter real AVTO=0 from (-inf:inf)
|
||||
`P(desc="Area related VTO mismatch parameter [Vm]");
|
||||
parameter real AKP=0 from (-inf:inf)
|
||||
`P(desc="Area related KP mismatch parameter [m]");
|
||||
parameter real AGAMMA=0 from (-inf:inf)
|
||||
`P(desc="Area related GAMMA mismatch parameter [V^0.5*m]");
|
||||
|
||||
// - intrinsic model (flicker noise, section 4.8)
|
||||
parameter real KF=0 from [0:inf)
|
||||
`P(desc="Flicker noise coefficient");
|
||||
parameter real AF=1 from (-inf:inf)
|
||||
`P(desc="Flicker noise exponent");
|
||||
|
||||
// - intrinsic model (setup, section 4.9)
|
||||
parameter real NQS=0 from [0:1]
|
||||
`P(desc="Non-quasi-static operation switch");
|
||||
parameter real SATLIM=exp(4) from (0:inf)
|
||||
`P(desc="Saturation limit (if/ir)");
|
||||
parameter real XQC=0.4 from [0:1]
|
||||
`P(desc="Charge/capacitance model selector");
|
||||
|
||||
// - external parasitic parameters
|
||||
parameter real HDIF=0 from [0:inf)
|
||||
`P(desc="S/D diffusion length (/2) [m]");
|
||||
parameter real RSH=0 from [0:inf)
|
||||
`P(desc="S/D sheet resistance [ohm]");
|
||||
parameter real JS=0 from [0:inf)
|
||||
`P(desc="S/D junction saturation current density [A/m^2]");
|
||||
parameter real JSW=0 from [0:inf)
|
||||
`P(desc="S/D junction sidewall saturation current density [A/m]");
|
||||
parameter real XTI=0 from [0:inf)
|
||||
`P(desc="S/D diode saturation current temperature exponent");
|
||||
parameter real N=1 from [0.5:10]
|
||||
`P(desc="S/D diode emission coefficient");
|
||||
parameter real CJ=0 from [0:inf)
|
||||
`P(desc="S/D zero-bias junction capacitance per area [F/m^2]");
|
||||
parameter real CJSW=0 from [0:inf)
|
||||
`P(desc="S/D zero-bias junction capacitance per perimeter [F/m]");
|
||||
parameter real PB=0.8 from (0:inf)
|
||||
`P(desc="S/D bottom junction builtin potential [V]");
|
||||
parameter real PBSW=PB from (0:inf)
|
||||
`P(desc="S/D sidewall junction builtin potential [V]");
|
||||
parameter real MJ=0.5 from (0:inf)
|
||||
`P(desc="S/D bottom junction grading coefficient");
|
||||
parameter real MJSW=0.333 from (0:inf)
|
||||
`P(desc="S/D sidewall junction grading coefficient");
|
||||
parameter real FC=0.5 from (0:inf)
|
||||
`P(desc="S/D bottom junction forward-bias threshold");
|
||||
parameter real FCSW=FC from (0:inf)
|
||||
`P(desc="S/D sidewall junction forward-bias threshold");
|
||||
parameter real CGSO=0 from [0:inf)
|
||||
`P(desc="Gate-source overlap capacitance per width [F/m]");
|
||||
parameter real CGDO=0 from [0:inf)
|
||||
`P(desc="Gate-drain overlap capacitance per width [F/m]");
|
||||
parameter real CGBO=0 from [0:inf)
|
||||
`P(desc="Gate-bulk overlap capacitance per length [F/m]");
|
||||
|
||||
|
||||
// Instance parameters
|
||||
|
||||
// - intrinsic model
|
||||
parameter real L=10u from [0:inf]
|
||||
`P(type="instance" desc="Drawn length [m]" unit="m");
|
||||
parameter real W=10u from [0:inf]
|
||||
`P(type="instance" desc="Drawn width [m]" unit="m");
|
||||
parameter real M=1 from [0:inf]
|
||||
`P(type="instance" desc="Parallel multiplier" unit="m");
|
||||
// parameter real N=1 from [0:inf]
|
||||
// `P(type="instance" desc="Series multiplier" unit="m");
|
||||
|
||||
// - external parasitics
|
||||
parameter real AD=((HDIF>0) ? (2*HDIF*W) : 0) from [0:inf)
|
||||
`P(desc="Drain area [m^2]" type="instance");
|
||||
parameter real AS=((HDIF>0) ? (2*HDIF*W) : 0) from [0:inf)
|
||||
`P(desc="Source area [m^2]" type="instance");
|
||||
parameter real PD=((HDIF>0) ? (4*HDIF+2*W) : 0) from [0:inf)
|
||||
`P(desc="Drain perimeter [m]" type="instance");
|
||||
parameter real PS=((HDIF>0) ? (4*HDIF+2*W) : 0) from [0:inf)
|
||||
`P(desc="Source perimeter [m]" type="instance");
|
||||
parameter real NRD=((HDIF>0) ? (HDIF/W) : 0) from [0:inf)
|
||||
`P(desc="Drain no. squares" type="instance");
|
||||
parameter real NRS=((HDIF>0) ? (HDIF/W) : 0) from [0:inf)
|
||||
`P(desc="Source no. squares" type="instance");
|
||||
parameter real RS=((RSH>0) ? (RSH*NRS) : 0) from [0:inf)
|
||||
`P(desc="Source resistance [ohms]" type="instance");
|
||||
parameter real RD=((RSH>0) ? (RSH*NRD) : 0) from [0:inf)
|
||||
`P(desc="Drain resistance [ohms]" type="instance");
|
||||
|
||||
|
||||
// Declaration of variables
|
||||
integer mode;
|
||||
real lc,isat_s,vexp_s,gexp_s,isat_d,vexp_d,gexp_d,fact,
|
||||
weff,leff,np,ns,lmin,rd,rs,ceps,ca,xsi,dvrsce,
|
||||
tempk,vt,sqrt_A,vto_a,kp_a,gamma_a,ucrit,phi,ibb,vc,qb0,
|
||||
vg,vd,vs,tmp,vgprime,vp0,vsprime,vdprime,gamma0,gammaprime,vp,n,ifwd,
|
||||
vdss,vdssprime,dv,vds,vip,dl,lprime,leq,irprime,irev,beta0,nau,
|
||||
nq,xf,xr,qd,qs,qi,qb,qg,beta0prime,beta,vpprime,is,ids,vib,
|
||||
idb,ibdj,ibsj,coxt,qdt,qst,qgt,qbt,
|
||||
cbs0,cbs0sw,cbs,cbd0,cbd0sw,cbd,
|
||||
fv,z0,z1,y;
|
||||
|
||||
real cgso,cgdo,cgbo;
|
||||
|
||||
|
||||
analog begin
|
||||
|
||||
`INITIAL_MODEL begin // Model Initialization
|
||||
|
||||
lc = sqrt(`EPSSI/COX*XJ);
|
||||
|
||||
end // INITIAL_MODEL
|
||||
|
||||
`INSTANCE begin // temperature independent device initialization
|
||||
|
||||
weff = W+DW;
|
||||
leff = L+DL;
|
||||
|
||||
np = M;
|
||||
ns = 1;
|
||||
|
||||
// eq. 54
|
||||
lmin = 0.1*ns*leff;
|
||||
|
||||
rs = ns/np*RS;
|
||||
rd = ns/np*RD;
|
||||
|
||||
ceps = 4*22e-3*22e-3;
|
||||
ca = 0.028;
|
||||
xsi = ca*(10*leff/LK-1);
|
||||
dvrsce = 2*Q0/COX/`SQR(1+0.5*(xsi+sqrt(xsi*xsi+ceps)));
|
||||
|
||||
coxt = np*ns*COX*weff*leff;
|
||||
|
||||
end // temperature independent
|
||||
|
||||
`INSTANCE begin // temperature dependent device initialization
|
||||
tempk = $temperature;
|
||||
vt = `VT(tempk);
|
||||
|
||||
sqrt_A = sqrt(np*weff*ns*leff);
|
||||
|
||||
vto_a = MTYPE*(VTO+TCV*(tempk-(TNOM+273.15)))+AVTO/sqrt_A;
|
||||
kp_a = KP*pow(tempk/(TNOM+273.15),BEX)*(1+AKP/sqrt_A);
|
||||
gamma_a = GAMMA+AGAMMA/sqrt_A;
|
||||
ucrit = UCRIT*pow(tempk/(TNOM+273.15),UCEX);
|
||||
phi = PHI*tempk/(TNOM+273.15)-3*vt*ln(tempk/(TNOM+273.15))-`EG(TNOM+273.15)*tempk/(TNOM+273.15)+`EG(tempk);
|
||||
ibb = IBB*(1+IBBT*(tempk-(TNOM+273.15)));
|
||||
|
||||
vc = ucrit*ns*leff;
|
||||
|
||||
// eq. 60
|
||||
qb0 = gamma_a*sqrt(phi);
|
||||
|
||||
fact = (`EG(TNOM+273.15)/`VT(TNOM+273.15)-`EG(tempk)/vt) * pow(tempk/(TNOM+273.15),XTI);
|
||||
`expl(fact,tmp)
|
||||
isat_s = np*ns*(JS*AS+JSW*PS)*tmp;
|
||||
isat_d = np*ns*(JS*AD+JSW*PD)*tmp;
|
||||
|
||||
if (isat_s>0) begin
|
||||
vexp_s = vt*ln(IMAX/isat_s+1);
|
||||
gexp_s = (IMAX+isat_s)/vt;
|
||||
end else begin
|
||||
vexp_s = -1e9;
|
||||
gexp_s = 0;
|
||||
end
|
||||
|
||||
if (isat_d>0) begin
|
||||
vexp_d = vt*ln(IMAX/isat_d+1);
|
||||
gexp_d = (IMAX+isat_d)/vt;
|
||||
end else begin
|
||||
vexp_d = -1e9;
|
||||
gexp_d = 0;
|
||||
end
|
||||
|
||||
cbs0 = np*ns*CJ*AS;
|
||||
cbd0 = np*ns*CJ*AD;
|
||||
cbs0sw = np*ns*CJSW*PS;
|
||||
cbd0sw = np*ns*CJSW*PD;
|
||||
|
||||
cgso = np*ns*CGSO*weff;
|
||||
cgdo = np*ns*CGDO*weff;
|
||||
cgbo = np*ns*CGBO*leff;
|
||||
|
||||
end // temperature dependent
|
||||
|
||||
|
||||
begin //Bias-dependent model evaluation
|
||||
|
||||
vg = MTYPE*V(g,b);
|
||||
vd = MTYPE*V(di,b);
|
||||
vs = MTYPE*V(si,b);
|
||||
// $strobe("vg=%e vd=%e vs=%e",vg,vd,vs);
|
||||
|
||||
if (vd>=vs)
|
||||
mode = 1;
|
||||
else begin
|
||||
mode = -1;
|
||||
tmp = vs;
|
||||
vs = vd;
|
||||
vd = tmp;
|
||||
end
|
||||
|
||||
// eq. 33
|
||||
vgprime = vg-vto_a-dvrsce+phi+gamma_a*sqrt(phi);
|
||||
// eq. 35
|
||||
vsprime = 0.5*(vs+phi+sqrt(`SQR(vs+phi)+16*`SQR(vt)));
|
||||
vdprime = 0.5*(vd+phi+sqrt(`SQR(vd+phi)+16*`SQR(vt)));
|
||||
// $strobe("vgprime=%e vdprime=%e vsprime=%e",vgprime,vdprime,vsprime);
|
||||
// eq. 34
|
||||
if (vgprime>=0) begin
|
||||
vp0 = vgprime-phi-gamma_a*(sqrt(vgprime+0.25*`SQR(gamma_a))-0.5*gamma_a);
|
||||
// eq. 36
|
||||
gamma0 = gamma_a-`EPSSI/COX*(LETA/leff*(sqrt(vsprime)+sqrt(vdprime))-3*WETA/weff*sqrt(vp0+phi));
|
||||
end else begin
|
||||
vp0 = -phi;
|
||||
// eq. 36 - skipped sqrt(vp0+phi) here, it produces inf on derivative
|
||||
gamma0 = gamma_a-`EPSSI/COX*(LETA/leff*(sqrt(vsprime)+sqrt(vdprime)) );
|
||||
end
|
||||
// eq. 37
|
||||
gammaprime = 0.5*(gamma0+sqrt(`SQR(gamma0)+0.1*vt));
|
||||
// eq. 38
|
||||
if (vgprime>=0)
|
||||
vp = vgprime-phi-gammaprime*(sqrt(vgprime+0.25*`SQR(gammaprime))-0.5*gammaprime);
|
||||
else
|
||||
vp = -phi;
|
||||
// $strobe("vp0=%e vp=%e gamma0=%e gammaprime=%e",vp0,vp,gamma0,gammaprime);
|
||||
// eq. 39
|
||||
n = 1+gamma_a*0.5/sqrt(vp+phi+4*vt);
|
||||
|
||||
// Forward current (43-44)
|
||||
fv=(vp-vs)/vt;
|
||||
|
||||
if (fv > -0.35) begin
|
||||
z0 = 2.0/(1.3 + fv - ln(fv+1.6));
|
||||
z1 = (2.0 + z0) / (1.0 + fv + ln(z0));
|
||||
y = (1.0 + fv + ln(z1)) / (2.0 + z1);
|
||||
end
|
||||
else if (fv > -15) begin
|
||||
`expl(-fv,tmp)
|
||||
z0 = 1.55 + tmp;
|
||||
z1 = (2.0 + z0) / (1.0 + fv + ln(z0));
|
||||
y = (1.0 + fv + ln(z1)) / (2.0 + z1);
|
||||
end
|
||||
else if (fv > -23.0) begin
|
||||
`expl(-fv,tmp)
|
||||
y = 1.0 / (2.0 + tmp);
|
||||
end
|
||||
else begin
|
||||
`expl(fv,tmp)
|
||||
y = tmp + 1.0e-64;
|
||||
end
|
||||
|
||||
ifwd = y*(1.0 + y);
|
||||
z0 = 1;
|
||||
z1 = 1;
|
||||
|
||||
// eq. 46
|
||||
vdss = vc*(sqrt(0.25+vt/vc*sqrt(ifwd))-0.5);
|
||||
// eq. 47
|
||||
vdssprime = vc*(sqrt(0.25+vt/vc*(sqrt(ifwd)-0.75*ln(ifwd)))-0.5)+vt*(ln(0.5*vc/vt)-0.6);
|
||||
// $strobe("ifwd=%e vdss=%e vdssprime=%e",ifwd,vdss,vdssprime);
|
||||
// eq. 48
|
||||
dv = 4*vt*sqrt(LAMBDA*(sqrt(ifwd)-vdss/vt)+1.0/64);
|
||||
// eq. 49
|
||||
vds = 0.5*(vd-vs);
|
||||
// eq. 50
|
||||
vip = sqrt(`SQR(vdss)+`SQR(dv))-sqrt(`SQR(vds-vdss)+`SQR(dv));
|
||||
// eq. 52
|
||||
dl = LAMBDA*lc*ln(1+(vds-vip)/(lc*ucrit));
|
||||
|
||||
// eq. 53
|
||||
lprime = ns*leff-dl+(vds+vip)/ucrit;
|
||||
// eq. 55
|
||||
leq = 0.5*(lprime+sqrt(`SQR(lprime)+`SQR(lmin)));
|
||||
|
||||
// eq. 56
|
||||
fv=(vp-vds-vs-sqrt(`SQR(vdssprime)+`SQR(dv))+sqrt(`SQR(vds-vdssprime)+`SQR(dv)))/vt;
|
||||
|
||||
if (fv > -0.35) begin
|
||||
z0 = 2.0/(1.3 + fv - ln(fv+1.6));
|
||||
z1 = (2.0 + z0) / (1.0 + fv + ln(z0));
|
||||
y = (1.0 + fv + ln(z1)) / (2.0 + z1);
|
||||
end
|
||||
else if (fv > -15) begin
|
||||
`expl(-fv,tmp)
|
||||
z0 = 1.55 + tmp;
|
||||
z1 = (2.0 + z0) / (1.0 + fv + ln(z0));
|
||||
y = (1.0 + fv + ln(z1)) / (2.0 + z1);
|
||||
end
|
||||
else if (fv > -23.0) begin
|
||||
`expl(-fv,tmp)
|
||||
y = 1.0 / (2.0 + tmp);
|
||||
end
|
||||
else begin
|
||||
`expl(fv,tmp)
|
||||
y = tmp + 1.0e-64;
|
||||
end
|
||||
|
||||
irprime = y*(1.0 + y);
|
||||
z0 = 1;
|
||||
z1 = 1;
|
||||
|
||||
// eq. 57
|
||||
fv=(vp-vd)/vt;
|
||||
|
||||
if (fv > -0.35) begin
|
||||
z0 = 2.0/(1.3 + fv - ln(fv+1.6));
|
||||
z1 = (2.0 + z0) / (1.0 + fv + ln(z0));
|
||||
y = (1.0 + fv + ln(z1)) / (2.0 + z1);
|
||||
end
|
||||
else if (fv > -15) begin
|
||||
`expl(-fv,tmp)
|
||||
z0 = 1.55 + tmp;
|
||||
z1 = (2.0 + z0) / (1.0 + fv + ln(z0));
|
||||
y = (1.0 + fv + ln(z1)) / (2.0 + z1);
|
||||
end
|
||||
else if (fv > -23.0) begin
|
||||
`expl(-fv,tmp)
|
||||
y = 1.0 / (2.0 + tmp);
|
||||
end
|
||||
else begin
|
||||
`expl(fv,tmp)
|
||||
y = tmp + 1.0e-64;
|
||||
end
|
||||
|
||||
irev = y*(1.0 + y);
|
||||
|
||||
// eq. 58
|
||||
beta0 = kp_a*np*weff/leq;
|
||||
// eq. 59
|
||||
nau = (5+MTYPE)/12.0;
|
||||
|
||||
// eq. 69
|
||||
nq = 1+0.5*gamma_a/sqrt(vp+phi+1e-6);
|
||||
|
||||
// eq. 70
|
||||
xf = sqrt(0.25+ifwd);
|
||||
// eq. 71
|
||||
xr = sqrt(0.25+irev);
|
||||
// eq. 72
|
||||
qd = -nq*(4.0/15*(3*`SQR(xr)*(xr+2*xf)+2*`SQR(xf)*(xf+2*xr))/`SQR(xf+xr)-0.5);
|
||||
// eq. 73
|
||||
qs = -nq*(4.0/15*(3*`SQR(xf)*(xf+2*xr)+2*`SQR(xr)*(xr+2*xf))/`SQR(xf+xr)-0.5);
|
||||
// eq. 74
|
||||
qi = qs+qd;
|
||||
// eq. 75
|
||||
if (vgprime>=0)
|
||||
qb = (-gamma_a*sqrt(vp+phi+1e-6))/vt-(nq-1)/nq*qi;
|
||||
else
|
||||
qb = -vgprime/vt;
|
||||
// eq. 76 (qox removed since it is assumed to be zero)
|
||||
qg = -qi-qb;
|
||||
|
||||
if (E0!=0) begin
|
||||
// eq. 61
|
||||
beta0prime = beta0*(1+COX/(E0*`EPSSI)*qb0);
|
||||
// eq. 62
|
||||
beta = beta0prime/(1+COX/(E0*`EPSSI)*vt*abs(qb+nau*qi));
|
||||
end else begin
|
||||
// eq. 63
|
||||
vpprime = 0.5*(vp+sqrt(`SQR(vp)+2*`SQR(vt)));
|
||||
// eq. 64
|
||||
beta = beta0/(1+THETA*vpprime);
|
||||
end // else: !if(e0!=0)
|
||||
// eq. 65
|
||||
is = 2*n*beta*`SQR(vt);
|
||||
// $strobe("beta0=%e beta0prime=%e beta=%e E0=%e qb0=%e qb=%e qi=%e",beta0,beta0prime,beta,E0,qb0,qb,qi);
|
||||
// eq. 66
|
||||
ids = is*(ifwd-irprime);
|
||||
// eq. 67
|
||||
vib = vd-vs-IBN*2*vdss;
|
||||
// eq. 68
|
||||
if (vib>0) begin
|
||||
`expl((-ibb*lc)/vib,tmp)
|
||||
idb = ids*IBA/ibb*vib*tmp;
|
||||
end else
|
||||
idb = 0;
|
||||
// $strobe("ids=%e idb=%e",ids,idb);
|
||||
|
||||
if (mode>1) begin
|
||||
if (isat_s>0) begin
|
||||
if (-vs>vexp_s)
|
||||
ibsj = IMAX+gexp_s*(-vs-vexp_s);
|
||||
else begin
|
||||
`expl(-vs/(N*vt),tmp)
|
||||
ibsj = isat_s*(tmp-1);
|
||||
end
|
||||
end else
|
||||
ibsj = 0;
|
||||
|
||||
if (isat_d>0) begin
|
||||
if (-vd>vexp_d)
|
||||
ibdj = IMAX+gexp_d*(-vd-vexp_d);
|
||||
else begin
|
||||
`expl(-vd/(N*vt),tmp)
|
||||
ibdj = isat_d*(tmp-1);
|
||||
end
|
||||
end else
|
||||
ibdj = 0;
|
||||
|
||||
end else begin // if (mode>1)
|
||||
if (isat_s>0) begin
|
||||
if (-vd>vexp_s)
|
||||
ibsj = IMAX+gexp_s*(-vd-vexp_s);
|
||||
else begin
|
||||
`expl(-vd/(N*vt),tmp)
|
||||
ibsj = isat_s*(tmp-1);
|
||||
end
|
||||
end else
|
||||
ibsj = 0;
|
||||
|
||||
if (isat_d>0) begin
|
||||
if (-vs>vexp_d)
|
||||
ibdj = IMAX+gexp_d*(-vs-vexp_d);
|
||||
else begin
|
||||
`expl(-vs/(N*vt),tmp)
|
||||
ibdj = isat_d*(tmp-1);
|
||||
end
|
||||
end else
|
||||
ibdj = 0;
|
||||
|
||||
end // else: !if(mode>1)
|
||||
|
||||
qdt = coxt*vt*qd;
|
||||
qst = coxt*vt*qs;
|
||||
qgt = coxt*vt*qg;
|
||||
qbt = coxt*vt*qb;
|
||||
|
||||
cbs = 0;
|
||||
cbd = 0;
|
||||
|
||||
if (cbs0>0) begin
|
||||
if (MTYPE*V(b,si)>FC*PB)
|
||||
cbs = cbs+cbs0/pow(1-FC,MJ)*(1+MJ*(MTYPE*V(b,si)-PB*FC))/(PB*(1-FC));
|
||||
else
|
||||
cbs = cbs+cbs0/pow(1-MTYPE*V(b,si),MJ);
|
||||
end
|
||||
if (cbd0>0) begin
|
||||
if (MTYPE*V(b,di)>FC*PB)
|
||||
cbd = cbd+cbd0/pow(1-FC,MJ)*(1+MJ*(MTYPE*V(b,di)-PB*FC))/(PB*(1-FC));
|
||||
else
|
||||
cbd = cbd+cbd0/pow(1-MTYPE*V(b,di),MJ);
|
||||
end
|
||||
if (cbs0sw>0) begin
|
||||
if (MTYPE*V(b,si)>FCSW*PBSW)
|
||||
cbs = cbs+cbs0sw/pow(1-FCSW,MJSW)*(1+MJSW*(MTYPE*V(b,si)-PBSW*FCSW))/(PBSW*(1-FCSW));
|
||||
else
|
||||
cbs = cbs+cbs0sw/pow(1-MTYPE*V(b,si),MJSW);
|
||||
end
|
||||
if (cbd0sw>0) begin
|
||||
if (MTYPE*V(b,di)>FCSW*PBSW)
|
||||
cbd = cbd+cbd0sw/pow(1-FCSW,MJSW)*(1+MJSW*(MTYPE*V(b,di)-PBSW*FCSW))/(PBSW*(1-FCSW));
|
||||
else
|
||||
cbd = cbd+cbd0sw/pow(1-MTYPE*V(b,di),MJSW);
|
||||
end
|
||||
|
||||
end //Bias-dependent model evaluation
|
||||
|
||||
begin //Define branch sources
|
||||
|
||||
I(di,si) <+ MTYPE*mode*ids;
|
||||
if (mode>0) begin
|
||||
I(di,b) <+ MTYPE*idb;
|
||||
|
||||
I(di,g) <+ MTYPE*ddt(qdt);
|
||||
I(si,g) <+ MTYPE*ddt(qst);
|
||||
|
||||
end else begin
|
||||
I(si,b) <+ MTYPE*idb;
|
||||
|
||||
I(si,g) <+ MTYPE*ddt(qdt);
|
||||
I(di,g) <+ MTYPE*ddt(qst);
|
||||
|
||||
end // else: !if(mode>0)
|
||||
|
||||
I(b,si) <+ MTYPE*ibsj;
|
||||
I(b,di) <+ MTYPE*ibdj;
|
||||
|
||||
I(b,g) <+ MTYPE*ddt(qbt);
|
||||
|
||||
I(g,si) <+ cgso*ddt(V(g,si));
|
||||
I(g,di) <+ cgdo*ddt(V(g,di));
|
||||
I(g,b) <+ cgbo*ddt(V(g,b));
|
||||
|
||||
if (RD>0)
|
||||
I(d,di) <+ V(d,di)/rd;
|
||||
else
|
||||
V(d,di) <+ 0.0;
|
||||
if (RS>0)
|
||||
I(s,si) <+ V(s,si)/rs;
|
||||
else
|
||||
V(s,si) <+ 0.0;
|
||||
|
||||
I(b,si) <+ cbs*ddt(V(b,si));
|
||||
I(b,di) <+ cbd*ddt(V(b,di));
|
||||
|
||||
end // begin
|
||||
|
||||
// `NOISE begin //Define noise sources
|
||||
//
|
||||
// end // noise
|
||||
|
||||
end //analog
|
||||
|
||||
endmodule
|
||||
|
|
@ -1,72 +0,0 @@
|
|||
//
|
||||
// simple capacitor model
|
||||
// t R i C b
|
||||
// o——/\/\/——o——| |——o
|
||||
//
|
||||
|
||||
`include "constants.h"
|
||||
`include "discipline.h"
|
||||
|
||||
`define P_CELCIUS0 273.15
|
||||
`define TNOM (`P_CELCIUS0 + 27.0)
|
||||
|
||||
module r2_cmc(t, b);
|
||||
inout t, b;
|
||||
electrical t, b;
|
||||
electrical i;
|
||||
branch (t, i) R;
|
||||
branch (i, b) C;
|
||||
parameter real w = 1u from (0.1u : +inf);
|
||||
parameter real l = 1u from (0.1u : +inf);
|
||||
parameter real nc = 1 from [1:2];
|
||||
parameter real rsh = 1 from (0 : +inf);
|
||||
parameter real ca = 1f from (0 : +inf);
|
||||
parameter real tcr = 0;
|
||||
parameter real vc1 = 0;
|
||||
parameter real vc2 = 0;
|
||||
parameter real type = 0; // 0=n, 1=p
|
||||
real dT, rsh_t, c, r, Ir, Qc, Ceff, pwrR;
|
||||
analog begin : L
|
||||
if ($port_connected(b) == 0)
|
||||
$finish(113);
|
||||
if ($param_given(tcr))
|
||||
$finish(4);
|
||||
if ($param_given(tcr))
|
||||
$finish(4);
|
||||
if (nc > 2)
|
||||
$finish(0);
|
||||
begin : initializeModel
|
||||
dT = $temperature - `TNOM;
|
||||
rsh_t = rsh*(1.0+tcr*dT);
|
||||
end
|
||||
begin : initializeInstance
|
||||
c = w*l*ca*1e12; // unit conversion
|
||||
if (nc > 1.5)
|
||||
r = rsh_t*(w/l)/12;
|
||||
else
|
||||
r = rsh_t*(w/l)/3;
|
||||
end
|
||||
begin : evaluateStatic
|
||||
Ir = V(R)/r;
|
||||
end
|
||||
begin : evaluateDynamic
|
||||
if (type > 0.5) // inelegant
|
||||
Qc = c*V(C)*(1-V(C)*(vc1/2-V(C)*vc2/3));
|
||||
else
|
||||
Qc = c*V(C)*(1+V(C)*(vc1/2+V(C)*vc2/3));
|
||||
end
|
||||
begin : loadStatic
|
||||
I(R) <+ Ir;
|
||||
end
|
||||
begin : loadDynamic
|
||||
I(C) <+ ddt(Qc);
|
||||
end
|
||||
begin : postProcess
|
||||
if (type > 0.5)
|
||||
Ceff = c*(1.0-V(C)*(vc1/2-V(C)/3));//error!
|
||||
else
|
||||
Ceff = c*(1.0+V(C)*(vc1/2+V(C)/3));//error!
|
||||
pwrR = V(R)*Ir;
|
||||
end
|
||||
end // analog
|
||||
endmodule
|
||||
|
|
@ -1,886 +0,0 @@
|
|||
/* COPYRIGHT NOTE for HICUM Models
|
||||
downloaded 17.03.2018 from
|
||||
https://www.iee.et.tu-dresden.de/iee/eb/hic_new/hic_source.html
|
||||
|
||||
The terms under which the HICUM software is provided are as follows:
|
||||
|
||||
Software is distributed as is, completely without warranty or service support.
|
||||
The Model Owner and his team members are not liable for the condition or
|
||||
performance of the software.
|
||||
|
||||
Michael Schroter (Model Owner) owns the copyright but shall not be liable
|
||||
for any infringement of copyright or other proprietary rights brought by
|
||||
third parties against the users of the software.
|
||||
|
||||
The Model Owner hereby disclaims all implied warranties.
|
||||
|
||||
The Model Owner grants 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:
|
||||
|
||||
The users agree not to charge for the HICUM code itself but may charge
|
||||
for additions, extensions, or support.
|
||||
|
||||
In any product based on the software, the users agree to acknowledge
|
||||
the Model Owner that developed the software. This acknowledgment
|
||||
shall appear in the product documentation.
|
||||
|
||||
The users agree to reproduce any copyright notice which appears on
|
||||
the software on any copy or modification of such made available to
|
||||
others.
|
||||
*/
|
||||
|
||||
// HICUM Level_0 Version_1.12: A Verilog-A description
|
||||
// (A simplified version of HICUM Level2 model for BJT)
|
||||
// ## It is modified after the first version of HICUM/L0 code ##
|
||||
|
||||
// 12/08: Modifications for ngspice and adms2.2.7 DW
|
||||
// Changed VT0 in Vt0 to prevent conflict in compiled C version.
|
||||
// Made a temporary variable cjei_i for cjei output purpose only.
|
||||
|
||||
// Minor code related changes
|
||||
// 03/08: Quick Fix: Default value of TFH has been changed from infinity to zero and modified the default value limits to [0, inf) to include zero
|
||||
// 12/06: Upper limit of FGEO is changed to infinity
|
||||
// 06/06: Thermal node "tnode" set as external
|
||||
// Flag FLSH introduced for controlling Self-heating calculation
|
||||
// all if-else blocks marked with begin-end
|
||||
// all series resistors and RTH are allowed to have a minimum value MIN_R
|
||||
// 07/06: QCJMOD deleted, QJMODF introduced along with with HICJQ
|
||||
// ddx() operator used with QJMOD and QJMODF wherever needed
|
||||
// aj is kept at 2.4 except BE depletion charge
|
||||
// Substrate transistor transfer current added.
|
||||
// Gmin added to (bi,ei) and (bi,ci) branches.
|
||||
// hyperbolic smoothing used in rbi computation to avoid devide-by-zero.
|
||||
|
||||
// *********************************************************************************
|
||||
// 06/06: Comment on NODE COLLAPSING:
|
||||
// Presently this verilog code permits a minimum of 1 milli-Ohm resistance for any
|
||||
// series resistance as well as for thermal resistance RTH. If any of the resistance
|
||||
// values drops below this minimum value, the corresponding nodes are shorted with
|
||||
// zero voltage contribution. We want the model compilers/simulators deal this
|
||||
// situation in such a manner that the corresponding node is COLLAPSED.
|
||||
// We expect that the simulators should permit current contribution statement
|
||||
// for any branch with resistance value more than (or equal to) 1 milli-Ohm without
|
||||
// any convergence problem. In fact, we wish NOT to have to use a voltage contribution
|
||||
// statement in our Verilog code, except as an indication for the model compiler/simulator
|
||||
// to interprete a zero branch voltage as NODE-COLLAPSING action.
|
||||
// **********************************************************************************
|
||||
|
||||
|
||||
//Default simulator: Spectre
|
||||
|
||||
`ifdef insideADMS
|
||||
`define P(p) (*p*)
|
||||
`define PGIVEN(p) $given(p)
|
||||
`define INITIAL_MODEL @(initial_model)
|
||||
`else
|
||||
`define P(p)
|
||||
`define PGIVEN(p) p
|
||||
`define INITIAL_MODEL @(initial_step)
|
||||
`endif
|
||||
|
||||
|
||||
//ADS
|
||||
//`include "constants.vams"
|
||||
//`include "disciplines.vams"
|
||||
//`include "compact.vams"
|
||||
|
||||
//Spectre
|
||||
`include "constants.h"
|
||||
`include "discipline.h"
|
||||
|
||||
|
||||
`define NPN +1
|
||||
`define PNP -1
|
||||
|
||||
`define VPT_thresh 1.0e2
|
||||
`define EXPLIM 80.0
|
||||
`define INF 1.0e6
|
||||
`define TMAX 326.85
|
||||
`define TMIN -100.0
|
||||
`define MIN_R 0.001
|
||||
//`define Gmin 1.0e-12
|
||||
|
||||
`define QCMODF(vj,cj0,vd,z,aj,cjf)\
|
||||
if(cj0 > 0.0) begin\
|
||||
vf = vd*(1.0-exp(-ln(aj)/z));\
|
||||
xvf = (vf-vj)/VT;\
|
||||
xvf2 = sqrt(xvf*xvf+1.921812);\
|
||||
v_j = vf-VT*(xvf+xvf2)*0.5;\
|
||||
dvj = 0.5*(xvf+xvf2)/xvf2;\
|
||||
cjf = cj0*exp(-z*ln(1-v_j/vd))*dvj+aj*cj0*(1-dvj);\
|
||||
end else begin\
|
||||
cjf = 0.0;\
|
||||
end
|
||||
|
||||
// DEPLETION CHARGE CALCULATION
|
||||
// Hyperbolic smoothing used; no punch-through
|
||||
`define QJMODF(vj,cj0,vd,z,aj,qjf)\
|
||||
if(cj0 > 0.0) begin\
|
||||
vf = vd*(1.0-exp(-ln(aj)/z));\
|
||||
xvf = (vf-vj)/VT;\
|
||||
xvf2 = sqrt(xvf*xvf+1.921812);\
|
||||
v_j = vf-VT*(xvf+xvf2)*0.5;\
|
||||
x = 1.0-z;\
|
||||
y = 1.0-exp(x*ln(1.0-v_j/vd));\
|
||||
qjf = cj0*vd*y/x+aj*cj0*(vj-v_j);\
|
||||
end else begin\
|
||||
qjf = 0.0;\
|
||||
end
|
||||
|
||||
|
||||
// Depletion Charge : with punch through
|
||||
`define QJMOD(vj,cj0,vd,z,vpt,aj,qjf)\
|
||||
if(cj0 > 0.0) begin\
|
||||
zr = z/4.0;\
|
||||
vp = vpt-vd;\
|
||||
vf = vd*(1.0-exp(-ln(aj)/z));\
|
||||
cmax = aj*cj0;\
|
||||
cr = cj0*exp((z-zr)*ln(vd/vpt));\
|
||||
a = VT;\
|
||||
ve = (vf-vj)/a;\
|
||||
if (ve <= `EXPLIM) begin\
|
||||
ex1 = exp(ve);\
|
||||
ee1 = 1.0+ex1;\
|
||||
vj1 = vf-a*ln(ee1);\
|
||||
end else begin\
|
||||
vj1 = vj;\
|
||||
end\
|
||||
a = 0.1*vp+4.0*VT;\
|
||||
vr = (vp+vj1)/a;\
|
||||
if (vr <= `EXPLIM) begin\
|
||||
ex1 = exp(vr);\
|
||||
ee1 = 1.0+ex1;\
|
||||
vj2 = -vp+a*ln(ee1);\
|
||||
end else begin\
|
||||
vj2 = vj1;\
|
||||
end\
|
||||
vj4 = vj-vj1;\
|
||||
ez = 1.0-z;\
|
||||
ezr = 1.0-zr;\
|
||||
vdj1 = ln(1.0-vj1/vd);\
|
||||
vdj2 = ln(1.0-vj2/vd);\
|
||||
qj1 = cj0*(1.0-exp(vdj2*ez))/ez;\
|
||||
qj2 = cr*(1.0-exp(vdj1*ezr))/ezr;\
|
||||
qj3 = cr*(1.0-exp(vdj2*ezr))/ezr;\
|
||||
qjf = (qj1+qj2-qj3)*vd+cmax*vj4;\
|
||||
end else begin\
|
||||
qjf = 0.0;\
|
||||
end
|
||||
|
||||
|
||||
// DEPLETION CHARGE CALCULATION SELECTOR:
|
||||
// Dependent on junction punch-through voltage
|
||||
// Important for collector related junctions
|
||||
`define HICJQ(vj,cj0,vd,z,vpt,qjf)\
|
||||
if(vpt < `VPT_thresh) begin\
|
||||
`QJMOD(vj,cj0,vd,z,vpt,2.4,qjf)\
|
||||
end else begin\
|
||||
`QJMODF(vj,cj0,vd,z,2.4,qjf)\
|
||||
end
|
||||
|
||||
//Temperature dependence of depletion capacitance parameters
|
||||
`define TMPHICJ(cj0,vd,z,vg,cj0_t,vd_t)\
|
||||
arg = 0.5*vd/Vt0;\
|
||||
vdj0 = 2*Vt0*ln(exp(arg)-exp(-arg));\
|
||||
vdjt = vdj0*qtt0+vg*(1-qtt0)-mg*VT*ln_qtt0;\
|
||||
vd_t = vdjt+2*VT*ln(0.5*(1+sqrt(1+4*exp(-vdjt/VT))));\
|
||||
cj0_t = cj0*exp(z*ln(vd/vd_t));
|
||||
|
||||
|
||||
//Limiting exponential
|
||||
`define LIN_EXP(le, arg)\
|
||||
if(arg > 80) begin\
|
||||
le = (1 + ((arg) - 80));\
|
||||
arg = 80;\
|
||||
end else begin\
|
||||
le=1;\
|
||||
end\
|
||||
le = le*limexp(arg);
|
||||
|
||||
// IDEAL DIODE (WITHOUT CAPACITANCE):
|
||||
// conductance not calculated
|
||||
// INPUT:
|
||||
// IS, IST : saturation currents (model parameter related)
|
||||
// UM1 : ideality factor
|
||||
// U : branch voltage
|
||||
// IMPLICIT INPUT:
|
||||
// VT : thermal voltage
|
||||
// OUTPUT:
|
||||
// Iz : diode current
|
||||
`define HICDIO(IS,IST,UM1,U,Iz)\
|
||||
DIOY = U/(UM1*VT);\
|
||||
if (IS > 0.0) begin\
|
||||
if (DIOY > 80) begin\
|
||||
le = (1 + ((DIOY) - 80));\
|
||||
DIOY = 80;\
|
||||
end else begin\
|
||||
le = 1;\
|
||||
end\
|
||||
le = le*limexp(DIOY);\
|
||||
Iz = IST*(le-1.0);\
|
||||
if(DIOY <= -14.0) begin\
|
||||
Iz = -IST;\
|
||||
end\
|
||||
end else begin\
|
||||
Iz = 0.0;\
|
||||
end
|
||||
|
||||
|
||||
module hic0_full (c,b,e,s,tnode);
|
||||
|
||||
|
||||
//Node definitions
|
||||
|
||||
inout c,b,e,s,tnode;
|
||||
electrical c `P(desc="external collector node");
|
||||
electrical b `P(desc="external base node");
|
||||
electrical e `P(desc="external emitter node");
|
||||
electrical s `P(desc="external substrate node");
|
||||
electrical ci `P(desc="internal collector node");
|
||||
electrical bi `P(desc="internal base node");
|
||||
electrical ei `P(desc="internal emitter node");
|
||||
electrical tnode `P(desc="local temperature rise node");
|
||||
|
||||
|
||||
//Branch definitions
|
||||
branch (ci,c) br_cic_i;
|
||||
branch (ci,c) br_cic_v;
|
||||
branch (ei,e) br_eie_i;
|
||||
branch (ei,e) br_eie_v;
|
||||
branch (bi,ei) br_biei;
|
||||
branch (bi,ci) br_bici;
|
||||
branch (ci,ei) br_ciei;
|
||||
branch (b,bi) br_bbi_i;
|
||||
branch (b,bi) br_bbi_v;
|
||||
branch (b,e) br_be;
|
||||
branch (b,ci) br_bci;
|
||||
branch (b,s) br_bs;
|
||||
branch (s,ci) br_sci;
|
||||
branch (tnode ) br_sht;
|
||||
|
||||
//
|
||||
// Parameter initialization with default values
|
||||
|
||||
// Collector current
|
||||
parameter real is = 1.0e-16 from [0:1] `P(spice:name="is" desc="(Modified) saturation current" m:factor="yes" unit="A");
|
||||
parameter real mcf = 1.00 from (0:10] `P(spice:name="mcf" desc="Non-ideality coefficient of forward collector current");
|
||||
parameter real mcr = 1.00 from (0:10] `P(spice:name="mcr" desc="Non-ideality coefficient of reverse collector current");
|
||||
parameter real vef = `INF from (0:`INF] `P(spice:name="vef" desc="forward Early voltage (normalization volt.)" unit="V" default:value="infinity");
|
||||
parameter real iqf = `INF from (0:`INF] `P(spice:name="iqf" desc="forward d.c. high-injection toll-off current" unit="A" m:factor="yes" default:value="infinity");
|
||||
parameter real iqr = `INF from (0:`INF] `P(spice:name="iqr" desc="inverse d.c. high-injection roll-off current" unit="A" m:factor="yes" default:value="infinity");
|
||||
parameter real iqfh = `INF from (0:`INF] `P(spice:name="iqfh" desc="high-injection correction current" unit="A" m:factor="yes");
|
||||
parameter real tfh = 0.0 from [0:`INF) `P(spice:name="tfh" desc="high-injection correction factor" test:value="2e-9" m:factor="yes");
|
||||
|
||||
// Base current
|
||||
parameter real ibes = 1e-18 from [0:1] `P(spice:name="ibes" desc="BE saturation current" unit="A" m:factor="yes");
|
||||
parameter real mbe = 1.0 from (0:10] `P(spice:name="mbe" desc="BE non-ideality factor");
|
||||
parameter real ires = 0.0 from [0:1] `P(spice:name="ires" desc="BE recombination saturation current" test:value="1e-16" unit="A" m:factor="yes");
|
||||
parameter real mre = 2.0 from (0:10] `P(spice:name="mre" desc="BE recombination non-ideality factor");
|
||||
parameter real ibcs = 0.0 from [0:1] `P(spice:name="ibcs" desc="BC saturation current" test:value="1e-16" unit="A" m:factor="yes");
|
||||
parameter real mbc = 1.0 from (0:10] `P(spice:name="mbc" desc="BC non-ideality factor");
|
||||
|
||||
// BE depletion cap
|
||||
parameter real cje0 = 1.0e-20 from (0:`INF) `P(spice:name="cje0" desc="Zero-bias BE depletion capacitance" unit="F" test:value="2e-14" m:factor="yes");
|
||||
parameter real vde = 0.9 from (0:10] `P(spice:name="vde" desc="BE built-in voltage" unit="V");
|
||||
parameter real ze = 0.5 from (0:1] `P(spice:name="ze" desc="BE exponent factor");
|
||||
parameter real aje = 2.5 from [1:`INF) `P(spice:name="aje" desc="Ratio of maximum to zero-bias value");
|
||||
|
||||
// Transit time
|
||||
parameter real t0 = 0.0 from [0:`INF) `P(spice:name="t0" desc="low current transit time at Vbici=0" test:value="5e-12" unit="s");
|
||||
parameter real dt0h = 0.0; // from [0:`INF) `P(spice:name="dt0h" desc="Base width modulation contribution" test:value="2e-12" unit="s");
|
||||
parameter real tbvl = 0.0 from [0:`INF) `P(spice:name="tbvl" desc="SCR width modulation contribution" test:value="4e-12" unit="s");
|
||||
parameter real tef0 = 0.0 from [0:`INF) `P(spice:name="tef0" desc="Storage time in neutral emitter" test:value="1e-12" unit="s");
|
||||
parameter real gte = 1.0 from (0:10] `P(spice:name="gte" desc="Exponent factor for emmiter transit time");
|
||||
parameter real thcs = 0.0 from [0:`INF) `P(spice:name="thcs" desc="Saturation time at high current densities" test:value="3e-11" unit="s");
|
||||
parameter real ahc = 0.1 from (0:10] `P(spice:name="ahc" desc="Smoothing facor for current dependence");
|
||||
parameter real tr = 0.0 from [0:`INF) `P(spice:name="tr" desc="Storage time at inverse operation" unit="s");
|
||||
|
||||
// Critical current
|
||||
parameter real rci0 = 150 from (0:`INF) `P(spice:name="rci0" desc="Low-field collector resistance under emitter" test:value="50" unit="Ohm" m:inverse_factor="yes");
|
||||
parameter real vlim = 0.5 from (0:10] `P(spice:name="vlim" desc="Voltage dividing ohmic and satur.region" unit="V");
|
||||
parameter real vpt = 100 from (0:100] `P(spice:name="vpt" desc="Punch-through voltage" test:value="10" unit="V" default="infinity");
|
||||
parameter real vces = 0.1 from [0:1] `P(spice:name="vces" desc="Saturation voltage" unit="V");
|
||||
|
||||
// BC depletion cap intern
|
||||
parameter real cjci0 = 1.0e-20 from (0:`INF) `P(spice:name="cjci0" desc="Total zero-bias BC depletion capacitance" test:value="1e-15" unit="F" m:factor="yes");
|
||||
parameter real vdci = 0.7 from (0:10] `P(spice:name="vdci" desc="BC built-in voltage" test:value="0.7" unit="V");
|
||||
parameter real zci = 0.333 from (0:1] `P(spice:name="zci" desc="BC exponent factor" test:value="0.4");
|
||||
parameter real vptci = 100 from (0:100] `P(spice:name="vptci" desc="Punch-through voltage of BC junction" test:value="50" unit="V");
|
||||
|
||||
// BC depletion cap extern
|
||||
parameter real cjcx0 = 1.0e-20 from [0:`INF) `P(spice:name="cjcx0" desc="Zero-bias external BC depletion capacitance" unit="F" test:value="1e-15" m:factor="yes");
|
||||
parameter real vdcx = 0.7 from (0:10] `P(spice:name="vdcx" desc="External BC built-in voltage" unit="V");
|
||||
parameter real zcx = 0.333 from (0:1] `P(spice:name="zcx" desc="External BC exponent factor");
|
||||
parameter real vptcx = 100 from (0:100] `P(spice:name="vptcx" desc="Punch-through voltage" unit="V" test:value="5.0" default="infinity");
|
||||
parameter real fbc = 1.0 from [0:1] `P(spice:name="fbc" desc="Split factor = Cjci0/Cjc0" test:value="0.5");
|
||||
|
||||
// Base resistance
|
||||
parameter real rbi0 = 0.0 from [0:`INF) `P(spice:name="rbi0" desc="Internal base resistance at zero-bias" test:value="100" unit="Ohm" m:inverse_factor="yes");
|
||||
parameter real vr0e = 2.5 from (0:`INF] `P(spice:name="vr0e" desc="forward Early voltage (normalization volt.)" unit="V");
|
||||
parameter real vr0c = `INF from (0:`INF] `P(spice:name="vr0c" desc="forward Early voltage (normalization volt.)" unit="V" default="infinity" test:value="25.0");
|
||||
parameter real fgeo = 0.656 from [0:`INF] `P(spice:name="fgeo" desc="Geometry factor" test:value="0.73");
|
||||
|
||||
// Series resistances
|
||||
parameter real rbx = 0.0 from [0:`INF) `P(spice:name="rbx" desc="External base series resistance" test:value="8.8" unit="Ohm" m:inverse_factor="yes");
|
||||
parameter real rcx = 0.0 from [0:`INF) `P(spice:name="rcx" desc="Emitter series resistance" test:value="12.5" unit="Ohm" m:inverse_factor="yes");
|
||||
parameter real re = 0.0 from [0:`INF) `P(spice:name="re" desc="External collector series resistance" test:value="9.16" unit="Ohm" m:inverse_factor="yes");
|
||||
|
||||
// Substrate transfer current, diode current and cap
|
||||
parameter real itss = 0.0 from [0:1.0] `P(spice:name="itss" desc="Substrate transistor transfer saturation current" unit="A" test:value="1e-17" m:factor="yes");
|
||||
parameter real msf = 1.0 from (0:10] `P(spice:name="msf" desc="Substrate transistor transfer current non-ideality factor");
|
||||
parameter real iscs = 0.0 from [0:1.0] `P(spice:name="iscs" desc="SC saturation current" unit="A" test:value="1e-17" m:factor="yes");
|
||||
parameter real msc = 1.0 from (0:10] `P(spice:name="msc" desc="SC non-ideality factor");
|
||||
parameter real cjs0 = 1.0e-20 from [0:`INF) `P(spice:name="cjs0" desc="Zero-bias SC depletion capacitance" unit="F" test:value="1e-15" m:factor="yes");
|
||||
parameter real vds = 0.3 from (0:10] `P(spice:name="vds" desc="SC built-in voltage" unit="V");
|
||||
parameter real zs = 0.3 from (0:1] `P(spice:name="zs" desc="External SC exponent factor");
|
||||
parameter real vpts = 100 from (0:100] `P(spice:name="vpts" desc="SC punch-through voltage" unit="V" test:value="5.0" default="infinity");
|
||||
|
||||
// Parasitic caps
|
||||
parameter real cbcpar = 0.0 from [0:`INF) `P(spice:name="cbcpar" desc="Collector-base isolation (overlap) capacitance" unit="F" m:factor="yes" test:value="1e-15");
|
||||
parameter real cbepar = 0.0 from [0:`INF) `P(spice:name="cbepar" desc="Emitter-base oxide capacitance" unit="F" m:factor="yes" test:value="2e-15");
|
||||
|
||||
// BC avalanche current
|
||||
parameter real eavl = 0.0 from [0:inf) `P(spice:name="eavl" desc="Exponent factor" test:value="1e-14");
|
||||
parameter real kavl = 0.0 from [0:`INF) `P(spice:name="kavl" desc="Prefactor" test:value="1.19");
|
||||
|
||||
// Flicker noise
|
||||
parameter real kf = 0.0 from [0:`INF) `P(spice:name="kf" desc="flicker noise coefficient" unit="M^(1-AF)");
|
||||
parameter real af = 2.0 from (0:10] `P(spice:name="af" desc="flicker noise exponent factor");
|
||||
|
||||
// Temperature dependance
|
||||
parameter real vgb = 1.2 from (0:10] `P(spice:name="vgb" desc="Bandgap-voltage" unit="V" test:value="1.17");
|
||||
parameter real vge = 1.17 from (0:10] `P(spice:name="vge" desc="Effective emitter bandgap-voltage" unit="V" test:value="1.07");
|
||||
parameter real vgc = 1.17 from (0:10] `P(spice:name="vgc" desc="Effective collector bandgap-voltage" unit="V" test:value="1.14");
|
||||
parameter real vgs = 1.17 from (0:10] `P(spice:name="vgs" desc="Effective substrate bandgap-voltage" unit="V" test:value="1.17");
|
||||
parameter real f1vg =-1.02377e-4 `P(spice:name="f1vg" desc="Coefficient K1 in T-dependent bandgap equation" unit="V/K");
|
||||
parameter real f2vg = 4.3215e-4 `P(spice:name="f2vg" desc="Coefficient K2 in T-dependent bandgap equation" unit="V/K");
|
||||
parameter real alt0 = 0.0 `P(spice:name="alt0" desc="Frist-order TC of tf0" unit="1/K");
|
||||
parameter real kt0 = 0.0 `P(spice:name="kt0" desc="Second-order TC of tf0" unit="1/K^2");
|
||||
parameter real zetact = 3.0 `P(spice:name="zetact" desc="Exponent coefficient in transfer current temperature dependence" test:value="3.5");
|
||||
parameter real zetabet = 3.5 `P(spice:name="zetabet" desc="Exponent coefficient in BE junction current temperature dependence" test:value="4.0");
|
||||
parameter real zetaci = 0.0 `P(spice:name="zetaci" desc="TC of epi-collector diffusivity" test:value="1.6");
|
||||
parameter real alvs = 0.0 `P(spice:name="alvs" desc="Relative TC of satur.drift velocity" unit="1/K" test:value="1e-3");
|
||||
parameter real alces = 0.0 `P(spice:name="alces" desc="Relative TC of vces" unit="1/K" test:value="4e-4");
|
||||
parameter real zetarbi = 0.0 `P(spice:name="zetarbi" desc="TC of internal base resistance" test:value="0.6");
|
||||
parameter real zetarbx = 0.0 `P(spice:name="zetarbx" desc="TC of external base resistance" test:value="0.2");
|
||||
parameter real zetarcx = 0.0 `P(spice:name="zetarcx" desc="TC of external collector resistance" test:value="0.2");
|
||||
parameter real zetare = 0.0 `P(spice:name="zetare" desc="TC of emitter resistances");
|
||||
parameter real alkav = 0.0 `P(spice:name="alkav" desc="TC of avalanche prefactor" unit="1/K");
|
||||
parameter real aleav = 0.0 `P(spice:name="aleav" desc="TC of avalanche exponential factor" unit="1/K");
|
||||
|
||||
// Self-heating
|
||||
parameter integer flsh = 0 from [0:2] `P(spice:name="flsh" desc="Flag for self-heating calculation" test:value="2");
|
||||
parameter real rth = 0.0 from [0:`INF) `P(spice:name="rth" desc="Thermal resistance" test:value="200.0" unit="K/W" m:inverse_factor="yes");
|
||||
parameter real cth = 0.0 from [0:`INF) `P(spice:name="cth" desc="Thermal capacitance" test:value="0.1" unit="Ws/K" m:factor="yes");
|
||||
|
||||
// Transistor type
|
||||
parameter integer npn = 1 from [0:1] `P(spice:isflag="yes" desc="model type flag for npn" );
|
||||
parameter integer pnp = 0 from [0:1] `P(desc="model type flag for pnp" );
|
||||
|
||||
//Circuit simulator specific parameters
|
||||
parameter real tnom = 27 `P(spice:name="tnom" desc="Temperature for which parameters are valid" unit="C");
|
||||
parameter real dt = 0.0 `P(spice:name="dt" type="instance" desc="Temperature change for particular transistor" unit="K");
|
||||
|
||||
|
||||
// Declaration of the variables: begin
|
||||
|
||||
real HICUMtype `P(spice:name="type" /* desc="Device type from npn or pnp flags" unit="no" */);
|
||||
|
||||
// QCJMOD
|
||||
real cj0,vd,z,aj;
|
||||
real zr,vp;
|
||||
real cmax,cr,ve;
|
||||
real ee1,ez,ezr,vdj1,vdj2,ex1,vr,vj1,vj2,vj4;
|
||||
real qj1,qj2,qj3,qjf;
|
||||
|
||||
|
||||
//Cjfun *** VT, removed: BA
|
||||
real cj1,cj2,cj3,cjf;
|
||||
|
||||
|
||||
//cjtfun *** tnom,VT,mg,Vt0, removed: BA
|
||||
real vg;
|
||||
real vdj0,vdjt,cj0_t,vd_t,aj_t;
|
||||
|
||||
|
||||
// temperature and drift
|
||||
real VT,Tamb,Tdev,Tnom,dT,qtt0,ln_qtt0;
|
||||
real vde_t,vdci_t,vdcx_t,vds_t;
|
||||
real is_t,ires_t,ibes_t,ibcs_t;
|
||||
real itss_t,iscs_t,cje0_t,cjci0_t,cjcx0_t;
|
||||
real cjs0_t,rci0_t,vlim_t;
|
||||
real vces_t,thcs_t,tef0_t,rbi0_t;
|
||||
real rbx_t,rcx_t,re_t,t0_t,eavl_t,kavl_t;
|
||||
real aje_t;
|
||||
|
||||
// bc charge and cap
|
||||
real qjci `P(desc="B-C internal junction charge" unit="C");
|
||||
real qjcx,qjcii,cjcii,qjcxi,qjciii; //cjcx
|
||||
real cjci0_t_ii,cjcx0_t_ii,cjcx0_t_i,v_j;
|
||||
|
||||
// be junction
|
||||
real qjei `P(desc="B-E internal junction charge" unit="C");
|
||||
real cjei_i `P(desc="B-E internal junction capacitance" unit="F"); // dw: adms2.2.7 problem
|
||||
real cjei,vf,vj,x,y,e1,e2;
|
||||
|
||||
// transfer and internal base current
|
||||
real cc,qj_2,facl;
|
||||
real tf0,ickf,ickr,itfi,itri,qm;
|
||||
real qpt,itf,itr;
|
||||
real it `P(desc="Transfer Current" unit="A");
|
||||
real ibe,ire,ibi;
|
||||
real itfl,itrl,al,s3l,wl,d_qfh;
|
||||
|
||||
// be diffusion charge
|
||||
real qf,qf0,dqfh,dqef;
|
||||
real dtef,dtfh,tf,ick;
|
||||
real vc,vceff,s3,w,a,tww;
|
||||
|
||||
// bc diffusion charge
|
||||
real qr;
|
||||
|
||||
// avalanche current source
|
||||
real v_bord,a_iavl,lncc;
|
||||
|
||||
// base resistance
|
||||
real rb,eta,rbi,qje,Qz_nom,fQz;
|
||||
|
||||
// substrate transistor, diode and cap
|
||||
real qjs,HSa,HSb,HSI_Tsu,HSUM;
|
||||
|
||||
// self heating
|
||||
real pterm;
|
||||
|
||||
// new for temperature dependence
|
||||
real mg,zetabci,zetasct,zetatef,avs;
|
||||
real k1,k2,vgbe,vgbc,vgsc,dvg;
|
||||
real xvf,xvf2,dvj,uvc,Vt0;
|
||||
|
||||
// noise
|
||||
real flicker_Pwr,fourkt,twoq;
|
||||
|
||||
// LIN_EXP
|
||||
real le,arg,le1,arg1,le2,arg2;
|
||||
|
||||
//HICDIO
|
||||
real IS,IST,UM1,U,Iz,DIOY;
|
||||
|
||||
// branch voltages
|
||||
real Vbci,Vbici,Vbiei,Vciei,Vsci,Veie,Vbbi,Vcic,Vbe,Vrth;
|
||||
|
||||
//Output to be seen
|
||||
real ijbc `P(desc="Base-collector diode current" unit="A");
|
||||
real iavl `P(desc="Avalanche current" unit="A");
|
||||
real ijsc `P(desc="Substrate-collector diode current" unit="A");
|
||||
real Ieei `P(desc="Current through external to internal emitter node" unit="A");
|
||||
real Icci `P(desc="Current through external to internal collector node" unit="A");
|
||||
real Ibbi `P(desc="Current through external to internal base node" unit="A");
|
||||
real Ibici `P(desc="Base-collector diode current minus the avalanche current" unit="A");
|
||||
real ijbe `P(desc="Base-emitter diode current" unit="A");
|
||||
|
||||
real Qbci,Qbe,Qbici,Qbiei;
|
||||
//Declaration of the variables: end
|
||||
|
||||
|
||||
//
|
||||
//======================== calculation of the transistor ===================
|
||||
//
|
||||
|
||||
analog begin
|
||||
|
||||
// assign voltages with regard to transistor type
|
||||
|
||||
`INITIAL_MODEL
|
||||
begin
|
||||
if (`PGIVEN(npn))
|
||||
HICUMtype = `NPN;
|
||||
else if (`PGIVEN(pnp))
|
||||
HICUMtype = `PNP;
|
||||
else
|
||||
HICUMtype = `NPN;
|
||||
end
|
||||
|
||||
Vbci = HICUMtype*V(br_bci);
|
||||
Vbici = HICUMtype*V(br_bici);
|
||||
Vbiei = HICUMtype*V(br_biei);
|
||||
Vciei = HICUMtype*V(br_ciei);
|
||||
Vsci = HICUMtype*V(br_sci);
|
||||
Veie = V(br_eie_v);
|
||||
Vcic = V(br_cic_v);
|
||||
Vbbi = V(br_bbi_v);
|
||||
Vbe = HICUMtype*V(br_be);
|
||||
Vrth = V(br_sht);
|
||||
|
||||
|
||||
|
||||
//
|
||||
// temperature and resulting parameter drift
|
||||
//
|
||||
|
||||
Tnom = tnom+273.15;
|
||||
Tamb = $temperature;
|
||||
Tdev = Tamb+dt+Vrth;
|
||||
|
||||
// Limit temperature to avoid FPE's in equations
|
||||
if(Tdev < `TMIN + 273.15) begin
|
||||
Tdev = `TMIN + 273.15;
|
||||
end else begin
|
||||
if (Tdev > `TMAX + 273.15) begin
|
||||
Tdev = `TMAX + 273.15;
|
||||
end
|
||||
end
|
||||
|
||||
Vt0 = `P_K*Tnom /`P_Q;
|
||||
VT = `P_K*Tdev /`P_Q;
|
||||
dT = Tdev-Tnom;
|
||||
qtt0 = Tdev/Tnom;
|
||||
ln_qtt0 = ln(qtt0);
|
||||
k1 = f1vg*Tnom;
|
||||
k2 = f2vg*Tnom+k1*ln(Tnom);
|
||||
avs = alvs*Tnom;
|
||||
vgbe = (vgb+vge)/2;
|
||||
vgbc = (vgb+vgc)/2;
|
||||
vgsc = (vgs+vgc)/2;
|
||||
mg = 3-`P_Q*f1vg/`P_K;
|
||||
zetabci = mg+1-zetaci;
|
||||
zetasct = mg-1.5; //+1-m_upS with m_upS=2.5
|
||||
is_t = is*exp(zetact*ln_qtt0+vgb/VT*(qtt0-1));
|
||||
ibes_t = ibes*exp(zetabet*ln_qtt0+vge/VT*(qtt0-1));
|
||||
ires_t = ires*exp(0.5*mg*ln_qtt0+0.5*vgbe/VT*(qtt0-1));
|
||||
ibcs_t = ibcs*exp(zetabci*ln_qtt0+vgc/VT*(qtt0-1));
|
||||
itss_t = itss*exp(zetasct*ln_qtt0+vgc/VT*(qtt0-1));
|
||||
iscs_t = iscs*exp(zetasct*ln_qtt0+vgs/VT*(qtt0-1));
|
||||
`TMPHICJ(cje0,vde,ze,vgbe,cje0_t,vde_t)
|
||||
aje_t = aje*vde_t/vde;
|
||||
`TMPHICJ(cjci0,vdci,zci,vgbc,cjci0_t,vdci_t)
|
||||
`TMPHICJ(cjcx0,vdcx,zcx,vgbc,cjcx0_t,vdcx_t)
|
||||
`TMPHICJ(cjs0,vds,zs,vgsc,cjs0_t,vds_t)
|
||||
rci0_t = rci0*exp(zetaci*ln_qtt0);
|
||||
vlim_t = vlim*exp((zetaci-avs)*ln_qtt0);
|
||||
vces_t = vces*(1+alces*dT);
|
||||
t0_t = t0*(1+alt0*dT+kt0*dT*dT);
|
||||
thcs_t = thcs*exp((zetaci-1)*ln_qtt0);
|
||||
zetatef = zetabet-zetact-0.5;
|
||||
dvg = vgb-vge;
|
||||
tef0_t = tef0*exp(zetatef*ln_qtt0-dvg/VT*(qtt0-1));
|
||||
rbx_t = rbx*exp(zetarbx*ln_qtt0);
|
||||
rcx_t = rcx*exp(zetarcx*ln_qtt0);
|
||||
rbi0_t = rbi0*exp(zetarbi*ln_qtt0);
|
||||
re_t = re*exp(zetare*ln_qtt0);
|
||||
eavl_t = eavl*exp(aleav*dT);
|
||||
kavl_t = kavl*exp(alkav*dT);
|
||||
|
||||
|
||||
//
|
||||
// Calculation of intrinsic transistor elements
|
||||
//
|
||||
|
||||
// BC charge and cap (internal and external)
|
||||
|
||||
// The cjcx0 value is used to switch between one (cjcx0=0) and two bc parameter sets
|
||||
// 1. For one parameter set only the internal bc set is partitioned by fbc
|
||||
// 2. For two independent sets only the external set is partitioned by fbc
|
||||
|
||||
if (cjcx0_t==0) begin
|
||||
cjci0_t_ii = cjci0_t*fbc; // zero bias internal portion
|
||||
qjcxi = 0;
|
||||
cjcx0_t_i = cjci0_t*(1-fbc); // zero bias external portion
|
||||
`HICJQ(Vbci,cjcx0_t_i,vdci_t,zci,vptci,qjcx)
|
||||
end else begin
|
||||
cjci0_t_ii = cjci0_t; // zero bias internal portion
|
||||
cjcx0_t_ii = cjcx0_t*fbc;
|
||||
`HICJQ(Vbici,cjcx0_t_ii,vdcx_t,zcx,vptcx,qjcxi)
|
||||
cjcx0_t_i = cjcx0_t*(1-fbc); // zero bias external portion
|
||||
`HICJQ(Vbci,cjcx0_t_i,vdcx_t,zcx,vptcx,qjcx)
|
||||
end
|
||||
`HICJQ(Vbici,cjci0_t_ii,vdci_t,zci,vptci,qjci)
|
||||
qjcii = qjci+qjcxi;
|
||||
|
||||
//Internal bc cap without punch through for cc
|
||||
|
||||
//`HICJQ(Vbici,cjci0_t_ii,vdci_t,zci,100,qjciii)
|
||||
`QCMODF(Vbici,cjci0_t_ii,vdci_t,zci,2.4,cjcii)
|
||||
//cjcii = ddx(qjciii,V(bi));
|
||||
|
||||
//Internal be cap and charge
|
||||
|
||||
`QJMODF(Vbiei,cje0_t,vde_t,ze,aje_t,qjei)
|
||||
cjei = ddx(qjei,V(bi));
|
||||
cjei_i = cjei; // dw: adms2.2.7 problem
|
||||
|
||||
// Critical current: ick
|
||||
vc = Vciei-vces_t;
|
||||
uvc = vc/VT-1;
|
||||
vceff = VT*(1+0.5*(uvc+sqrt(uvc*uvc+1.921812)));
|
||||
x = (vceff-vlim_t)/vpt;
|
||||
ick = vceff*(1+0.5*(x+sqrt(x*x+1e-3)))/rci0_t/sqrt(1+vceff*vceff/vlim_t/vlim_t);
|
||||
|
||||
// Transfer current
|
||||
|
||||
// Normalized BC cap and carge
|
||||
cc = cjci0_t_ii/cjcii;
|
||||
qjci = qjci/cjci0_t_ii;
|
||||
qj_2 = (1+qjci/vef)/2;
|
||||
|
||||
// Minority charge transit time
|
||||
tf0 = t0_t+dt0h*(cc-1)+tbvl*(1/cc-1);
|
||||
|
||||
// DC critical currents
|
||||
ickf = iqf;
|
||||
ickr = iqr;
|
||||
|
||||
// Ideal transfer currents
|
||||
arg1 = Vbiei/(mcf*VT);
|
||||
`LIN_EXP(le1,arg1)
|
||||
itfi=is_t*le1;
|
||||
|
||||
arg2 = Vbici/(mcr*VT);
|
||||
`LIN_EXP(le2,arg2)
|
||||
itri=is_t*le2;
|
||||
|
||||
|
||||
// Normalized minority charge
|
||||
qm = (itfi/ickf+itri/ickr);
|
||||
|
||||
// Normalized total hole charge
|
||||
qpt = qj_2+sqrt((qj_2)*(qj_2)+qm);
|
||||
if (qpt<=1e-20) begin
|
||||
qpt=1e-20;
|
||||
end
|
||||
|
||||
// Low transfer current
|
||||
itfl = itfi/qpt;
|
||||
itrl = itri/qpt;
|
||||
|
||||
// Normalized injection width with low transfer current
|
||||
// and normalized charge component
|
||||
if (itfl<=1e-20) begin
|
||||
itfl = 1e-20;
|
||||
end
|
||||
al = 1-ick/itfl;
|
||||
s3l = sqrt(al*al+ahc);
|
||||
wl = (al+s3l)/(1+sqrt(1+ahc));
|
||||
d_qfh = (wl*wl+tfh*itfl/ick)*itfl/iqfh;
|
||||
|
||||
// Transfer current
|
||||
facl = 1/(1+d_qfh/qpt);
|
||||
itf = itfl*facl;
|
||||
itr = itrl*facl;
|
||||
if (itf<=1e-20) begin
|
||||
itf = 1e-20;
|
||||
end
|
||||
it = itf-itr;
|
||||
|
||||
// BE diffusion charge
|
||||
|
||||
// Calculation of low-current portion
|
||||
qf0 = tf0*itf;
|
||||
|
||||
// Current dependent component
|
||||
a = 1-ick/itf;
|
||||
s3 = sqrt(a*a+ahc);
|
||||
w = (a+s3)/(1+sqrt(1+ahc));
|
||||
tww = thcs_t*w*w;
|
||||
dqfh = tww*itf;
|
||||
dtfh = tww*(1+2*ick/itf/s3);
|
||||
|
||||
// Emitter component
|
||||
dtef = tef0_t*exp(gte*ln(itf/ick));
|
||||
dqef = dtef*itf/(gte+1.0);
|
||||
|
||||
// Total minority charge and transit time
|
||||
qf = qf0+dqef+dqfh;
|
||||
tf = tf0+dtfh+dtef;
|
||||
|
||||
// BC diffusion charge
|
||||
qr = tr*itr;
|
||||
|
||||
// Internal base current
|
||||
|
||||
// BE diode
|
||||
`HICDIO(ibes,ibes_t,mbe,Vbiei,ibe)
|
||||
`HICDIO(ires,ires_t,mre,Vbiei,ire)
|
||||
ijbe = ibe+ire;
|
||||
|
||||
// BC diode
|
||||
`HICDIO(ibcs,ibcs_t,mbc,Vbici,ijbc)
|
||||
|
||||
// Total base current
|
||||
ibi = ijbe+ijbc;
|
||||
|
||||
// Avalanche current
|
||||
|
||||
if (Vbici < 0) begin : HICAVL
|
||||
v_bord = eavl_t*vdci_t;
|
||||
if (vdci_t-Vbici>v_bord) begin
|
||||
a_iavl = kavl_t/vdci_t*exp(-cc);
|
||||
iavl = itf*a_iavl*(v_bord+(1+cc)*(vdci_t-Vbici-v_bord));
|
||||
end else begin
|
||||
lncc = ln(1/cc);
|
||||
iavl = kavl_t*itf*exp(-1/zci*lncc-eavl_t*exp((1/zci-1)*lncc));
|
||||
end
|
||||
end else begin
|
||||
iavl = 0;
|
||||
end
|
||||
|
||||
//
|
||||
// Additional elements for external transistor
|
||||
//
|
||||
|
||||
// Base resistance
|
||||
if(rbi0_t > 0.0) begin : HICRBI
|
||||
// Conductivity modulation with hyperbolic smoothing
|
||||
qje = qjei/cje0_t;
|
||||
Qz_nom = 1+qje/vr0e+qjci/vr0c+itf/ickf+itr/ickr;
|
||||
fQz = 0.5*(Qz_nom+sqrt(Qz_nom*Qz_nom+0.01));;
|
||||
rbi = rbi0_t/fQz;
|
||||
// Emitter current crowding
|
||||
if (ibi > 0.0) begin
|
||||
eta = fgeo*rbi*ibi/VT;
|
||||
if (eta < 1e-6) begin
|
||||
rbi = rbi*(1-0.5*eta);
|
||||
end else begin
|
||||
rbi = rbi*ln(eta+1)/eta;
|
||||
end
|
||||
end
|
||||
end else begin
|
||||
rbi = 0.0;
|
||||
end
|
||||
// Total base resistance
|
||||
rb = rbi+rbx_t;
|
||||
|
||||
// Parasitic substrate transistor transfer current
|
||||
if(itss > 0.0) begin : Sub_Transfer
|
||||
HSUM = msf*VT;
|
||||
HSa = limexp(Vbci/HSUM);
|
||||
HSb = limexp(Vsci/HSUM);
|
||||
HSI_Tsu = itss_t*(HSa-HSb);
|
||||
end else begin
|
||||
HSI_Tsu = 0.0;
|
||||
end
|
||||
|
||||
// Substrate diode and cap and charge
|
||||
|
||||
`HICDIO(iscs,iscs_t,msc,Vsci,ijsc)
|
||||
|
||||
`HICJQ(Vsci,cjs0_t,vds_t,zs,vpts,qjs)
|
||||
|
||||
// Self heating
|
||||
|
||||
if (flsh == 1 && rth >= `MIN_R) begin
|
||||
pterm = it*Vciei+iavl*(vdci_t-Vbici);
|
||||
end else if (flsh == 2 && rth >= `MIN_R) begin
|
||||
pterm = Vciei*it + (vdci_t-Vbici)*iavl + ijbe*Vbiei + ijbc*Vbici + ijsc*Vsci;
|
||||
if (rb >= `MIN_R) begin
|
||||
pterm = pterm + Vbbi*Vbbi/rb;
|
||||
end
|
||||
if (re_t >= `MIN_R) begin
|
||||
pterm = pterm + Veie*Veie/re_t;
|
||||
end
|
||||
if (rcx_t >= `MIN_R) begin
|
||||
pterm = pterm + Vcic*Vcic/rcx_t;
|
||||
end
|
||||
end
|
||||
|
||||
//
|
||||
// Compute branch sources
|
||||
//
|
||||
|
||||
Ibici = ijbc - iavl;
|
||||
|
||||
Qbci = cbcpar*Vbci;
|
||||
Qbe = cbepar*Vbe;
|
||||
Qbici = qjcii+qr;
|
||||
Qbiei = qjei+qf;
|
||||
|
||||
ijsc = HICUMtype*ijsc;
|
||||
qjs = HICUMtype*qjs;
|
||||
qjcx = HICUMtype*qjcx;
|
||||
Qbci = HICUMtype*Qbci;
|
||||
Qbe = HICUMtype*Qbe;
|
||||
|
||||
Ibici = HICUMtype*Ibici;
|
||||
Qbici = HICUMtype*Qbici;
|
||||
ijbe = HICUMtype*ijbe;
|
||||
Qbiei = HICUMtype*Qbiei;
|
||||
it = HICUMtype*it;
|
||||
|
||||
//
|
||||
// Define branch sources
|
||||
//
|
||||
I(br_biei) <+ $simparam("gmin")*V(br_biei);
|
||||
I(br_bici) <+ $simparam("gmin")*V(br_bici);
|
||||
|
||||
I(br_bs) <+ HSI_Tsu;
|
||||
I(br_sci) <+ ijsc + $simparam("gmin")*V(br_sci); //`P(spectre:gmin="add" spectre:pwl_passive="1e10");
|
||||
I(br_sci) <+ ddt(qjs);
|
||||
I(br_bci) <+ ddt(qjcx);
|
||||
I(br_bci) <+ ddt(Qbci);
|
||||
I(br_be) <+ ddt(Qbe);
|
||||
if (re >= `MIN_R) begin
|
||||
I(br_eie_i) <+ Veie/re_t + $simparam("gmin")*V(br_eie_i);//`P(spectre:gmin="add");
|
||||
end else begin
|
||||
V(br_eie_v) <+ 0.0;
|
||||
end
|
||||
if (rcx >= `MIN_R) begin
|
||||
I(br_cic_i) <+ Vcic/rcx_t + $simparam("gmin")*V(br_cic_i);//`P(spectre:gmin="add");
|
||||
end else begin
|
||||
V(br_cic_v) <+ 0.0;
|
||||
end
|
||||
if (rbi0 >= `MIN_R || rbx >= `MIN_R) begin
|
||||
I(br_bbi_i) <+ Vbbi/rb + $simparam("gmin")*V(br_bbi_i); //`P(spectre:gmin="add");
|
||||
end else begin
|
||||
V(br_bbi_v) <+ 0.0;
|
||||
end
|
||||
I(br_bici) <+ Ibici + $simparam("gmin")*V(br_bici); //`P(spectre:gmin="add" spectre:pwl_sat_current="IMAX" spectre:pwl_sat_cond="imax/0.025" spectre:pwl_rev_current="imax" spectre:pwl_rev_cond="IMAX/0.025");
|
||||
I(br_bici) <+ ddt(Qbici);
|
||||
I(br_biei) <+ ijbe + $simparam("gmin")*V(br_biei); //`P(spectre:gmin="add" spectre:pwl_fwd_current="IBEIS*exp(25.0)" spectre:pwl_fwd_node="bi" spectre:pwl_fwd_cond="IBEIS*exp(25.0)/0.025" spectre:pwl_sat_current="IMAX" spectre:pwl_sat_cond="IMAX/0.025" spectre:pwl_passive="1e10");
|
||||
I(br_biei) <+ ddt(Qbiei);
|
||||
I(br_ciei) <+ it `P(spectre:pwl_fwd_current="IS*exp(25.0)" spectre:pwl_fwd_node="bi" spectre:pwl_fwd_cond="IS*exp(25.0)/0.025" spectre:pwl_rev_current="IMAX" spectre:pwl_rev_cond="IMAX/0.025" spectre:pwl_passive="1e10");
|
||||
|
||||
// Following code is an intermediate solution:
|
||||
// ******************************************
|
||||
if(flsh == 0 || rth < `MIN_R) begin
|
||||
I(br_sht) <+ Vrth/`MIN_R;
|
||||
end else begin
|
||||
I(br_sht) <+ Vrth/rth-pterm + $simparam("gmin")*V(br_sht);//`P(spectre:gmin="add");
|
||||
I(br_sht) <+ ddt(cth*Vrth);
|
||||
end
|
||||
// ******************************************
|
||||
// For simulators having no problem with V(br_sht) <+ 0.0
|
||||
// with external thermal node, follwing code may be used.
|
||||
// This external thermal node should remain accessible.
|
||||
// ********************************************
|
||||
//if(flsh == 0 || rth < `MIN_R) begin
|
||||
// V(br_sht) <+ 0.0;
|
||||
//end else begin
|
||||
// I(br_sht) <+ Vrth/rth-pterm `P(spectre:gmin="add");
|
||||
// I(br_sht) <+ ddt(cth*Vrth);
|
||||
//end
|
||||
// ********************************************
|
||||
|
||||
// Noise sources
|
||||
// Thermal noise
|
||||
fourkt = 4.0 * `P_K * Tdev;
|
||||
if(rbx >= `MIN_R || rbi0 >= `MIN_R) begin
|
||||
I(br_bbi_i) <+ white_noise(fourkt/rb);
|
||||
end
|
||||
if(rcx >= `MIN_R) begin
|
||||
I(br_cic_i) <+ white_noise(fourkt/rcx_t);
|
||||
end
|
||||
if(re >= `MIN_R) begin
|
||||
I(br_eie_i) <+ white_noise(fourkt/re_t);
|
||||
end
|
||||
|
||||
// Shot noise
|
||||
twoq = 2.0 * `P_Q;
|
||||
I(br_biei) <+ white_noise(twoq*ijbe);
|
||||
I(br_ciei) <+ white_noise(twoq*it);
|
||||
|
||||
// Flicker noise
|
||||
flicker_Pwr = kf*pow(ijbe,af);
|
||||
I(br_biei) <+ flicker_noise(flicker_Pwr,1.0);
|
||||
|
||||
end // analog
|
||||
endmodule
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,47 +0,0 @@
|
|||
// Copyright (c) 2000-2007, NXP Semiconductors
|
||||
// Copyright (c) 2007-2014, Delft University of Technology
|
||||
// Copyright (c) 2015, Auburn University
|
||||
|
||||
INTELLECTUAL PROPERTY NOTICE, DISCLAIMER AND LICENSE
|
||||
|
||||
The Mextram model and documentation presented at this website,
|
||||
denoted as the Model,
|
||||
has been developed by NXP Semiconductors until 2007,
|
||||
Delft University of Technology from 2007 to 2014,
|
||||
and Auburn University since April 2015.
|
||||
|
||||
The Model is distributed as is, completely without any expressed
|
||||
or implied warranty or service support.
|
||||
NXP Semiconductors, Delft University of Technology,
|
||||
Auburn University and their employees are not liable for
|
||||
the condition or performance of the Model.
|
||||
|
||||
NXP Semiconductors, Delft University of Technology,
|
||||
Auburn University own
|
||||
the copyright and grant users a perpetual,
|
||||
irrevocable, worldwide, non-exclusive, royalty-free
|
||||
license with respect to the Model as set forth below.
|
||||
|
||||
NXP Semiconductors, Delft University of Technology, Auburn University
|
||||
hereby disclaim all implied warranties.
|
||||
|
||||
NXP Semiconductors, Delft University of Technology, Auburn University
|
||||
grant the users the right to modify, copy, and
|
||||
redistribute the Model and documentation,
|
||||
both within the user's organization and externally,
|
||||
subject to the following restrictions
|
||||
|
||||
1. The users agree not to charge for the code
|
||||
itself but may charge for additions, extensions, or support.
|
||||
|
||||
2. In any product based on the Model, the users agree to acknowledge
|
||||
NXP Semiconductors, Delft University of Technology, Auburn University
|
||||
that developed the Model. This acknowledgment
|
||||
shall appear in the product documentation.
|
||||
|
||||
3. The users agree to obey all restrictions governing redistribution
|
||||
or export of the Model.
|
||||
|
||||
4. The users agree to reproduce any copyright notice which appears
|
||||
on the Model on any copy or modification of such made available
|
||||
to others.
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
// Copyright (c) 2000-2007, NXP Semiconductor
|
||||
// Copyright (c) 2007-2014, Delft University of Technology
|
||||
// Copyright (c) 2015, Auburn University
|
||||
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
|
||||
|
||||
`include "frontdef.inc"
|
||||
`define SELFHEATING
|
||||
`define SUBSTRATE
|
||||
|
||||
module bjt504tva (c, b, e, s, dt);
|
||||
|
||||
`ifdef insideADMS
|
||||
`define P(p) (*p*)
|
||||
`else
|
||||
`define P(p)
|
||||
`endif
|
||||
|
||||
// External ports
|
||||
inout c, b, e, s, dt;
|
||||
|
||||
electrical c `P(desc="external collector node");
|
||||
electrical b `P(desc="external base node");
|
||||
electrical e `P(desc="external emitter node");
|
||||
electrical s `P(desc="external substrate node");
|
||||
electrical dt `P(desc="external thermal node");
|
||||
|
||||
// Internal nodes
|
||||
electrical c1 `P(desc="internal collector node 1");
|
||||
electrical e1 `P(desc="internal emitter node");
|
||||
electrical b1 `P(desc="internal base node 1");
|
||||
electrical b2 `P(desc="internal base node 2");
|
||||
electrical c2 `P(desc="internal collector node 2");
|
||||
electrical c3 `P(desc="internal collector node 3");
|
||||
electrical c4 `P(desc="internal collector node 4");
|
||||
// For correlated noise implementation
|
||||
electrical noi `P(desc="internal noise node");
|
||||
|
||||
`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,655 +0,0 @@
|
|||
// Copyright (c) 2000-2007, NXP Semiconductor
|
||||
// Copyright (c) 2007-2014, Delft University of Technology
|
||||
// Copyright (c) 2015, Auburn University
|
||||
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
|
||||
|
||||
// Evaluate model equations
|
||||
|
||||
begin // 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: */
|
||||
|
||||
`ifdef insideADMS
|
||||
//dw we have limited all the RCXXX to MIN_R
|
||||
Vc4c1 = TYPE * V(c4, c1);
|
||||
Vc3c4 = TYPE * V(c3, c4);
|
||||
`else
|
||||
if (RCBLX > 0.0)
|
||||
begin
|
||||
if (RCBLI > 0.0)
|
||||
begin
|
||||
Vc4c1 = TYPE * V(c4, c1);
|
||||
Vc3c4 = TYPE * V(c3, c4);
|
||||
end
|
||||
else
|
||||
begin
|
||||
Vc4c1 = 0 ;
|
||||
Vc3c4 = TYPE * V(c3, c1);
|
||||
end
|
||||
end
|
||||
else
|
||||
begin
|
||||
if (RCBLI > 0.0)
|
||||
begin
|
||||
Vc4c1 = TYPE * V(c4, c1);
|
||||
Vc3c4 = 0 ;
|
||||
end
|
||||
else
|
||||
begin
|
||||
Vc4c1 = 0 ;
|
||||
Vc3c4 = 0 ;
|
||||
end
|
||||
end
|
||||
`endif
|
||||
|
||||
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)
|
||||
`expLin(eVb2e1,Vb2e1 * VtINV)
|
||||
`expLin(eVb1e1,Vb1e1 * VtINV)
|
||||
`expLin(eVb1c4,Vb1c4 * VtINV)
|
||||
`expLin(eVb1b2,Vb1b2 * VtINV)
|
||||
`expLin(eVbc3,Vbc3 * VtINV)
|
||||
`ifdef SUBSTRATE
|
||||
`expLin(eVsc1,Vsc1 * VtINV)
|
||||
// RvdT MXT504.10, new: eVsc3, eVsc4
|
||||
`expLin(eVsc3,Vsc3 * VtINV)
|
||||
`expLin(eVsc4,Vsc4 * VtINV)
|
||||
`endif
|
||||
|
||||
`expLin(eVbc3VDC,(Vbc3 - VDC_T) * VtINV)
|
||||
`expLin(eVb1c4VDC,(Vb1c4 - VDC_T) * VtINV)
|
||||
`expLin(eVb2c2VDC,(Vb2c2 - VDC_T) * VtINV)
|
||||
`expLin(eVb2c1VDC,(Vb2c1 - VDC_T) * VtINV)
|
||||
|
||||
// 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;
|
||||
Ec = Vt * (K0 - Kw - ln((K0 + 1.0) / (Kw + 1.0)) );
|
||||
Ic1c2 = (Ec + Vc1c2) / RCV_TM;
|
||||
|
||||
if (Ic1c2 > 0.0) begin
|
||||
|
||||
`linLog(tmpV,Vb2c1,100.0);
|
||||
Vqs_th = VDC_T + 2.0 * Vt *
|
||||
ln(0.5 * Ic1c2 * RCV_TM * VtINV + 1.0) - tmpV;
|
||||
eps_VDC = 0.2 * VDC_T;
|
||||
`max_hyp0(Vqs, Vqs_th, eps_VDC);
|
||||
Iqs = Vqs * (Vqs + IHC_M * SCRCV_M) / (SCRCV_M * (Vqs + IHC_M * RCV_TM));
|
||||
|
||||
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_M * SCRCV_M);
|
||||
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_TM * 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)
|
||||
p0star = gp02 + sqrt(sqr_arg);
|
||||
else
|
||||
p0star = gp0_help / (sqrt(sqr_arg) - gp02);
|
||||
// if (p0star < `TEN_M40) p0star = 0.0;
|
||||
|
||||
|
||||
eVb2c2star = p0star * (p0star + 1.0) * exp(VDC_T * VtINV);
|
||||
B1 = 0.5 * SCRCV_M * (Ic1c2 - IHC_M);
|
||||
B2 = SCRCV_M * RCV_TM * IHC_M * Ic1c2;
|
||||
Vxi0 = B1 + sqrt(B1 * B1 + B2);
|
||||
Vch = VDC_T * (0.1 + 2.0 * Ic1c2 / (Ic1c2 + Iqs));
|
||||
Icap = IHC_M * Ic1c2 / (IHC_M + Ic1c2);
|
||||
Icap_IHC = IHC_M / (IHC_M + 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_T;
|
||||
Icap = Ic1c2;
|
||||
Icap_IHC = 1.0 - Icap / IHC_M;
|
||||
|
||||
end
|
||||
|
||||
// Effective emitter 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, E0BE to be re-used in EB- Zener tunnel model:
|
||||
E0BE = pow(1.0 - Vje * inv_VDE_T, 1.0 - PE) ;
|
||||
Vte = VDE_T / (1.0 - PE) * (1.0 - E0BE) +
|
||||
`AJE * (Vb2e1 - Vje);
|
||||
|
||||
// Effective collector junction capacitance bias
|
||||
|
||||
Vjunc = Vb2c1 + Vxi0;
|
||||
bjc = (`AJC - XP_T) / (1.0 - XP_T);
|
||||
Vfc = VDC_T * (1.0 - pow(bjc, -1.0 / PC));
|
||||
`min_logexp(Vjc, Vjunc, Vfc, Vch);
|
||||
fI = pow(Icap_IHC, MC);
|
||||
Vcv = VDC_T / (1.0 - PC) * (1.0 - fI * pow(1.0 - Vjc / VDC_T, 1.0 - PC)) +
|
||||
fI * bjc * (Vjunc - Vjc);
|
||||
Vtc = (1.0 - XP_T) * Vcv + XP_T * Vb2c1;
|
||||
|
||||
// Transfer current
|
||||
|
||||
If0 = 4.0 * IS_TM / IK_TM;
|
||||
f1 = If0 * eVb2e1;
|
||||
n0 = f1 / (1.0 + sqrt(1.0 + f1));
|
||||
f2 = If0 * eVb2c2star;
|
||||
nB = f2 / (1.0 + sqrt(1.0 + f2));
|
||||
|
||||
if (DEG == 0.0)
|
||||
q0I = 1.0 + Vte / VER_T + Vtc / VEF_T;
|
||||
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 = IS_TM * eVb2c2star;
|
||||
If = IS_TM * eVb2e1;
|
||||
In = (If - Ir) / qBI;
|
||||
|
||||
// Base and substrate current(s)
|
||||
|
||||
Ibf0 = IS_TM / BF_T;
|
||||
if (XREC == 0.0)
|
||||
Ib1 = (1.0 - XIBI) * Ibf0 * (eVb2e1 - 1.0);
|
||||
else
|
||||
Ib1 = (1.0 - XIBI) * Ibf0 * ((1.0 - XREC) * (eVb2e1 - 1.0) +
|
||||
XREC * (eVb2e1 + eVb2c2star - 2.0) * (1.0 + Vtc / VEF_T));
|
||||
|
||||
Ib1_s = XIBI * Ibf0 * (eVb1e1 - 1.0);
|
||||
`expLin(tmpExp,Vb2e1 * VtINV / MLF)
|
||||
Ib2 = IBF_TM * (tmpExp - 1.0) + $simparam("gmin") * Vb2e1;
|
||||
`expLin(tmpExp,0.5 * Vb1c4 * VtINV)
|
||||
Ib3 = IBR_TM * (eVb1c4 - 1.0) /
|
||||
(tmpExp + exp(0.5 * VLR * VtINV)) +
|
||||
$simparam("gmin") * Vb1c4;
|
||||
|
||||
// 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 < 0)
|
||||
begin
|
||||
|
||||
`expLin(eZEB, nZEB_T * (1 - (pow2_2mPE/(2.0*E0BE))))
|
||||
// Force all derivatives at Vb2e1=0 to zero by using in DZEB a
|
||||
// modified dE0BE expression for E0BE:
|
||||
x = Vb2e1 * inv_VDE_T ;
|
||||
dE0BE = pow(- x, -2.0-PE)*(PE*(1-PE*PE-3*x*(PE-1))-6*x*x*(PE-1+x)) * `one_sixth ;
|
||||
`expLin(edZEB, Vb2e1 * pow2_2mPE * nZEB_T / (VGZEB_T * dE0BE ))
|
||||
DZEB = - Vb2e1 - VGZEB_T * dE0BE * (1 - edZEB) / (pow2_2mPE * nZEB_T) ;
|
||||
Izteb = 2.0 * IZEB_TM * DZEB * E0BE * eZEB * inv_VDE_T * pow2_PEm2 ;
|
||||
end
|
||||
else
|
||||
begin
|
||||
DZEB = 0 ;
|
||||
Izteb = 0 ;
|
||||
end
|
||||
|
||||
// end RvdT, November 2008, MXT504.8_alpha
|
||||
|
||||
// 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_TM * nBex - IS_TM);
|
||||
//
|
||||
// Iex since MXT 504.10: RvdT@TUDelft Q1, 2011:
|
||||
Iex = IK_TM * nBex / (2.0 * BRI_T) ;
|
||||
|
||||
`ifdef SUBSTRATE
|
||||
// RvdT MXT504.10, new term: eVsc4
|
||||
if (EXSUB == 1.0)
|
||||
Isub = 2.0 * ISS_TM * (eVb1c4 - eVsc4) /
|
||||
(1.0 + sqrt(1.0 + 4.0 * (IS_TM / IKS_TM) * eVb1c4));
|
||||
else
|
||||
Isub = 2.0 * ISS_TM * (eVb1c4 - 1.0) /
|
||||
(1.0 + sqrt(1.0 + 4.0 * (IS_TM / IKS_TM) * eVb1c4));
|
||||
|
||||
// until504.8: Isf = ISS_TM * (eVsc1 - 1.0);
|
||||
// New 504.9:
|
||||
|
||||
if (ICSS < 0.0)
|
||||
// this clause is to implement backwards compatibility
|
||||
begin
|
||||
Isf = ISS_TM * (eVsc1 - 1.0);
|
||||
end
|
||||
else
|
||||
begin
|
||||
Isf = ICSS_TM * (eVsc1 - 1.0);
|
||||
end
|
||||
|
||||
// End: New 504.9.
|
||||
|
||||
`endif
|
||||
|
||||
XIex =0.0;
|
||||
|
||||
`ifdef SUBSTRATE
|
||||
XIsub = 0.0;
|
||||
`endif
|
||||
|
||||
// begin: RvdT, Q4 2012, Mextram 504.11: added EXMOD=2 option:
|
||||
if (EXMOD == 1 || EXMOD == 2)
|
||||
begin
|
||||
|
||||
Iex = Iex * Xext1;
|
||||
|
||||
`ifdef SUBSTRATE
|
||||
Isub = Isub * Xext1;
|
||||
`endif
|
||||
|
||||
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));
|
||||
// XIMex until and including MXT 504.9:
|
||||
// XIMex = XEXT * (0.5 * IK_TM * XnBex - IS_TM) / BRI_T;
|
||||
//
|
||||
// XIMex in MXT 504.10: RvdT@TUDelft Q1, 2011:
|
||||
XIMex = XEXT * 0.5 * IK_TM * XnBex / BRI_T;
|
||||
|
||||
`ifdef SUBSTRATE
|
||||
// RvdT MXT504.10, new term: eVsc3
|
||||
if (EXSUB == 1.0)
|
||||
XIMsub = XEXT * 2.0 * ISS_TM * (eVbc3 - eVsc3) /
|
||||
(1.0 + sqrt(1.0 + 4.0 * IS_T / IKS_T * eVbc3));
|
||||
else
|
||||
XIMsub = XEXT * 2.0 * ISS_TM * (eVbc3 - 1.0) /
|
||||
(1.0 + sqrt(1.0 + 4.0 * IS_T / IKS_T * eVbc3));
|
||||
`else
|
||||
XIMsub = 0.0;
|
||||
`endif
|
||||
|
||||
if (EXMOD == 1)
|
||||
begin
|
||||
`ifdef SUBSTRATE
|
||||
Vex_bias = XEXT * (IS_TM / BRI_T + ISS_TM) * RCCxx_TM;
|
||||
`else
|
||||
Vex_bias = XEXT * (IS_TM / BRI_T) * RCCxx_TM;
|
||||
`endif
|
||||
Vex = Vt * (2.0 - ln( Vex_bias * VtINV));
|
||||
vdif = Vbc3 - Vex;
|
||||
`max_hyp0(VBex, vdif, 0.11);
|
||||
Fex = VBex /(Vex_bias + (XIMex + XIMsub) * RCCxx_TM + VBex);
|
||||
end
|
||||
else
|
||||
begin
|
||||
Vex = 0.0 ;
|
||||
vdif = 0.0 ;
|
||||
VBex = 0.0 ;
|
||||
Fex = 1.0 ;
|
||||
end
|
||||
|
||||
/* end: RvdT, Q4, 2012, Mextram 504.11: added EXMOD=2 option: */
|
||||
|
||||
XIex = Fex * XIMex;
|
||||
|
||||
`ifdef SUBSTRATE
|
||||
XIsub = Fex * XIMsub;
|
||||
`endif
|
||||
end
|
||||
else
|
||||
begin
|
||||
Fex = 0;
|
||||
XnBex = 0 ;
|
||||
end
|
||||
|
||||
// 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_TM / qBQ;
|
||||
Ib1b2 = (2.0 * Vt * (eVb1b2 - 1.0) + Vb1b2) / Rb2;
|
||||
|
||||
// Weak-avalanche current
|
||||
|
||||
Iavl = 0.0;
|
||||
Gem = 0.0;
|
||||
if ((Ic1c2 > 0.0) && (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.0)
|
||||
Weff = WAVL;
|
||||
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)
|
||||
Em = E0;
|
||||
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 - Ic1c2 / (IHC_M * SHw));
|
||||
sqr_arg = (Ew - E0) * (Ew - E0) + 0.1 * Eav * Eav * Icap / IHC_M;
|
||||
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
|
||||
Gem = An * Weff * exp(-BnT / Em);
|
||||
|
||||
Gmax = Vt / (Ic1c2 * (RBC_TM + Rb2)) + qBI / BF_T +
|
||||
RE_TM / (RBC_TM + Rb2);
|
||||
Iavl = Ic1c2 * Gem / (Gem +Gem / Gmax + 1.0);
|
||||
end
|
||||
|
||||
if (eVb2c2star > 0.0)
|
||||
Vb2c2star = Vt * ln(eVb2c2star);
|
||||
else
|
||||
Vb2c2star = Vb2c2;
|
||||
|
||||
`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_TM +
|
||||
Vcc3 * Vcc3 * GCCxx_TM +
|
||||
Vc3c4 * Vc3c4 * GCCex_TM +
|
||||
Vc4c1 * Vc4c1 * GCCin_TM +
|
||||
Vbb1 * Vbb1 / RBC_TM +
|
||||
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 +
|
||||
Ib1_s * Vb1e1 +
|
||||
`ifdef SUBSTRATE
|
||||
(Iex + Ib3) * Vb1c4 + XIex * Vbc3 +
|
||||
Isub * (Vb1c4 - Vsc4) +
|
||||
XIsub * (Vbc3 - Vsc3) +
|
||||
Isf * Vsc1;
|
||||
`else
|
||||
(Iex + Ib3) * Vb1c4 + XIex * Vbc3;
|
||||
`endif
|
||||
|
||||
`endif
|
||||
|
||||
|
||||
// Charges
|
||||
|
||||
Qte = (1.0 - XCJE) * CJE_TM * Vte;
|
||||
`min_logexp(Vje_s, Vb1e1, Vfe, a_VDE);
|
||||
Qte_s = XCJE * CJE_TM * (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_TM * Vtc;
|
||||
Qb0 = TAUB_T * IK_TM;
|
||||
Qbe_qs = 0.5 * Qb0 * n0 * q1Q;
|
||||
Qbc_qs = 0.5 * Qb0 * nB * q1Q;
|
||||
|
||||
a_VDC = 0.1 * VDC_T;
|
||||
`min_logexp(Vjcex, Vb1c4, Vfc, a_VDC);
|
||||
Vtexv = VDC_T / (1.0 - PC) * (1.0 - pow(1.0 - Vjcex / VDC_T, 1.0 - PC)) +
|
||||
bjc * (Vb1c4 - Vjcex);
|
||||
Qtex = CJC_TM * ((1.0 - XP_T) * Vtexv + XP_T * Vb1c4) *
|
||||
(1.0 - XCJC) * (1.0 - XEXT);
|
||||
|
||||
`min_logexp(XVjcex, Vbc3, Vfc, a_VDC);
|
||||
XVtexv = VDC_T / (1.0 - PC) * (1.0 - pow(1.0 - XVjcex / VDC_T, 1.0 - PC)) +
|
||||
bjc * (Vbc3 - XVjcex);
|
||||
XQtex = CJC_TM * ((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_TM * (VDS_T / (1.0 - PS) *
|
||||
(1.0 - pow(1.0 - Vjs / VDS_T, 1.0 - PS)) + `AJS * (Vsc1 - Vjs));
|
||||
`endif
|
||||
|
||||
Qe0 = TAUE_T * IK_TM * pow(IS_TM / IK_TM, 1.0 / MTAU);
|
||||
`expLin(tmpExp,Vb2e1 / (MTAU * Vt))
|
||||
|
||||
// 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_TM;
|
||||
Qepi = 0.5 * Qepi0 * xi_w * (p0star + pW + 2.0);
|
||||
|
||||
Qex = TAUR_T * 0.5 * (Qb0 * nBex + Qepi0 * pWex) / (TAUB_T + TEPI_T);
|
||||
XQex = 0.0;
|
||||
|
||||
if (EXMOD == 1) begin
|
||||
|
||||
Qex = Qex * (1.0 - XEXT);
|
||||
Xg2 = 4.0 * eVbc3VDC;
|
||||
XpWex = Xg2 / (1.0 + sqrt(1.0 + Xg2));
|
||||
XQex = 0.5 * Fex * XEXT * TAUR_T *
|
||||
(Qb0 * XnBex + Qepi0 * XpWex) / (TAUB_T + TEPI_T);
|
||||
|
||||
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)
|
||||
dVjeVb2e1 = 1.0 / (1.0 + exp(Vb2e1Vfe));
|
||||
else
|
||||
dVjeVb2e1 = exp(- Vb2e1Vfe) / (1.0 + exp(- Vb2e1Vfe));
|
||||
|
||||
dVteVb2e1 = dVteVje * dVjeVb2e1 + `AJE;
|
||||
dQteVb2e1 = (1.0 - XCJE) * CJE_TM * dVteVb2e1;
|
||||
|
||||
dn0Vb2e1 = If0 * eVb2e1 * VtINV * (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 - KE) * Qe_qs;
|
||||
Qbe_qs_eff = Qbe_qs + KE * Qe_qs;
|
||||
Qbc = XQB * Qbe_qs_eff + Qbc_qs;
|
||||
Qbe = (1 - 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;
|
||||
I(c2, e1) <+ TYPE * In;
|
||||
I(b1, e1) <+ TYPE * Ib1_s;
|
||||
// begin RvdT, 28-10-2008, MXT504.8_alpha
|
||||
// contribution tunnel current added
|
||||
I(b2, e1) <+ TYPE * (Ib1 + Ib2 - Izteb);
|
||||
|
||||
`ifdef SUBSTRATE
|
||||
I(b1, s) <+ TYPE * Isub;
|
||||
I(b, s) <+ TYPE * XIsub;
|
||||
I(s, c1) <+ TYPE * Isf;
|
||||
`endif
|
||||
I(b1, b2) <+ TYPE * Ib1b2;
|
||||
I(b2, c2) <+ TYPE * (-1.0 * Iavl);
|
||||
I(e, e1) <+ TYPE * Vee1 / RE_TM;
|
||||
I(b, b1) <+ TYPE * Vbb1 / RBC_TM;
|
||||
|
||||
`ifdef SELFHEATING
|
||||
// Electrical equivalent for the thermal network
|
||||
I(dt) <+ V(dt) / RTH_Tamb_M;
|
||||
I(dt) <+ ddt(CTH_M * V(dt));
|
||||
I(dt) <+ -1.0 * power;
|
||||
`endif
|
||||
|
||||
|
||||
// Dynamic currents
|
||||
I(b2, e1) <+ ddt(TYPE * (Qte + Qbe + Qe));
|
||||
I(b1, e1) <+ ddt(TYPE * (Qte_s));
|
||||
I(b2, c2) <+ ddt(TYPE * (Qtc + Qbc + Qepi));
|
||||
`ifdef SUBSTRATE
|
||||
I(s, c1) <+ ddt(TYPE * Qts);
|
||||
`endif
|
||||
I(b1, b2) <+ ddt(TYPE * Qb1b2);
|
||||
I(b, e) <+ ddt(TYPE * CBEO_M * Vbe);
|
||||
I(b, c) <+ ddt(TYPE * CBCO_M * Vbc);
|
||||
|
||||
end // Currents and charges
|
||||
|
||||
|
||||
/* RvdT, Delft Univ. Tech. 03-12-2007.
|
||||
Distribution of parasitic collector resistance.
|
||||
This construct supports the case
|
||||
RCBLI = 0.0 and or RCBLX = 0.0 .
|
||||
It is up to the compiler to adjust the circuit topology
|
||||
and perform a node-collapse in such cases. */
|
||||
`ifdef insideADMS
|
||||
//dw we have limited all the RCXXX to MIN_R
|
||||
I(b, c3) <+ TYPE * XIex;
|
||||
I(c, c3) <+ TYPE * Vcc3 * GCCxx_TM ;
|
||||
I(b, c3) <+ ddt(TYPE * (XQtex + XQex));
|
||||
I(c4, c1) <+ TYPE * Vc4c1 * GCCin_TM;
|
||||
I(b1, c4) <+ TYPE * (Ib3 + Iex);
|
||||
I(c3, c4) <+ TYPE * Vc3c4 * GCCex_TM ;
|
||||
I(b1, c4) <+ ddt(TYPE * (Qtex + Qex));
|
||||
`else
|
||||
if (RCBLX > 0.0)
|
||||
begin
|
||||
I(b, c3) <+ TYPE * XIex;
|
||||
I(c, c3) <+ TYPE * Vcc3 * GCCxx_TM ;
|
||||
I(b, c3) <+ ddt(TYPE * (XQtex + XQex));
|
||||
if (RCBLI > 0.0)
|
||||
begin
|
||||
I(c4, c1) <+ TYPE * Vc4c1 * GCCin_TM;
|
||||
I(b1, c4) <+ TYPE * (Ib3 + Iex);
|
||||
I(c3, c4) <+ TYPE * Vc3c4 * GCCex_TM ;
|
||||
I(b1, c4) <+ ddt(TYPE * (Qtex + Qex));
|
||||
end
|
||||
else
|
||||
begin
|
||||
V(c4, c1) <+ 0.0 ;
|
||||
I(b1, c1) <+ TYPE * (Ib3 + Iex);
|
||||
I(b1, c1) <+ ddt(TYPE * (Qtex + Qex));
|
||||
I(c3, c1) <+ TYPE * Vc3c4 * GCCex_TM ;
|
||||
end
|
||||
end
|
||||
else
|
||||
begin
|
||||
V(c3, c4) <+ 0 ;
|
||||
if (RCBLI > 0.0)
|
||||
begin
|
||||
I(b, c4) <+ TYPE * XIex;
|
||||
I(c, c4) <+ TYPE * Vcc3 * GCCxx_TM ;
|
||||
I(c4, c1) <+ TYPE * Vc4c1 * GCCin_TM;
|
||||
I(b1, c4) <+ TYPE * (Ib3 + Iex);
|
||||
I(b1, c4) <+ ddt(TYPE * (Qtex + Qex));
|
||||
I(b, c4) <+ ddt(TYPE * (XQtex + XQex));
|
||||
end
|
||||
else
|
||||
begin
|
||||
I(b, c1) <+ TYPE * XIex;
|
||||
I(c, c1) <+ TYPE * Vcc3 * GCCxx_TM ;
|
||||
V(c4, c1) <+ 0.0 ;
|
||||
I(b1, c1) <+ TYPE * (Ib3 + Iex);
|
||||
I(b1, c1) <+ ddt(TYPE * (Qtex + Qex));
|
||||
I(b, c1) <+ ddt(TYPE * (XQtex + XQex));
|
||||
I(c3, c1) <+ TYPE * Vc3c4 * GCCex_TM ;
|
||||
end
|
||||
end
|
||||
`endif
|
||||
|
||||
|
|
@ -1,130 +0,0 @@
|
|||
// Copyright (c) 2000-2007, NXP Semiconductor
|
||||
// Copyright (c) 2007-2014, Delft University of Technology
|
||||
// Copyright (c) 2015, Auburn University
|
||||
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
|
||||
|
||||
// Front definitions
|
||||
|
||||
`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 VEXLIM 400.0
|
||||
`define PI 3.1415926
|
||||
`ifdef insideADMS
|
||||
//dw needed for RCXXX limiting
|
||||
`define MIN_R 0.001
|
||||
`endif
|
||||
|
||||
// Desriptions and units
|
||||
`ifdef __VAMS_COMPACT_MODELING__
|
||||
`define OPP(nam,uni,des) (* desc="des", units="uni" *) real nam;
|
||||
`define PAR(des,uni) (* desc="des", units="uni" *) parameter real
|
||||
`define PAI(des,uni) (* desc="des", units="uni" *) parameter integer
|
||||
`else
|
||||
`define OPP(nam,uni,des)
|
||||
`define PAR(des,uni) parameter real
|
||||
`define PAI(des,uni) parameter integer
|
||||
`endif
|
||||
|
||||
// ADMS specific definitions
|
||||
`ifdef insideADMS
|
||||
`define MODEL @(initial_model)
|
||||
`define INSTANCE @(initial_instance)
|
||||
`define NOISE @(noise)
|
||||
`else
|
||||
`define MODEL
|
||||
`define INSTANCE
|
||||
`define NOISE
|
||||
`endif
|
||||
|
||||
// Smooth limitting functions
|
||||
`define max_hyp0(result, x, epsilon)\
|
||||
eps2 = epsilon * epsilon;\
|
||||
x2 = x * x;\
|
||||
if (x < 0.0)\
|
||||
result = 0.5 * eps2 / (sqrt(x2 + eps2) - x);\
|
||||
else\
|
||||
result = 0.5 * (sqrt(x2 + eps2) + x);\
|
||||
result=result
|
||||
|
||||
`define min_logexp(result, x, x0, a)\
|
||||
dxa = (x - x0) / (a);\
|
||||
if (x < x0)\
|
||||
result = x - a * ln(1.0 + exp(dxa));\
|
||||
else\
|
||||
result = x0 - a * ln(1.0 + exp(-dxa));\
|
||||
result=result
|
||||
|
||||
`define max_logexp(result, x, x0, a)\
|
||||
dxa = (x - x0) / (a);\
|
||||
if (x < x0)\
|
||||
result = x0 + a * ln(1.0 + exp(dxa));\
|
||||
else\
|
||||
result = x + a * ln(1.0 + exp(-dxa));\
|
||||
result=result
|
||||
|
||||
`define expLin(result, x)\
|
||||
if (x < `VEXLIM)\
|
||||
result = exp(x);\
|
||||
else begin\
|
||||
expl = exp(`VEXLIM);\
|
||||
result = expl * (1.0 + (x - `VEXLIM));\
|
||||
end
|
||||
|
||||
`define linLog(result, x, vlim)\
|
||||
if (x < vlim)\
|
||||
result = x;\
|
||||
else\
|
||||
result = vlim + ln(1.0 + (x - vlim));\
|
||||
result=result
|
||||
|
||||
// Macros for the model/instance parameters
|
||||
//
|
||||
// MPRxx model parameter real
|
||||
// MPIxx model parameter integer
|
||||
// ||
|
||||
// cc closed lower bound, closed upper bound
|
||||
// oo open lower bound, open upper bound
|
||||
// co closed lower bound, open upper bound
|
||||
// oc open lower bound, closed upper bound
|
||||
// cz closed lower bound=0, open upper bound=inf
|
||||
// oz open lower bound=0, open upper bound=inf
|
||||
// nb no bounds
|
||||
// ex no bounds with exclude
|
||||
// sw switch(integer only, values 0=false and 1=true)
|
||||
// ty switch(integer only, values -1=p-type and +1=n-type)
|
||||
//
|
||||
//
|
||||
`define MPRnb(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def ;
|
||||
`define MPRex(nam,def,uni,exc, des) (*units=uni, desc=des*) parameter real nam=def exclude exc ;
|
||||
`define MPRcc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from[lwr:upr] ;
|
||||
`define MPRoo(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from(lwr:upr) ;
|
||||
`define MPRco(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from[lwr:upr) ;
|
||||
`define MPRoc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from(lwr:upr] ;
|
||||
`define MPRcz(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def from[ 0:inf);
|
||||
`define MPRoz(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def from( 0:inf);
|
||||
|
||||
`define MPInb(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def ;
|
||||
`define MPIex(nam,def,uni,exc, des) (*units=uni, desc=des*) parameter integer nam=def exclude exc ;
|
||||
`define MPIcc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from[lwr:upr] ;
|
||||
`define MPIoo(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from(lwr:upr) ;
|
||||
`define MPIco(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from[lwr:upr) ;
|
||||
`define MPIoc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from(lwr:upr] ;
|
||||
`define MPIcz(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from[ 0:inf);
|
||||
`define MPIoz(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from( 0:inf);
|
||||
|
||||
`define MPIsw(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from[ 0: 1] ;
|
||||
`define MPIty(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from[ -1: 1] exclude 0 ;
|
||||
|
||||
|
|
@ -1,83 +0,0 @@
|
|||
// Copyright (c) 2000-2007, NXP Semiconductor
|
||||
// Copyright (c) 2007-2014, Delft University of Technology
|
||||
// Copyright (c) 2015, Auburn University
|
||||
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
|
||||
|
||||
// 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;
|
||||
|
||||
// Temperature independent MULT scaling
|
||||
|
||||
`ifdef SELFHEATING
|
||||
CTH_M = CTH * MULT;
|
||||
`endif
|
||||
|
||||
CBEO_M = CBEO * MULT;
|
||||
CBCO_M = CBCO * MULT;
|
||||
|
||||
invMULT = 1.0 / MULT;
|
||||
SCRCV_M = SCRCV * invMULT;
|
||||
|
||||
KF_M = KF * pow(MULT, 1.0 - AF);
|
||||
KFN_M = KFN * pow(MULT, 1.0 - (2.0 * (MLF - 1.0) + AF * (2.0 - MLF)));
|
||||
|
||||
// begin: RvdT, November 2008; Zener tunneling current model
|
||||
|
||||
pow2_2mPE = pow(2.0, 2.0 - PE) ;
|
||||
pow2_PEm2 = 1.0 / pow2_2mPE ;
|
||||
|
||||
// Reference Temperature expressed in Kelvin:
|
||||
Trk = TREF + `C2K;
|
||||
// Ambient Temperature expressed in Kelvin:
|
||||
Tamb = $temperature + DTA;
|
||||
|
||||
|
||||
// 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) ;
|
||||
//dw adms can't expand the macro `max_logexp here - using the code
|
||||
_x = VGZEB + AVGEB*Trk*Trk / (Trk + TVGEB);
|
||||
_x0 = 0.05;
|
||||
_a = 0.1;
|
||||
_dxa = (_x - _x0) / (_a);
|
||||
if (_x < _x0)
|
||||
VGZEBOK = _x0 + _a * ln(1.0 + exp(_dxa));
|
||||
else
|
||||
VGZEBOK = _x + _a * ln(1.0 + exp(-_dxa));
|
||||
|
||||
VGZEB_Tr = VGZEB ;
|
||||
// end: RvdT March 2009: use VGZEB as a parameter, instead of VGZEBOK:
|
||||
|
||||
inv_VGZEB_Tr = 1.0 / VGZEB_Tr ;
|
||||
|
||||
inv_VDE = 1.0 / VDE ;
|
||||
|
||||
// end: RvdT, November 2008; Zener tunneling current model
|
||||
|
||||
|
|
@ -1,145 +0,0 @@
|
|||
// Copyright (c) 2000-2007, NXP Semiconductor
|
||||
// Copyright (c) 2007-2014, Delft University of Technology
|
||||
// Copyright (c) 2015, Auburn University
|
||||
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
|
||||
|
||||
// Noise sources
|
||||
|
||||
`NOISE begin
|
||||
|
||||
// Thermal noise
|
||||
common = 4.0 * `KB * Tk;
|
||||
powerREC = common / RE_TM; // Emitter resistance
|
||||
powerRBC = common / RBC_TM; // Base resistance
|
||||
powerRCCxx = common * GCCxx_TM; // Collector resistance
|
||||
powerRCCex = common * GCCex_TM; // Collector resistance
|
||||
powerRCCin = common * GCCin_TM; // Collector resistance
|
||||
powerRBV = common / Rb2 * (4.0 * eVb1b2 + 5.0) * `one_third ; // Variable base resistance
|
||||
|
||||
// Main current shot noise
|
||||
In_N = (If + Ir) / qBI;
|
||||
powerCCS = 2.0 * `QQ * abs(In_N);
|
||||
|
||||
// Weak-avalanche current shot noise
|
||||
if (KAVL > 0) begin
|
||||
Gem_N = abs(Iavl / In_N);
|
||||
end else begin
|
||||
Gem_N = 0.0;
|
||||
end
|
||||
|
||||
powerIIS = 2.0 * `QQ * Iavl * (Gem_N + 1);
|
||||
|
||||
// Transit time for noise
|
||||
if (In_N > 0.0) begin
|
||||
Taub_N = (Qbe + Qbc) / In_N;
|
||||
end else begin
|
||||
Taub_N = TAUB_T * q1Q * qBI;
|
||||
end
|
||||
|
||||
// RF correlation noise model switch
|
||||
if (KC == 1) begin
|
||||
// use charge partition for noise transit time
|
||||
taun = XQB * Taub_N;
|
||||
end else if (KC == 2) begin
|
||||
// use fraction of transit time for noise transit time
|
||||
taun = FTAUN * Taub_N;
|
||||
end else begin // KC == 0
|
||||
// no correlation noise
|
||||
taun = 0;
|
||||
end
|
||||
|
||||
// Forward base current shot noise and 1/f noise
|
||||
powerFBCS = 2.0 * `QQ * (abs(Ib1) + abs(Ib2) + abs(Izteb));
|
||||
powerFBC1fB1 = (1.0 - XIBI) * pow((abs(Ib1) / (1 - XIBI)), AF) * KF_M;
|
||||
exponentFBC1fB2 = (2.0 * (MLF - 1.0)) + (AF * (2.0 - MLF));
|
||||
powerFBC1fB2 = KFN_M * pow(abs(Ib2), exponentFBC1fB2);
|
||||
|
||||
// Emitter-base sidewall current shot and 1/f noise
|
||||
powerEBSCS = 2.0 * `QQ * abs(Ib1_s);
|
||||
if (XIBI == 0)
|
||||
powerEBSC1f = 0.0;
|
||||
else
|
||||
powerEBSC1f = KF_M * XIBI * pow((abs(Ib1_s / XIBI)), AF);
|
||||
|
||||
// Reverse base current shot noise and 1/f noise
|
||||
powerRBCS = 2.0 * `QQ * abs(Ib3);
|
||||
powerRBC1f = KF_M * pow(abs(Ib3), AF);
|
||||
|
||||
// Extrinsic current shot noise and 1/f noise
|
||||
powerExCS = 2.0 * `QQ * abs(Iex);
|
||||
powerExC1f = KF_M * (1 - (EXMOD * XEXT)) *
|
||||
pow((abs(Iex) / (1 - (EXMOD * XEXT))), AF);
|
||||
powerExCSMOD = 2.0 * `QQ * abs(XIex) * EXMOD;
|
||||
if (XEXT == 0.0)
|
||||
powerExC1fMOD = 0.0;
|
||||
else
|
||||
powerExC1fMOD = KF_M * EXMOD * XEXT * pow((abs(XIex) / XEXT), AF);
|
||||
|
||||
`ifdef SUBSTRATE
|
||||
// Substrate current shot noise (between nodes B1 and S, resp. B and S)
|
||||
powerSubsCS_B1S = 2.0 * `QQ * abs(Isub);
|
||||
powerSubsCS_BS = 2.0 * `QQ * abs(XIsub);
|
||||
`endif
|
||||
|
||||
// Reference un-correlated current shot noise sources
|
||||
I(noi) <+ white_noise(powerCCS);
|
||||
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);
|
||||
I(b2, e1) <+ white_noise(powerFBCS);
|
||||
|
||||
// Add noise sources
|
||||
I(e, e1) <+ white_noise(powerREC); // "emitter resistance"
|
||||
I(b, b1) <+ white_noise(powerRBC); // "base resistance"
|
||||
I(b1, b2) <+ white_noise(powerRBV); // "variable base resistance"
|
||||
I(b2, e1) <+ flicker_noise(powerFBC1fB1, 1); // "bas_emi_forw"
|
||||
I(b2, e1) <+ flicker_noise(powerFBC1fB2, 1); // "bas_emi_forw"
|
||||
I(e1, b1) <+ white_noise(powerEBSCS); // "emi_bas_side"
|
||||
I(e1, b1) <+ flicker_noise(powerEBSC1f, 1); // "emi_bas_side"
|
||||
I(b1, c4) <+ white_noise(powerRBCS); // "bas_col_reve"
|
||||
I(b1, c4) <+ flicker_noise(powerRBC1f, 1); // "bas_col_reve"
|
||||
I(b1, c4) <+ white_noise(powerExCS); // "Ext_bas_col"
|
||||
I(b1, c4) <+ flicker_noise(powerExC1f, 1); // "Ext_bas_col"
|
||||
I(b, c3) <+ white_noise(powerExCSMOD); // "Ext_bas_col"
|
||||
I(b, c3) <+ flicker_noise(powerExC1fMOD, 1); // "Ext_bas_col"
|
||||
|
||||
`ifdef SUBSTRATE
|
||||
I(b1, s) <+ white_noise(powerSubsCS_B1S); // "bas_sub_current"
|
||||
I(b, s) <+ white_noise(powerSubsCS_BS); // "bas_sub_current"
|
||||
`endif
|
||||
|
||||
if (RCBLX > 0.0)
|
||||
begin
|
||||
if (RCBLI > 0.0)
|
||||
begin /* all branches exist */
|
||||
I(c, c3) <+ white_noise(powerRCCxx); // "collector plug resistance"
|
||||
I(c3, c4) <+ white_noise(powerRCCex); // "extrinsic collector BL resistance"
|
||||
I(c4, c1) <+ white_noise(powerRCCin); // "intrinsic collector BL resistance"
|
||||
end
|
||||
else
|
||||
begin /* only Rcblx exists */
|
||||
I(c, c3) <+ white_noise(powerRCCxx); // "collector plug resistance"
|
||||
I(c3, c1) <+ white_noise(powerRCCex); // "extrinsic collector BL resistance"
|
||||
end
|
||||
end
|
||||
else
|
||||
begin
|
||||
if (RCBLI > 0.0)
|
||||
begin /* only Rcbli exists */
|
||||
I(c, c4) <+ white_noise(powerRCCxx); // "collector plug resistance"
|
||||
I(c4, c1) <+ white_noise(powerRCCin); // "intrinsic collector BL resistance"
|
||||
end
|
||||
else
|
||||
begin /* neither Rcblx nor Rcbli exists */
|
||||
I(c, c1) <+ white_noise(powerRCCxx); // "collector plug resistance"
|
||||
end
|
||||
end
|
||||
|
||||
end // Noise
|
||||
|
||||
|
|
@ -1,245 +0,0 @@
|
|||
// Copyright (c) 2000-2007, NXP Semiconductor
|
||||
// Copyright (c) 2007-2014, Delft University of Technology
|
||||
// Copyright (c) 2015, Auburn University
|
||||
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
|
||||
|
||||
// Evaluate the operating point (output) variables
|
||||
begin
|
||||
|
||||
`ifdef __VAMS_COMPACT_MODELING__
|
||||
|
||||
|
||||
// The external currents and the current gain
|
||||
OP_ic = I(<c>); // External DC collector current
|
||||
OP_ib = I(<b>); // External DC base Current
|
||||
|
||||
if (OP_ib == 0)
|
||||
begin
|
||||
OP_betadc = 0.0 ;
|
||||
end
|
||||
else
|
||||
begin
|
||||
OP_betadc = OP_ic / OP_ib; // External DC Current gain
|
||||
end
|
||||
|
||||
// begin added in MXT 504.9:
|
||||
OP_ie = I(<e>); // External DC emitter current
|
||||
OP_vbe = V(b, e); // External base-emitter bias
|
||||
OP_vce = V(c, e); // External collector-emitter bias
|
||||
OP_vbc = V(b, c); // External base-collector bias
|
||||
|
||||
`ifdef SUBSTRATE
|
||||
OP_is = I(<s>); // External DC emitter current
|
||||
OP_vse = V(s, e); // External substrate-emitter bias
|
||||
OP_vbs = V(b, s); // External base-substrate bias
|
||||
OP_vsc = V(s, c); // External substrate-collector bias
|
||||
`endif
|
||||
|
||||
// end added in MXT 504.9:
|
||||
|
||||
// The internal voltage differences
|
||||
OP_vb2e1 = Vb2e1; // Internal base-emiter bias
|
||||
OP_vb2c2 = Vb2c2; // Internal base-emiter bias
|
||||
OP_vb2c1 = Vb2c1; // Internal base-collector bias including epilayer
|
||||
|
||||
OP_vb1c1 = Vb1b2 + Vb2c1; // External base-collector bias without contact resistances
|
||||
|
||||
OP_vc4c1 = Vc4c1; // Bias over intrinsic buried layer
|
||||
OP_vc3c4 = Vc3c4; // Bias over extrinsic buried layer
|
||||
|
||||
OP_ve1e = - Vee1; // Bias over emiter resistance
|
||||
|
||||
// The branch currents
|
||||
OP_in = In; // Main current
|
||||
OP_ic1c2 = Ic1c2; // Epilayer current
|
||||
OP_ib1b2 = Ib1b2; // Pinched-base current
|
||||
OP_ib1 = Ib1; // Ideal forward base current
|
||||
OP_sib1 = Ib1_s; // Ideal side-wall base current
|
||||
//
|
||||
// 504.8, RvdT, TU-Delft April. 2009:
|
||||
//
|
||||
OP_izteb = Izteb ; // Zener tunneling current
|
||||
//
|
||||
OP_ib2 = Ib2; // Non-ideal forward base current
|
||||
OP_ib3 = Ib3; // Non-ideal reverse base current
|
||||
OP_iavl = Iavl; // Avalanche current
|
||||
OP_iex = Iex; // Extrinsic reverse base current
|
||||
OP_xiex = XIex; // Extrinsic reverse base current
|
||||
`ifdef SUBSTRATE
|
||||
OP_isub = Isub; // Substrate current
|
||||
OP_xisub = XIsub; // Substrate current
|
||||
OP_isf = Isf; // Substrate-collector current
|
||||
`endif
|
||||
OP_ire = - Vee1 / RE_TM; // Current through emiter resistance
|
||||
OP_irbc = Vbb1 / RBC_TM; // Current through constant base resistance
|
||||
|
||||
OP_ircc = Vcc3 * GCCxx_TM; // Current through collector contact resistance
|
||||
OP_ircblx = Vc3c4 * GCCex_TM; // Current through extrinsic buried layer resistance
|
||||
OP_ircbli = Vc4c1 * GCCin_TM; // Current through extrinsic buried layer resistance
|
||||
|
||||
// The branch charges
|
||||
OP_qe = Qe; // Emitter charge or emitter neutral charge
|
||||
OP_qte = Qte; // Base-emiter depletion charge
|
||||
OP_sqte = Qte_s; // Sidewall base-emiter depletion charge
|
||||
OP_qbe = Qbe; // Base-emiter diffusion charge
|
||||
OP_qbc = Qbc; // Base-collector diffusion charge
|
||||
OP_qtc = Qtc; // Base-colector depletion charge
|
||||
OP_qepi = Qepi; // Epilayer diffusion charge
|
||||
OP_qb1b2 = Qb1b2; // AC current crowding charge
|
||||
OP_qtex = Qtex; // Extrinsic base-collector depletion charge
|
||||
OP_xqtex = XQtex; // Extrinsic base-collector depletion charge
|
||||
OP_qex = Qex; // Extrinsic base-collector diffusion charge
|
||||
OP_xqex = XQex; // Extrinsic base-collector diffusion charge
|
||||
`ifdef SUBSTRATE
|
||||
OP_qts = Qts; // Collector substrate depletion charge
|
||||
`endif
|
||||
|
||||
// Small signal equivalent circuit conductances and resistances
|
||||
|
||||
OP_gx = - ddx(In, V(e1)); // Forward transconductance
|
||||
OP_gy = - ddx(In, V(c2)); // Reverse transconductance
|
||||
|
||||
OP_gz = - ddx(In, V(c1)); // Reverse transconductance
|
||||
|
||||
OP_sgpi = - ddx(Ib1_s, V(e))
|
||||
- ddx(Ib1_s, V(e1)); // Conductance sidewal b-e junction
|
||||
OP_gpix = - ddx(Ib1+Ib2, V(e1)); // Conductance floor b-e junction
|
||||
|
||||
OP_gpiy = - ddx(Ib1, V(c2)); // Early effect on recombination base current
|
||||
OP_gpiz = - ddx(Ib1, V(c1)); // Early effect on recombination base current
|
||||
|
||||
OP_gmux = ddx( Iavl, V(e1)); // Early effect on avalanche current limitting
|
||||
OP_gmuy = ddx( Iavl, V(c2)); // Conductance of avalanche current
|
||||
OP_gmuz = - ddx(- Iavl, V(c1)); // Conductance of avalanche current
|
||||
|
||||
// Conductance extrinsic b-c current :
|
||||
OP_gmuex = ddx(Iex+Ib3, V(e))
|
||||
+ ddx(Iex+Ib3, V(b1))
|
||||
+ ddx(Iex+Ib3, V(b2))
|
||||
+ ddx(Iex+Ib3, V(e1))
|
||||
+ ddx(Iex+Ib3, V(c2));
|
||||
|
||||
OP_xgmuex = ddx(XIex, V(b)) ; // Conductance extrinsic b-c current
|
||||
|
||||
OP_grcvy = - ddx(Ic1c2, V(c2)); // Conductance of epilayer current
|
||||
OP_grcvz = - ddx(Ic1c2, V(c1)); // Conductance of epilayer current
|
||||
|
||||
OP_rbv = 1.0 / (- ddx(Ib1b2, V(b2)) - ddx(Ib1b2, V(c2))); // Base resistance
|
||||
|
||||
OP_grbvx = - ddx(Ib1b2, V(e)) - ddx(Ib1b2, V(e1)); // Early effect on base resistance
|
||||
OP_grbvy = - ddx(Ib1b2, V(c2)); // Early effect on base resistance
|
||||
|
||||
OP_grbvz = - ddx(Ib1b2, V(c1)); // Early effect on base resistance
|
||||
|
||||
OP_re = RE_TM; // Emiter resistance
|
||||
OP_rbc = RBC_TM; // Constant base resistance
|
||||
OP_rcc = RCCxx_TM; // Collector Contact resistance
|
||||
OP_rcblx = RCCex_TM; // Extrinsic buried layer resistance
|
||||
OP_rcbli = RCCin_TM; // Extrinsic buried layer resistance
|
||||
|
||||
|
||||
`ifdef SUBSTRATE
|
||||
OP_gs = ddx(Isub, V(b)) + ddx(Isub, V(b1)); // Conductance parasitic PNP transitor
|
||||
OP_xgs = ddx(XIsub, V(b)) ; // Conductance parasitic PNP transistor
|
||||
OP_gsf = ddx(Isf, V(s)) ; // Conductance substrate-collector current
|
||||
`endif
|
||||
|
||||
|
||||
|
||||
// Small signal equivalent circuit capacitances
|
||||
OP_scbe = - ddx(Qte_s, V(e)) - ddx(Qte_s, V(e1)); // Capacitance sidewall b-e junction
|
||||
|
||||
OP_cbex = - ddx(Qte + Qbe + Qe, V(e1)) ; // Capacitance floor b-e junction
|
||||
|
||||
OP_cbey = - ddx(Qbe, V(c2)); // Early effect on b-e diffusion junction
|
||||
|
||||
OP_cbez = - ddx(Qbe, V(c1)); // Early effect on b-e diffusion junction
|
||||
|
||||
OP_cbcx = - ddx(Qbc, V(e)) - ddx(Qbc, V(e1)); // Early effect on b-c diffusion junction
|
||||
|
||||
|
||||
OP_cbcy = - ddx(Qtc + Qbc + Qepi, V(c2)); // Capacitance floor b-c junction
|
||||
OP_cbcz = - ddx(Qtc + Qbc + Qepi, V(c1)); // Capacitance floor b-c junction
|
||||
|
||||
// Capacitance extrinsic b-c junction :
|
||||
OP_cbcex = ddx(Qtex + Qex,V(e))
|
||||
+ ddx(Qtex + Qex,V(b1 ))
|
||||
+ ddx(Qtex + Qex,V(b2))
|
||||
+ ddx(Qtex + Qex,V(e1))
|
||||
+ ddx(Qtex + Qex,V(c2)) ;
|
||||
|
||||
// Capacitance extrinsic b-c junction :
|
||||
OP_xcbcex = ddx(XQtex + XQex, V(b)) ;
|
||||
|
||||
OP_cb1b2 = - ddx(Qb1b2, V(b2)) - ddx(Qb1b2, V(c2)); // Capacitance AC current crowding
|
||||
|
||||
OP_cb1b2x = - ddx(Qb1b2, V(e)) - ddx(Qb1b2, V(e1)); // Cross-capacitance AC current crowding
|
||||
OP_cb1b2y = - ddx(Qb1b2, V(c2)); // Cross-capacitance AC current crowding
|
||||
OP_cb1b2z = - ddx(Qb1b2, V(c1)) ; // Cross-capacitance AC current crowding
|
||||
|
||||
`ifdef SUBSTRATE
|
||||
OP_cts = ddx(Qts, V(s)) ; // Capacitance s-c junction
|
||||
`endif
|
||||
|
||||
// Approximate small signal equivalent circuit
|
||||
dydx = (OP_gx - OP_gmux) / (OP_grcvy + OP_gmuy - OP_gy);
|
||||
dydz = (OP_gz - OP_grcvz - OP_gmuz) / (OP_grcvy + OP_gmuy - OP_gy);
|
||||
gpi = OP_sgpi + OP_gpix + OP_gmux + OP_gpiz + OP_gmuz +
|
||||
(OP_gpiy + OP_gmuy) * (dydx + dydz);
|
||||
OP_gm = (OP_grcvy * (OP_gx - OP_gmux + // Transconductance
|
||||
OP_gz - OP_gmuz) - OP_grcvz *
|
||||
(OP_gy - OP_gmuy)) / (OP_grcvy + OP_gmuy - OP_gy);
|
||||
OP_beta = OP_gm / gpi; // Current amplification
|
||||
OP_gout = ((OP_gy - OP_gmuy) * OP_grcvz - // Output conductance
|
||||
(OP_gz - OP_gmuz) * OP_grcvy) /
|
||||
(OP_grcvy + OP_gmuy - OP_gy);
|
||||
OP_gmu = OP_gpiz + OP_gmuz + (OP_gpiy + OP_gmuy) * dydz + // Feedback transconductance
|
||||
OP_gmuex + OP_xgmuex;
|
||||
OP_rb = RBC_TM + OP_rbv; // Base resistance
|
||||
OP_rc = OP_rcc + OP_rcblx + OP_rcbli; // Collector resistance
|
||||
OP_cbe = OP_cbex + OP_scbe + OP_cbcx + // Base-emitter capacitance
|
||||
(OP_cbey + OP_cbcy) * dydx + CBEO_M;
|
||||
OP_cbc = (OP_cbey + OP_cbcy) * dydz + OP_cbcz + // Base-collector capacitance
|
||||
OP_cbcex + OP_xcbcex + CBCO_M;
|
||||
|
||||
|
||||
// Quantities to describe internal state of the model
|
||||
gammax = (OP_gpix + OP_gmux - OP_grbvx) * OP_rbv;
|
||||
gammay = (OP_gpiy + OP_gmuy - OP_grbvy) * OP_rbv;
|
||||
gammaz = (OP_gpiz + OP_gmuz - OP_grbvz) * OP_rbv;
|
||||
gbfx = OP_gpix + OP_sgpi * (1.0 + gammax);
|
||||
gbfy = OP_gpiy + OP_sgpi * gammay;
|
||||
gbfz = OP_gpiz + OP_sgpi * gammaz;
|
||||
|
||||
// RvdT March 2008:
|
||||
alpha_ft = (1.0 + (OP_grcvy * dydx * OP_rc) +
|
||||
(OP_gx + gbfx + (OP_gy + gbfy) * dydx) * RE_TM)/
|
||||
(1.0 - (OP_grcvz + OP_grcvy * dydz) * OP_rc -
|
||||
(OP_gz + gbfz + (OP_gy + gbfy) * dydz) * RE_TM);
|
||||
|
||||
rx = pow((OP_grcvy * dydx + alpha_ft * (OP_grcvz + OP_grcvy * dydz)), -1);
|
||||
rz = alpha_ft * rx;
|
||||
ry = (1.0 - OP_grcvz * rz) / OP_grcvy;
|
||||
rb1b2 = gammax * rx + gammay * ry + gammaz * rz;
|
||||
rex = rz + rb1b2 - OP_rcbli;
|
||||
xrex = rz + rb1b2 + RBC_TM * ((gbfx + OP_gmux) * rx + (gbfy + OP_gmuy) * ry +
|
||||
(gbfz + OP_gmuz) * rz) - OP_rcbli - OP_rcblx;
|
||||
|
||||
taut = OP_scbe * (rx + rb1b2) + (OP_cbex + OP_cbcx) * rx + (OP_cbey + OP_cbcy) *
|
||||
ry + (OP_cbez + OP_cbcz) * rz + OP_cbcex * rex + OP_xcbcex * xrex +
|
||||
(CBEO_M + CBCO_M) * (xrex - RCCxx_TM);
|
||||
|
||||
OP_ft = 1.0 / (2.0 * `PI * taut); // Good approximation for cut-off frequency
|
||||
OP_iqs = Iqs; // Current at onset of quasi-saturation
|
||||
OP_xiwepi = xi_w; // Thickness of injection layer
|
||||
OP_vb2c2star = Vb2c2star; // Physical value of internal base-collector bias
|
||||
|
||||
//self-heating
|
||||
`ifdef SELFHEATING
|
||||
OP_pdiss = power; // Dissipation
|
||||
`endif
|
||||
|
||||
OP_tk = Tk; // Actual temperature
|
||||
|
||||
`endif
|
||||
end
|
||||
|
|
@ -1,156 +0,0 @@
|
|||
// Copyright (c) 2000-2007, NXP Semiconductor
|
||||
// Copyright (c) 2007-2014, Delft University of Technology
|
||||
// Copyright (c) 2015, Auburn University
|
||||
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
|
||||
|
||||
//
|
||||
// Operation point (output) variables
|
||||
//
|
||||
|
||||
// The external currents and current gain
|
||||
`OPP(OP_ic, A, External DC collector current)
|
||||
`OPP(OP_ib, A, External DC base current)
|
||||
`OPP(OP_betadc, , External DC current gain Ic/Ib)
|
||||
|
||||
// begin added in MXT 504.9:
|
||||
`OPP(OP_ie, A, External DC emitter current)
|
||||
|
||||
// The external biases
|
||||
`OPP(OP_vbe, V, External base-emitter bias)
|
||||
`OPP(OP_vce, V, External collector-emitter bias)
|
||||
`OPP(OP_vbc, V, External base-collector bias)
|
||||
|
||||
`ifdef SUBSTRATE
|
||||
`OPP(OP_is, A, External DC substrate current)
|
||||
`OPP(OP_vse, V, External substrate-emitter bias)
|
||||
`OPP(OP_vbs, V, External base-substrate bias)
|
||||
`OPP(OP_vsc, V, External substrate-collector bias)
|
||||
`endif
|
||||
|
||||
// end added in MXT 504.9
|
||||
// The internal biases
|
||||
`OPP(OP_vb2e1, V, Internal base-emitter bias)
|
||||
`OPP(OP_vb2c2, V, Internal base-collector bias)
|
||||
`OPP(OP_vb2c1, V, Internal base-collector bias including epilayer)
|
||||
`OPP(OP_vb1c1, V, External base-collector bias without contact resistances)
|
||||
`OPP(OP_vc4c1, V, Bias over intrinsic buried layer)
|
||||
`OPP(OP_vc3c4, V, Bias over extrinsic buried layer)
|
||||
`OPP(OP_ve1e, V, Bias over emitter resistance)
|
||||
|
||||
// The actual currents
|
||||
`OPP(OP_in, A, Main current)
|
||||
`OPP(OP_ic1c2, A, Epilayer current)
|
||||
`OPP(OP_ib1b2, A, Pinched-base current)
|
||||
`OPP(OP_ib1, A, Ideal forward base current)
|
||||
`OPP(OP_sib1, A, Ideal side-wall base current)
|
||||
//
|
||||
// 504.8, RvdT, TU-Delft April. 2009, Zener tunneling current:
|
||||
//
|
||||
`OPP(OP_izteb, A, Zener tunneling current in the emitter base junction)
|
||||
//
|
||||
`OPP(OP_ib2, A, Non-ideal forward base current)
|
||||
`OPP(OP_ib3, A, Non-ideal reverse base current)
|
||||
`OPP(OP_iavl, A, Avalanche current)
|
||||
`OPP(OP_iex, A, Extrinsic reverse base current)
|
||||
|
||||
`OPP(OP_xiex, A, Extrinsic reverse base current)
|
||||
`ifdef SUBSTRATE
|
||||
`OPP(OP_isub, A, Substrate current)
|
||||
`OPP(OP_xisub, A, Substrate current)
|
||||
`OPP(OP_isf, A, Substrate failure current)
|
||||
`endif
|
||||
`OPP(OP_ire, A, Current through emitter resistance)
|
||||
`OPP(OP_irbc, A, Current through constant base resistance)
|
||||
`OPP(OP_ircblx, A, Current through extrinsic buried layer resistance)
|
||||
`OPP(OP_ircbli, A, Current through intrinsic buried layer resistance)
|
||||
`OPP(OP_ircc, A, Current through collector contact resistance)
|
||||
|
||||
//The actual charges
|
||||
`OPP(OP_qe, C, Emitter charge or emitter neutral charge)
|
||||
`OPP(OP_qte, C, Base-emitter depletion charge)
|
||||
`OPP(OP_sqte, C, Sidewall base-emitter depletion charge)
|
||||
`OPP(OP_qbe, C, Base-emitter diffusion charge)
|
||||
`OPP(OP_qbc, C, Base_collector diffusion charge)
|
||||
`OPP(OP_qtc, C, Base-collector depletion charge)
|
||||
`OPP(OP_qepi, C, Epilayer diffusion charge)
|
||||
`OPP(OP_qb1b2, C, AC current crowding charge)
|
||||
`OPP(OP_qtex, C, Extrinsic base-collector depletion charge)
|
||||
`OPP(OP_xqtex, C, Extrinsic base-collector depletion charge)
|
||||
`OPP(OP_qex, C, Extrinsic base-collector diffusion charge)
|
||||
`OPP(OP_xqex, C, Extrinsic base-collector diffusion charge)
|
||||
`ifdef SUBSTRATE
|
||||
`OPP(OP_qts, C, Collector-substrate depletion charge)
|
||||
`endif
|
||||
|
||||
//Small signal equivalent circuit conductances and resistances
|
||||
`OPP(OP_gx, S, Forward transconductance)
|
||||
`OPP(OP_gy, S, Reverse transconductance)
|
||||
`OPP(OP_gz, S, Reverse transconductance)
|
||||
`OPP(OP_sgpi, S, Conductance sidewall b-e junction)
|
||||
`OPP(OP_gpix, S, Conductance floor b-e junction)
|
||||
`OPP(OP_gpiy, S, Early effect on recombination base current)
|
||||
`OPP(OP_gpiz, S, Early effect on recombination base current)
|
||||
`OPP(OP_gmux, S, Early effect on avalanche current limiting)
|
||||
`OPP(OP_gmuy, S, Conductance of avalanche current)
|
||||
`OPP(OP_gmuz, S, Conductance of avalanche current)
|
||||
`OPP(OP_gmuex, S, Conductance of extrinsic b-c junction)
|
||||
`OPP(OP_xgmuex, S, Conductance of extrinsic b-c junction)
|
||||
`OPP(OP_grcvy, S, Conductance of epilayer current)
|
||||
`OPP(OP_grcvz, S, Conductance of epilayer current)
|
||||
`OPP(OP_rbv, Ohm, Base resistance)
|
||||
`OPP(OP_grbvx, S, Early effect on base resistance)
|
||||
`OPP(OP_grbvy, S, Early effect on base resistance)
|
||||
`OPP(OP_grbvz, S, Early effect on base resistance)
|
||||
`OPP(OP_re, Ohm, Emitter resistance)
|
||||
`OPP(OP_rbc, Ohm, Constant base resistance)
|
||||
`OPP(OP_rcc, Ohm, Collector contact resistance)
|
||||
`OPP(OP_rcblx, Ohm, Extrinsic buried layer resistance)
|
||||
`OPP(OP_rcbli, Ohm, Intrinsic buried layer resistance)
|
||||
`ifdef SUBSTRATE
|
||||
`OPP(OP_gs, S, Conductance parasitic PNP transistor)
|
||||
`OPP(OP_xgs, S, Conductance parasitic PNP transistor)
|
||||
`OPP(OP_gsf, S, Conductance substrate failure current)
|
||||
`endif
|
||||
//Small signal equivalent circuit capacitances
|
||||
`OPP(OP_scbe, F, Capacitance sidewall b-e junction)
|
||||
`OPP(OP_cbex, F, Capacitance floor b-e junction)
|
||||
`OPP(OP_cbey, F, Early effect on b-e diffusion charge)
|
||||
`OPP(OP_cbez, F, Early effect on b-e diffusion charge)
|
||||
`OPP(OP_cbcx, F, Early effect on b-c diffusion charge)
|
||||
`OPP(OP_cbcy, F, Capacitance floor b-c junction)
|
||||
`OPP(OP_cbcz, F, Capacitance floor b-c junction)
|
||||
`OPP(OP_cbcex, F, Capacitance extrinsic b-c junction)
|
||||
`OPP(OP_xcbcex, F, Capacitance extrinsic b-c junction)
|
||||
`OPP(OP_cb1b2, F, Capacitance AC current crowding)
|
||||
`OPP(OP_cb1b2x, F, Cross-capacitance AC current crowding)
|
||||
`OPP(OP_cb1b2y, F, Cross-capacitance AC current crowding)
|
||||
`OPP(OP_cb1b2z, F, Cross-capacitance AC current crowding)
|
||||
`ifdef SUBSTRATE
|
||||
`OPP(OP_cts, F, Capacitance s-c junction)
|
||||
`endif
|
||||
//Approximate small signal equivalent circuit
|
||||
`OPP(OP_gm, S,transconductance)
|
||||
`OPP(OP_beta, , Current amplification)
|
||||
`OPP(OP_gout, S, Output conductance)
|
||||
`OPP(OP_gmu, S, Feedback transconductance)
|
||||
`OPP(OP_rb, Ohm, Base resistance)
|
||||
`OPP(OP_rc, Ohm, Collector resistance)
|
||||
`OPP(OP_cbe, C, Base-emitter capacitance)
|
||||
`OPP(OP_cbc, C, Base-collector capacitance)
|
||||
|
||||
//quantities to describe internal state of the model
|
||||
`OPP(OP_ft, , Good approximation for cut-off frequency)
|
||||
`OPP(OP_iqs, A, Current at onset of quasi-saturation)
|
||||
`OPP(OP_xiwepi, m, Thickness of injection layer)
|
||||
`OPP(OP_vb2c2star, V, Physical value of internal base-collector bias)
|
||||
|
||||
//self-heating
|
||||
`ifdef SELFHEATING
|
||||
`OPP(OP_pdiss, W, Dissipation)
|
||||
`endif
|
||||
`OPP(OP_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,115 +0,0 @@
|
|||
// Copyright (c) 2000-2007, NXP Semiconductor
|
||||
// Copyright (c) 2007-2014, Delft University of Technology
|
||||
// Copyright (c) 2015, Auburn University
|
||||
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
|
||||
|
||||
// Mextram parameters
|
||||
`MPIco( LEVEL ,504 ,"" ,504 ,505 ,"Model level" )
|
||||
`MPRco( TREF ,25.0 ,"" ,-273.0 ,inf ,"Reference temperature" )
|
||||
`MPRnb( DTA ,0.0 ,"" ,"Difference between the local and global ambient temperatures" )
|
||||
`MPIcc( EXMOD ,1 ,"" ,0 ,2 ,"Flag for extended modeling of the reverse current gain" )
|
||||
`MPIcc( EXPHI ,1 ,"" ,0 ,1 ,"Flag for the distributed high-frequency effects in transient" )
|
||||
`MPIcc( EXAVL ,0 ,"" ,0 ,1 ,"Flag for extended modeling of avalanche currents" )
|
||||
|
||||
`ifdef SUBSTRATE
|
||||
`MPIcc( EXSUB ,0 ,"" ,0 ,1 ,"Flag for extended modelling of substrate currents" )
|
||||
`endif
|
||||
|
||||
`MPRoo( IS ,22.0a ,"" ,0.0 ,inf ,"Collector-emitter saturation current" )
|
||||
`MPRco( IK ,0.1 ,"" ,1.0p ,inf ,"Collector-emitter high injection knee current" )
|
||||
`MPRco( VER ,2.5 ,"" ,0.01 ,inf ,"Reverse Early voltage" )
|
||||
`MPRco( VEF ,44.0 ,"" ,0.01 ,inf ,"Forward Early voltage" )
|
||||
`MPRco( BF ,215.0 ,"" ,0.1m ,inf ,"Ideal forward current gain" )
|
||||
`MPRco( IBF ,2.7f ,"" ,0.0 ,inf ,"Saturation current of the non-ideal forward base current" )
|
||||
`MPRco( MLF ,2.0 ,"" ,0.1 ,inf ,"Non-ideality factor of the non-ideal forward base current" )
|
||||
`MPRcc( XIBI ,0.0 ,"" ,0.0 ,1.0 ,"Part of ideal base current that belongs to the sidewall" )
|
||||
`MPRco( IZEB ,0.0 ,"" ,0.0 ,inf ,"Pre-factor of emitter-base Zener tunneling current" )
|
||||
`MPRco( NZEB ,22.0 ,"" ,0.0 ,inf ,"Coefficient of emitter-base Zener tunneling current" )
|
||||
`MPRco( BRI ,7.0 ,"" ,1.0e-4 ,inf ,"Ideal reverse current gain" )
|
||||
`MPRco( IBR ,1.0f ,"" ,0.0 ,inf ,"Saturation current of the non-ideal reverse base current" )
|
||||
`MPRnb( VLR ,0.2 ,"" ,"Cross-over voltage of the non-ideal reverse base current" )
|
||||
`MPRcc( XEXT ,0.63 ,"" ,0.0 ,1.0 ,"Part of currents and charges that belong to extrinsic region" )
|
||||
`MPRco( WAVL ,1.1u ,"" ,1.0n ,inf ,"Epilayer thickness used in weak-avalanche model" )
|
||||
`MPRco( VAVL ,3.0 ,"" ,0.01 ,inf ,"Voltage determining curvature of avalanche current" )
|
||||
`MPRco( SFH ,0.3 ,"" ,0.0 ,inf ,"Current spreading factor of avalanche model when EXAVL=1" )
|
||||
`MPRco( RE ,5.0 ,"" ,1.0m ,inf ,"Emitter resistance" )
|
||||
`MPRco( RBC ,23.0 ,"" ,1.0m ,inf ,"Constant part of the base resistance" )
|
||||
`MPRco( RBV ,18.0 ,"" ,1.0m ,inf ,"Zero-bias value of the variable part of the base resistance" )
|
||||
`MPRco( RCC ,12.0 ,"" ,1.0m ,inf ,"Constant part of the collector resistance" )
|
||||
`MPRco( RCV ,150.0 ,"" ,1.0m ,inf ,"Resistance of the un-modulated epilayer" )
|
||||
`MPRco( SCRCV ,1250.0 ,"" ,1.0m ,inf ,"Space charge resistance of the epilayer" )
|
||||
`MPRco( IHC ,4.0m ,"" ,1.0p ,inf ,"Critical current for velocity saturation in the epilayer" )
|
||||
`MPRco( AXI ,0.3 ,"" ,0.02 ,inf ,"Smoothness parameter for the onset of quasi-saturation" )
|
||||
`MPRco( CJE ,73.0f ,"" ,0.0 ,inf ,"Zero-bias emitter-base depletion capacitance" )
|
||||
`MPRco( VDE ,0.95 ,"" ,0.05 ,inf ,"Emitter-base diffusion voltage" )
|
||||
`MPRco( PE ,0.4 ,"" ,0.01 ,0.99 ,"Emitter-base grading coefficient" )
|
||||
`MPRcc( XCJE ,0.4 ,"" ,0.0 ,1.0 ,"Sidewall fraction of the emitter-base depletion capacitance" )
|
||||
`MPRco( CBEO ,0.0 ,"" ,0.0 ,inf ,"Emitter-base overlap capacitance" )
|
||||
`MPRco( CJC ,78.0f ,"" ,0.0 ,inf ,"Zero-bias collector-base depletion capacitance" )
|
||||
`MPRco( VDC ,0.68 ,"" ,0.05 ,inf ,"Collector-base diffusion voltage" )
|
||||
`MPRco( PC ,0.5 ,"" ,0.01 ,0.99 ,"Collector-base grading coefficient" )
|
||||
`MPRco( XP ,0.35 ,"" ,0.0 ,0.99 ,"Constant part of Cjc" )
|
||||
`MPRco( MC ,0.5 ,"" ,0.0 ,1.0 ,"Coefficient for current modulation of CB depletion capacitance" )
|
||||
`MPRcc( XCJC ,32.0m ,"" ,0.0 ,1.0 ,"Fraction of CB depletion capacitance under the emitter" )
|
||||
`MPRco( RCBLX ,0.0 ,"" ,0.0 ,inf ,"Resistance Collector Buried Layer eXtrinsic" )
|
||||
`MPRco( RCBLI ,0.0 ,"" ,0.0 ,inf ,"Resistance Collector Buried Layer Intrinsic" )
|
||||
`MPRco( CBCO ,0.0 ,"" ,0.0 ,inf ,"Collector-base overlap capacitance" )
|
||||
`MPRco( MTAU ,1.0 ,"" ,0.1 ,inf ,"Non-ideality factor of the emitter stored charge" )
|
||||
`MPRco( TAUE ,2.0p ,"" ,0.0 ,inf ,"Minimum transit time of stored emitter charge" )
|
||||
`MPRoo( TAUB ,4.2p ,"" ,0.0 ,inf ,"Transit time of stored base charge" )
|
||||
`MPRco( TEPI ,41.0p ,"" ,0.0 ,inf ,"Transit time of stored epilayer charge" )
|
||||
`MPRco( TAUR ,520.0p ,"" ,0.0 ,inf ,"Transit time of reverse extrinsic stored base charge" )
|
||||
`MPRnb( DEG ,0.0 ,"" ,"Bandgap difference over the base" )
|
||||
`MPRco( XREC ,0.0 ,"" ,0.0 ,inf ,"Pre-factor of the recombination part of Ib1" )
|
||||
`MPRcc( XQB ,`one_third ,"" ,0.0 ,1.0 ,"Emitter-fraction of base diffusion charge" )
|
||||
`MPRnb( AQBO ,0.3 ,"" ,"Temperature coefficient of the zero-bias base charge" )
|
||||
`MPRnb( AE ,0.0 ,"" ,"Temperature coefficient of the resistivity of the emitter" )
|
||||
`MPRnb( AB ,1.0 ,"" ,"Temperature coefficient of the resistivity of the base" )
|
||||
`MPRnb( AEPI ,2.5 ,"" ,"Temperature coefficient of the resistivity of the epilayer" )
|
||||
`MPRnb( AEX ,0.62 ,"" ,"Temperature coefficient of the resistivity of the extrinsic base" )
|
||||
`MPRnb( AC ,2.0 ,"" ,"Temperature coefficient of the resistivity of the collector contact" )
|
||||
`MPRco( ACBL ,2.0 ,"" ,0.0 ,inf ,"Temperature coefficient of the resistivity of the collector buried layer" )
|
||||
`MPRnb( DVGBF ,50.0m ,"" ,"Band-gap voltage difference of the forward current gain" )
|
||||
`MPRnb( DVGBR ,45.0m ,"" ,"Band-gap voltage difference of the reverse current gain" )
|
||||
`MPRco( VGB ,1.17 ,"" ,0.1 ,inf ,"Band-gap voltage of the base" )
|
||||
`MPRco( VGC ,1.18 ,"" ,0.1 ,inf ,"Band-gap voltage of the collector" )
|
||||
`MPRco( VGJ ,1.15 ,"" ,0.1 ,inf ,"Band-gap voltage recombination emitter-base junction" )
|
||||
`MPRco( VGZEB ,1.15 ,"" ,0.1 ,inf ,"Band-gap voltage at Tref of Zener effect emitter-base junction" )
|
||||
`MPRoo( AVGEB ,4.73e-4 ,"" ,-inf ,inf ,"Temperature coefficient band-gap voltage for Zener effect emitter-base junction" )
|
||||
`MPRco( TVGEB ,636.0 ,"" ,0.0 ,inf ,"Temperature coefficient band-gap voltage for Zener effect emitter-base junction" )
|
||||
`MPRnb( DVGTE ,0.05 ,"" ,"Band-gap voltage difference of emitter stored charge" )
|
||||
`MPRnb( DAIS ,0.0 ,"" ,"Fine tuning of temperature dependence of C-E saturation current" )
|
||||
`MPRco( AF ,2.0 ,"" ,0.01 ,inf ,"Exponent of the Flicker-noise" )
|
||||
`MPRco( KF ,20.0p ,"" ,0.0 ,inf ,"Flicker-noise coefficient of the ideal base current" )
|
||||
`MPRco( KFN ,20.0p ,"" ,0.0 ,inf ,"Flicker-noise coefficient of the non-ideal base current" )
|
||||
`MPIcc( KAVL ,0 ,"" ,0 ,1 ,"Switch for white noise contribution due to avalanche" )
|
||||
`MPIcc( KC ,0 ,"" ,0 ,2 ,"Switch for RF correlation noise model selection" )
|
||||
`MPRcc( KE ,0.0 ,"" ,0.0 ,1.0 ,"Fraction of QE in excess phase shift" )
|
||||
`MPRcc( FTAUN ,0.0 ,"" ,0.0 ,1.0 ,"Fraction of noise transit time to total transit time" )
|
||||
|
||||
`ifdef SUBSTRATE
|
||||
`MPRco( ISS ,48.0a ,"" ,0.0 ,inf ,"Base-substrate saturation current" )
|
||||
`MPRoo( ICSS ,-1.0 ,"" ,-inf ,inf ,"Collector-substrate ideal saturation current" )
|
||||
`MPRco( IKS ,250.0u ,"" ,1.0p ,inf ,"Base-substrate high injection knee current" )
|
||||
`MPRco( CJS ,315.0f ,"" ,0.0 ,inf ,"Zero-bias collector-substrate depletion capacitance" )
|
||||
`MPRoo( VDS ,0.62 ,"" ,0.05 ,inf ,"Collector-substrate diffusion voltage" )
|
||||
`MPRoo( PS ,0.34 ,"" ,0.01 ,0.99 ,"Collector-substrate grading coefficient" )
|
||||
`MPRco( VGS ,1.20 ,"" ,0.1 ,inf ,"Band-gap voltage of the substrate" )
|
||||
`MPRnb( AS ,1.58 ,"" ,"Substrate temperature coefficient" )
|
||||
`MPRnb( ASUB ,2.0 ,"" ,"Temperature coefficient for mobility of minorities in the substrate" )
|
||||
`endif
|
||||
|
||||
`ifdef SELFHEATING
|
||||
`MPRoo( RTH ,300.0 ,"" ,0.0 ,inf ,"Thermal resistance" )
|
||||
`MPRco( CTH ,3.0n ,"" ,0.0 ,inf ,"Thermal capacitance" )
|
||||
`MPRnb( ATH ,0.0 ,"" ,"Temperature coefficient of the thermal resistance" )
|
||||
`endif
|
||||
|
||||
`MPRoo( MULT ,1.0 ,"" ,0.0 ,inf ,"Multiplication factor" )
|
||||
`MPIty( TYPE ,1 ,"" ,"Flag for NPN (1) or PNP (-1) transistor type" )
|
||||
`MPRoc( GMIN ,1.0e-13 ,"" ,0.0 ,1e-10 ,"Minimum conductance" )
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,262 +0,0 @@
|
|||
// Copyright (c) 2000-2007, NXP Semiconductor
|
||||
// Copyright (c) 2007-2014, Delft University of Technology
|
||||
// Copyright (c) 2015, Auburn University
|
||||
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
|
||||
|
||||
// Temperature scaling of parameters
|
||||
|
||||
// The excess transistor temperature due to the self-heating
|
||||
`ifdef SELFHEATING
|
||||
Tki = V(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;
|
||||
|
||||
lntN = ln(tN) ;
|
||||
|
||||
// begin: RvdT, November 2008, "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) ;
|
||||
|
||||
// end: RvdT, November 2008, "Zener tunneling model"
|
||||
|
||||
// Depletion capacitances
|
||||
|
||||
UdeT = -3.0 * Vt * ln(tN) + VDE * tN + (1.0 - tN) * VGB;
|
||||
`max_logexp(VDE_T, `VDLOW, UdeT, Vt);
|
||||
|
||||
UdcT = -3.0 * Vt * ln(tN) + VDC * tN + (1.0 - tN) * VGC;
|
||||
`max_logexp(VDC_T, `VDLOW, UdcT, Vt);
|
||||
|
||||
`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 ;
|
||||
CJE_T_div_CJE = pow(VDE * inv_VDE_T, PE);
|
||||
CJE_T = CJE * CJE_T_div_CJE ;
|
||||
|
||||
`ifdef SUBSTRATE
|
||||
CJS_T = CJS * pow(VDS / VDS_T, PS);
|
||||
`endif
|
||||
|
||||
CJCscale = ((1.0 - XP) * pow(VDC / VDC_T, PC) + XP);
|
||||
CJCscaleINV = 1.0 / CJCscale;
|
||||
|
||||
CJC_T = CJC * CJCscale;
|
||||
XP_T = XP * CJCscaleINV;
|
||||
|
||||
// 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 RCCxx_T, RCCex_T, RCCin_T
|
||||
`ifdef insideADMS
|
||||
//dw limiting all the RCXXX to MIN_R
|
||||
if (RCC > 0.0)
|
||||
RCCxx_T = RCC * exp(lntN * AC);
|
||||
else
|
||||
RCCxx_T = `MIN_R * exp(lntN * AC);
|
||||
if (RCBLX > 0.0)
|
||||
RCCex_T = RCBLX * exp(lntN * ACBL);
|
||||
else
|
||||
RCCex_T = `MIN_R * exp(lntN * ACBL);
|
||||
if (RCBLI > 0.0)
|
||||
RCCin_T = RCBLI * exp(lntN * ACBL);
|
||||
else
|
||||
RCCin_T = `MIN_R * exp(lntN * ACBL);
|
||||
`else
|
||||
RCCxx_T = RCC * exp(lntN * AC);
|
||||
RCCex_T = RCBLX * exp(lntN * ACBL);
|
||||
RCCin_T = RCBLI * exp(lntN * ACBL);
|
||||
`endif
|
||||
|
||||
RCV_T = RCV * exp(lntN * AEPI);
|
||||
|
||||
// Current gains
|
||||
|
||||
BF_T = BF * exp(lntN * (AE - AB - AQBO)) * exp(-DVGBF * VdtINV);
|
||||
BRI_T = BRI * exp(-DVGBR * VdtINV);
|
||||
|
||||
// Currents and voltages
|
||||
|
||||
IS_T = IS * exp(lntN * (4.0 - AB - AQBO + DAIS)) * exp(-VGB * VdtINV);
|
||||
IK_T = IK * exp(lntN * (1.0 - AB));
|
||||
IBF_T = IBF * exp(lntN * (6.0 - 2.0 * MLF)) * exp(-VGJ * VdtINV / MLF);
|
||||
IBR_T = IBR * tN * tN * exp(-VGC * VdtINV / 2.0);
|
||||
|
||||
// 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
|
||||
|
||||
x = exp(lntN * AQBO) ;
|
||||
VEF_T = VEF * x * CJCscaleINV;
|
||||
// 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.
|
||||
|
||||
if ((ISS_T > 0.0))
|
||||
IKS_T = IKS * exp(lntN * (1.0 - AS)) * (IS_T / IS) * (ISS / ISS_T);
|
||||
else
|
||||
IKS_T = IKS * exp(lntN * (1.0 - AS));
|
||||
`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);
|
||||
|
||||
// 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
|
||||
|
||||
IS_TM = IS_T * MULT;
|
||||
IK_TM = IK_T * MULT;
|
||||
IBF_TM = IBF_T * MULT;
|
||||
IBR_TM = IBR_T * MULT;
|
||||
// RvdT: November 2008, Zener tunneling parameters
|
||||
IZEB_TM = IZEB_T * MULT ;
|
||||
|
||||
// end Zener tunneling parameters
|
||||
|
||||
|
||||
|
||||
|
||||
IHC_M = IHC * MULT;
|
||||
`ifdef SUBSTRATE
|
||||
ISS_TM = ISS_T * MULT;
|
||||
// New: 504.9
|
||||
ICSS_TM = ICSS_T * MULT;
|
||||
IKS_TM = IKS_T * MULT;
|
||||
`endif
|
||||
CJE_TM = CJE_T * MULT;
|
||||
CJC_TM = CJC_T * MULT;
|
||||
|
||||
// begin RvdT, 28-10-2008, MXT504.8_alpha
|
||||
// Base-emitter tunneling current Mult scaling:
|
||||
// BTJE_TM = BTJE_T * MULT;
|
||||
// end RvdT, 28-10-2008, MXT504.8_alpha
|
||||
|
||||
|
||||
`ifdef SUBSTRATE
|
||||
CJS_TM = CJS_T * MULT;
|
||||
`endif
|
||||
|
||||
RE_TM = RE_T * invMULT;
|
||||
RBC_TM = RBC_T * invMULT;
|
||||
RBV_TM = RBV_T * invMULT;
|
||||
// RvdT, 30-01-2007: new collector resistances:
|
||||
RCCxx_TM = RCCxx_T * invMULT;
|
||||
RCCex_TM = RCCex_T * invMULT;
|
||||
RCCin_TM = RCCin_T * invMULT;
|
||||
RCV_TM = RCV_T * invMULT;
|
||||
|
||||
|
||||
// RvdT, 03-12-2007: new collector conductances
|
||||
`ifdef insideADMS
|
||||
//dw we have limited all the RCXXX to MIN_R
|
||||
GCCxx_TM = 1.0 / RCCxx_TM ;
|
||||
GCCex_TM = 1.0 / RCCex_TM ;
|
||||
GCCin_TM = 1.0 / RCCin_TM ;
|
||||
`else
|
||||
if (RCC > 0.0)
|
||||
begin
|
||||
GCCxx_TM = 1.0 / RCCxx_TM ;
|
||||
end
|
||||
else
|
||||
begin
|
||||
GCCxx_TM = 0 ;
|
||||
end
|
||||
|
||||
if (RCBLX > 0.0)
|
||||
begin
|
||||
GCCex_TM = 1.0 / RCCex_TM ;
|
||||
end
|
||||
else
|
||||
begin
|
||||
GCCex_TM = 0 ;
|
||||
end
|
||||
|
||||
if (RCBLI > 0.0)
|
||||
begin
|
||||
GCCin_TM = 1.0 / RCCin_TM ;
|
||||
end
|
||||
else
|
||||
begin
|
||||
GCCin_TM = 0 ;
|
||||
end
|
||||
`endif
|
||||
|
||||
`ifdef SELFHEATING
|
||||
RTH_Tamb_M = RTH_Tamb * invMULT;
|
||||
`endif
|
||||
|
|
@ -1,198 +0,0 @@
|
|||
// Copyright (c) 2000-2007, NXP Semiconductor
|
||||
// Copyright (c) 2007-2014, Delft University of Technology
|
||||
// Copyright (c) 2015, Auburn University
|
||||
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
|
||||
|
||||
// Declaration of variables
|
||||
real _x, _x0, _a, _dxa;
|
||||
|
||||
// Model constants
|
||||
|
||||
real An, Bn;
|
||||
|
||||
// Temperature scaling variables
|
||||
|
||||
real Tk, Trk, tN, Tamb;
|
||||
real Vt, Vtr, VtINV, VtrINV, VdtINV;
|
||||
real Vdt;
|
||||
|
||||
real UdeT, VDE_T, UdcT, VDC_T;
|
||||
real CJE_T, CJC_T, XP_T;
|
||||
real CJCscale, CJCscaleINV;
|
||||
|
||||
real RE_T, RBV_T, RBC_T, RCV_T;
|
||||
// RvdT: 30-01-2007, new collector resistances:
|
||||
real RCCxx_T, RCCex_T, RCCin_T;
|
||||
|
||||
real BF_T, BRI_T;
|
||||
|
||||
real IS_T, IK_T, IBF_T, IBR_T, VEF_T, VER_T;
|
||||
|
||||
// RvdT: November 2008, Zener tunneling parameters and variables:
|
||||
real Izteb, IZEB_T, E0BE, dE0BE,nZEB_T, pow2_2mPE, pow2_PEm2, inv_VDE, inv_VDE_T;
|
||||
real eZEB, edZEB, DZEB, VGZEB_T, VGZEB_Tr, inv_VGZEB_Tr, CJE_T_div_CJE ;
|
||||
|
||||
// RvdT: March 2009, Zener tunneling parameters and variables:
|
||||
real VGZEBOK;
|
||||
|
||||
// end Zener tunneling parameters
|
||||
|
||||
real TAUE_T, TAUB_T, TEPI_T, TAUR_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;
|
||||
`endif
|
||||
|
||||
// MULT - scaling variables
|
||||
|
||||
real invMULT;
|
||||
real IS_TM, IK_TM, IBF_TM, IBR_TM, IHC_M;
|
||||
// RvdT: November 2008, Zener tunneling parameters
|
||||
real IZEB_TM ;
|
||||
|
||||
// end Zener tunneling parameters
|
||||
|
||||
|
||||
|
||||
|
||||
real CJE_TM, CJC_TM;
|
||||
|
||||
real RE_TM, RBC_TM, RBV_TM, RCV_TM, SCRCV_M;
|
||||
// RvdT: 30-01-2007, new collector resistances:
|
||||
real RCCxx_TM, RCCex_TM, RCCin_TM;
|
||||
// RvdT: 03-12-2007, new collector conductances:
|
||||
real GCCxx_TM, GCCex_TM, GCCin_TM;
|
||||
|
||||
|
||||
real KF_M, KFN_M;
|
||||
|
||||
`ifdef SELFHEATING
|
||||
real RTH_Tamb_M, CTH_M;
|
||||
`endif
|
||||
|
||||
`ifdef SUBSTRATE
|
||||
real ISS_TM, ICSS_TM, IKS_TM, CJS_TM;
|
||||
`endif
|
||||
|
||||
|
||||
// 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;
|
||||
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;
|
||||
real Ibf0, Iex;
|
||||
real g1, g2, pWex, nBex;
|
||||
real Xg1, XnBex, XIMex, XIMsub, Vex, VBex, Fex, XIex;
|
||||
|
||||
`ifdef SUBSTRATE
|
||||
real Isub, XIsub, Isf;
|
||||
`endif
|
||||
|
||||
// Distributed base effects variables
|
||||
|
||||
real q0Q, q1Q, qBQ, Rb2, Ib1b2;
|
||||
real dVteVb2e1, dVteVje, dVjeVb2e1;
|
||||
real dQteVb2e1, dQbeVb2e1, dQeVb2e1;
|
||||
real dn0Vb2e1;
|
||||
|
||||
// Weak-avalanche current variables
|
||||
|
||||
real dEdx0, xd, Weff, Wd, Eav, E0, Em, SHw, Efi, Ew;
|
||||
real lambda, Gem, Gmax, Iavl;
|
||||
real Icap_IHC;
|
||||
|
||||
`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, XQex;
|
||||
real Qex;
|
||||
real CBEO_M, CBCO_M;
|
||||
|
||||
// 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, eVb1e1, eVb1b2, eVb1c4, eVbc3;
|
||||
real eVb1c4VDC, eVb2c2VDC, eVbc3VDC, eVb2c1VDC;
|
||||
|
||||
// Help variables
|
||||
|
||||
// RvdT, November 2008, lntN introduced to speed up T-scaling:
|
||||
// Acknowledgements due to Geoffrey Coram
|
||||
real lntN ;
|
||||
|
||||
// RvdT, November 2008 variables for local use; may be re-used globally:
|
||||
real x, y ;
|
||||
|
||||
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_VDC;
|
||||
|
||||
real expl, tmpExp, tmpV;
|
||||
|
||||
|
||||
`ifdef SUBSTRATE
|
||||
real a_VDS;
|
||||
`endif
|
||||
|
||||
// Noise variables
|
||||
real common;
|
||||
real powerREC, powerRBC, powerRCCxx, powerRCCex, powerRCCin, powerRBV;
|
||||
real powerCCS;
|
||||
real powerFBCS, powerFBC1fB1, exponentFBC1fB2, powerFBC1fB2;
|
||||
real powerEBSCS, powerEBSC1f;
|
||||
real powerRBCS, powerRBC1f;
|
||||
real powerExCS, powerExCSMOD, powerExC1f, powerExC1fMOD;
|
||||
real powerIIS;
|
||||
|
||||
`ifdef SUBSTRATE
|
||||
real powerSubsCS_B1S, powerSubsCS_BS;
|
||||
`endif
|
||||
|
||||
// noise correlation help variables
|
||||
real In_N, Gem_N, Taub_N, taun, Qbe_qs_eff;
|
||||
|
||||
|
|
@ -1,184 +0,0 @@
|
|||
//======================================================================================
|
||||
//======================================================================================
|
||||
// Filename: JUNCAP200_InitModel.include
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
|
||||
//
|
||||
//
|
||||
// Version: 102.1 (PSP), 200.2 (JUNCAP), April 2007 (Simkit 2.5)
|
||||
//
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// Further information can be found in the file readme.txt
|
||||
//
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Calculation of internal paramters which are independent
|
||||
// on instance parameters
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
TRJ_i = `CLIP_LOW( TRJ , `TRJ_cliplow);
|
||||
IMAX_i = `CLIP_LOW( IMAX , `IMAX_cliplow);
|
||||
CJORBOT_i = `CLIP_LOW( CJORBOT , `CJORBOT_cliplow);
|
||||
CJORSTI_i = `CLIP_LOW( CJORSTI , `CJORSTI_cliplow);
|
||||
CJORGAT_i = `CLIP_LOW( CJORGAT , `CJORGAT_cliplow);
|
||||
VBIRBOT_i = `CLIP_LOW( VBIRBOT , `VBIR_cliplow);
|
||||
VBIRSTI_i = `CLIP_LOW( VBIRSTI , `VBIR_cliplow);
|
||||
VBIRGAT_i = `CLIP_LOW( VBIRGAT , `VBIR_cliplow);
|
||||
PBOT_i = `CLIP_BOTH(PBOT , `P_cliplow,`P_cliphigh);
|
||||
PSTI_i = `CLIP_BOTH(PSTI , `P_cliplow,`P_cliphigh);
|
||||
PGAT_i = `CLIP_BOTH(PGAT , `P_cliplow,`P_cliphigh);
|
||||
IDSATRBOT_i = `CLIP_LOW( IDSATRBOT , `IDSATR_cliplow);
|
||||
IDSATRSTI_i = `CLIP_LOW( IDSATRSTI , `IDSATR_cliplow);
|
||||
IDSATRGAT_i = `CLIP_LOW( IDSATRGAT , `IDSATR_cliplow);
|
||||
CSRHBOT_i = `CLIP_LOW( CSRHBOT , `CSRH_cliplow);
|
||||
CSRHSTI_i = `CLIP_LOW( CSRHSTI , `CSRH_cliplow);
|
||||
CSRHGAT_i = `CLIP_LOW( CSRHGAT , `CSRH_cliplow);
|
||||
XJUNSTI_i = `CLIP_LOW( XJUNSTI , `XJUN_cliplow);
|
||||
XJUNGAT_i = `CLIP_LOW( XJUNGAT , `XJUN_cliplow);
|
||||
CTATBOT_i = `CLIP_LOW( CTATBOT , `CTAT_cliplow);
|
||||
CTATSTI_i = `CLIP_LOW( CTATSTI , `CTAT_cliplow);
|
||||
CTATGAT_i = `CLIP_LOW( CTATGAT , `CTAT_cliplow);
|
||||
MEFFTATBOT_i = `CLIP_LOW( MEFFTATBOT, `MEFFTAT_cliplow);
|
||||
MEFFTATSTI_i = `CLIP_LOW( MEFFTATSTI, `MEFFTAT_cliplow);
|
||||
MEFFTATGAT_i = `CLIP_LOW( MEFFTATGAT, `MEFFTAT_cliplow);
|
||||
CBBTBOT_i = `CLIP_LOW( CBBTBOT , `CBBT_cliplow);
|
||||
CBBTSTI_i = `CLIP_LOW( CBBTSTI , `CBBT_cliplow);
|
||||
CBBTGAT_i = `CLIP_LOW( CBBTGAT , `CBBT_cliplow);
|
||||
VBRBOT_i = `CLIP_LOW( VBRBOT , `VBR_cliplow);
|
||||
VBRSTI_i = `CLIP_LOW( VBRSTI , `VBR_cliplow);
|
||||
VBRGAT_i = `CLIP_LOW( VBRGAT , `VBR_cliplow);
|
||||
PBRBOT_i = `CLIP_LOW( PBRBOT , `PBR_cliplow);
|
||||
PBRSTI_i = `CLIP_LOW( PBRSTI , `PBR_cliplow);
|
||||
PBRGAT_i = `CLIP_LOW( PBRGAT , `PBR_cliplow);
|
||||
|
||||
tkr = `KELVINCONVERSION + TRJ_i;
|
||||
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_i * ftdbot * ftdbot;
|
||||
idsatsti = IDSATRSTI_i * ftdsti * ftdsti;
|
||||
idsatgat = IDSATRGAT_i * ftdgat * ftdgat;
|
||||
|
||||
// built-in voltages before limiting
|
||||
ubibot = VBIRBOT_i * auxt - 2 * phitd * ln(ftdbot);
|
||||
ubisti = VBIRSTI_i * auxt - 2 * phitd * ln(ftdsti);
|
||||
ubigat = VBIRGAT_i * auxt - 2 * 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 - PBOT_i;
|
||||
one_minus_PSTI = 1 - PSTI_i;
|
||||
one_minus_PGAT = 1 - PGAT_i;
|
||||
|
||||
// one over "one minus the grading coefficient"
|
||||
one_over_one_minus_PBOT = 1 / one_minus_PBOT;
|
||||
one_over_one_minus_PSTI = 1 / one_minus_PSTI;
|
||||
one_over_one_minus_PGAT = 1 / one_minus_PGAT;
|
||||
|
||||
// temperature-scaled zero-bias capacitance
|
||||
cjobot = CJORBOT_i * pow((VBIRBOT_i * vbiinvbot), PBOT_i);
|
||||
cjosti = CJORSTI_i * pow((VBIRSTI_i * vbiinvsti), PSTI_i);
|
||||
cjogat = CJORGAT_i * pow((VBIRGAT_i * vbiinvgat), PGAT_i);
|
||||
|
||||
// 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_i;
|
||||
wdepnulrsti = XJUNSTI_i * `EPSSI / CJORSTI_i;
|
||||
wdepnulrgat = XJUNGAT_i * `EPSSI / CJORGAT_i;
|
||||
|
||||
// inverse values of "wdepnulr", used in BBT model
|
||||
wdepnulrinvbot = 1 / wdepnulrbot;
|
||||
wdepnulrinvsti = 1 / wdepnulrsti;
|
||||
wdepnulrinvgat = 1 / wdepnulrgat;
|
||||
|
||||
// inverse values of built-in voltages at reference temperature, needed in SRH and BBT model
|
||||
VBIRBOTinv = 1 / VBIRBOT_i;
|
||||
VBIRSTIinv = 1 / VBIRSTI_i;
|
||||
VBIRGATinv = 1 / VBIRGAT_i;
|
||||
|
||||
// some constants needed in erfc-approximation, needed in TAT model
|
||||
perfc = (`SQRTPI * `aerfc);
|
||||
berfc = ((-5 * (`aerfc) + 6 - pow((perfc), -2)) / 3);
|
||||
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 * MEFFTATBOT_i * `MELE * `QELE * (deltaEbot * deltaEbot * deltaEbot)) / (3 * `HBAR);
|
||||
btatpartsti = sqrt(32 * MEFFTATSTI_i * `MELE * `QELE * (deltaEsti * deltaEsti * deltaEsti)) / (3 * `HBAR);
|
||||
btatpartgat = sqrt(32 * MEFFTATGAT_i * `MELE * `QELE * (deltaEgat * deltaEgat * deltaEgat)) / (3 * `HBAR);
|
||||
|
||||
// temperature-scaled values of FBBT, needed in BBT model
|
||||
fbbtbot = FBBTRBOT * (1 + STFBBTBOT * (tkd - tkr));
|
||||
fbbtsti = FBBTRSTI * (1 + STFBBTSTI * (tkd - tkr));
|
||||
fbbtgat = FBBTRGAT * (1 + STFBBTGAT * (tkd - tkr));
|
||||
|
||||
// values of fstop, needed in avalanche/breakdown model
|
||||
fstopbot = 1 / (1 - pow(`alphaav, PBRBOT_i));
|
||||
fstopsti = 1 / (1 - pow(`alphaav, PBRSTI_i));
|
||||
fstopgat = 1 / (1 - pow(`alphaav, PBRGAT_i));
|
||||
|
||||
// inverse values of breakdown voltages, needed in avalanche/breakdown model
|
||||
VBRinvbot = 1 / VBRBOT_i;
|
||||
VBRinvsti = 1 / VBRSTI_i;
|
||||
VBRinvgat = 1 / VBRGAT_i;
|
||||
|
||||
// slopes for linear extraploation close to and beyond breakdown, needed in avalanche/breakdown model
|
||||
slopebot = -(fstopbot * fstopbot * pow(`alphaav, (PBRBOT_i - 1))) * PBRBOT_i * VBRinvbot;
|
||||
slopesti = -(fstopsti * fstopsti * pow(`alphaav, (PBRSTI_i - 1))) * PBRSTI_i * VBRinvsti;
|
||||
slopegat = -(fstopgat * fstopgat * pow(`alphaav, (PBRGAT_i - 1))) * PBRGAT_i * VBRinvgat;
|
||||
|
|
@ -1,285 +0,0 @@
|
|||
//======================================================================================
|
||||
//======================================================================================
|
||||
// Filename: JUNCAP200_macrodefs.include
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
|
||||
//
|
||||
//
|
||||
// Version: 102.1 (PSP), 200.2 (JUNCAP), April 2007 (Simkit 2.5)
|
||||
//
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// Further information can be found in the file readme.txt
|
||||
//
|
||||
|
||||
///////////////////////////////////////////
|
||||
//
|
||||
// Macros and constants used in JUNCAP2
|
||||
//
|
||||
///////////////////////////////////////////
|
||||
|
||||
// Other constants
|
||||
`define MINTEMP -250
|
||||
`define vbilow 0.050
|
||||
`define a 2
|
||||
`define epsch 0.1
|
||||
`define dvbi 0.050
|
||||
`define epsav 1E-6
|
||||
`define vbrmax 1000
|
||||
`define alphaav 0.999
|
||||
`define vmaxlarge 1E8
|
||||
`define aerfc 0.29214664
|
||||
`define twothirds 0.666666666666667
|
||||
|
||||
|
||||
// Clipping values
|
||||
`define levelnumber 200
|
||||
`define AB_cliplow 0
|
||||
`define LS_cliplow 0
|
||||
`define LG_cliplow 0
|
||||
`define MULT_cliplow 0
|
||||
`define TRJ_cliplow `MINTEMP
|
||||
`define IMAX_cliplow 1E-12
|
||||
`define CJORBOT_cliplow 1E-12
|
||||
`define CJORSTI_cliplow 1E-18
|
||||
`define CJORGAT_cliplow 1E-18
|
||||
`define VBIR_cliplow `vbilow
|
||||
`define P_cliplow 0.05
|
||||
`define P_cliphigh 0.95
|
||||
`define IDSATR_cliplow 0
|
||||
`define CSRH_cliplow 0
|
||||
`define XJUN_cliplow 1E-9
|
||||
`define CTAT_cliplow 0
|
||||
`define MEFFTAT_cliplow 0.01
|
||||
`define CBBT_cliplow 0
|
||||
`define VBR_cliplow 0.1
|
||||
`define PBR_cliplow 0.1
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Instance parameter dependent initialization
|
||||
|
||||
`define JuncapInitInstance(AB_i, LS_i, LG_i, VMAX, vbimin, vch, vfmin, vbbtlim) \
|
||||
if (idsatbot * AB_i > 0) begin \
|
||||
vmaxbot = phitd * ln(IMAX_i / (idsatbot * AB_i) + 1); \
|
||||
end else begin \
|
||||
vmaxbot = `vmaxlarge; \
|
||||
end \
|
||||
if (idsatsti * LS_i > 0) begin \
|
||||
vmaxsti = phitd * ln(IMAX_i / (idsatsti * LS_i) + 1); \
|
||||
end else begin \
|
||||
vmaxsti = `vmaxlarge; \
|
||||
end \
|
||||
if (idsatgat * LG_i > 0) begin \
|
||||
vmaxgat = phitd * ln(IMAX_i / (idsatgat * LG_i) + 1); \
|
||||
end else begin \
|
||||
vmaxgat = `vmaxlarge; \
|
||||
end \
|
||||
VMAX = min(min(vmaxbot, vmaxsti), vmaxgat); \
|
||||
\
|
||||
/* determination of minimum value of the relevant built-in voltages */ \
|
||||
vbibot2 = vbibot; \
|
||||
vbisti2 = vbisti; \
|
||||
vbigat2 = vbigat; \
|
||||
if (AB_i == 0) begin vbibot2 = vbisti + vbigat; end \
|
||||
if (LS_i == 0) begin vbisti2 = vbibot + vbigat; end \
|
||||
if (LG_i == 0) begin vbigat2 = vbibot + vbisti; end \
|
||||
vbimin = min(min(vbibot2, vbisti2), vbigat2); \
|
||||
vch = vbimin * `epsch; \
|
||||
if (vbimin == vbibot) begin vfmin = vbibot * (1 - (pow(`a, (-1.0 / PBOT_i)))); end \
|
||||
if (vbimin == vbisti) begin vfmin = vbisti * (1 - (pow(`a, (-1.0 / PSTI_i)))); end \
|
||||
if (vbimin == vbigat) begin vfmin = vbigat * (1 - (pow(`a, (-1.0 / PGAT_i)))); end \
|
||||
\
|
||||
/* determination of limiting value of conditioned voltage for BBT calculation */ \
|
||||
vbibot2r = VBIRBOT_i; \
|
||||
vbisti2r = VBIRSTI_i; \
|
||||
vbigat2r = VBIRGAT_i; \
|
||||
if (AB_i == 0) begin vbibot2r = VBIRSTI_i + VBIRGAT_i; end \
|
||||
if (LS_i == 0) begin vbisti2r = VBIRBOT_i + VBIRGAT_i; end \
|
||||
if (LG_i == 0) begin vbigat2r = VBIRBOT_i + VBIRSTI_i; end \
|
||||
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) begin \
|
||||
result = 1 / (x); \
|
||||
end else begin \
|
||||
result = pow(x, power); \
|
||||
end
|
||||
|
||||
`define mypower3(x,power,result) \
|
||||
if (power == 4) begin \
|
||||
result = (x) * (x) * (x) * (x); \
|
||||
end else begin \
|
||||
result = pow(x, power); \
|
||||
end
|
||||
|
||||
|
||||
// Smoothing functions
|
||||
|
||||
`define hypfunction2(x,x0,eps,hyp2) \
|
||||
hyp2 = 0.5 * ((x) + (x0) - sqrt(((x) - (x0)) * ((x) - (x0)) + 4 * (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) begin \
|
||||
terfc = 1 / (1 + perfc * y); \
|
||||
end else begin \
|
||||
terfc = 1 / (1 - perfc * y); \
|
||||
end \
|
||||
`expl_low(-ysq + m, tmp) \
|
||||
erfcpos = (`aerfc * terfc + berfc * (terfc * terfc) + cerfc * (terfc * terfc * terfc)) * tmp; \
|
||||
if (y > 0) begin \
|
||||
result = erfcpos; \
|
||||
end else begin\
|
||||
`expl_low(m, tmp) \
|
||||
result = 2 * tmp - erfcpos; \
|
||||
end
|
||||
|
||||
|
||||
// This is the main function of the JUNCAP2-model. It returns the current and charge
|
||||
// for a single diode
|
||||
|
||||
`define juncapfunction(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 - vj * vbiinv), one_minus_P, tmp) \
|
||||
Qjprime = qpref * (1 - tmp) + qpref2 * (VAK - vj); \
|
||||
id = idsat * idmult; \
|
||||
if ((CSRH == 0) && (CTAT == 0)) begin \
|
||||
isrh = 0; \
|
||||
end else begin \
|
||||
vbi_minus_vjsrh = vbi-vjsrh; \
|
||||
wsrhstep = 1 - sqrt(1 - two_psistar / vbi_minus_vjsrh); \
|
||||
if (P == 0.5) begin \
|
||||
dwsrh = 0; \
|
||||
end else begin \
|
||||
dwsrh = ((wsrhstep * wsrhstep * ln(wsrhstep) / (1 - wsrhstep)) + wsrhstep) * (1 - 2 * P); \
|
||||
end \
|
||||
wsrh = wsrhstep + dwsrh; \
|
||||
`mypower(vbi_minus_vjsrh * VBIRinv, P, tmp) \
|
||||
wdep = wdepnulr * tmp; \
|
||||
asrh = ftd * ((zinv - 1) * wdep); \
|
||||
isrh = CSRH * (asrh * wsrh); \
|
||||
end \
|
||||
if (CTAT == 0) begin \
|
||||
itat = 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)); \
|
||||
sqrtumax = sqrt(abs(umax)); \
|
||||
umaxpoweronepointfive = umax * sqrtumax; \
|
||||
`mypower2((1 + btat * umaxpoweronepointfive), (-P * one_over_one_minus_P), wgamma) \
|
||||
wtat = wsrh * wgamma / (wsrh + wgamma); \
|
||||
ktat = sqrt(0.375 * (btat / sqrtumax)); \
|
||||
ltat = 2 * (twoatatoverthreebtat * sqrtumax) - umax; \
|
||||
mtat = atat * twoatatoverthreebtat * sqrtumax - atat * umax + 0.5 * (btat * umaxpoweronepointfive); \
|
||||
xerfc = (ltat - 1) * ktat; \
|
||||
`calcerfcexpmtat(xerfc, mtat, erfctimesexpmtat) \
|
||||
gammamax = `SQRTPI * 0.5 * (atat * erfctimesexpmtat / ktat); \
|
||||
itat = CTAT * (asrh * gammamax * wtat); \
|
||||
end \
|
||||
if (CBBT == 0) begin \
|
||||
ibbt = 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; \
|
||||
end else begin \
|
||||
if (vav > -`alphaav * VBR) begin \
|
||||
`mypower3(abs(vav * VBRinv), PBR, tmp) \
|
||||
fbreakdown = 1 / (1 - tmp); \
|
||||
end else begin \
|
||||
fbreakdown = fstop + (vav + `alphaav * VBR) * slope; \
|
||||
end \
|
||||
end \
|
||||
Ijprime = (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(AB_i,LS_i,LG_i,ijunbot,qjunbot,ijunsti,qjunsti,ijungat,qjungat) \
|
||||
vbbt = 0.0; \
|
||||
two_psistar = 0.0; \
|
||||
if ( !( ((AB_i) == 0) && ((LS_i) == 0) && ((LG_i) == 0) ) ) begin \
|
||||
`hypfunction5(VAK, vfmin, vch, vj) \
|
||||
if (VAK < VMAX) begin \
|
||||
`expl(0.5 * (VAK * phitdinv), zinv) \
|
||||
idmult = zinv * zinv; \
|
||||
end else begin \
|
||||
`expl(VMAX * phitdinv, exp_VMAX_over_phitd) \
|
||||
idmult = (1 + (VAK - VMAX) * phitdinv) * exp_VMAX_over_phitd; \
|
||||
zinv = sqrt(idmult); \
|
||||
end \
|
||||
idmult = idmult - 1.0; \
|
||||
z = 1 / zinv; \
|
||||
if (VAK > 0) begin \
|
||||
two_psistar = 2.0 * (phitd * ln(2.0 + z + sqrt((z + 1.0) * (z + 3.0)))); \
|
||||
end else begin \
|
||||
two_psistar = -VAK + 2.0 * (phitd * ln(2 * zinv + 1 + sqrt((1 + zinv) * (1 + 3 * zinv)))); \
|
||||
end \
|
||||
vjlim = vbimin - two_psistar; \
|
||||
`hypfunction2(VAK, vjlim, phitd, vjsrh) \
|
||||
`hypfunction2(VAK, vbbtlim, phitr, vbbt) \
|
||||
`hypfunction2(VAK, 0, `epsav, vav) \
|
||||
end \
|
||||
if ((AB_i) == 0) begin \
|
||||
ijunbot = 0; \
|
||||
qjunbot = 0; \
|
||||
end else begin \
|
||||
`juncapfunction(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) begin \
|
||||
ijunsti = 0; \
|
||||
qjunsti = 0; \
|
||||
end else begin \
|
||||
`juncapfunction(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) begin \
|
||||
ijungat = 0; \
|
||||
qjungat = 0; \
|
||||
end else begin \
|
||||
`juncapfunction(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
|
||||
|
|
@ -1,65 +0,0 @@
|
|||
//======================================================================================
|
||||
//======================================================================================
|
||||
// Filename: JUNCAP200_parlist.include
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
|
||||
//
|
||||
//
|
||||
// Version: 102.1 (PSP), 200.2 (JUNCAP), April 2007 (Simkit 2.5)
|
||||
//
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// Further information can be found in the file readme.txt
|
||||
//
|
||||
|
||||
//////////////////////////////////////////
|
||||
//
|
||||
// JUNCAP2 - Reduced parameterlist
|
||||
//
|
||||
//////////////////////////////////////////
|
||||
|
||||
parameter real IMAX = 1000 `from(`IMAX_cliplow ,inf ) `P(desc="Maximum current up to which forward current behaves exponentially" unit="A" );
|
||||
parameter real CJORBOT = 1E-3 `from(`CJORBOT_cliplow ,inf ) `P(desc="Zero-bias capacitance per unit-of-area of bottom component" unit="Fm^-2" );
|
||||
parameter real CJORSTI = 1E-9 `from(`CJORSTI_cliplow ,inf ) `P(desc="Zero-bias capacitance per unit-of-length of STI-edge component" unit="Fm^-1" );
|
||||
parameter real CJORGAT = 1E-9 `from(`CJORGAT_cliplow ,inf ) `P(desc="Zero-bias capacitance per unit-of-length of gate-edge component" unit="Fm^-1" );
|
||||
parameter real VBIRBOT = 1 `from(`VBIR_cliplow ,inf ) `P(desc="Built-in voltage at the reference temperature of bottom component" unit="V" );
|
||||
parameter real VBIRSTI = 1 `from(`VBIR_cliplow ,inf ) `P(desc="Built-in voltage at the reference temperature of STI-edge component" unit="V" );
|
||||
parameter real VBIRGAT = 1 `from(`VBIR_cliplow ,inf ) `P(desc="Built-in voltage at the reference temperature of gate-edge component" unit="V" );
|
||||
parameter real PBOT = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(desc="Grading coefficient of bottom component" unit="" );
|
||||
parameter real PSTI = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(desc="Grading coefficient of STI-edge component" unit="" );
|
||||
parameter real PGAT = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(desc="Grading coefficient of gate-edge component" unit="" );
|
||||
parameter real PHIGBOT = 1.16 `P(desc="Zero-temperature bandgap voltage of bottom component" unit="V" );
|
||||
parameter real PHIGSTI = 1.16 `P(desc="Zero-temperature bandgap voltage of STI-edge component" unit="V" );
|
||||
parameter real PHIGGAT = 1.16 `P(desc="Zero-temperature bandgap voltage of gate-edge component" unit="V" );
|
||||
parameter real IDSATRBOT = 1E-12 `from(`IDSATR_cliplow ,inf ) `P(desc="Saturation current density at the reference temperature of bottom component" unit="Am^-2" );
|
||||
parameter real IDSATRSTI = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(desc="Saturation current density at the reference temperature of STI-edge component" unit="Am^-1" );
|
||||
parameter real IDSATRGAT = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(desc="Saturation current density at the reference temperature of gate-edge component" unit="Am^-1" );
|
||||
parameter real CSRHBOT = 1E2 `from(`CSRH_cliplow ,inf ) `P(desc="Shockley-Read-Hall prefactor of bottom component" unit="Am^-3" );
|
||||
parameter real CSRHSTI = 1E-4 `from(`CSRH_cliplow ,inf ) `P(desc="Shockley-Read-Hall prefactor of STI-edge component" unit="Am^-2" );
|
||||
parameter real CSRHGAT = 1E-4 `from(`CSRH_cliplow ,inf ) `P(desc="Shockley-Read-Hall prefactor of gate-edge component" unit="Am^-2" );
|
||||
parameter real XJUNSTI = 100E-9 `from(`XJUN_cliplow ,inf ) `P(desc="Junction depth of STI-edge component" unit="m" );
|
||||
parameter real XJUNGAT = 100E-9 `from(`XJUN_cliplow ,inf ) `P(desc="Junction depth of gate-edge component" unit="m" );
|
||||
parameter real CTATBOT = 1E2 `from(`CTAT_cliplow ,inf ) `P(desc="Trap-assisted tunneling prefactor of bottom component" unit="Am^-3" );
|
||||
parameter real CTATSTI = 1E-4 `from(`CTAT_cliplow ,inf ) `P(desc="Trap-assisted tunneling prefactor of STI-edge component" unit="Am^-2" );
|
||||
parameter real CTATGAT = 1E-4 `from(`CTAT_cliplow ,inf ) `P(desc="Trap-assisted tunneling prefactor of gate-edge component" unit="Am^-2" );
|
||||
parameter real MEFFTATBOT = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(desc="Effective mass (in units of m0) for trap-assisted tunneling of bottom component" unit="" );
|
||||
parameter real MEFFTATSTI = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(desc="Effective mass (in units of m0) for trap-assisted tunneling of STI-edge component" unit="" );
|
||||
parameter real MEFFTATGAT = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(desc="Effective mass (in units of m0) for trap-assisted tunneling of gate-edge component" unit="" );
|
||||
parameter real CBBTBOT = 1E-12 `from(`CBBT_cliplow ,inf ) `P(desc="Band-to-band tunneling prefactor of bottom component" unit="AV^-3" );
|
||||
parameter real CBBTSTI = 1E-18 `from(`CBBT_cliplow ,inf ) `P(desc="Band-to-band tunneling prefactor of STI-edge component" unit="AV^-3m" );
|
||||
parameter real CBBTGAT = 1E-18 `from(`CBBT_cliplow ,inf ) `P(desc="Band-to-band tunneling prefactor of gate-edge component" unit="AV^-3m" );
|
||||
parameter real FBBTRBOT = 1E9 `P(desc="Normalization field at the reference temperature for band-to-band tunneling of bottom component" unit="Vm^-1" );
|
||||
parameter real FBBTRSTI = 1E9 `P(desc="Normalization field at the reference temperature for band-to-band tunneling of STI-edge component" unit="Vm^-1" );
|
||||
parameter real FBBTRGAT = 1E9 `P(desc="Normalization field at the reference temperature for band-to-band tunneling of gate-edge component" unit="Vm^-1" );
|
||||
parameter real STFBBTBOT = -1E-3 `P(desc="Temperature scaling parameter for band-to-band tunneling of bottom component" unit="K^-1" );
|
||||
parameter real STFBBTSTI = -1E-3 `P(desc="Temperature scaling parameter for band-to-band tunneling of STI-edge component" unit="K^-1" );
|
||||
parameter real STFBBTGAT = -1E-3 `P(desc="Temperature scaling parameter for band-to-band tunneling of gate-edge component" unit="K^-1" );
|
||||
parameter real VBRBOT = 10 `from(`VBR_cliplow ,inf ) `P(desc="Breakdown voltage of bottom component" unit="V" );
|
||||
parameter real VBRSTI = 10 `from(`VBR_cliplow ,inf ) `P(desc="Breakdown voltage of STI-edge component" unit="V" );
|
||||
parameter real VBRGAT = 10 `from(`VBR_cliplow ,inf ) `P(desc="Breakdown voltage of gate-edge component" unit="V" );
|
||||
parameter real PBRBOT = 4 `from(`PBR_cliplow ,inf ) `P(desc="Breakdown onset tuning parameter of bottom component" unit="V" );
|
||||
parameter real PBRSTI = 4 `from(`PBR_cliplow ,inf ) `P(desc="Breakdown onset tuning parameter of STI-edge component" unit="V" );
|
||||
parameter real PBRGAT = 4 `from(`PBR_cliplow ,inf ) `P(desc="Breakdown onset tuning parameter of gate-edge component" unit="V" );
|
||||
|
|
@ -1,67 +0,0 @@
|
|||
//======================================================================================
|
||||
//======================================================================================
|
||||
// Filename: JUNCAP200_varlist.include
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
|
||||
//
|
||||
//
|
||||
// Version: 102.1 (PSP), 200.2 (JUNCAP), April 2007 (Simkit 2.5)
|
||||
//
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// Further information can be found in the file readme.txt
|
||||
//
|
||||
|
||||
|
||||
// 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 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;
|
||||
|
||||
// declaration of clipped parameters
|
||||
real TRJ_i, IMAX_i;
|
||||
real CJORBOT_i, CJORSTI_i, CJORGAT_i, VBIRBOT_i, VBIRSTI_i, VBIRGAT_i;
|
||||
real PBOT_i, PSTI_i, PGAT_i;
|
||||
real IDSATRBOT_i, IDSATRSTI_i, IDSATRGAT_i, XJUNSTI_i, XJUNGAT_i;
|
||||
real CSRHBOT_i, CSRHSTI_i, CSRHGAT_i, CTATBOT_i, CTATSTI_i, CTATGAT_i;
|
||||
real MEFFTATBOT_i, MEFFTATSTI_i, MEFFTATGAT_i;
|
||||
real CBBTBOT_i, CBBTSTI_i, CBBTGAT_i;
|
||||
real VBRBOT_i, VBRSTI_i, VBRGAT_i, PBRBOT_i, PBRSTI_i, PBRGAT_i;
|
||||
|
||||
// declaration of variables calculated outside macro "juncapfunction", voltage-independent part
|
||||
real tkr, tkd, auxt, KBOL_over_QELE, phitr, phitrinv, phitd, phitdinv;
|
||||
real deltaphigr, phigrbot, phigrsti, phigrgat, deltaphigd, phigdbot, phigdsti, phigdgat;
|
||||
real ftdbot, ftdsti, ftdgat, idsatbot, idsatsti, idsatgat, exp_VMAX_over_phitd;
|
||||
real ubibot, ubisti, ubigat, vbibot, vbisti, vbigat;
|
||||
real vbibot2, vbisti2, vbigat2, 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, qprefbot, qprefsti, qprefgat;
|
||||
real vbimin, vch, vfmin, vbbtlim;
|
||||
real qpref2bot, qpref2sti, qpref2gat;
|
||||
real wdepnulrbot, wdepnulrsti, wdepnulrgat, wdepnulrinvbot, wdepnulrinvsti, wdepnulrinvgat;
|
||||
real VBIRBOTinv, VBIRSTIinv, VBIRGATinv;
|
||||
real perfc, berfc, cerfc;
|
||||
real deltaEbot, deltaEsti, deltaEgat, atatbot, atatsti, atatgat;
|
||||
real btatpartbot, btatpartsti, btatpartgat;
|
||||
real fbbtbot, fbbtsti, fbbtgat;
|
||||
real fstopbot, fstopsti, fstopgat, VBRinvbot, VBRinvsti, VBRinvgat;
|
||||
real slopebot, slopesti, slopegat;
|
||||
real vmaxbot, vmaxsti, vmaxgat, VMAX;
|
||||
|
||||
// declaration of variables calculated outside macro "juncapfunction", voltage-dependent part
|
||||
real VAK, idmult, vj, z, zinv, two_psistar, vjlim, vjsrh, vbbt, vav;
|
||||
|
||||
|
|
@ -1,303 +0,0 @@
|
|||
//======================================================================================
|
||||
//======================================================================================
|
||||
// Filename: PSP102_ChargesNQS.include
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
|
||||
//
|
||||
//
|
||||
// Version: 102.1, April 2007 (Simkit 2.5)
|
||||
//
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// Further information can be found in the file readme.txt
|
||||
//
|
||||
|
||||
|
||||
///////////////////////////////////////////////
|
||||
//
|
||||
// Calculate NQS-charge contributions
|
||||
//
|
||||
///////////////////////////////////////////////
|
||||
|
||||
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);
|
||||
thesat2 = thesat1 * thesat1 * 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 * Qp6) / 37829.0 - 900.0 / 181.0 * Qp5;
|
||||
end else begin
|
||||
dQy = 0;
|
||||
d2Qy = 0;
|
||||
end
|
||||
`fq(Qp1, xg, dQy, d2Qy, fk1)
|
||||
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 * Qp0
|
||||
+ 6048 * Qp1 - 10152 * 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;
|
||||
d2Qy = 0;
|
||||
end
|
||||
`fq(Qp2, xg, 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;
|
||||
d2Qy = 0;
|
||||
end
|
||||
`fq(Qp3, xg, 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;
|
||||
d2Qy = 0;
|
||||
end
|
||||
`fq(Qp4, xg, 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;
|
||||
d2Qy = 0;
|
||||
end
|
||||
`fq(Qp5, xg, 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;
|
||||
d2Qy = 0;
|
||||
end
|
||||
`fq(Qp6, xg, 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;
|
||||
d2Qy = 0;
|
||||
end
|
||||
`fq(Qp7, xg, 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;
|
||||
d2Qy = 0;
|
||||
end
|
||||
`fq(Qp8, xg, 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;
|
||||
d2Qy = 0;
|
||||
end
|
||||
`fq(Qp9, xg, dQy, d2Qy, fk9)
|
||||
end
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
// Terminal charges for NQS
|
||||
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, temp1)
|
||||
QG_NQS = xg - (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, temp1)
|
||||
`QiToPhi(Qp2, xg, temp2)
|
||||
QG_NQS = xg - (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, temp1)
|
||||
`QiToPhi(Qp2, xg, temp2)
|
||||
`QiToPhi(Qp3, xg, temp3)
|
||||
QG_NQS = xg - (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, temp1)
|
||||
`QiToPhi(Qp2, xg, temp2)
|
||||
`QiToPhi(Qp3, xg, temp3)
|
||||
`QiToPhi(Qp4, xg, temp4)
|
||||
`QiToPhi(Qp5, xg, temp5)
|
||||
QG_NQS = xg - (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, temp1)
|
||||
`QiToPhi(Qp2, xg, temp2)
|
||||
`QiToPhi(Qp3, xg, temp3)
|
||||
`QiToPhi(Qp4, xg, temp4)
|
||||
`QiToPhi(Qp5, xg, temp5)
|
||||
`QiToPhi(Qp6, xg, temp6)
|
||||
`QiToPhi(Qp7, xg, temp7)
|
||||
`QiToPhi(Qp8, xg, temp8)
|
||||
`QiToPhi(Qp9, xg, temp9)
|
||||
QG_NQS = xg - (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) <+ idt(-vnorm_inv * Tnorm * fk1, Qp1_0);
|
||||
V(RES2) <+ vnorm_inv * I(RES2) * r_nqs;
|
||||
V(SPLINE2) <+ idt(-vnorm_inv * Tnorm * fk2, Qp2_0);
|
||||
V(RES3) <+ vnorm_inv * I(RES3) * r_nqs;
|
||||
V(SPLINE3) <+ idt(-vnorm_inv * Tnorm * fk3, Qp3_0);
|
||||
V(RES4) <+ vnorm_inv * I(RES4) * r_nqs;
|
||||
V(SPLINE4) <+ idt(-vnorm_inv * Tnorm * fk4, Qp4_0);
|
||||
V(RES5) <+ vnorm_inv * I(RES5) * r_nqs;
|
||||
V(SPLINE5) <+ idt(-vnorm_inv * Tnorm * fk5, Qp5_0);
|
||||
V(RES6) <+ vnorm_inv * I(RES6) * r_nqs;
|
||||
V(SPLINE6) <+ idt(-vnorm_inv * Tnorm * fk6, Qp6_0);
|
||||
V(RES7) <+ vnorm_inv * I(RES7) * r_nqs;
|
||||
V(SPLINE7) <+ idt(-vnorm_inv * Tnorm * fk7, Qp7_0);
|
||||
V(RES8) <+ vnorm_inv * I(RES8) * r_nqs;
|
||||
V(SPLINE8) <+ idt(-vnorm_inv * Tnorm * fk8, Qp8_0);
|
||||
V(RES9) <+ vnorm_inv * I(RES9) * r_nqs;
|
||||
V(SPLINE9) <+ idt(-vnorm_inv * Tnorm * fk9, Qp9_0);
|
||||
|
||||
|
|
@ -1,190 +0,0 @@
|
|||
//======================================================================================
|
||||
//======================================================================================
|
||||
// Filename: PSP102_InitNQS.include
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
|
||||
//
|
||||
//
|
||||
// Version: 102.1, April 2007 (Simkit 2.5)
|
||||
//
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// Further information can be found in the file readme.txt
|
||||
//
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Computing initial (dc) values for internal nodes.
|
||||
// This code is independent of internal-node voltages
|
||||
//
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
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 > 0) begin
|
||||
if (SWNQS_i == 1) begin
|
||||
phi_p1 = `Phiy(0.5);
|
||||
`PhiToQb(phi_p1,Qb_tmp)
|
||||
Qp1_0 = -pd * (xg - phi_p1) - Qb_tmp;
|
||||
end else if (SWNQS_i == 2) begin
|
||||
phi_p1 = `Phiy(`oneThird);
|
||||
`PhiToQb(phi_p1,Qb_tmp)
|
||||
Qp1_0 = -pd * (xg - phi_p1) - Qb_tmp;
|
||||
|
||||
phi_p2 = `Phiy(`twoThirds);
|
||||
`PhiToQb(phi_p2,Qb_tmp)
|
||||
Qp2_0 = -pd * (xg - 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 - phi_p1) - Qb_tmp;
|
||||
|
||||
phi_p2 = `Phiy(0.5);
|
||||
`PhiToQb(phi_p2,Qb_tmp)
|
||||
Qp2_0 = -pd * (xg - phi_p2) - Qb_tmp;
|
||||
|
||||
phi_p3 = `Phiy(0.75);
|
||||
`PhiToQb(phi_p3,Qb_tmp)
|
||||
Qp3_0 = -pd * (xg - 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 - phi_p1) - Qb_tmp;
|
||||
|
||||
phi_p2 = `Phiy(`oneThird);
|
||||
`PhiToQb(phi_p2,Qb_tmp)
|
||||
Qp2_0 = -pd * (xg - phi_p2) - Qb_tmp;
|
||||
|
||||
phi_p3 = `Phiy(0.5);
|
||||
`PhiToQb(phi_p3,Qb_tmp)
|
||||
Qp3_0 = -pd * (xg - phi_p3) - Qb_tmp;
|
||||
|
||||
phi_p4 = `Phiy(`twoThirds);
|
||||
`PhiToQb(phi_p4,Qb_tmp)
|
||||
Qp4_0 = -pd * (xg - phi_p4) - Qb_tmp;
|
||||
|
||||
phi_p5 = `Phiy(0.8333333333333333);
|
||||
`PhiToQb(phi_p5,Qb_tmp)
|
||||
Qp5_0 = -pd * (xg - phi_p5) - Qb_tmp;
|
||||
if (sigVds < 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 - phi_p1) - Qb_tmp;
|
||||
|
||||
phi_p2 = `Phiy(0.2);
|
||||
`PhiToQb(phi_p2,Qb_tmp)
|
||||
Qp2_0 = -pd * (xg - phi_p2) - Qb_tmp;
|
||||
|
||||
phi_p3 = `Phiy(0.3);
|
||||
`PhiToQb(phi_p3,Qb_tmp)
|
||||
Qp3_0 = -pd * (xg - phi_p3) - Qb_tmp;
|
||||
|
||||
phi_p4 = `Phiy(0.4);
|
||||
`PhiToQb(phi_p4,Qb_tmp)
|
||||
Qp4_0 = -pd * (xg - phi_p4) - Qb_tmp;
|
||||
|
||||
phi_p5 = `Phiy(0.5);
|
||||
`PhiToQb(phi_p5,Qb_tmp)
|
||||
Qp5_0 = -pd * (xg - phi_p5) - Qb_tmp;
|
||||
|
||||
phi_p6 = `Phiy(0.6);
|
||||
`PhiToQb(phi_p6,Qb_tmp)
|
||||
Qp6_0 = -pd * (xg - phi_p6) - Qb_tmp;
|
||||
|
||||
phi_p7 = `Phiy(0.7);
|
||||
`PhiToQb(phi_p7,Qb_tmp)
|
||||
Qp7_0 = -pd * (xg - phi_p7) - Qb_tmp;
|
||||
|
||||
phi_p8 = `Phiy(0.8);
|
||||
`PhiToQb(phi_p8,Qb_tmp)
|
||||
Qp8_0 = -pd * (xg - phi_p8) - Qb_tmp;
|
||||
|
||||
phi_p9 = `Phiy(0.9);
|
||||
`PhiToQb(phi_p9,Qb_tmp)
|
||||
Qp9_0 = -pd * (xg - phi_p9) - Qb_tmp;
|
||||
if (sigVds < 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)
|
||||
end // (SWNQS_i != 0)
|
||||
|
||||
x_sp = 0.0;
|
||||
x_dp = 0.0;
|
||||
Qp0 = 0.0;
|
||||
QpN = 0.0;
|
||||
if (SWNQS_i != 0.0) begin
|
||||
x_sp = x_m - sigVds * 0.5 * dps * inv_phit1;
|
||||
x_dp = x_m + sigVds * 0.5 * dps * inv_phit1;
|
||||
Qp0 = 0.0;
|
||||
QpN = 0.0;
|
||||
if (x_sp > 0) begin
|
||||
`PhiToQb(x_sp, QbSIGN)
|
||||
Qp0 = -pd * (xg - x_sp) - QbSIGN;
|
||||
end
|
||||
if (x_dp > 0) begin
|
||||
`PhiToQb(x_dp, QbSIGN)
|
||||
QpN = -pd * (xg - x_dp) - QbSIGN;
|
||||
end
|
||||
end
|
||||
|
|
@ -1,127 +0,0 @@
|
|||
//======================================================================================
|
||||
//======================================================================================
|
||||
// Filename: PSP102_binning.include
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
|
||||
//
|
||||
//
|
||||
// Version: 102.1, April 2007 (Simkit 2.5)
|
||||
//
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// Further information can be found in the file readme.txt
|
||||
//
|
||||
|
||||
// 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 = POVFB + iLE * PLVFB + iWE * PWVFB + iLEWE * PLWVFB;
|
||||
STVFB = POSTVFB + iLE * PLSTVFB + iWE * PWSTVFB + iLEWE * PLWSTVFB;
|
||||
TOX = POTOX;
|
||||
NEFF = PONEFF + iLE * PLNEFF + iWE * PWNEFF + iLEWE * PLWNEFF;
|
||||
VNSUB = POVNSUB;
|
||||
NSLP = PONSLP;
|
||||
DNSUB = PODNSUB;
|
||||
DPHIB = PODPHIB + iLE * PLDPHIB + iWE * PWDPHIB + iLEWE * PLWDPHIB;
|
||||
NP = PONP + iLE * PLNP + iWE * PWNP + iLEWE * PLWNP;
|
||||
CT = POCT + iLE * PLCT + iWE * PWCT + iLEWE * PLWCT;
|
||||
TOXOV = POTOXOV;
|
||||
NOV = PONOV + iLE * PLNOV + iWE * PWNOV + iLEWE * PLWNOV;
|
||||
|
||||
// DIBL parameters
|
||||
CF = POCF + iLE * PLCF + iWE * PWCF + iLEWE * PLWCF;
|
||||
CFB = POCFB;
|
||||
|
||||
// Mobility parameters
|
||||
BETN = POBETN + iLE * PLBETN + iiWE * PWBETN + iiiLEWE * PLWBETN;
|
||||
STBET = POSTBET + iLE * PLSTBET + iWE * PWSTBET + iLEWE * PLWSTBET;
|
||||
MUE = POMUE + iLE * PLMUE + iWE * PWMUE + iLEWE * PLWMUE;
|
||||
STMUE = POSTMUE;
|
||||
THEMU = POTHEMU;
|
||||
STTHEMU = POSTTHEMU;
|
||||
CS = POCS + iLE * PLCS + iWE * PWCS + iLEWE * PLWCS;
|
||||
STCS = POSTCS;
|
||||
XCOR = POXCOR + iLE * PLXCOR + iWE * PWXCOR + iLEWE * PLWXCOR;
|
||||
STXCOR = POSTXCOR;
|
||||
FETA = POFETA;
|
||||
|
||||
// Series resistance parameters
|
||||
RS = PORS + iLE * PLRS + iWE * PWRS + iLEWE * PLWRS;
|
||||
STRS = POSTRS;
|
||||
RSB = PORSB;
|
||||
RSG = PORSG;
|
||||
|
||||
// Velocity saturation parameters
|
||||
THESAT = POTHESAT + iLE * PLTHESAT + iWE * PWTHESAT + iLEWE * PLWTHESAT;
|
||||
STTHESAT = POSTTHESAT + iLE * PLSTTHESAT + iWE * PWSTTHESAT + iLEWE * PLWSTTHESAT;
|
||||
THESATB = POTHESATB + iLE * PLTHESATB + iWE * PWTHESATB + iLEWE * PLWTHESATB;
|
||||
THESATG = POTHESATG + iLE * PLTHESATG + iWE * PWTHESATG + iLEWE * PLWTHESATG;
|
||||
|
||||
// Saturation voltage parameters
|
||||
AX = POAX + iLE * PLAX + iWE * PWAX + iLEWE * PLWAX;
|
||||
|
||||
// Channel length modulation (CLM) parameters
|
||||
ALP = POALP + iLE * PLALP + iWE * PWALP + iLEWE * PLWALP;
|
||||
ALP1 = POALP1 + iLE * PLALP1 + iWE * PWALP1 + iLEWE * PLWALP1;
|
||||
ALP2 = POALP2 + iLE * PLALP2 + iWE * PWALP2 + iLEWE * PLWALP2;
|
||||
VP = POVP;
|
||||
|
||||
// Impact ionization parameters
|
||||
A1 = POA1 + iLE * PLA1 + iWE * PWA1 + iLEWE * PLWA1;
|
||||
A2 = POA2;
|
||||
STA2 = POSTA2;
|
||||
A3 = POA3 + iLE * PLA3 + iWE * PWA3 + iLEWE * PLWA3;
|
||||
A4 = POA4 + iLE * PLA4 + iWE * PWA4 + iLEWE * PLWA4;
|
||||
GCO = POGCO;
|
||||
|
||||
// Gate current parameters
|
||||
IGINV = POIGINV + iiLE * PLIGINV + iiWE * PWIGINV + iiLEWE * PLWIGINV;
|
||||
IGOV = POIGOV + iLE * PLIGOV + iiWE * PWIGOV + iiiLEWE * PLWIGOV;
|
||||
STIG = POSTIG;
|
||||
GC2 = POGC2;
|
||||
GC3 = POGC3;
|
||||
CHIB = POCHIB;
|
||||
|
||||
// Gate-induced drain leakage (GIDL) parameters
|
||||
AGIDL = POAGIDL + iLE * PLAGIDL + iiWE * PWAGIDL + iiiLEWE * PLWAGIDL;
|
||||
BGIDL = POBGIDL;
|
||||
STBGIDL = POSTBGIDL;
|
||||
CGIDL = POCGIDL;
|
||||
|
||||
// Charge model parameters
|
||||
COX = POCOX + iiLEcv * PLCOX + iiWEcv * PWCOX + iiLEWEcv * PLWCOX;
|
||||
CGOV = POCGOV + iLEcv * PLCGOV + iiWEcv * PWCGOV + iiiLEWEcv * PLWCGOV;
|
||||
CGBOV = POCGBOV + iiLcv * PLCGBOV + iiWcv * PWCGBOV + iiLWcv * PLWCGBOV;
|
||||
CFR = POCFR + iLcv * PLCFR + iiWcv * PWCFR + iiiLWcv * PLWCFR;
|
||||
|
||||
// Noise model parameters
|
||||
FNT = POFNT;
|
||||
NFA = PONFA + iLE * PLNFA + iWE * PWNFA + iLEWE * PLWNFA;
|
||||
NFB = PONFB + iLE * PLNFB + iWE * PWNFB + iLEWE * PLWNFB;
|
||||
NFC = PONFC + iLE * PLNFC + iWE * PWNFC + iLEWE * PLWNFC;
|
||||
|
|
@ -1,233 +0,0 @@
|
|||
//======================================================================================
|
||||
//======================================================================================
|
||||
// Filename: PSP102_binpars.include
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
|
||||
//
|
||||
//
|
||||
// Version: 102.1, April 2007 (Simkit 2.5)
|
||||
//
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// Further information can be found in the file readme.txt
|
||||
//
|
||||
|
||||
///////////////////////////////////////////////////
|
||||
// PSP global model parameters (binning)
|
||||
///////////////////////////////////////////////////
|
||||
|
||||
parameter real LEVEL = 1021 `P(desc="Model level" unit="" );
|
||||
parameter real TYPE = 1 `from( -1.0,1.0 ) `P(desc="Channel type parameter, +1=NMOS -1=PMOS" unit="" );
|
||||
parameter real TR = 21 `from( -273.0,inf ) `P(desc="nominal (reference) temperature" unit="C" );
|
||||
|
||||
// Switch parameters
|
||||
parameter real SWIGATE = 0 `from( 0.0,1.0 ) `P(desc="Flag for gate current, 0=turn off IG" unit="" );
|
||||
parameter real SWIMPACT = 0 `from( 0.0,1.0 ) `P(desc="Flag for impact ionization current, 0=turn off II" unit="" );
|
||||
parameter real SWGIDL = 0 `from( 0.0,1.0 ) `P(desc="Flag for GIDL current, 0=turn off IGIDL" unit="" );
|
||||
parameter real SWJUNCAP = 0 `from( 0.0,3.0 ) `P(desc="Flag for juncap, 0=turn off juncap" unit="" );
|
||||
parameter real QMC = 1 `from( 0.0,inf ) `P(desc="Quantum-mechanical correction factor" unit="" );
|
||||
|
||||
// Process parameters
|
||||
parameter real LVARO = 0 `P(desc="Geometry independent difference between actual and programmed poly-silicon gate length" unit="m" );
|
||||
parameter real LVARL = 0 `P(desc="Length dependence of difference between actual and programmed poly-silicon gate length" unit="" );
|
||||
parameter real LAP = 0 `P(desc="Effective channel length reduction per side due to lateral diffusion of source/drain dopant ions" unit="m" );
|
||||
parameter real WVARO = 0 `P(desc="Geometry independent difference between actual and programmed field-oxide opening" unit="m" );
|
||||
parameter real WVARW = 0 `P(desc="Width dependence of difference between actual and programmed field-oxide opening" unit="" );
|
||||
parameter real WOT = 0 `P(desc="Effective reduction of channel width per side due to lateral diffusion of channel-stop dopant ions" unit="m" );
|
||||
parameter real DLQ = 0 `P(desc="Effective channel length reduction for CV" unit="m" );
|
||||
parameter real DWQ = 0 `P(desc="Effective channel width reduction for CV" unit="m" );
|
||||
parameter real POVFB = -1 `P(desc="Coefficient for the geometry independent part of VFB" unit="V" );
|
||||
parameter real PLVFB = 0.0 `P(desc="Coefficient for the length dependence of VFB" unit="V" );
|
||||
parameter real PWVFB = 0.0 `P(desc="Coefficient for the width dependence of VFB" unit="V" );
|
||||
parameter real PLWVFB = 0.0 `P(desc="Coefficient for the length times width dependence of VFB" unit="V" );
|
||||
parameter real POSTVFB = 0.0005 `P(desc="Coefficient for the geometry independent part of STVFB" unit="V/K" );
|
||||
parameter real PLSTVFB = 0.0 `P(desc="Coefficient for the length dependence of STVFB" unit="V/K" );
|
||||
parameter real PWSTVFB = 0.0 `P(desc="Coefficient for the width dependence of STVFB" unit="V/K" );
|
||||
parameter real PLWSTVFB = 0.0 `P(desc="Coefficient for the length times width dependence of STVFB" unit="V/K" );
|
||||
parameter real POTOX = 2E-09 `P(desc="Coefficient for the geometry independent part of TOX" unit="m" );
|
||||
parameter real PONEFF = 5E+23 `P(desc="Coefficient for the geometry independent part of NEFF" unit="m^-3" );
|
||||
parameter real PLNEFF = 0.0 `P(desc="Coefficient for the length dependence of NEFF" unit="m^-3" );
|
||||
parameter real PWNEFF = 0.0 `P(desc="Coefficient for the width dependence of NEFF" unit="m^-3" );
|
||||
parameter real PLWNEFF = 0.0 `P(desc="Coefficient for the length times width dependence of NEFF" unit="m^-3" );
|
||||
parameter real POVNSUB = 0 `P(desc="Coefficient for the geometry independent part of VNSUB" unit="V" );
|
||||
parameter real PONSLP = 0.05 `P(desc="Coefficient for the geometry independent part of NSLP" unit="V" );
|
||||
parameter real PODNSUB = 0 `P(desc="Coefficient for the geometry independent part of DNSUB" unit="V^-1" );
|
||||
parameter real PODPHIB = 0 `P(desc="Coefficient for the geometry independent part of DPHIB" unit="V" );
|
||||
parameter real PLDPHIB = 0.0 `P(desc="Coefficient for the length dependence of DPHIB" unit="V" );
|
||||
parameter real PWDPHIB = 0.0 `P(desc="Coefficient for the width dependence of DPHIB" unit="V" );
|
||||
parameter real PLWDPHIB = 0.0 `P(desc="Coefficient for the length times width dependence of DPHIB" unit="V" );
|
||||
parameter real PONP = 1E+26 `P(desc="Coefficient for the geometry independent part of NP" unit="m^-3" );
|
||||
parameter real PLNP = 0.0 `P(desc="Coefficient for the length dependence of NP" unit="m^-3" );
|
||||
parameter real PWNP = 0.0 `P(desc="Coefficient for the width dependence of NP" unit="m^-3" );
|
||||
parameter real PLWNP = 0.0 `P(desc="Coefficient for the length times width dependence of NP" unit="m^-3" );
|
||||
parameter real POCT = 0 `P(desc="Coefficient for the geometry independent part of CT" unit="" );
|
||||
parameter real PLCT = 0.0 `P(desc="Coefficient for the length dependence of CT" unit="" );
|
||||
parameter real PWCT = 0.0 `P(desc="Coefficient for the width dependence of CT" unit="" );
|
||||
parameter real PLWCT = 0.0 `P(desc="Coefficient for the length times width dependence of CT" unit="" );
|
||||
parameter real POTOXOV = 2E-09 `P(desc="Coefficient for the geometry independent part of TOXOV" unit="m" );
|
||||
parameter real PONOV = 5E+25 `P(desc="Coefficient for the geometry independent part of NOV" unit="m^-3" );
|
||||
parameter real PLNOV = 0.0 `P(desc="Coefficient for the length dependence of NOV" unit="m^-3" );
|
||||
parameter real PWNOV = 0.0 `P(desc="Coefficient for the width dependence of NOV" unit="m^-3" );
|
||||
parameter real PLWNOV = 0.0 `P(desc="Coefficient for the length times width dependence of NOV" unit="m^-3" );
|
||||
|
||||
// DIBL parameters
|
||||
parameter real POCF = 0 `P(desc="Coefficient for the geometry independent part of CF" unit="V^-1" );
|
||||
parameter real PLCF = 0.0 `P(desc="Coefficient for the length dependence of CF" unit="V^-1" );
|
||||
parameter real PWCF = 0.0 `P(desc="Coefficient for the width dependence of CF" unit="V^-1" );
|
||||
parameter real PLWCF = 0.0 `P(desc="Coefficient for the length times width dependence of CF" unit="V^-1" );
|
||||
parameter real POCFB = 0 `P(desc="Coefficient for the geometry independent part of CFB" unit="V^-1" );
|
||||
|
||||
// Mobility parameters
|
||||
parameter real POBETN = 0.07 `P(desc="Coefficient for the geometry independent part of BETN" unit="m^2/V/s" );
|
||||
parameter real PLBETN = 0.0 `P(desc="Coefficient for the length dependence of BETN" unit="m^2/V/s" );
|
||||
parameter real PWBETN = 0.0 `P(desc="Coefficient for the width dependence of BETN" unit="m^2/V/s" );
|
||||
parameter real PLWBETN = 0.0 `P(desc="Coefficient for the length times width dependence of BETN" unit="m^2/V/s" );
|
||||
parameter real POSTBET = 1 `P(desc="Coefficient for the geometry independent part of STBET" unit="" );
|
||||
parameter real PLSTBET = 0.0 `P(desc="Coefficient for the length dependence of STBET" unit="" );
|
||||
parameter real PWSTBET = 0.0 `P(desc="Coefficient for the width dependence of STBET" unit="" );
|
||||
parameter real PLWSTBET = 0.0 `P(desc="Coefficient for the length times width dependence of STBET" unit="" );
|
||||
parameter real POMUE = 0.5 `P(desc="Coefficient for the geometry independent part of MUE" unit="m/V" );
|
||||
parameter real PLMUE = 0.0 `P(desc="Coefficient for the length dependence of MUE" unit="m/V" );
|
||||
parameter real PWMUE = 0.0 `P(desc="Coefficient for the width dependence of MUE" unit="m/V" );
|
||||
parameter real PLWMUE = 0.0 `P(desc="Coefficient for the length times width dependence of MUE" unit="m/V" );
|
||||
parameter real POSTMUE = 0 `P(desc="Coefficient for the geometry independent part of STMUE" unit="" );
|
||||
parameter real POTHEMU = 1.5 `P(desc="Coefficient for the geometry independent part of THEMU" unit="" );
|
||||
parameter real POSTTHEMU = 1.5 `P(desc="Coefficient for the geometry independent part of STTHEMU" unit="" );
|
||||
parameter real POCS = 0 `P(desc="Coefficient for the geometry independent part of CS" unit="" );
|
||||
parameter real PLCS = 0.0 `P(desc="Coefficient for the length dependence of CS" unit="" );
|
||||
parameter real PWCS = 0.0 `P(desc="Coefficient for the width dependence of CS" unit="" );
|
||||
parameter real PLWCS = 0.0 `P(desc="Coefficient for the length times width dependence of CS" unit="" );
|
||||
parameter real POSTCS = 0 `P(desc="Coefficient for the geometry independent part of STCS" unit="" );
|
||||
parameter real POXCOR = 0 `P(desc="Coefficient for the geometry independent part of XCOR" unit="V^-1" );
|
||||
parameter real PLXCOR = 0.0 `P(desc="Coefficient for the length dependence of XCOR" unit="V^-1" );
|
||||
parameter real PWXCOR = 0.0 `P(desc="Coefficient for the width dependence of XCOR" unit="V^-1" );
|
||||
parameter real PLWXCOR = 0.0 `P(desc="Coefficient for the length times width dependence of XCOR" unit="V^-1" );
|
||||
parameter real POSTXCOR = 0 `P(desc="Coefficient for the geometry independent part of STXCOR" unit="" );
|
||||
parameter real POFETA = 1 `P(desc="Coefficient for the geometry independent part of FETA" unit="" );
|
||||
|
||||
// Series resistance parameters
|
||||
parameter real PORS = 30 `P(desc="Coefficient for the geometry independent part of RS" unit="Ohm" );
|
||||
parameter real PLRS = 0.0 `P(desc="Coefficient for the length dependence of RS" unit="Ohm" );
|
||||
parameter real PWRS = 0.0 `P(desc="Coefficient for the width dependence of RS" unit="Ohm" );
|
||||
parameter real PLWRS = 0.0 `P(desc="Coefficient for the length times width dependence of RS" unit="Ohm" );
|
||||
parameter real POSTRS = 1 `P(desc="Coefficient for the geometry independent part of STRS" unit="" );
|
||||
parameter real PORSB = 0 `P(desc="Coefficient for the geometry independent part of RSB" unit="V^-1" );
|
||||
parameter real PORSG = 0 `P(desc="Coefficient for the geometry independent part of RSG" unit="V^-1" );
|
||||
|
||||
// Velocity saturation parameters
|
||||
parameter real POTHESAT = 1 `P(desc="Coefficient for the geometry independent part of THESAT" unit="V^-1" );
|
||||
parameter real PLTHESAT = 0.0 `P(desc="Coefficient for the length dependence of THESAT" unit="V^-1" );
|
||||
parameter real PWTHESAT = 0.0 `P(desc="Coefficient for the width dependence of THESAT" unit="V^-1" );
|
||||
parameter real PLWTHESAT = 0.0 `P(desc="Coefficient for the length times width dependence of THESAT" unit="V^-1" );
|
||||
parameter real POSTTHESAT = 1 `P(desc="Coefficient for the geometry independent part of STTHESAT" unit="" );
|
||||
parameter real PLSTTHESAT = 0.0 `P(desc="Coefficient for the length dependence of STTHESAT" unit="" );
|
||||
parameter real PWSTTHESAT = 0.0 `P(desc="Coefficient for the width dependence of STTHESAT" unit="" );
|
||||
parameter real PLWSTTHESAT = 0.0 `P(desc="Coefficient for the length times width dependence of STTHESAT" unit="" );
|
||||
parameter real POTHESATB = 0 `P(desc="Coefficient for the geometry independent part of THESATB" unit="V^-1" );
|
||||
parameter real PLTHESATB = 0.0 `P(desc="Coefficient for the length dependence of THESATB" unit="V^-1" );
|
||||
parameter real PWTHESATB = 0.0 `P(desc="Coefficient for the width dependence of THESATB" unit="V^-1" );
|
||||
parameter real PLWTHESATB = 0.0 `P(desc="Coefficient for the length times width dependence of THESATB" unit="V^-1" );
|
||||
parameter real POTHESATG = 0 `P(desc="Coefficient for the geometry independent part of THESATG" unit="V^-1" );
|
||||
parameter real PLTHESATG = 0.0 `P(desc="Coefficient for the length dependence of THESATG" unit="V^-1" );
|
||||
parameter real PWTHESATG = 0.0 `P(desc="Coefficient for the width dependence of THESATG" unit="V^-1" );
|
||||
parameter real PLWTHESATG = 0.0 `P(desc="Coefficient for the length times width dependence of THESATG" unit="V^-1" );
|
||||
|
||||
// Saturation voltage parameters
|
||||
parameter real POAX = 3 `P(desc="Coefficient for the geometry independent part of AX" unit="" );
|
||||
parameter real PLAX = 0.0 `P(desc="Coefficient for the length dependence of AX" unit="" );
|
||||
parameter real PWAX = 0.0 `P(desc="Coefficient for the width dependence of AX" unit="" );
|
||||
parameter real PLWAX = 0.0 `P(desc="Coefficient for the length times width dependence of AX" unit="" );
|
||||
|
||||
// Channel length modulation (CLM) parameters
|
||||
parameter real POALP = 0.01 `P(desc="Coefficient for the geometry independent part of ALP" unit="" );
|
||||
parameter real PLALP = 0.0 `P(desc="Coefficient for the length dependence of ALP" unit="" );
|
||||
parameter real PWALP = 0.0 `P(desc="Coefficient for the width dependence of ALP" unit="" );
|
||||
parameter real PLWALP = 0.0 `P(desc="Coefficient for the length times width dependence of ALP" unit="" );
|
||||
parameter real POALP1 = 0 `P(desc="Coefficient for the geometry independent part of ALP1" unit="V" );
|
||||
parameter real PLALP1 = 0.0 `P(desc="Coefficient for the length dependence of ALP1" unit="V" );
|
||||
parameter real PWALP1 = 0.0 `P(desc="Coefficient for the width dependence of ALP1" unit="V" );
|
||||
parameter real PLWALP1 = 0.0 `P(desc="Coefficient for the length times width dependence of ALP1" unit="V" );
|
||||
parameter real POALP2 = 0 `P(desc="Coefficient for the geometry independent part of ALP2" unit="V^-1" );
|
||||
parameter real PLALP2 = 0.0 `P(desc="Coefficient for the length dependence of ALP2" unit="V^-1" );
|
||||
parameter real PWALP2 = 0.0 `P(desc="Coefficient for the width dependence of ALP2" unit="V^-1" );
|
||||
parameter real PLWALP2 = 0.0 `P(desc="Coefficient for the length times width dependence of ALP2" unit="V^-1" );
|
||||
parameter real POVP = 0.05 `P(desc="Coefficient for the geometry independent part of VP" unit="V" );
|
||||
|
||||
// Impact ionization parameters
|
||||
parameter real POA1 = 1 `P(desc="Coefficient for the geometry independent part of A1" unit="" );
|
||||
parameter real PLA1 = 0.0 `P(desc="Coefficient for the length dependence of A1" unit="" );
|
||||
parameter real PWA1 = 0.0 `P(desc="Coefficient for the width dependence of A1" unit="" );
|
||||
parameter real PLWA1 = 0.0 `P(desc="Coefficient for the length times width dependence of A1" unit="" );
|
||||
parameter real POA2 = 10 `P(desc="Coefficient for the geometry independent part of A2" unit="V" );
|
||||
parameter real POSTA2 = 0 `P(desc="Coefficient for the geometry independent part of STA2" unit="V" );
|
||||
parameter real POA3 = 1 `P(desc="Coefficient for the geometry independent part of A3" unit="" );
|
||||
parameter real PLA3 = 0.0 `P(desc="Coefficient for the length dependence of A3" unit="" );
|
||||
parameter real PWA3 = 0.0 `P(desc="Coefficient for the width dependence of A3" unit="" );
|
||||
parameter real PLWA3 = 0.0 `P(desc="Coefficient for the length times width dependence of A3" unit="" );
|
||||
parameter real POA4 = 0 `P(desc="Coefficient for the geometry independent part of A4" unit="V^-0.5" );
|
||||
parameter real PLA4 = 0.0 `P(desc="Coefficient for the length dependence of A4" unit="V^-0.5" );
|
||||
parameter real PWA4 = 0.0 `P(desc="Coefficient for the width dependence of A4" unit="V^-0.5" );
|
||||
parameter real PLWA4 = 0.0 `P(desc="Coefficient for the length times width dependence of A4" unit="V^-0.5" );
|
||||
parameter real POGCO = 0 `P(desc="Coefficient for the geometry independent part of GCO" unit="" );
|
||||
|
||||
// Gate current parameters
|
||||
parameter real POIGINV = 0 `P(desc="Coefficient for the geometry independent part of IGINV" unit="A" );
|
||||
parameter real PLIGINV = 0.0 `P(desc="Coefficient for the length dependence of IGINV" unit="A" );
|
||||
parameter real PWIGINV = 0.0 `P(desc="Coefficient for the width dependence of IGINV" unit="A" );
|
||||
parameter real PLWIGINV = 0.0 `P(desc="Coefficient for the length times width dependence of IGINV" unit="A" );
|
||||
parameter real POIGOV = 0 `P(desc="Coefficient for the geometry independent part of IGOV" unit="A" );
|
||||
parameter real PLIGOV = 0.0 `P(desc="Coefficient for the length dependence of IGOV" unit="A" );
|
||||
parameter real PWIGOV = 0.0 `P(desc="Coefficient for the width dependence of IGOV" unit="A" );
|
||||
parameter real PLWIGOV = 0.0 `P(desc="Coefficient for the length times width dependence of IGOV" unit="A" );
|
||||
parameter real POSTIG = 2 `P(desc="Coefficient for the geometry independent part of STIG" unit="" );
|
||||
parameter real POGC2 = 0.375 `P(desc="Coefficient for the geometry independent part of GC2" unit="" );
|
||||
parameter real POGC3 = 0.063 `P(desc="Coefficient for the geometry independent part of GC3" unit="" );
|
||||
parameter real POCHIB = 3.1 `P(desc="Coefficient for the geometry independent part of CHIB" unit="V" );
|
||||
|
||||
// Gate-induced drain leakage (GIDL) parameters
|
||||
parameter real POAGIDL = 0 `P(desc="Coefficient for the geometry independent part of AGIDL" unit="A/V^3" );
|
||||
parameter real PLAGIDL = 0.0 `P(desc="Coefficient for the length dependence of AGIDL" unit="A/V^3" );
|
||||
parameter real PWAGIDL = 0.0 `P(desc="Coefficient for the width dependence of AGIDL" unit="A/V^3" );
|
||||
parameter real PLWAGIDL = 0.0 `P(desc="Coefficient for the length times width dependence of AGIDL" unit="A/V^3" );
|
||||
parameter real POBGIDL = 41 `P(desc="Coefficient for the geometry independent part of BGIDL" unit="V" );
|
||||
parameter real POSTBGIDL = 0 `P(desc="Coefficient for the geometry independent part of STBGIDL" unit="V/K" );
|
||||
parameter real POCGIDL = 0 `P(desc="Coefficient for the geometry independent part of CGIDL" unit="" );
|
||||
|
||||
// Charge model parameters
|
||||
parameter real POCOX = 1E-14 `P(desc="Coefficient for the geometry independent part of COX" unit="F" );
|
||||
parameter real PLCOX = 0.0 `P(desc="Coefficient for the length dependence of COX" unit="F" );
|
||||
parameter real PWCOX = 0.0 `P(desc="Coefficient for the width dependence of COX" unit="F" );
|
||||
parameter real PLWCOX = 0.0 `P(desc="Coefficient for the length times width dependence of COX" unit="F" );
|
||||
parameter real POCGOV = 1E-15 `P(desc="Coefficient for the geometry independent part of CGOV" unit="F" );
|
||||
parameter real PLCGOV = 0.0 `P(desc="Coefficient for the length dependence of CGOV" unit="F" );
|
||||
parameter real PWCGOV = 0.0 `P(desc="Coefficient for the width dependence of CGOV" unit="F" );
|
||||
parameter real PLWCGOV = 0.0 `P(desc="Coefficient for the length times width dependence of CGOV" unit="F" );
|
||||
parameter real POCGBOV = 0 `P(desc="Coefficient for the geometry independent part of CGBOV" unit="F" );
|
||||
parameter real PLCGBOV = 0.0 `P(desc="Coefficient for the length dependence of CGBOV" unit="F" );
|
||||
parameter real PWCGBOV = 0.0 `P(desc="Coefficient for the width dependence of CGBOV" unit="F" );
|
||||
parameter real PLWCGBOV = 0.0 `P(desc="Coefficient for the length times width dependence of CGBOV" unit="F" );
|
||||
parameter real POCFR = 0 `P(desc="Coefficient for the geometry independent part of CFR" unit="F" );
|
||||
parameter real PLCFR = 0.0 `P(desc="Coefficient for the length dependence of CFR" unit="F" );
|
||||
parameter real PWCFR = 0.0 `P(desc="Coefficient for the width dependence of CFR" unit="F" );
|
||||
parameter real PLWCFR = 0.0 `P(desc="Coefficient for the length times width dependence of CFR" unit="F" );
|
||||
|
||||
// Noise model parameters
|
||||
parameter real POFNT = 1 `P(desc="Coefficient for the geometry independent part of FNT" unit="" );
|
||||
parameter real PONFA = 8E+22 `P(desc="Coefficient for the geometry independent part of NFA" unit="V^-1/m^4" );
|
||||
parameter real PLNFA = 0.0 `P(desc="Coefficient for the length dependence of NFA" unit="V^-1/m^4" );
|
||||
parameter real PWNFA = 0.0 `P(desc="Coefficient for the width dependence of NFA" unit="V^-1/m^4" );
|
||||
parameter real PLWNFA = 0.0 `P(desc="Coefficient for the length times width dependence of NFA" unit="V^-1/m^4" );
|
||||
parameter real PONFB = 3E+07 `P(desc="Coefficient for the geometry independent part of NFB" unit="V^-1/m^2" );
|
||||
parameter real PLNFB = 0.0 `P(desc="Coefficient for the length dependence of NFB" unit="V^-1/m^2" );
|
||||
parameter real PWNFB = 0.0 `P(desc="Coefficient for the width dependence of NFB" unit="V^-1/m^2" );
|
||||
parameter real PLWNFB = 0.0 `P(desc="Coefficient for the length times width dependence of NFB" unit="V^-1/m^2" );
|
||||
parameter real PONFC = 0 `P(desc="Coefficient for the geometry independent part of NFC" unit="V^-1" );
|
||||
parameter real PLNFC = 0.0 `P(desc="Coefficient for the length dependence of NFC" unit="V^-1" );
|
||||
parameter real PWNFC = 0.0 `P(desc="Coefficient for the width dependence of NFC" unit="V^-1" );
|
||||
parameter real PLWNFC = 0.0 `P(desc="Coefficient for the length times width dependence of NFC" unit="V^-1" );
|
||||
|
||||
// Other parameters
|
||||
parameter real DTA = 0 `P(desc="Temperature offset w.r.t. ambient temperature" unit="K" );
|
||||
|
|
@ -1,250 +0,0 @@
|
|||
//======================================================================================
|
||||
//======================================================================================
|
||||
// Filename: PSP102_macrodefs.include
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
|
||||
//
|
||||
//
|
||||
// Version: 102.1, April 2007 (Simkit 2.5)
|
||||
//
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// Further information can be found in the file readme.txt
|
||||
//
|
||||
|
||||
|
||||
/////////////////////////////////////////////
|
||||
//
|
||||
// Macros and constants used in PSP
|
||||
//
|
||||
/////////////////////////////////////////////
|
||||
|
||||
// Explicit Gmin
|
||||
`define GMIN 1E-15
|
||||
|
||||
`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)))
|
||||
|
||||
// Physical constants
|
||||
`define EPSOX 3.453E-11
|
||||
`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 exp80 5.5406223843935098e+34
|
||||
`define exp160 3.0698496406442424e+69
|
||||
|
||||
`ifdef NQSmodel
|
||||
`define Gint GP
|
||||
`define Bint BP
|
||||
`define Bjs BS
|
||||
`define Bjd BD
|
||||
`else // NQSmodel
|
||||
`define Gint G
|
||||
`define Bint B
|
||||
`define Bjs B
|
||||
`define Bjd B
|
||||
`endif // NQSModel
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
// sigma function used in surface potential and other calculations
|
||||
// (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); \
|
||||
mu = nu * nu / (tau) + 0.5 * ((c) * (c)) - (a); \
|
||||
y = (eta) + (a) * nu / (mu + (nu / mu) * (c) * ((c) * (c) * `oneThird - (a)));
|
||||
|
||||
|
||||
// modified version of sigma, which takes 4 arguments
|
||||
`define sigma2(a,b,c,tau,eta,y) \
|
||||
nu = (a) + (c); \
|
||||
if (abs(tau) < 1e-120) begin /*sometimes tau is extremely small...*/\
|
||||
y = (eta); \
|
||||
end else begin \
|
||||
mu = (nu) * (nu) / (tau) + 0.5 * ((c) * (c)) - (a) * (b); \
|
||||
y = (eta) + (a) * nu / (mu + (nu / mu) * (c) * ((c) * (c) * `oneThird - (a) * (b))); \
|
||||
end
|
||||
|
||||
//
|
||||
// sp_s 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 / (x1 + Gf * 7.324648775608221e-001); \
|
||||
SP_S_A_fac= (xi * x1 * 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 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; \
|
||||
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_ov surface potential calculation for the overlap regions
|
||||
//
|
||||
`define sp_ov(sp,xg) \
|
||||
if (abs(xg) <= x_mrg_ov) begin \
|
||||
sp = (-(xg) * inv_xi_ov); \
|
||||
end else begin \
|
||||
if (xg < -x_mrg_ov) begin \
|
||||
SP_OV_yg = -xg; \
|
||||
SP_OV_z = x1 * SP_OV_yg * inv_xi_ov; \
|
||||
SP_OV_eta = 0.5 * (SP_OV_z + 10.0 - sqrt((SP_OV_z - 6.0) * (SP_OV_z - 6.0) + 64.0)); \
|
||||
SP_OV_a = (SP_OV_yg - SP_OV_eta) * (SP_OV_yg - SP_OV_eta) + GOV2 * (SP_OV_eta + 1.0); \
|
||||
SP_OV_c = 2.0 * (SP_OV_yg - SP_OV_eta) - GOV2; \
|
||||
SP_OV_tau = ln(SP_OV_a / GOV2) - SP_OV_eta; \
|
||||
`sigma(SP_OV_a, SP_OV_c, SP_OV_tau, SP_OV_eta, SP_OV_y0) \
|
||||
SP_OV_D0 = exp(SP_OV_y0); \
|
||||
SP_OV_temp = SP_OV_yg - SP_OV_y0; \
|
||||
SP_OV_p = 2.0 * SP_OV_temp + GOV2 * (SP_OV_D0 - 1.0); \
|
||||
SP_OV_q = SP_OV_temp * SP_OV_temp + GOV2 * (SP_OV_y0 + 1.0 - SP_OV_D0); \
|
||||
SP_OV_xi = 1.0 - GOV2 * 0.5 * SP_OV_D0; \
|
||||
SP_OV_temp = SP_OV_p * SP_OV_p - 4.0 * (SP_OV_xi * SP_OV_q); \
|
||||
SP_OV_w = 2.0 * (SP_OV_q / (SP_OV_p + sqrt(SP_OV_temp))); \
|
||||
sp = -(SP_OV_y0 + SP_OV_w); \
|
||||
end else begin \
|
||||
SP_OV_Afac = (xi_ov * x1 * inv_xg1 - 1.0) * inv_xg1; \
|
||||
SP_OV_xbar = xg * inv_xi_ov * (1.0 + SP_OV_Afac * xg); \
|
||||
`expl_low(-SP_OV_xbar, SP_OV_temp) \
|
||||
SP_OV_w = 1.0 - SP_OV_temp; \
|
||||
SP_OV_x0 = xg + GOV2 * 0.5 - GOV * sqrt(xg + GOV2 * 0.25 - SP_OV_w); \
|
||||
`expl_low(-SP_OV_x0, SP_OV_D0) \
|
||||
SP_OV_p = 2.0 * (xg - SP_OV_x0) + GOV2 * (1 - SP_OV_D0); \
|
||||
SP_OV_q = (xg - SP_OV_x0) * (xg - SP_OV_x0) - GOV2 * (SP_OV_x0 - 1.0 + SP_OV_D0); \
|
||||
SP_OV_xi = 1.0 - GOV2 * 0.5 * SP_OV_D0; \
|
||||
SP_OV_temp = SP_OV_p * SP_OV_p - 4.0 * (SP_OV_xi * SP_OV_q); \
|
||||
SP_OV_u = 2.0 * (SP_OV_q / (SP_OV_p + sqrt(SP_OV_temp))); \
|
||||
sp = SP_OV_x0 + SP_OV_u; \
|
||||
end \
|
||||
sp = -sp; \
|
||||
end
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,117 +0,0 @@
|
|||
//======================================================================================
|
||||
//======================================================================================
|
||||
// Filename: PSP102_nqs_macrodefs.include
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
|
||||
//
|
||||
//
|
||||
// Version: 102.1, April 2007 (Simkit 2.5)
|
||||
//
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// Further information can be found in the file readme.txt
|
||||
//
|
||||
|
||||
//////////////////////////////////////////
|
||||
//
|
||||
// Macros used in PSP-NQS
|
||||
//
|
||||
//////////////////////////////////////////
|
||||
|
||||
// Function to calculate bulk charge from surface potential
|
||||
`define PhiToQb(phi,Qb_tmp) \
|
||||
if (abs(phi) <= margin) \
|
||||
Qb_tmp = -0.70710678 * phi * Gf * (1.0 - `oneSixth * phi * (1.0 - `oneSixth * phi)); \
|
||||
else begin \
|
||||
`expl((-phi), temp) \
|
||||
Qb_tmp = Gf * sqrt(temp + phi - 1.0); \
|
||||
if (phi > margin) \
|
||||
Qb_tmp = -Qb_tmp; \
|
||||
end
|
||||
|
||||
|
||||
// Function used in fq-macro
|
||||
`define PhiTod2Qis(xphi,d2Qis) \
|
||||
if (abs(xphi) <= margin) begin \
|
||||
Qb_tmp = -0.70710678 * xphi * Gf * (1.0 - `oneSixth * xphi * (1.0 - `oneSixth * xphi)); \
|
||||
dQbs = -0.70710678 * Gf * (1.0 - `oneThird * xphi * (1.0 - 0.25 * xphi)); \
|
||||
d2Qis = -0.235702 * Gf * (1.0 - 0.5 * xphi); \
|
||||
end else begin \
|
||||
`expl((-xphi),temp) \
|
||||
Qb_tmp = Gf * sqrt(temp + xphi - 1.0); \
|
||||
if (xphi > margin) \
|
||||
Qb_tmp = -Qb_tmp; \
|
||||
dQbs = 0.5 * Gf2 * (1.0 - temp) / Qb_tmp; \
|
||||
d2Qis = (dQbs * dQbs - 0.5 * Gf * Gf) / 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 = thesat2 * dpsy2; \
|
||||
if (CHNL_TYPE == `PMOS) \
|
||||
zsat = zsat / (1.0 + thesat1 * dps); \
|
||||
temp = sqrt(1.0 + 2.0 * zsat); \
|
||||
Fvsat = 2.0 / (1.0 + temp); \
|
||||
temp1 = d2Qy - dpsy2 * d2Qis; \
|
||||
fk = Fvsat * (fk0 - zsat * fQi * temp1 * Fvsat / temp);
|
||||
|
||||
|
||||
// Interpolation of surface potential along channel
|
||||
`define Phiy(y) \
|
||||
x_m + H * (1.0 - sqrt(1.0 - 2.0 * dps / H * ((y) - ym))) * inv_phit1
|
||||
|
|
@ -1,122 +0,0 @@
|
|||
//======================================================================================
|
||||
//======================================================================================
|
||||
// Filename: SIMKIT_macrodefs.include
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
|
||||
//
|
||||
//
|
||||
// Version: 102.1, April 2007 (Simkit 2.5)
|
||||
//
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// Further information can be found in the file readme.txt
|
||||
//
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
//
|
||||
// General macros and constants for compact va-models
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
`define VERS "0.0"
|
||||
`define VREV "0.0"
|
||||
`define VERSreal 0.0
|
||||
`define VREVreal 0.0
|
||||
|
||||
`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))
|
||||
|
||||
// Note 1: In this va-code, the `P-macro is defined such that its argument
|
||||
// is ignored during compilation; in this source code it acts as
|
||||
// a comment
|
||||
// Note 2: In this va-code, the "from" keyword in the parameter
|
||||
// list is not used. Silent clipping is used instead. One could enable
|
||||
// the Verilog-A range checking by redefining the `from-macro below.
|
||||
// `define P(txt)
|
||||
`define P(txt) (*txt*)
|
||||
`define AT_MODEL
|
||||
`define AT_INSTANCE
|
||||
`define AT_NOISE
|
||||
`define from(lower,upper)
|
||||
// `define from(lower,upper) from[lower:upper]
|
||||
|
||||
// Some 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 EPSSI 1.045E-10
|
||||
|
||||
// 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
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Macro definitions.
|
||||
//
|
||||
// Note that because variables in macros are not locally scoped,
|
||||
// the intermediate variables used in the macros below must be
|
||||
// explicitly declared in the main code.
|
||||
//
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
// 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), to avoid overflows
|
||||
// and underflows and retain C-3 continuity
|
||||
`define expl(x, res) \
|
||||
if (abs(x) < `se05) begin\
|
||||
res = exp(x); \
|
||||
end else begin \
|
||||
if ((x) < -`se05) 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
|
||||
|
||||
`define swap(a, b) \
|
||||
temp = a; \
|
||||
a = b; \
|
||||
b = temp;
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
//======================================================================================
|
||||
//======================================================================================
|
||||
// Filename: psp102.va
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
|
||||
//
|
||||
//
|
||||
// Version: 102.1, April 2007 (Simkit 2.5)
|
||||
//
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// Further information can be found in the file readme.txt
|
||||
//
|
||||
|
||||
`include "discipline.h"
|
||||
|
||||
`include "SIMKIT_macrodefs.include"
|
||||
|
||||
`include "JUNCAP200_macrodefs.include"
|
||||
|
||||
`include "PSP102_macrodefs.include"
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PSP global model code
|
||||
//
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// `undef LocalModel
|
||||
// `define Binning
|
||||
|
||||
module PSP102VA(D, G, S, B)
|
||||
|
||||
`P(
|
||||
desc = "PSP MOSFET Model"
|
||||
version = `VERS
|
||||
revision = `VREV
|
||||
simkit:name = "psp1020"
|
||||
simkit:desc = "psp_1020"
|
||||
);
|
||||
|
||||
`include "PSP102_module.include"
|
||||
|
||||
endmodule
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
ngspice customizations of package psp102.1
|
||||
------------------------------------------
|
||||
|
||||
- Mon Apr 30 15:28:25 WEDT 2007 (Berlin)
|
||||
o renamed 'initializeModel/initializeInstance' to 'initial_model/initial_instance'.
|
||||
(this issue should go away when auto-partionning done in adms.)
|
||||
o redefined macro P(txt) in order to 'see' instance parameters
|
||||
o status: psp code created by adms compiles
|
||||
|
|
@ -1,120 +0,0 @@
|
|||
======================================================================================
|
||||
======================================================================================
|
||||
|
||||
---------------------------
|
||||
Verilog-A definition of PSP
|
||||
---------------------------
|
||||
|
||||
|
||||
(c) Copyright 2007, All Rights Reserved, NXP Semiconductors
|
||||
|
||||
|
||||
Version: PSP 102.1 (including JUNCAP2 200.2), April 2007 (Simkit 2.5)
|
||||
|
||||
======================================================================================
|
||||
======================================================================================
|
||||
|
||||
Authors: G.D.J. Smit, A.J. Scholten, and D.B.M. Klaassen (NXP Semiconductors Research)
|
||||
R. van Langevelde (Philips Research)
|
||||
G. Gildenblat, X. Li, and W. Wu (The Arizona State University)
|
||||
|
||||
|
||||
|
||||
The most recent version of the model code, the documentation, and contact information
|
||||
can be found on:
|
||||
|
||||
http://PSPmodel.asu.edu/
|
||||
or
|
||||
http://www.nxp.com/Philips_Models/
|
||||
|
||||
======================================================================================
|
||||
======================================================================================
|
||||
|
||||
This package consists of several files:
|
||||
|
||||
- readme.txt This file
|
||||
|
||||
- psp102.va Main file for global ("geometrical") model
|
||||
- psp102b.va Main file for global binning model
|
||||
- psp102e.va Main file for local ("electrical") model
|
||||
- psp102_nqs.va Main file for global ("geometrical") model with NQS-effects
|
||||
- psp102b_nqs.va Main file for global binning model with NQS-effects
|
||||
- psp102e_nqs.va Main file for local ("electrical") model with NQS-effects
|
||||
- juncap200.va Main file for JUNCAP2 stand-alone model
|
||||
|
||||
- SIMKIT_macrodefs.include Common macro definitions
|
||||
- PSP102_macrodefs.include Macro definitions for PSP
|
||||
- PSP102_module.include Actual model code for intrinsic MOS model
|
||||
- PSP102_binning.include Geometry scaling equation for binning
|
||||
- PSP102_binpars.include Parameterlist for global PSP binning model
|
||||
- PSP102_nqs_macrodefs.include Macro definitions for PSP-NQS
|
||||
- PSP102_InitNQS.include PSP-NQS initialization code
|
||||
- PSP102_ChargesNQS.include Calculation of NQS-charge contributions
|
||||
- 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 seven .va-files
|
||||
(psp102.va, psp102b.va, psp102e.va, psp102_nqs.va, psp102b_nqs.va, psp102e_nqs.va, and
|
||||
juncap200.va). The module names are "PSP102VA" and "PSPNQS102VA" for the global PSP-model
|
||||
(QS and NQS, respectively), and similarly "PSP102BVA" and "PSPNQS102BVA" for the binning
|
||||
PSP-model, "PSP102EVA" and "PSPNQS102EVA" for the local PSP-model, and "JUNCAP200" for
|
||||
the JUNCAP2-model.
|
||||
|
||||
|
||||
======================================================================================
|
||||
======================================================================================
|
||||
|
||||
Release notes va-code of PSP 102.1, including JUNCAP2 200.2 (April 2007)
|
||||
------------------------------------------------------------------------
|
||||
|
||||
Focus in this release has been on improving the simulation speed of PSP and JUNCAP2.
|
||||
The model equations in this release of PSP 102.1 are identical to those in the
|
||||
October 2006 release. This version features some minor impelementation changes
|
||||
w.r.t. the previous release.
|
||||
|
||||
The main changes have been in the SiMKit version generated from this verilog-A
|
||||
implementation: improvements in the automatic C-code generation process
|
||||
and compilation of the C-code. The result is reflected in the SiMKit 2.5 version of
|
||||
PSP, which shows a very significant simulation speed improvement w.r.t SiMKit 2.4.
|
||||
|
||||
The minor implementation changes in the verilog-A code will have some positive effect
|
||||
on the simulation speed of the verilog-A version as well. Note, however, that the
|
||||
simulation speed of the verilog-A version of PSP and the improvement w.r.t. the
|
||||
previous version strongly depend on the verilog-A compiler used.
|
||||
|
||||
PSP 102.1 is backwards compatible with the previous version, PSP 102.0.
|
||||
|
||||
|
||||
======================================================================================
|
||||
======================================================================================
|
||||
|
||||
The functionality of the Verilog-A code in this package is the same as that of the
|
||||
C-code, which is contained in SIMKIT version 2.5. Note that Operating Point information
|
||||
is available only in the C-code, not in Verilog-A code.
|
||||
|
||||
|
||||
The PSP-NQS model is provided as Verilog-A code. In SiMKit 2.5, a test version of
|
||||
the PSP-NQS model is included (identical to that in SiMKit 2.4). This implementation
|
||||
circumvents the problem of the SpectreVerilog-A-generated C-code being too large to
|
||||
compile. Moreover, it is computationally more efficient as it uses less rows in the
|
||||
simulator matrix. On the other hand, this implementation has some known limitations.
|
||||
More information is available from the authors. Further improvements are expected in
|
||||
future releases.
|
||||
|
||||
|
||||
This Verilog-A code of PSP is primarily intended as a source for C-code generation
|
||||
using ADMS. Most of the testing has been done on the C-code which was generated from it.
|
||||
|
||||
|
||||
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 useful comments on the Verilog-A
|
||||
code.
|
||||
Loading…
Reference in New Issue