psp model 102 initial import
This commit is contained in:
parent
2b2d2efce0
commit
c9d9b2f337
|
|
@ -0,0 +1,184 @@
|
|||
//======================================================================================
|
||||
//======================================================================================
|
||||
// Filename: JUNCAP200_InitModel.include
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
|
||||
//
|
||||
//
|
||||
// Version: 102.1 (PSP), 200.2 (JUNCAP), October 2006 (Simkit 2.4)
|
||||
//
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// 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;
|
||||
|
|
@ -0,0 +1,285 @@
|
|||
//======================================================================================
|
||||
//======================================================================================
|
||||
// Filename: JUNCAP200_macrodefs.include
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
|
||||
//
|
||||
//
|
||||
// Version: 102.1 (PSP), 200.2 (JUNCAP), October 2006 (Simkit 2.4)
|
||||
//
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// 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 = atat * erfctimesexpmtat * `SQRTPI / (2 * ktat); \
|
||||
itat = CTAT * asrh * gammamax * wtat; \
|
||||
end \
|
||||
if (CBBT == 0) begin \
|
||||
ibbt = 0; \
|
||||
end else begin \
|
||||
`mypower(((VBIR - vbbt) * VBIRinv), P, tmp) \
|
||||
Fmaxr = (VBIR - vbbt) * one_over_one_minus_P * 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
|
||||
|
|
@ -0,0 +1,65 @@
|
|||
//======================================================================================
|
||||
//======================================================================================
|
||||
// Filename: JUNCAP200_parlist.include
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
|
||||
//
|
||||
//
|
||||
// Version: 102.1 (PSP), 200.2 (JUNCAP), October 2006 (Simkit 2.4)
|
||||
//
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// Further information can be found in the file readme.txt
|
||||
//
|
||||
|
||||
//////////////////////////////////////////
|
||||
//
|
||||
// JUNCAP2 - Reduced parameterlist
|
||||
//
|
||||
//////////////////////////////////////////
|
||||
|
||||
parameter real IMAX = 1000 `from(`IMAX_cliplow ,inf ) `P(info="Maximum current up to which forward current behaves exponentially" unit="A" );
|
||||
parameter real CJORBOT = 1E-3 `from(`CJORBOT_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-area of bottom component" unit="Fm^-2" );
|
||||
parameter real CJORSTI = 1E-9 `from(`CJORSTI_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-length of STI-edge component" unit="Fm^-1" );
|
||||
parameter real CJORGAT = 1E-9 `from(`CJORGAT_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-length of gate-edge component" unit="Fm^-1" );
|
||||
parameter real VBIRBOT = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of bottom component" unit="V" );
|
||||
parameter real VBIRSTI = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of STI-edge component" unit="V" );
|
||||
parameter real VBIRGAT = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of gate-edge component" unit="V" );
|
||||
parameter real PBOT = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of bottom component" unit="" );
|
||||
parameter real PSTI = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of STI-edge component" unit="" );
|
||||
parameter real PGAT = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of gate-edge component" unit="" );
|
||||
parameter real PHIGBOT = 1.16 `P(info="Zero-temperature bandgap voltage of bottom component" unit="V" );
|
||||
parameter real PHIGSTI = 1.16 `P(info="Zero-temperature bandgap voltage of STI-edge component" unit="V" );
|
||||
parameter real PHIGGAT = 1.16 `P(info="Zero-temperature bandgap voltage of gate-edge component" unit="V" );
|
||||
parameter real IDSATRBOT = 1E-12 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of bottom component" unit="Am^-2" );
|
||||
parameter real IDSATRSTI = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of STI-edge component" unit="Am^-1" );
|
||||
parameter real IDSATRGAT = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of gate-edge component" unit="Am^-1" );
|
||||
parameter real CSRHBOT = 1E2 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of bottom component" unit="Am^-3" );
|
||||
parameter real CSRHSTI = 1E-4 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of STI-edge component" unit="Am^-2" );
|
||||
parameter real CSRHGAT = 1E-4 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of gate-edge component" unit="Am^-2" );
|
||||
parameter real XJUNSTI = 100E-9 `from(`XJUN_cliplow ,inf ) `P(info="Junction depth of STI-edge component" unit="m" );
|
||||
parameter real XJUNGAT = 100E-9 `from(`XJUN_cliplow ,inf ) `P(info="Junction depth of gate-edge component" unit="m" );
|
||||
parameter real CTATBOT = 1E2 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of bottom component" unit="Am^-3" );
|
||||
parameter real CTATSTI = 1E-4 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of STI-edge component" unit="Am^-2" );
|
||||
parameter real CTATGAT = 1E-4 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of gate-edge component" unit="Am^-2" );
|
||||
parameter real MEFFTATBOT = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of bottom component" unit="" );
|
||||
parameter real MEFFTATSTI = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="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(info="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(info="Band-to-band tunneling prefactor of bottom component" unit="AV^-3" );
|
||||
parameter real CBBTSTI = 1E-18 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of STI-edge component" unit="AV^-3m" );
|
||||
parameter real CBBTGAT = 1E-18 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of gate-edge component" unit="AV^-3m" );
|
||||
parameter real FBBTRBOT = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of bottom component" unit="Vm^-1" );
|
||||
parameter real FBBTRSTI = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of STI-edge component" unit="Vm^-1" );
|
||||
parameter real FBBTRGAT = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of gate-edge component" unit="Vm^-1" );
|
||||
parameter real STFBBTBOT = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of bottom component" unit="K^-1" );
|
||||
parameter real STFBBTSTI = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of STI-edge component" unit="K^-1" );
|
||||
parameter real STFBBTGAT = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of gate-edge component" unit="K^-1" );
|
||||
parameter real VBRBOT = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of bottom component" unit="V" );
|
||||
parameter real VBRSTI = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of STI-edge component" unit="V" );
|
||||
parameter real VBRGAT = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of gate-edge component" unit="V" );
|
||||
parameter real PBRBOT = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of bottom component" unit="V" );
|
||||
parameter real PBRSTI = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of STI-edge component" unit="V" );
|
||||
parameter real PBRGAT = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of gate-edge component" unit="V" );
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
//======================================================================================
|
||||
//======================================================================================
|
||||
// Filename: JUNCAP200_varlist.include
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
|
||||
//
|
||||
//
|
||||
// Version: 102.1 (PSP), 200.2 (JUNCAP), October 2006 (Simkit 2.4)
|
||||
//
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// 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;
|
||||
|
||||
|
|
@ -0,0 +1,303 @@
|
|||
//======================================================================================
|
||||
//======================================================================================
|
||||
// Filename: PSP102_ChargesNQS.include
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
|
||||
//
|
||||
//
|
||||
// Version: 102.1, October 2006 (Simkit 2.4)
|
||||
//
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// 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) <+ vnorm_inv * idt(-Tnorm * fk1, Qp1_0);
|
||||
V(RES2) <+ vnorm_inv * I(RES2) * r_nqs;
|
||||
V(SPLINE2) <+ vnorm_inv * idt(-Tnorm * fk2, Qp2_0);
|
||||
V(RES3) <+ vnorm_inv * I(RES3) * r_nqs;
|
||||
V(SPLINE3) <+ vnorm_inv * idt(-Tnorm * fk3, Qp3_0);
|
||||
V(RES4) <+ vnorm_inv * I(RES4) * r_nqs;
|
||||
V(SPLINE4) <+ vnorm_inv * idt(-Tnorm * fk4, Qp4_0);
|
||||
V(RES5) <+ vnorm_inv * I(RES5) * r_nqs;
|
||||
V(SPLINE5) <+ vnorm_inv * idt(-Tnorm * fk5, Qp5_0);
|
||||
V(RES6) <+ vnorm_inv * I(RES6) * r_nqs;
|
||||
V(SPLINE6) <+ vnorm_inv * idt(-Tnorm * fk6, Qp6_0);
|
||||
V(RES7) <+ vnorm_inv * I(RES7) * r_nqs;
|
||||
V(SPLINE7) <+ vnorm_inv * idt(-Tnorm * fk7, Qp7_0);
|
||||
V(RES8) <+ vnorm_inv * I(RES8) * r_nqs;
|
||||
V(SPLINE8) <+ vnorm_inv * idt(-Tnorm * fk8, Qp8_0);
|
||||
V(RES9) <+ vnorm_inv * I(RES9) * r_nqs;
|
||||
V(SPLINE9) <+ vnorm_inv * idt(-Tnorm * fk9, Qp9_0);
|
||||
|
||||
|
|
@ -0,0 +1,190 @@
|
|||
//======================================================================================
|
||||
//======================================================================================
|
||||
// Filename: PSP102_InitNQS.include
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
|
||||
//
|
||||
//
|
||||
// Version: 102.1, October 2006 (Simkit 2.4)
|
||||
//
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// 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
|
||||
|
|
@ -0,0 +1,127 @@
|
|||
//======================================================================================
|
||||
//======================================================================================
|
||||
// Filename: PSP102_binning.include
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
|
||||
//
|
||||
//
|
||||
// Version: 102.1, October 2006 (Simkit 2.4)
|
||||
//
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// 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;
|
||||
|
|
@ -0,0 +1,233 @@
|
|||
//======================================================================================
|
||||
//======================================================================================
|
||||
// Filename: PSP102_binpars.include
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
|
||||
//
|
||||
//
|
||||
// Version: 102.1, October 2006 (Simkit 2.4)
|
||||
//
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// Further information can be found in the file readme.txt
|
||||
//
|
||||
|
||||
///////////////////////////////////////////////////
|
||||
// PSP global model parameters (binning)
|
||||
///////////////////////////////////////////////////
|
||||
|
||||
parameter real LEVEL = 1021 `P(info="Model level" unit="" );
|
||||
parameter real TYPE = 1 `from( -1.0,1.0 ) `P(info="Channel type parameter, +1=NMOS -1=PMOS" unit="" );
|
||||
parameter real TR = 21 `from( -273.0,inf ) `P(info="nominal (reference) temperature" unit="C" );
|
||||
|
||||
// Switch parameters
|
||||
parameter real SWIGATE = 0 `from( 0.0,1.0 ) `P(info="Flag for gate current, 0=turn off IG" unit="" );
|
||||
parameter real SWIMPACT = 0 `from( 0.0,1.0 ) `P(info="Flag for impact ionization current, 0=turn off II" unit="" );
|
||||
parameter real SWGIDL = 0 `from( 0.0,1.0 ) `P(info="Flag for GIDL current, 0=turn off IGIDL" unit="" );
|
||||
parameter real SWJUNCAP = 0 `from( 0.0,3.0 ) `P(info="Flag for juncap, 0=turn off juncap" unit="" );
|
||||
parameter real QMC = 1 `from( 0.0,inf ) `P(info="Quantum-mechanical correction factor" unit="" );
|
||||
|
||||
// Process parameters
|
||||
parameter real LVARO = 0 `P(info="Geometry independent difference between actual and programmed poly-silicon gate length" unit="m" );
|
||||
parameter real LVARL = 0 `P(info="Length dependence of difference between actual and programmed poly-silicon gate length" unit="" );
|
||||
parameter real LAP = 0 `P(info="Effective channel length reduction per side due to lateral diffusion of source/drain dopant ions" unit="m" );
|
||||
parameter real WVARO = 0 `P(info="Geometry independent difference between actual and programmed field-oxide opening" unit="m" );
|
||||
parameter real WVARW = 0 `P(info="Width dependence of difference between actual and programmed field-oxide opening" unit="" );
|
||||
parameter real WOT = 0 `P(info="Effective reduction of channel width per side due to lateral diffusion of channel-stop dopant ions" unit="m" );
|
||||
parameter real DLQ = 0 `P(info="Effective channel length reduction for CV" unit="m" );
|
||||
parameter real DWQ = 0 `P(info="Effective channel width reduction for CV" unit="m" );
|
||||
parameter real POVFB = -1 `P(info="Coefficient for the geometry independent part of VFB" unit="V" );
|
||||
parameter real PLVFB = 0.0 `P(info="Coefficient for the length dependence of VFB" unit="V" );
|
||||
parameter real PWVFB = 0.0 `P(info="Coefficient for the width dependence of VFB" unit="V" );
|
||||
parameter real PLWVFB = 0.0 `P(info="Coefficient for the length times width dependence of VFB" unit="V" );
|
||||
parameter real POSTVFB = 0.0005 `P(info="Coefficient for the geometry independent part of STVFB" unit="V/K" );
|
||||
parameter real PLSTVFB = 0.0 `P(info="Coefficient for the length dependence of STVFB" unit="V/K" );
|
||||
parameter real PWSTVFB = 0.0 `P(info="Coefficient for the width dependence of STVFB" unit="V/K" );
|
||||
parameter real PLWSTVFB = 0.0 `P(info="Coefficient for the length times width dependence of STVFB" unit="V/K" );
|
||||
parameter real POTOX = 2E-09 `P(info="Coefficient for the geometry independent part of TOX" unit="m" );
|
||||
parameter real PONEFF = 5E+23 `P(info="Coefficient for the geometry independent part of NEFF" unit="m^-3" );
|
||||
parameter real PLNEFF = 0.0 `P(info="Coefficient for the length dependence of NEFF" unit="m^-3" );
|
||||
parameter real PWNEFF = 0.0 `P(info="Coefficient for the width dependence of NEFF" unit="m^-3" );
|
||||
parameter real PLWNEFF = 0.0 `P(info="Coefficient for the length times width dependence of NEFF" unit="m^-3" );
|
||||
parameter real POVNSUB = 0 `P(info="Coefficient for the geometry independent part of VNSUB" unit="V" );
|
||||
parameter real PONSLP = 0.05 `P(info="Coefficient for the geometry independent part of NSLP" unit="V" );
|
||||
parameter real PODNSUB = 0 `P(info="Coefficient for the geometry independent part of DNSUB" unit="V^-1" );
|
||||
parameter real PODPHIB = 0 `P(info="Coefficient for the geometry independent part of DPHIB" unit="V" );
|
||||
parameter real PLDPHIB = 0.0 `P(info="Coefficient for the length dependence of DPHIB" unit="V" );
|
||||
parameter real PWDPHIB = 0.0 `P(info="Coefficient for the width dependence of DPHIB" unit="V" );
|
||||
parameter real PLWDPHIB = 0.0 `P(info="Coefficient for the length times width dependence of DPHIB" unit="V" );
|
||||
parameter real PONP = 1E+26 `P(info="Coefficient for the geometry independent part of NP" unit="m^-3" );
|
||||
parameter real PLNP = 0.0 `P(info="Coefficient for the length dependence of NP" unit="m^-3" );
|
||||
parameter real PWNP = 0.0 `P(info="Coefficient for the width dependence of NP" unit="m^-3" );
|
||||
parameter real PLWNP = 0.0 `P(info="Coefficient for the length times width dependence of NP" unit="m^-3" );
|
||||
parameter real POCT = 0 `P(info="Coefficient for the geometry independent part of CT" unit="" );
|
||||
parameter real PLCT = 0.0 `P(info="Coefficient for the length dependence of CT" unit="" );
|
||||
parameter real PWCT = 0.0 `P(info="Coefficient for the width dependence of CT" unit="" );
|
||||
parameter real PLWCT = 0.0 `P(info="Coefficient for the length times width dependence of CT" unit="" );
|
||||
parameter real POTOXOV = 2E-09 `P(info="Coefficient for the geometry independent part of TOXOV" unit="m" );
|
||||
parameter real PONOV = 5E+25 `P(info="Coefficient for the geometry independent part of NOV" unit="m^-3" );
|
||||
parameter real PLNOV = 0.0 `P(info="Coefficient for the length dependence of NOV" unit="m^-3" );
|
||||
parameter real PWNOV = 0.0 `P(info="Coefficient for the width dependence of NOV" unit="m^-3" );
|
||||
parameter real PLWNOV = 0.0 `P(info="Coefficient for the length times width dependence of NOV" unit="m^-3" );
|
||||
|
||||
// DIBL parameters
|
||||
parameter real POCF = 0 `P(info="Coefficient for the geometry independent part of CF" unit="V^-1" );
|
||||
parameter real PLCF = 0.0 `P(info="Coefficient for the length dependence of CF" unit="V^-1" );
|
||||
parameter real PWCF = 0.0 `P(info="Coefficient for the width dependence of CF" unit="V^-1" );
|
||||
parameter real PLWCF = 0.0 `P(info="Coefficient for the length times width dependence of CF" unit="V^-1" );
|
||||
parameter real POCFB = 0 `P(info="Coefficient for the geometry independent part of CFB" unit="V^-1" );
|
||||
|
||||
// Mobility parameters
|
||||
parameter real POBETN = 0.07 `P(info="Coefficient for the geometry independent part of BETN" unit="m^2/V/s" );
|
||||
parameter real PLBETN = 0.0 `P(info="Coefficient for the length dependence of BETN" unit="m^2/V/s" );
|
||||
parameter real PWBETN = 0.0 `P(info="Coefficient for the width dependence of BETN" unit="m^2/V/s" );
|
||||
parameter real PLWBETN = 0.0 `P(info="Coefficient for the length times width dependence of BETN" unit="m^2/V/s" );
|
||||
parameter real POSTBET = 1 `P(info="Coefficient for the geometry independent part of STBET" unit="" );
|
||||
parameter real PLSTBET = 0.0 `P(info="Coefficient for the length dependence of STBET" unit="" );
|
||||
parameter real PWSTBET = 0.0 `P(info="Coefficient for the width dependence of STBET" unit="" );
|
||||
parameter real PLWSTBET = 0.0 `P(info="Coefficient for the length times width dependence of STBET" unit="" );
|
||||
parameter real POMUE = 0.5 `P(info="Coefficient for the geometry independent part of MUE" unit="m/V" );
|
||||
parameter real PLMUE = 0.0 `P(info="Coefficient for the length dependence of MUE" unit="m/V" );
|
||||
parameter real PWMUE = 0.0 `P(info="Coefficient for the width dependence of MUE" unit="m/V" );
|
||||
parameter real PLWMUE = 0.0 `P(info="Coefficient for the length times width dependence of MUE" unit="m/V" );
|
||||
parameter real POSTMUE = 0 `P(info="Coefficient for the geometry independent part of STMUE" unit="" );
|
||||
parameter real POTHEMU = 1.5 `P(info="Coefficient for the geometry independent part of THEMU" unit="" );
|
||||
parameter real POSTTHEMU = 1.5 `P(info="Coefficient for the geometry independent part of STTHEMU" unit="" );
|
||||
parameter real POCS = 0 `P(info="Coefficient for the geometry independent part of CS" unit="" );
|
||||
parameter real PLCS = 0.0 `P(info="Coefficient for the length dependence of CS" unit="" );
|
||||
parameter real PWCS = 0.0 `P(info="Coefficient for the width dependence of CS" unit="" );
|
||||
parameter real PLWCS = 0.0 `P(info="Coefficient for the length times width dependence of CS" unit="" );
|
||||
parameter real POSTCS = 0 `P(info="Coefficient for the geometry independent part of STCS" unit="" );
|
||||
parameter real POXCOR = 0 `P(info="Coefficient for the geometry independent part of XCOR" unit="V^-1" );
|
||||
parameter real PLXCOR = 0.0 `P(info="Coefficient for the length dependence of XCOR" unit="V^-1" );
|
||||
parameter real PWXCOR = 0.0 `P(info="Coefficient for the width dependence of XCOR" unit="V^-1" );
|
||||
parameter real PLWXCOR = 0.0 `P(info="Coefficient for the length times width dependence of XCOR" unit="V^-1" );
|
||||
parameter real POSTXCOR = 0 `P(info="Coefficient for the geometry independent part of STXCOR" unit="" );
|
||||
parameter real POFETA = 1 `P(info="Coefficient for the geometry independent part of FETA" unit="" );
|
||||
|
||||
// Series resistance parameters
|
||||
parameter real PORS = 30 `P(info="Coefficient for the geometry independent part of RS" unit="Ohm" );
|
||||
parameter real PLRS = 0.0 `P(info="Coefficient for the length dependence of RS" unit="Ohm" );
|
||||
parameter real PWRS = 0.0 `P(info="Coefficient for the width dependence of RS" unit="Ohm" );
|
||||
parameter real PLWRS = 0.0 `P(info="Coefficient for the length times width dependence of RS" unit="Ohm" );
|
||||
parameter real POSTRS = 1 `P(info="Coefficient for the geometry independent part of STRS" unit="" );
|
||||
parameter real PORSB = 0 `P(info="Coefficient for the geometry independent part of RSB" unit="V^-1" );
|
||||
parameter real PORSG = 0 `P(info="Coefficient for the geometry independent part of RSG" unit="V^-1" );
|
||||
|
||||
// Velocity saturation parameters
|
||||
parameter real POTHESAT = 1 `P(info="Coefficient for the geometry independent part of THESAT" unit="V^-1" );
|
||||
parameter real PLTHESAT = 0.0 `P(info="Coefficient for the length dependence of THESAT" unit="V^-1" );
|
||||
parameter real PWTHESAT = 0.0 `P(info="Coefficient for the width dependence of THESAT" unit="V^-1" );
|
||||
parameter real PLWTHESAT = 0.0 `P(info="Coefficient for the length times width dependence of THESAT" unit="V^-1" );
|
||||
parameter real POSTTHESAT = 1 `P(info="Coefficient for the geometry independent part of STTHESAT" unit="" );
|
||||
parameter real PLSTTHESAT = 0.0 `P(info="Coefficient for the length dependence of STTHESAT" unit="" );
|
||||
parameter real PWSTTHESAT = 0.0 `P(info="Coefficient for the width dependence of STTHESAT" unit="" );
|
||||
parameter real PLWSTTHESAT = 0.0 `P(info="Coefficient for the length times width dependence of STTHESAT" unit="" );
|
||||
parameter real POTHESATB = 0 `P(info="Coefficient for the geometry independent part of THESATB" unit="V^-1" );
|
||||
parameter real PLTHESATB = 0.0 `P(info="Coefficient for the length dependence of THESATB" unit="V^-1" );
|
||||
parameter real PWTHESATB = 0.0 `P(info="Coefficient for the width dependence of THESATB" unit="V^-1" );
|
||||
parameter real PLWTHESATB = 0.0 `P(info="Coefficient for the length times width dependence of THESATB" unit="V^-1" );
|
||||
parameter real POTHESATG = 0 `P(info="Coefficient for the geometry independent part of THESATG" unit="V^-1" );
|
||||
parameter real PLTHESATG = 0.0 `P(info="Coefficient for the length dependence of THESATG" unit="V^-1" );
|
||||
parameter real PWTHESATG = 0.0 `P(info="Coefficient for the width dependence of THESATG" unit="V^-1" );
|
||||
parameter real PLWTHESATG = 0.0 `P(info="Coefficient for the length times width dependence of THESATG" unit="V^-1" );
|
||||
|
||||
// Saturation voltage parameters
|
||||
parameter real POAX = 3 `P(info="Coefficient for the geometry independent part of AX" unit="" );
|
||||
parameter real PLAX = 0.0 `P(info="Coefficient for the length dependence of AX" unit="" );
|
||||
parameter real PWAX = 0.0 `P(info="Coefficient for the width dependence of AX" unit="" );
|
||||
parameter real PLWAX = 0.0 `P(info="Coefficient for the length times width dependence of AX" unit="" );
|
||||
|
||||
// Channel length modulation (CLM) parameters
|
||||
parameter real POALP = 0.01 `P(info="Coefficient for the geometry independent part of ALP" unit="" );
|
||||
parameter real PLALP = 0.0 `P(info="Coefficient for the length dependence of ALP" unit="" );
|
||||
parameter real PWALP = 0.0 `P(info="Coefficient for the width dependence of ALP" unit="" );
|
||||
parameter real PLWALP = 0.0 `P(info="Coefficient for the length times width dependence of ALP" unit="" );
|
||||
parameter real POALP1 = 0 `P(info="Coefficient for the geometry independent part of ALP1" unit="V" );
|
||||
parameter real PLALP1 = 0.0 `P(info="Coefficient for the length dependence of ALP1" unit="V" );
|
||||
parameter real PWALP1 = 0.0 `P(info="Coefficient for the width dependence of ALP1" unit="V" );
|
||||
parameter real PLWALP1 = 0.0 `P(info="Coefficient for the length times width dependence of ALP1" unit="V" );
|
||||
parameter real POALP2 = 0 `P(info="Coefficient for the geometry independent part of ALP2" unit="V^-1" );
|
||||
parameter real PLALP2 = 0.0 `P(info="Coefficient for the length dependence of ALP2" unit="V^-1" );
|
||||
parameter real PWALP2 = 0.0 `P(info="Coefficient for the width dependence of ALP2" unit="V^-1" );
|
||||
parameter real PLWALP2 = 0.0 `P(info="Coefficient for the length times width dependence of ALP2" unit="V^-1" );
|
||||
parameter real POVP = 0.05 `P(info="Coefficient for the geometry independent part of VP" unit="V" );
|
||||
|
||||
// Impact ionization parameters
|
||||
parameter real POA1 = 1 `P(info="Coefficient for the geometry independent part of A1" unit="" );
|
||||
parameter real PLA1 = 0.0 `P(info="Coefficient for the length dependence of A1" unit="" );
|
||||
parameter real PWA1 = 0.0 `P(info="Coefficient for the width dependence of A1" unit="" );
|
||||
parameter real PLWA1 = 0.0 `P(info="Coefficient for the length times width dependence of A1" unit="" );
|
||||
parameter real POA2 = 10 `P(info="Coefficient for the geometry independent part of A2" unit="V" );
|
||||
parameter real POSTA2 = 0 `P(info="Coefficient for the geometry independent part of STA2" unit="V" );
|
||||
parameter real POA3 = 1 `P(info="Coefficient for the geometry independent part of A3" unit="" );
|
||||
parameter real PLA3 = 0.0 `P(info="Coefficient for the length dependence of A3" unit="" );
|
||||
parameter real PWA3 = 0.0 `P(info="Coefficient for the width dependence of A3" unit="" );
|
||||
parameter real PLWA3 = 0.0 `P(info="Coefficient for the length times width dependence of A3" unit="" );
|
||||
parameter real POA4 = 0 `P(info="Coefficient for the geometry independent part of A4" unit="V^-0.5" );
|
||||
parameter real PLA4 = 0.0 `P(info="Coefficient for the length dependence of A4" unit="V^-0.5" );
|
||||
parameter real PWA4 = 0.0 `P(info="Coefficient for the width dependence of A4" unit="V^-0.5" );
|
||||
parameter real PLWA4 = 0.0 `P(info="Coefficient for the length times width dependence of A4" unit="V^-0.5" );
|
||||
parameter real POGCO = 0 `P(info="Coefficient for the geometry independent part of GCO" unit="" );
|
||||
|
||||
// Gate current parameters
|
||||
parameter real POIGINV = 0 `P(info="Coefficient for the geometry independent part of IGINV" unit="A" );
|
||||
parameter real PLIGINV = 0.0 `P(info="Coefficient for the length dependence of IGINV" unit="A" );
|
||||
parameter real PWIGINV = 0.0 `P(info="Coefficient for the width dependence of IGINV" unit="A" );
|
||||
parameter real PLWIGINV = 0.0 `P(info="Coefficient for the length times width dependence of IGINV" unit="A" );
|
||||
parameter real POIGOV = 0 `P(info="Coefficient for the geometry independent part of IGOV" unit="A" );
|
||||
parameter real PLIGOV = 0.0 `P(info="Coefficient for the length dependence of IGOV" unit="A" );
|
||||
parameter real PWIGOV = 0.0 `P(info="Coefficient for the width dependence of IGOV" unit="A" );
|
||||
parameter real PLWIGOV = 0.0 `P(info="Coefficient for the length times width dependence of IGOV" unit="A" );
|
||||
parameter real POSTIG = 2 `P(info="Coefficient for the geometry independent part of STIG" unit="" );
|
||||
parameter real POGC2 = 0.375 `P(info="Coefficient for the geometry independent part of GC2" unit="" );
|
||||
parameter real POGC3 = 0.063 `P(info="Coefficient for the geometry independent part of GC3" unit="" );
|
||||
parameter real POCHIB = 3.1 `P(info="Coefficient for the geometry independent part of CHIB" unit="V" );
|
||||
|
||||
// Gate-induced drain leakage (GIDL) parameters
|
||||
parameter real POAGIDL = 0 `P(info="Coefficient for the geometry independent part of AGIDL" unit="A/V^3" );
|
||||
parameter real PLAGIDL = 0.0 `P(info="Coefficient for the length dependence of AGIDL" unit="A/V^3" );
|
||||
parameter real PWAGIDL = 0.0 `P(info="Coefficient for the width dependence of AGIDL" unit="A/V^3" );
|
||||
parameter real PLWAGIDL = 0.0 `P(info="Coefficient for the length times width dependence of AGIDL" unit="A/V^3" );
|
||||
parameter real POBGIDL = 41 `P(info="Coefficient for the geometry independent part of BGIDL" unit="V" );
|
||||
parameter real POSTBGIDL = 0 `P(info="Coefficient for the geometry independent part of STBGIDL" unit="V/K" );
|
||||
parameter real POCGIDL = 0 `P(info="Coefficient for the geometry independent part of CGIDL" unit="" );
|
||||
|
||||
// Charge model parameters
|
||||
parameter real POCOX = 1E-14 `P(info="Coefficient for the geometry independent part of COX" unit="F" );
|
||||
parameter real PLCOX = 0.0 `P(info="Coefficient for the length dependence of COX" unit="F" );
|
||||
parameter real PWCOX = 0.0 `P(info="Coefficient for the width dependence of COX" unit="F" );
|
||||
parameter real PLWCOX = 0.0 `P(info="Coefficient for the length times width dependence of COX" unit="F" );
|
||||
parameter real POCGOV = 1E-15 `P(info="Coefficient for the geometry independent part of CGOV" unit="F" );
|
||||
parameter real PLCGOV = 0.0 `P(info="Coefficient for the length dependence of CGOV" unit="F" );
|
||||
parameter real PWCGOV = 0.0 `P(info="Coefficient for the width dependence of CGOV" unit="F" );
|
||||
parameter real PLWCGOV = 0.0 `P(info="Coefficient for the length times width dependence of CGOV" unit="F" );
|
||||
parameter real POCGBOV = 0 `P(info="Coefficient for the geometry independent part of CGBOV" unit="F" );
|
||||
parameter real PLCGBOV = 0.0 `P(info="Coefficient for the length dependence of CGBOV" unit="F" );
|
||||
parameter real PWCGBOV = 0.0 `P(info="Coefficient for the width dependence of CGBOV" unit="F" );
|
||||
parameter real PLWCGBOV = 0.0 `P(info="Coefficient for the length times width dependence of CGBOV" unit="F" );
|
||||
parameter real POCFR = 0 `P(info="Coefficient for the geometry independent part of CFR" unit="F" );
|
||||
parameter real PLCFR = 0.0 `P(info="Coefficient for the length dependence of CFR" unit="F" );
|
||||
parameter real PWCFR = 0.0 `P(info="Coefficient for the width dependence of CFR" unit="F" );
|
||||
parameter real PLWCFR = 0.0 `P(info="Coefficient for the length times width dependence of CFR" unit="F" );
|
||||
|
||||
// Noise model parameters
|
||||
parameter real POFNT = 1 `P(info="Coefficient for the geometry independent part of FNT" unit="" );
|
||||
parameter real PONFA = 8E+22 `P(info="Coefficient for the geometry independent part of NFA" unit="V^-1/m^4" );
|
||||
parameter real PLNFA = 0.0 `P(info="Coefficient for the length dependence of NFA" unit="V^-1/m^4" );
|
||||
parameter real PWNFA = 0.0 `P(info="Coefficient for the width dependence of NFA" unit="V^-1/m^4" );
|
||||
parameter real PLWNFA = 0.0 `P(info="Coefficient for the length times width dependence of NFA" unit="V^-1/m^4" );
|
||||
parameter real PONFB = 3E+07 `P(info="Coefficient for the geometry independent part of NFB" unit="V^-1/m^2" );
|
||||
parameter real PLNFB = 0.0 `P(info="Coefficient for the length dependence of NFB" unit="V^-1/m^2" );
|
||||
parameter real PWNFB = 0.0 `P(info="Coefficient for the width dependence of NFB" unit="V^-1/m^2" );
|
||||
parameter real PLWNFB = 0.0 `P(info="Coefficient for the length times width dependence of NFB" unit="V^-1/m^2" );
|
||||
parameter real PONFC = 0 `P(info="Coefficient for the geometry independent part of NFC" unit="V^-1" );
|
||||
parameter real PLNFC = 0.0 `P(info="Coefficient for the length dependence of NFC" unit="V^-1" );
|
||||
parameter real PWNFC = 0.0 `P(info="Coefficient for the width dependence of NFC" unit="V^-1" );
|
||||
parameter real PLWNFC = 0.0 `P(info="Coefficient for the length times width dependence of NFC" unit="V^-1" );
|
||||
|
||||
// Other parameters
|
||||
parameter real DTA = 0 `P(info="Temperature offset w.r.t. ambient temperature" unit="K" );
|
||||
|
|
@ -0,0 +1,250 @@
|
|||
//======================================================================================
|
||||
//======================================================================================
|
||||
// Filename: PSP102_macrodefs.include
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
|
||||
//
|
||||
//
|
||||
// Version: 102.1, October 2006 (Simkit 2.4)
|
||||
//
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// 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
|
|
@ -0,0 +1,117 @@
|
|||
//======================================================================================
|
||||
//======================================================================================
|
||||
// Filename: PSP102_nqs_macrodefs.include
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
|
||||
//
|
||||
//
|
||||
// Version: 102.1, October 2006 (Simkit 2.4)
|
||||
//
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// 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
|
||||
|
|
@ -0,0 +1,121 @@
|
|||
//======================================================================================
|
||||
//======================================================================================
|
||||
// Filename: SIMKIT_macrodefs.include
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
|
||||
//
|
||||
//
|
||||
// Version: 102.1, October 2006 (Simkit 2.4)
|
||||
//
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// 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 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;
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
//======================================================================================
|
||||
//======================================================================================
|
||||
// Filename: psp102.va
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
|
||||
//
|
||||
//
|
||||
// Version: 102.1, October 2006 (Simkit 2.4)
|
||||
//
|
||||
//======================================================================================
|
||||
//======================================================================================
|
||||
//
|
||||
// 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 psp102(D, G, S, B)
|
||||
|
||||
`P(
|
||||
info = "PSP MOSFET Model"
|
||||
version = `VERS
|
||||
revision = `VREV
|
||||
simkit:name = "psp1020"
|
||||
simkit:desc = "psp_1020"
|
||||
);
|
||||
|
||||
`include "PSP102_module.include"
|
||||
|
||||
endmodule
|
||||
|
|
@ -0,0 +1,118 @@
|
|||
======================================================================================
|
||||
======================================================================================
|
||||
|
||||
---------------------------
|
||||
Verilog-A definition of PSP
|
||||
---------------------------
|
||||
|
||||
|
||||
(c) Copyright 2006, All Rights Reserved, NXP Semiconductors
|
||||
|
||||
|
||||
Version: PSP 102.1 (including JUNCAP2 200.2), October 2006 (Simkit 2.4)
|
||||
|
||||
======================================================================================
|
||||
======================================================================================
|
||||
|
||||
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 (October 2006)
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
PSP 102.1 is backwards compatible with the previous version, PSP 102.0, and
|
||||
resolves some minor implementation issues and bugs. Next to the existing
|
||||
verilog-A implementation, a test version of the NQS model is now available
|
||||
in the SiMKit.
|
||||
|
||||
- Added clipping boundaries for SWNQS.
|
||||
- Removed several "empty statements".
|
||||
- Resolved SpectreRF hidden state problem
|
||||
- Solved minor bugs in stress model
|
||||
- Solved minor bug in juncap model
|
||||
- Changed the NQS-module names in the verilog-A code
|
||||
- Made some implementation changes for optimization and maintenance purposes
|
||||
* Introduced verilog-macro for nodes G/GP, B/BP, B/BS, and B/BD
|
||||
* Make drain junction voltage equal to V(D, B) instead of V(D, S) + V(S, B)
|
||||
* Extra intermediate variables for parasitic resistor noise densities
|
||||
* Modified implementation of NQS-model
|
||||
|
||||
======================================================================================
|
||||
======================================================================================
|
||||
|
||||
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.4. 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.4, for the first time a
|
||||
test version of the PSP-NQS model is included. This implementation circumvents the
|
||||
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 his useful comments on the Verilog-A
|
||||
code.
|
||||
Loading…
Reference in New Issue