bsimcmg, adms workaround, transform hypsmooth to a .va macro
This commit is contained in:
parent
61fac01631
commit
b3fd560190
|
|
@ -41,16 +41,6 @@
|
|||
// ___Professor in Graduate School _______
|
||||
// ********************************************************
|
||||
|
||||
// Hyperbolic Smoothing Function
|
||||
analog function real hypsmooth;
|
||||
input x, c;
|
||||
real x, c;
|
||||
|
||||
begin
|
||||
hypsmooth = 0.5 * (x + sqrt(x * x + 4.0 * c * c));
|
||||
end
|
||||
endfunction
|
||||
|
||||
// Hyperbolic Smoothing max Function
|
||||
analog function real hypmax;
|
||||
input x, xmin, c;
|
||||
|
|
@ -70,7 +60,7 @@ analog function real Tempdep;
|
|||
if (TEMPMOD != 0) begin
|
||||
Tempdep = PARAML + hypmax(PARAMT * DELTEMP, -PARAML, 1.0e-6);
|
||||
end else begin
|
||||
Tempdep = PARAML * hypsmooth(1.0 + PARAMT * DELTEMP - 1.0e-6, 1.0e-3);
|
||||
Tempdep = PARAML * `hypsmooth(1.0 + PARAMT * DELTEMP - 1.0e-6, 1.0e-3);
|
||||
end
|
||||
end
|
||||
endfunction
|
||||
|
|
@ -2399,7 +2389,7 @@ analog begin
|
|||
T1 = (DevTemp / 300.15) * sqrt(DevTemp / 300.15);
|
||||
ni = NI0SUB * T1 * `lexp(BG0SUB / (2.0 * `KboQ * 300.15) - Eg / (2.0 * Vtm));
|
||||
Nc = NC0SUB * T1;
|
||||
ThetaSS = hypsmooth(1.0 + TSS_i * delTemp - 1.0e-6, 1.0e-3);
|
||||
ThetaSS = `hypsmooth(1.0 + TSS_i * delTemp - 1.0e-6, 1.0e-3);
|
||||
|
||||
// Quantum Mechanical Vth Correction (Ref: Trivedi et al., EDL 2005)
|
||||
kT = Vtm * `q;
|
||||
|
|
@ -2453,7 +2443,7 @@ analog begin
|
|||
|
||||
UCS_t = UCS_i * pow(TRatio, UCSTE_i);
|
||||
|
||||
rdstemp = hypsmooth(1.0 + PRT_i * delTemp - 1.0e-6, 1.0e-3);
|
||||
rdstemp = `hypsmooth(1.0 + PRT_i * delTemp - 1.0e-6, 1.0e-3);
|
||||
RSDR_t = Tempdep(RSDR, TRSDR, delTemp, TEMPMOD);
|
||||
if (ASYMMOD != 0) begin
|
||||
RSDRR_t = Tempdep(RSDRR, TRSDR, delTemp, TEMPMOD);
|
||||
|
|
@ -2498,9 +2488,9 @@ analog begin
|
|||
VSATCV_t = 1000;
|
||||
end
|
||||
|
||||
MEXP_t = hypsmooth(MEXP_i * (1.0 + TMEXP * delTemp) - 2.0, 1.0e-3) + 2.0;
|
||||
MEXP_t = `hypsmooth(MEXP_i * (1.0 + TMEXP * delTemp) - 2.0, 1.0e-3) + 2.0;
|
||||
if (ASYMMOD != 0) begin
|
||||
MEXPR_t = hypsmooth(MEXPR_i * (1.0 + TMEXPR * delTemp) - 2.0, 1.0e-3) + 2.0;
|
||||
MEXPR_t = `hypsmooth(MEXPR_i * (1.0 + TMEXPR * delTemp) - 2.0, 1.0e-3) + 2.0;
|
||||
end
|
||||
|
||||
PTWG_t = Tempdep(PTWG_i, -PTWGT_i, delTemp, TEMPMOD);
|
||||
|
|
@ -2510,7 +2500,7 @@ analog begin
|
|||
|
||||
dvth_temp = (KT1_i + KT1L / Leff) * (TRatio - 1.0);
|
||||
BETA0_t = BETA0_i * pow(TRatio, IIT_i);
|
||||
SII0_t = SII0_i * (hypsmooth(1.0 + TII_i * (TRatio - 1.0) - 0.01, 1.0e-3) + 0.01);
|
||||
SII0_t = SII0_i * (`hypsmooth(1.0 + TII_i * (TRatio - 1.0) - 0.01, 1.0e-3) + 0.01);
|
||||
|
||||
K0_t = K0_i + K01_i * delTemp;
|
||||
K0SI_t = K0SI_i + hypmax(K0SI1_i * delTemp, -K0SI_i, 1.0e-6);
|
||||
|
|
@ -2527,8 +2517,8 @@ analog begin
|
|||
AIGC_t = AIGC_i + hypmax(AIGC1_i * delTemp, -AIGC_i, 1.0e-6);
|
||||
AIGS_t = AIGS_i + hypmax(AIGS1_i * delTemp, -AIGS_i, 1.0e-6);
|
||||
AIGD_t = AIGD_i + hypmax(AIGD1_i * delTemp, -AIGD_i, 1.0e-6);
|
||||
BGIDL_t = BGIDL_i * hypsmooth(1.0 + TGIDL_i * delTemp - 1.0e-6, 1.0e-3);
|
||||
BGISL_t = BGISL_i * hypsmooth(1.0 + TGIDL_i * delTemp - 1.0e-6, 1.0e-3);
|
||||
BGIDL_t = BGIDL_i * `hypsmooth(1.0 + TGIDL_i * delTemp - 1.0e-6, 1.0e-3);
|
||||
BGISL_t = BGISL_i * `hypsmooth(1.0 + TGIDL_i * delTemp - 1.0e-6, 1.0e-3);
|
||||
ALPHA0_t = ALPHA0_i + hypmax(ALPHA01 * delTemp, -ALPHA0_i, 1.0e-6);
|
||||
ALPHA1_t = ALPHA1_i + hypmax(ALPHA11 * delTemp, -ALPHA1_i, 1.0e-6);
|
||||
ALPHAII0_t = ALPHAII0_i + hypmax(ALPHAII01 * delTemp, -ALPHAII0_i, 1.0e-25);
|
||||
|
|
@ -2544,12 +2534,12 @@ analog begin
|
|||
CJSWGS_t = Tempdep(CJSWGS, TCJSWG, delTemp, TEMPMOD);
|
||||
CJSWGD_t = Tempdep(CJSWGD, TCJSWG, delTemp, TEMPMOD);
|
||||
|
||||
PBS_t = hypsmooth(PBS - TPB * delTemp - 0.01, 1.0e-3) + 0.01;
|
||||
PBD_t = hypsmooth(PBD - TPB * delTemp - 0.01, 1.0e-3) + 0.01;
|
||||
PBSWS_t = hypsmooth(PBSWS - TPBSW * delTemp - 0.01, 1.0e-3) + 0.01;
|
||||
PBSWD_t = hypsmooth(PBSWD - TPBSW * delTemp - 0.01, 1.0e-3) + 0.01;
|
||||
PBSWGS_t = hypsmooth(PBSWGS - TPBSWG * delTemp - 0.01, 1.0e-3) + 0.01;
|
||||
PBSWGD_t = hypsmooth(PBSWGD - TPBSWG * delTemp - 0.01, 1.0e-3) + 0.01;
|
||||
PBS_t = `hypsmooth(PBS - TPB * delTemp - 0.01, 1.0e-3) + 0.01;
|
||||
PBD_t = `hypsmooth(PBD - TPB * delTemp - 0.01, 1.0e-3) + 0.01;
|
||||
PBSWS_t = `hypsmooth(PBSWS - TPBSW * delTemp - 0.01, 1.0e-3) + 0.01;
|
||||
PBSWD_t = `hypsmooth(PBSWD - TPBSW * delTemp - 0.01, 1.0e-3) + 0.01;
|
||||
PBSWGS_t = `hypsmooth(PBSWGS - TPBSWG * delTemp - 0.01, 1.0e-3) + 0.01;
|
||||
PBSWGD_t = `hypsmooth(PBSWGD - TPBSWG * delTemp - 0.01, 1.0e-3) + 0.01;
|
||||
|
||||
T0 = Eg0 / Vtm0 - Eg / Vtm;
|
||||
T1 = `lln(TRatio);
|
||||
|
|
@ -2571,19 +2561,19 @@ analog begin
|
|||
JTSSWGD_t = JTSSWGD * (sqrt(JTWEFF / Weff0) + 1.0) * `lexp(Eg0 * XTSSWGD * (TRatio - 1.0) / Vtm);
|
||||
|
||||
// All NJT's Smoothed to 0.01 to Prevent Divide-by-zero / Negative Values
|
||||
NJTS_t = hypsmooth(NJTS * (1.0 + TNJTS * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
|
||||
NJTSD_t = hypsmooth(NJTSD * (1.0 + TNJTSD * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
|
||||
NJTSSW_t = hypsmooth(NJTSSW * (1.0 + TNJTSSW * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
|
||||
NJTSSWD_t = hypsmooth(NJTSSWD * (1.0 + TNJTSSWD * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
|
||||
NJTSSWG_t = hypsmooth(NJTSSWG * (1.0 + TNJTSSWG * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
|
||||
NJTSSWGD_t = hypsmooth(NJTSSWGD * (1.0 + TNJTSSWGD * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
|
||||
NJTS_t = `hypsmooth(NJTS * (1.0 + TNJTS * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
|
||||
NJTSD_t = `hypsmooth(NJTSD * (1.0 + TNJTSD * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
|
||||
NJTSSW_t = `hypsmooth(NJTSSW * (1.0 + TNJTSSW * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
|
||||
NJTSSWD_t = `hypsmooth(NJTSSWD * (1.0 + TNJTSSWD * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
|
||||
NJTSSWG_t = `hypsmooth(NJTSSWG * (1.0 + TNJTSSWG * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
|
||||
NJTSSWGD_t = `hypsmooth(NJTSSWGD * (1.0 + TNJTSSWGD * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
|
||||
end
|
||||
|
||||
if (!$param_given(VFBSD)) begin
|
||||
if (NGATE > 0.0) begin
|
||||
vfbsd = devsign * (hypsmooth(0.5 * Eg - Vtm * `lln(NGATE / ni), 1.0e-4) - (0.5 * Eg - devsign * (0.5 * Eg - hypsmooth(0.5 * Eg - Vtm * `lln(NSD / ni), 1.0e-4))));
|
||||
vfbsd = devsign * (`hypsmooth(0.5 * Eg - Vtm * `lln(NGATE / ni), 1.0e-4) - (0.5 * Eg - devsign * (0.5 * Eg - `hypsmooth(0.5 * Eg - Vtm * `lln(NSD / ni), 1.0e-4))));
|
||||
end else begin
|
||||
vfbsd = devsign * (PHIG_i - (EASUB + 0.5 * Eg - devsign * (0.5 * Eg - hypsmooth(0.5 * Eg - Vtm * `lln(NSD / ni), 1.0e-4))));
|
||||
vfbsd = devsign * (PHIG_i - (EASUB + 0.5 * Eg - devsign * (0.5 * Eg - `hypsmooth(0.5 * Eg - Vtm * `lln(NSD / ni), 1.0e-4))));
|
||||
end
|
||||
end else begin
|
||||
vfbsd = VFBSD;
|
||||
|
|
@ -2642,7 +2632,7 @@ analog begin
|
|||
T0 = `lexp(VjsmFwd / Nvtms);
|
||||
IVjsmFwd = Isbs * (T0 - XExpBVS / T0 + XExpBVS - 1.0);
|
||||
SslpFwd = Isbs * (T0 + XExpBVS / T0) / Nvtms;
|
||||
T2 = hypsmooth(IJTHSREV / Isbs - 10.0, 1.0e-3) + 10.0;
|
||||
T2 = `hypsmooth(IJTHSREV / Isbs - 10.0, 1.0e-3) + 10.0;
|
||||
VjsmRev = -BVS - Nvtms * `lln((T2 - 1.0) / XJBVS);
|
||||
T1 = XJBVS * `lexp(-(BVS + VjsmRev) / Nvtms);
|
||||
IVjsmRev = Isbs * (1.0 + T1);
|
||||
|
|
@ -2660,7 +2650,7 @@ analog begin
|
|||
T0 = `lexp(VjdmFwd / Nvtmd);
|
||||
IVjdmFwd = Isbd * (T0 - XExpBVD / T0 + XExpBVD - 1.0);
|
||||
DslpFwd = Isbd * (T0 + XExpBVD / T0) / Nvtmd;
|
||||
T2 = hypsmooth(IJTHDREV / Isbd - 10.0, 1.0e-3) + 10.0;
|
||||
T2 = `hypsmooth(IJTHDREV / Isbd - 10.0, 1.0e-3) + 10.0;
|
||||
VjdmRev = -BVD - Nvtmd * `lln((T2 - 1.0) / XJBVD);
|
||||
T1 = XJBVD * `lexp(-(BVD + VjdmRev) / Nvtmd);
|
||||
IVjdmRev = Isbd * (1.0 + T1);
|
||||
|
|
@ -2807,13 +2797,13 @@ analog begin
|
|||
beta0 = u0_a * cox * Weff0 / Leff;
|
||||
T0 = -(dvch_qm + nVtm * `lln(2.0 * cox * Imin / (beta0 * nVtm * `q * Nc * TFIN)));
|
||||
T1 = vgsfb + T0 + DELVTRAND;
|
||||
vgsfbeff = hypsmooth(T1 , 1.0e-4) - T0;
|
||||
vgsfbeff = `hypsmooth(T1 , 1.0e-4) - T0;
|
||||
|
||||
// Core Model Calculation at Source Side
|
||||
vch = 0.0 + dvch_qm;
|
||||
|
||||
if (BULKMOD != 0) begin
|
||||
T1 = hypsmooth(2.0 * phib + vch - ves, 0.1);
|
||||
T1 = `hypsmooth(2.0 * phib + vch - ves, 0.1);
|
||||
T3 = (-K1_t / (2.0 * nVtm)) * (sqrt(T1) - sqrt(2.0 * phib));
|
||||
T0 = -qdep - T3 + vth_fixed_factor_Sub + QMFACTORCVfinal * pow(-qdep, 2.0/3.0);
|
||||
T1 = -qdep - T3 + vth_fixed_factor_SI;
|
||||
|
|
@ -2887,7 +2877,7 @@ analog begin
|
|||
Tc = T6 * (EsatL + 2.0 * T6 * T0);
|
||||
Vdsat = (Tb - sqrt(Tb * Tb - 2.0 * Ta * Tc)) / Ta;
|
||||
end
|
||||
Vdsat = hypsmooth(Vdsat - 1.0e-3, 1.0e-5) + 1.0e-3;
|
||||
Vdsat = `hypsmooth(Vdsat - 1.0e-3, 1.0e-5) + 1.0e-3;
|
||||
T7 = pow(vds / Vdsat , MEXP_a);
|
||||
T8 = pow(1.0 + T7, inv_MEXP);
|
||||
Vdseff = vds / T8;
|
||||
|
|
@ -2900,7 +2890,7 @@ analog begin
|
|||
vch = Vdseff + dvch_qm;
|
||||
|
||||
if (BULKMOD != 0) begin
|
||||
T1 = hypsmooth(2.0 * phib + vch - ves, 0.1);
|
||||
T1 = `hypsmooth(2.0 * phib + vch - ves, 0.1);
|
||||
T3 = (-K1_t / (2.0 * nVtm)) * (sqrt(T1) - sqrt(2.0 * phib));
|
||||
T0 = -qdep - T3 + vth_fixed_factor_Sub + QMFACTORCVfinal * pow(-qdep, 2.0 / 3.0);
|
||||
T1 = -qdep - T3 + vth_fixed_factor_SI;
|
||||
|
|
@ -3103,7 +3093,7 @@ analog begin
|
|||
|
||||
// Body-Effect Factor for BULKMOD = 2
|
||||
if (BULKMOD == 2) begin
|
||||
T0 = hypsmooth((K2_t + K2SAT_t * vdsx), 1.0e-6);
|
||||
T0 = `hypsmooth((K2_t + K2SAT_t * vdsx), 1.0e-6);
|
||||
T1 = T0 / (max(0, K2SI_t + K2SISAT_t * dqi * dqi) * qia + 2.0 * nVtm);
|
||||
T3 = sqrt(PHIBE_i - veseff) - sqrt(PHIBE_i);
|
||||
Mob = `lexp(- T1 * T3);
|
||||
|
|
@ -3212,9 +3202,9 @@ analog begin
|
|||
end else begin
|
||||
T0 = ESATII_i * Leff;
|
||||
T1 = SII0_t * T0 / (1.0 + T0);
|
||||
T0 = 1.0 / (1.0 + hypsmooth(SII1_i * vgsfbeff, IIMOD2CLAMP1)); // T0 = 1 / (1 + SII1_i * vgsfbeff)
|
||||
T0 = 1.0 / (1.0 + `hypsmooth(SII1_i * vgsfbeff, IIMOD2CLAMP1)); // T0 = 1 / (1 + SII1_i * vgsfbeff)
|
||||
T3 = T0 + SII2_i;
|
||||
T2 = hypsmooth(vgsfbeff * T3, IIMOD2CLAMP2); // T2 = vgsfbeff * T3
|
||||
T2 = `hypsmooth(vgsfbeff * T3, IIMOD2CLAMP2); // T2 = vgsfbeff * T3
|
||||
T3 = 1.0 / (1.0 + SIID_i * vds);
|
||||
VgsStep = T1 * T2 * T3;
|
||||
Vdsatii = VgsStep * (1.0 - LII_i / Leff);
|
||||
|
|
@ -3293,7 +3283,7 @@ analog begin
|
|||
T0 = vgs_noswap - vfbsd;
|
||||
vgs_eff = sqrt(T0 * T0 + 1.0e-4);
|
||||
if (IGCLAMP == 1) begin
|
||||
T1 = hypsmooth((AIGS_t - BIGS_i * vgs_eff), 1.0e-6);
|
||||
T1 = `hypsmooth((AIGS_t - BIGS_i * vgs_eff), 1.0e-6);
|
||||
if (CIGS_i < 0.01) begin
|
||||
CIGS_i = 0.01;
|
||||
end
|
||||
|
|
@ -3313,7 +3303,7 @@ analog begin
|
|||
T0 = vgd_noswap - vfbsd;
|
||||
vgd_eff = sqrt(T0 * T0 + 1.0e-4);
|
||||
if (IGCLAMP == 1) begin
|
||||
T1 = hypsmooth((AIGD_t - BIGD_i * vgd_eff), 1.0e-6);
|
||||
T1 = `hypsmooth((AIGD_t - BIGD_i * vgd_eff), 1.0e-6);
|
||||
if (CIGD_i < 0.01) begin
|
||||
CIGD_i = 0.01;
|
||||
end
|
||||
|
|
@ -3342,13 +3332,13 @@ analog begin
|
|||
T6 = 0.0;
|
||||
end else begin
|
||||
T1 = (-vgd_noswap - EGIDL_i + vfbsd) / T0;
|
||||
T1 = hypsmooth(T1, 1.0e-2);
|
||||
T1 = `hypsmooth(T1, 1.0e-2);
|
||||
T2 = BGIDL_t / (T1 + 1.0e-3);
|
||||
T3 = `lexp(PGIDL_i * `lln(T1));
|
||||
if (BULKMOD != 0) begin
|
||||
T4 = -ved_jct*ved_jct*ved_jct;
|
||||
T4a = CGIDL_i + abs(T4) + 1.0e-5;
|
||||
T5 = hypsmooth(T4/T4a, 1.0e-6) - 1.0e-6;
|
||||
T5 = `hypsmooth(T4/T4a, 1.0e-6) - 1.0e-6;
|
||||
T6 = AGIDL_i * Weff0 * T3 * `lexp(-T2) * T5;
|
||||
end else begin
|
||||
T6 = AGIDL_i * Weff0 * T3 * `lexp(-T2) * vds_noswap;
|
||||
|
|
@ -3366,13 +3356,13 @@ analog begin
|
|||
T6 = 0.0;
|
||||
end else begin
|
||||
T1 = (-vgs_noswap - EGISL_i + vfbsd) / T0;
|
||||
T1 = hypsmooth(T1, 1.0e-2);
|
||||
T1 = `hypsmooth(T1, 1.0e-2);
|
||||
T2 = BGISL_t / (T1 + 1.0e-3);
|
||||
T3 = `lexp(PGISL_i * `lln(T1));
|
||||
if (BULKMOD != 0) begin
|
||||
T4 = -ves_jct * ves_jct * ves_jct;
|
||||
T4a = CGISL_i + abs(T4) + 1.0e-5;
|
||||
T5 = hypsmooth(T4/T4a, 1.0e-6) - 1.0e-6;
|
||||
T5 = `hypsmooth(T4/T4a, 1.0e-6) - 1.0e-6;
|
||||
T6 = AGISL_i * Weff0 * T3 * `lexp(-T2) * T5;
|
||||
end else
|
||||
T6 = AGISL_i * Weff0 * T3 * `lexp(-T2) * (-vds_noswap);
|
||||
|
|
|
|||
|
|
@ -72,6 +72,10 @@
|
|||
`define lln(x) \
|
||||
ln(max((x) , `N_MINLOG))
|
||||
|
||||
// Hyperbolic Smoothing Function
|
||||
`define hypsmooth(x,c) \
|
||||
(0.5 * ((x) + sqrt((x)*(x) + 4.0*(c)*(c))))
|
||||
|
||||
// Mathematical functions
|
||||
//`define SINH(x) (0.5 * (`lexp(x) - `lexp(-(x))))
|
||||
`define COSH(x) (0.5 * (`lexp(x) + `lexp(-(x))))
|
||||
|
|
|
|||
Loading…
Reference in New Issue