bsim6.va, macro for lln, to avoid derivatives of this function

This commit is contained in:
rlar 2017-05-26 20:26:14 +02:00 committed by Holger Vogt
parent 4f46cd20ee
commit 68b8614a35
1 changed files with 28 additions and 33 deletions

View File

@ -629,13 +629,8 @@ electrical d, g, s, b;
(((x) < -`EXPL_THRESHOLD) ? (`MIN_EXPL) : exp(x)))
// Clamped log function
analog function real lln;
input x;
real x;
begin
lln = ln(max(x , `N_MINLOG));
end
endfunction
`define lln(x) \
ln(max((x) , `N_MINLOG))
// Hyperbolic smoothing function
`define hypsmooth(x,c) \
@ -2740,26 +2735,26 @@ DevTemp = $temperature + DTEMP;
ni = NI0SUB * T1y * `lexp(Eg / (2.0 * Vtm0) - Eg / (2.0 * Vtm));
`ifdef __SHMOD__
if ((SHMOD != 0) && (RTH0 > 0)) begin
T0 = lln(NDEP_i/ni);
T0 = `lln(NDEP_i/ni);
phib = sqrt(T0 * T0 + 1.0E-6);
end else begin
phib = lln(NDEP_i/ni);
phib = `lln(NDEP_i/ni);
end
`else
phib = lln(NDEP_i/ni);
phib = `lln(NDEP_i/ni);
`endif
`ifdef __SHMOD__
if ((SHMOD != 0) && (RTH0 > 0)) begin
T0 = lln(NDEP_i*NSD/ni*ni);
T0 = `lln(NDEP_i*NSD/ni*ni);
Vbi = sqrt(T0 * T0 + 1.0E-6);
end else begin
Vbi = lln(NDEP_i*NSD/ni*ni);
Vbi = `lln(NDEP_i*NSD/ni*ni);
end
`else
Vbi = lln(NDEP_i*NSD/ni*ni);
Vbi = `lln(NDEP_i*NSD/ni*ni);
`endif
if(NGATE_i > 0)
Vfbsdr = -devsign * Vt * lln(NGATE_i/NSD_i) + VFBSDOFF;
Vfbsdr = -devsign * Vt * `lln(NGATE_i/NSD_i) + VFBSDOFF;
else
Vfbsdr = 0.0;
@ -2822,7 +2817,7 @@ DevTemp = $temperature + DTEMP;
BETA0_t = BETA0_i * pow(TRatio, IIT_i);
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);
igtemp = `lexp(IGT_i * lln(TRatio)); //pow(TRatio, IGT_i);
igtemp = `lexp(IGT_i * `lln(TRatio)); //pow(TRatio, IGT_i);
//***Diode Model temperature Code Start***//
CJS_t = CJS * `hypsmooth(1.0 + TCJ * delTemp - 1.0E-6, 1.0E-3);
@ -2839,7 +2834,7 @@ DevTemp = $temperature + DTEMP;
PBSWGD_t = `hypsmooth(PBSWGD - TPBSWG * delTemp - 0.01, 1.0E-3) + 0.01;
T0y = Eg0 / Vtm0 - Eg / Vtm;
T1y = lln(TRatio);
T1y = `lln(TRatio);
T3y = `lexp((T0y + XTIS * T1y) / NJS);
JSS_t = JSS * T3y;
JSWS_t = JSWS * T3y;
@ -2918,12 +2913,12 @@ DevTemp = $temperature + DTEMP;
XExpBVS = `lexp(-BVS / Nvtms) * XJBVS;
T2y = max(IJTHSFWD / Isbs, 10.0);
Tb = 1.0 + T2y - XExpBVS;
VjsmFwd = Nvtms * lln(0.5 * (Tb + sqrt(Tb * Tb + 4 * XExpBVS)));
VjsmFwd = Nvtms * `lln(0.5 * (Tb + sqrt(Tb * Tb + 4 * XExpBVS)));
T0y = `lexp(VjsmFwd / Nvtms);
IVjsmFwd = Isbs * (T0y - XExpBVS / T0y + XExpBVS - 1.0);
SslpFwd = Isbs * (T0y + XExpBVS / T0y) / Nvtms;
T2y = `hypsmooth(IJTHSREV / Isbs - 10.0, 1.0E-3) + 10.0;
VjsmRev = -BVS - Nvtms * lln((T2y - 1.0) / XJBVS);
VjsmRev = -BVS - Nvtms * `lln((T2y - 1.0) / XJBVS);
T1y = XJBVS * `lexp(-(BVS + VjsmRev) / Nvtms);
IVjsmRev = Isbs * (1.0 + T1y);
SslpRev = -Isbs * T1y / Nvtms;
@ -2945,12 +2940,12 @@ DevTemp = $temperature + DTEMP;
XExpBVD = `lexp(-BVD / Nvtmd) * XJBVD;
T2y = max(IJTHDFWD / Isbd, 10.0);
Tb = 1.0 + T2y - XExpBVD;
VjdmFwd = Nvtmd * lln(0.5 * (Tb + sqrt(Tb * Tb + 4 * XExpBVD)));
VjdmFwd = Nvtmd * `lln(0.5 * (Tb + sqrt(Tb * Tb + 4 * XExpBVD)));
T0y = `lexp(VjdmFwd / Nvtmd);
IVjdmFwd = Isbd * (T0y - XExpBVD / T0y + XExpBVD - 1.0);
DslpFwd = Isbd * (T0y + XExpBVD / T0y) / Nvtmd;
T2y = `hypsmooth(IJTHDREV / Isbd - 10.0, 1.0E-3) + 10.0;
VjdmRev = -BVD - Nvtmd * lln((T2y - 1.0) / XJBVD);
VjdmRev = -BVD - Nvtmd * `lln((T2y - 1.0) / XJBVD);
T1y = XJBVD * `lexp(-(BVD + VjdmRev) / Nvtmd);
IVjdmRev = Isbd * (1.0 + T1y);
DslpRev = -Isbd * T1y / Nvtmd;
@ -3163,7 +3158,7 @@ DevTemp = $temperature + DTEMP;
else
T2 = exp(T0);
T3 = Leff + DVTP0_i * (1.0 + T2);
dVth_ldop = -nVt * lln(Leff / T3);
dVth_ldop = -nVt * `lln(Leff / T3);
end else
dVth_ldop = 0;
@ -3407,7 +3402,7 @@ DevTemp = $temperature + DTEMP;
T1 = PCLM_a / (1.0 - PCLMG * qia / EsatL)/Fp;
else
T1 = PCLM_a * (1.0 + PCLMG * qia / EsatL)/Fp;
MdL = 1.0 + T1 * lln(1.0 + diffVds / T1 / Vasat);
MdL = 1.0 + T1 * `lln(1.0 + diffVds / T1 / Vasat);
end else
MdL = 1.0;
Moc = Moc * MdL;
@ -3577,7 +3572,7 @@ DevTemp = $temperature + DTEMP;
// Igbinv
if (IGBMOD != 0) begin
T1 = Voxmacc / NIGBACC_i / Vt; //representative of Qb in acc
Vaux_Igbacc = NIGBACC_i * Vt * lln(1 + `lexp(-T1));
Vaux_Igbacc = NIGBACC_i * Vt * `lln(1 + `lexp(-T1));
T2 = AIGBACC_i - BIGBACC_i * Voxmacc;
T3 = 1.0 + CIGBACC_i * Voxmacc;
T4 = -7.45669e11 * TOXE * T2 * T3;
@ -3587,7 +3582,7 @@ DevTemp = $temperature + DTEMP;
igbacc = igbacc * igtemp;
T1 = (Voxminv - EIGBINV_i) / NIGBINV_i / Vt;
Vaux_Igbinv = NIGBINV_i * Vt * lln(1.0 + `lexp(T1));
Vaux_Igbinv = NIGBINV_i * Vt * `lln(1.0 + `lexp(T1));
T2 = AIGBINV_i - BIGBINV_i * Voxminv;
T3 = 1.0 + CIGBINV_i * Voxminv;
T4 = -9.82222e11 * TOXE * T2 * T3;
@ -3806,7 +3801,7 @@ DevTemp = $temperature + DTEMP;
if (T1<0.9) begin
arg = 1.0 - T1;
if (MJS == 0.5) sarg = 1.0 / sqrt(arg);
else sarg = `lexp(-MJS * lln(arg));
else sarg = `lexp(-MJS * `lln(arg));
Qbs = PBS_t * Czbs * (1.0 - arg * sarg) / (1.0 - MJS);
end else begin
T2 = pow(0.1,-MJS);
@ -3824,7 +3819,7 @@ DevTemp = $temperature + DTEMP;
if (T1<0.9) begin
arg = 1.0 - T1;
if (MJSWS == 0.5) sarg = 1.0 / sqrt(arg);
else sarg = `lexp(-MJSWS * lln(arg));
else sarg = `lexp(-MJSWS * `lln(arg));
Qbs = Qbs + PBSWS_t * Czbssw * (1.0 - arg * sarg) / (1.0 - MJSWS);
end else begin
T2 = pow(0.1,-MJSWS);
@ -3840,7 +3835,7 @@ DevTemp = $temperature + DTEMP;
if (T1<0.9) begin
arg = 1.0 - T1;
if (MJSWGS == 0.5) sarg = 1.0 / sqrt(arg);
else sarg = `lexp(-MJSWGS * lln(arg));
else sarg = `lexp(-MJSWGS * `lln(arg));
Qbs = Qbs + PBSWGS_t * Czbsswg * (1.0 - arg * sarg) / (1.0 - MJSWGS);
end else begin
T2 = pow(0.1,-MJSWGS);
@ -3857,7 +3852,7 @@ DevTemp = $temperature + DTEMP;
if (T1<0.9) begin
arg = 1.0 - T1;
if (MJD == 0.5) sarg = 1.0 / sqrt(arg);
else sarg = `lexp(-MJD * lln(arg));
else sarg = `lexp(-MJD * `lln(arg));
Qbd = PBD_t * Czbd * (1.0 - arg * sarg) / (1.0 - MJD);
end else begin
T2 = pow(0.1,-MJD);
@ -3875,7 +3870,7 @@ DevTemp = $temperature + DTEMP;
if (T1<0.9) begin
arg = 1.0 - T1;
if (MJSWD == 0.5) sarg = 1.0 / sqrt(arg);
else sarg = `lexp(-MJSWD * lln(arg));
else sarg = `lexp(-MJSWD * `lln(arg));
Qbd = Qbd + PBSWD_t * Czbdsw * (1.0 - arg * sarg) / (1.0 - MJSWD);
end else begin
T2 = pow(0.1,-MJSWD);
@ -3891,7 +3886,7 @@ DevTemp = $temperature + DTEMP;
if (T1<0.9) begin
arg = 1.0 - T1;
if (MJSWGD == 0.5) sarg = 1.0 / sqrt(arg);
else sarg = `lexp(-MJSWGD * lln(arg));
else sarg = `lexp(-MJSWGD * `lln(arg));
Qbd = Qbd + PBSWGD_t * Czbdswg * (1.0 - arg * sarg) / (1.0 - MJSWGD);
end else begin
T2 = pow(0.1,-MJSWGD);
@ -3922,7 +3917,7 @@ DevTemp = $temperature + DTEMP;
DelClm = 0.0;
else begin
T0 = (diffVds / litl + EM) / Esatnoi;
DelClm = litl * lln(T0);
DelClm = litl * `lln(T0);
if (DelClm < 0.0) DelClm = 0.0;
end
T1 = `q * `q * `q * Vt * abs(ids) * ueff;
@ -3930,7 +3925,7 @@ DevTemp = $temperature + DTEMP;
N0 = 2.0 * nq * Cox * Vt * qs / `q;
Nl = 2.0 * nq * Cox * Vt * qdeff / `q;
Nstar = Vt / `q * (Cox + Cdep + CIT);
T3 = NOIA * lln((N0 + Nstar) / (Nl + Nstar));
T3 = NOIA * `lln((N0 + Nstar) / (Nl + Nstar));
T4 = NOIB * (N0 - Nl);
T5 = 0.5 * NOIC * (N0 * N0 - Nl * Nl);
T6 = `q * Vt * ids * ids;
@ -4124,7 +4119,7 @@ if (CVMOD==1) begin
end
if(PCLMCV_i != 0) begin
MdL = 1.0 + PCLMCV_i * lln(1.0 + diffVds / PCLMCV_i / Vasat);
MdL = 1.0 + PCLMCV_i * `lln(1.0 + diffVds / PCLMCV_i / Vasat);
end else
MdL = 1.0;