bsim6.va, macro for lln, to avoid derivatives of this function
This commit is contained in:
parent
4f46cd20ee
commit
68b8614a35
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue