Revert "bsim6.va, macro for hypsmooth, to avoid derivatives of this function"

This commit is contained in:
rlar 2017-09-23 17:11:10 +02:00 committed by Holger Vogt
parent b6f5cfb8ac
commit 12cbb8bf9b
1 changed files with 47 additions and 42 deletions

View File

@ -654,8 +654,13 @@ analog function real lln;
endfunction
// Hyperbolic smoothing function
`define hypsmooth(x,c) \
(0.5 * ((x) + sqrt((x)*(x) + 4.0*(c)*(c))))
analog function real hypsmooth;
input x , c;
real x , c;
begin
hypsmooth = 0.5 * (x + sqrt(x*x + 4.0*c*c));
end
endfunction
/***************************/
/* Instance Parameters */
/***************************/
@ -2786,7 +2791,7 @@ DevTemp = $temperature + DTEMP;
T1DEP = sqrt(2.0 * epssi / (`q * NDEP_i));
litl = sqrt((epssi / epsox) * TOXE * XJ_i);//SCBE Rout
NFACTOR_t = NFACTOR_i * `hypsmooth((1.0 + TNFACTOR * (TRatio - 1.0)),1e-3);
NFACTOR_t = NFACTOR_i * hypsmooth((1.0 + TNFACTOR * (TRatio - 1.0)),1e-3);
ETA0_t = ETA0_i * (1.0 + TETA0 * (TRatio - 1.0));
if(ASYMMOD != 0)
ETA0R_t = ETA0R_i * (1.0 + TETA0 * (TRatio - 1.0));
@ -2794,14 +2799,14 @@ DevTemp = $temperature + DTEMP;
eta_mu = (TYPE != `ntype) ? (`Oneby3 * ETAMOB) : (0.5 * ETAMOB);
U0_t = U0_i * pow(TRatio, UTE_i);
UA_t = UA_i * `hypsmooth(1.0 + UA1_i*delTemp - 1.0E-6, 1.0E-3);
UC_t = UC_i * `hypsmooth(1.0 + UC1_i*delTemp - 1.0E-6, 1.0E-3);
UA_t = UA_i * hypsmooth(1.0 + UA1_i*delTemp - 1.0E-6, 1.0E-3);
UC_t = UC_i * hypsmooth(1.0 + UC1_i*delTemp - 1.0E-6, 1.0E-3);
UD_t = UD_i * pow(TRatio, UD1_i);
UCS_t = UCS_i * pow(TRatio, UCSTE_i);
if(ASYMMOD != 0) begin
U0R_t = U0R_i * pow(TRatio, UTE_i);
UAR_t = UAR_i * `hypsmooth(1.0 + UA1_i*delTemp - 1.0E-6, 1.0E-3);
UCR_t = UCR_i * `hypsmooth(1.0 + UC1_i*delTemp - 1.0E-6, 1.0E-3);
UAR_t = UAR_i * hypsmooth(1.0 + UA1_i*delTemp - 1.0E-6, 1.0E-3);
UCR_t = UCR_i * hypsmooth(1.0 + UC1_i*delTemp - 1.0E-6, 1.0E-3);
UDR_t = UDR_i * pow(TRatio, UD1_i);
UCSR_t = UCSR_i * pow(TRatio, UCSTE_i);
end
@ -2827,32 +2832,32 @@ DevTemp = $temperature + DTEMP;
VSATCV_t = 100.0;
end
DELTA_t = 1.0 / ( `hypsmooth((1.0/DELTA_i) * (1.0 + TDELTA * delTemp)-2.0 , 1.0E-3) + 2.0);
PTWG_t = PTWG_i * `hypsmooth(1.0 - PTWGT_i*delTemp - 1.0E-6, 1.0E-3);
DELTA_t = 1.0 / ( hypsmooth((1.0/DELTA_i) * (1.0 + TDELTA * delTemp)-2.0 , 1.0E-3) + 2.0);
PTWG_t = PTWG_i * hypsmooth(1.0 - PTWGT_i*delTemp - 1.0E-6, 1.0E-3);
if(ASYMMOD != 0)
PTWGR_t = PTWGR_i * `hypsmooth(1.0 - PTWGT_i*delTemp - 1.0E-6, 1.0E-3);
PTWGR_t = PTWGR_i * hypsmooth(1.0 - PTWGT_i*delTemp - 1.0E-6, 1.0E-3);
A1_t = A1_i * `hypsmooth(1.0 + A11_i*delTemp - 1.0E-6, 1.0E-3);
A2_t = A2_i * `hypsmooth(1.0 + A21_i*delTemp - 1.0E-6, 1.0E-3);
A1_t = A1_i * hypsmooth(1.0 + A11_i*delTemp - 1.0E-6, 1.0E-3);
A2_t = A2_i * hypsmooth(1.0 + A21_i*delTemp - 1.0E-6, 1.0E-3);
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);
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);
//***Diode Model temperature Code Start***//
CJS_t = CJS * `hypsmooth(1.0 + TCJ * delTemp - 1.0E-6, 1.0E-3);
CJD_t = CJD * `hypsmooth(1.0 + TCJ * delTemp - 1.0E-6, 1.0E-3);
CJSWS_t = CJSWS * `hypsmooth(1.0 + TCJSW * delTemp - 1.0E-6, 1.0E-3);
CJSWD_t = CJSWD * `hypsmooth(1.0 + TCJSW * delTemp - 1.0E-6, 1.0E-3);
CJSWGS_t = CJSWGS * `hypsmooth(1.0 + TCJSWG * delTemp - 1.0E-6, 1.0E-3);
CJSWGD_t = CJSWGD * `hypsmooth(1.0 + TCJSWG * delTemp - 1.0E-6, 1.0E-3);
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;
CJS_t = CJS * hypsmooth(1.0 + TCJ * delTemp - 1.0E-6, 1.0E-3);
CJD_t = CJD * hypsmooth(1.0 + TCJ * delTemp - 1.0E-6, 1.0E-3);
CJSWS_t = CJSWS * hypsmooth(1.0 + TCJSW * delTemp - 1.0E-6, 1.0E-3);
CJSWD_t = CJSWD * hypsmooth(1.0 + TCJSW * delTemp - 1.0E-6, 1.0E-3);
CJSWGS_t = CJSWGS * hypsmooth(1.0 + TCJSWG * delTemp - 1.0E-6, 1.0E-3);
CJSWGD_t = CJSWGD * hypsmooth(1.0 + TCJSWG * delTemp - 1.0E-6, 1.0E-3);
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;
T0y = Eg0 / Vtm0 - Eg / Vtm;
T1y = lln(TRatio);
@ -2872,12 +2877,12 @@ DevTemp = $temperature + DTEMP;
JTSSWGD_t = JTSSWGD * (sqrt(JTWEFF / Weffcj) + 1.0) * lexp(Eg0 * XTSSWGD * (TRatio - 1) / 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;
NJTSSW_t = `hypsmooth(NJTSSW * (1.0 + TNJTSSW * (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;
NJTSD_t = `hypsmooth(NJTSD * (1.0 + TNJTSD * (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;
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;
NJTSSW_t = hypsmooth(NJTSSW * (1.0 + TNJTSSW * (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;
NJTSD_t = hypsmooth(NJTSD * (1.0 + TNJTSD * (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;
NJTSSWGD_t = hypsmooth(NJTSSWGD * (1.0 + TNJTSSWGD * (TRatio-1.0)) - 0.01, 1.0E-3) + 0.01;
//***Diode Model temperature Code End***//
// Effective Source/Drain junction area and perimeter
@ -2938,7 +2943,7 @@ DevTemp = $temperature + DTEMP;
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;
T2y = hypsmooth(IJTHSREV / Isbs - 10.0, 1.0E-3) + 10.0;
VjsmRev = -BVS - Nvtms * lln((T2y - 1.0) / XJBVS);
T1y = XJBVS * lexp(-(BVS + VjsmRev) / Nvtms);
IVjsmRev = Isbs * (1.0 + T1y);
@ -2965,7 +2970,7 @@ DevTemp = $temperature + DTEMP;
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;
T2y = hypsmooth(IJTHDREV / Isbd - 10.0, 1.0E-3) + 10.0;
VjdmRev = -BVD - Nvtmd * lln((T2y - 1.0) / XJBVD);
T1y = XJBVD * lexp(-(BVD + VjdmRev) / Nvtmd);
IVjdmRev = Isbd * (1.0 + T1y);
@ -3200,9 +3205,9 @@ DevTemp = $temperature + DTEMP;
//********************************************Threshold Voltage for Operating Point Information**************************************************************//
gam = sqrt(2.0 * `q * epssi*NDEP_i * inv_Vt)/Cox;
q_vth = 0.5;
T0 = `hypsmooth((2*phib+Vs*inv_Vt),1e-3);
T0 = hypsmooth((2*phib+Vs*inv_Vt),1e-3);
nq = 1.0+ gam/(2.0*sqrt(T0));
psip_th = `hypsmooth((Vs*inv_Vt+2*phib+ln(q_vth)+2*q_vth+ln(2*nq/gam * (2*q_vth*nq/gam + 2*sqrt(T0)))),1e-3);
psip_th = hypsmooth((Vs*inv_Vt+2*phib+ln(q_vth)+2*q_vth+ln(2*nq/gam * (2*q_vth*nq/gam + 2*sqrt(T0)))),1e-3);
VTH = VFB_i+ (psip_th-Vs*inv_Vt)*Vt + Vt*gam*sqrt(psip_th)+ Vth_shift;
//******************************************************************************************************************//
@ -3400,7 +3405,7 @@ DevTemp = $temperature + DTEMP;
Vgst2Vtm = qia + 2.0 * nVt;
if (DIBLfactor > 0) begin
T3 = Vgst2Vtm / (Vdssat + Vgst2Vtm);
T4 = `hypsmooth((1.0 + PDIBLCB_i * Vbsx),1e-3);
T4 = hypsmooth((1.0 + PDIBLCB_i * Vbsx),1e-3);
T5 = 1/T4;
VaDIBL = Vgst2Vtm / DIBLfactor * T3 * PVAGfactor * T5;
Moc = 1.0 + diffVds / VaDIBL;
@ -3676,12 +3681,12 @@ DevTemp = $temperature + DTEMP;
T6 = 0.0;
end else begin
T1 = (- Vgd_noswap - EGIDL_i + Vfbsdr) / T0y;
T1 = `hypsmooth(T1, 1.0E-2);
T1 = hypsmooth(T1, 1.0E-2);
T2 = BGIDL_t / (T1 + 1.0E-3);
if (CGIDL_i !=0) begin
T3 = Vdb_noswap*Vdb_noswap*Vdb_noswap;
T4 = CGIDL_i + abs(T3) + 1.0E-9;
T5 = `hypsmooth(T3/T4, 1.0E-6) - 1.0E-6;
T5 = hypsmooth(T3/T4, 1.0E-6) - 1.0E-6;
end else
T5 = 1.0;
T6 = AGIDL_i * Weff * T1 * lexp(-T2) * T5;
@ -3693,12 +3698,12 @@ DevTemp = $temperature + DTEMP;
T6 = 0.0;
end else begin
T1 = (- Vgs_noswap - EGISL_i + Vfbsdr) / T0y;
T1 = `hypsmooth(T1, 1.0E-2);
T1 = hypsmooth(T1, 1.0E-2);
T2 = BGISL_t / (T1 + 1.0E-3);
if (CGISL_i !=0) begin
T3 = Vsb_noswap*Vsb_noswap*Vsb_noswap;
T4 = CGISL_i + abs(T3) + 1.0E-9;
T5 = `hypsmooth(T3/T4, 1.0E-6) - 1.0E-6;
T5 = hypsmooth(T3/T4, 1.0E-6) - 1.0E-6;
end else
T5 = 1.0;
T6 = AGISL_i * Weff * T1 * lexp(-T2) * T5;
@ -4227,7 +4232,7 @@ end
// Edge FET Model Implementation
//****************************************************
if (EDGEFET == 1) begin
NFACTOREDGE_t = NFACTOREDGE * `hypsmooth((1.0 + TNFACTOREDGE * (TRatio - 1.0)),1e-3);
NFACTOREDGE_t = NFACTOREDGE * hypsmooth((1.0 + TNFACTOREDGE * (TRatio - 1.0)),1e-3);
ETA0EDGE_t = ETA0EDGE * (1.0 + TETA0EDGE * (TRatio - 1.0));
cdsc = CITEDGE + NFACTOREDGE_t + CDSCDEDGE * Vdsx - CDSCBEDGE * Vbsx;