Title: List of Modification/BugFixes in BSIM4.1.0 ===================================== Xuemei Xi, Mark Cao, and Chenming Hu Project Director: Prof. Chenming Hu The following is a list of the modification/bugs made/found in BSIM4.1.0 along with the solutions discussed at the Compact Model Council (CMC) meeting. With these changes, BSIM4.2.0 code makes a better compatibility of BSIM3 netlist to that of BSIM4 and also the computation efficiency is improved. 1 Modification Requirer: D. Averill Bell (Agere System) Judy An (Advanced Micro Devices) Description: New Parameters XL & XW Implementation to Allow Global Mask/Etch Change Files involved: b4def.h, b4mpar.c, b4mask.c, b4.c, b4temp.c, b4set.c b4check.c Changes in b4temp.c: Lnew = here->BSIM4l + model->BSIM4xl ; Wnew = here->BSIM4w / here->BSIM4nf + model->BSIM4xw; T0 = pow(Lnew, model->BSIM4Lln); T1 = pow(Wnew, model->BSIM4Lwn); T2 = pow(Lnew, model->BSIM4Wln); T3 = pow(Wnew, model->BSIM4Wwn); pParam->BSIM4leff = Lnew - 2.0 * pParam->BSIM4dl; pParam->BSIM4leffCV = Lnew - 2.0 * pParam->BSIM4dlc; pParam->BSIM4weffCV = Wnew - 2.0 * pParam->BSIM4dwc; pParam->BSIM4weffCJ = Wnew - 2.0 * pParam->BSIM4dwj; here->BSIM4grgeltd = model->BSIM4rshg * (model->BSIM4xgw + pParam->BSIM4weffCJ / 3.0 / model->BSIM4ngcon) / (model->BSIM4ngcon * here->BSIM4nf * (Lnew - model->BSIM4xgl)); 2 Bug #1: ------ Bug reporters: Alexandre Zavorine (Circuit Semantics) David T. Zweidinger, Keith Green (TI) Chenming Hu, Xuemei Xi(UC Berkeley) C files involved: b4set.c, b4temp.c b4geo.c Bug description: Original code doesn't effectively consider the extranous node allocation with RD/RS and RD/RS isn't considered when RGEOMOD=0 while there is S/D resistance with sheet resistance not zero Fix: in b4set.c: ...................................................................... int noiseAnalGiven = 0, createNode; /* Criteria for new node creation */ double Rtot, DMCGeff, DMCIeff, DMDGeff; JOB *job; /* Search for a noise analysis request */ for (job = ((TSKtask *)ft_curckt->ci_curTask)->jobs;job;job = job->JOBnextJob) { if(strcmp(job->JOBname,"Noise Analysis")==0) { noiseAnalGiven = 1; break; } } /* loop through all the BSIM4 device models */ for( ; model != NULL; model = model->BSIM4nextModel ) ...................................................................... DMCGeff = model->BSIM4dmcg - model->BSIM4dmcgt; DMCIeff = model->BSIM4dmci; DMDGeff = model->BSIM4dmdg - model->BSIM4dmcgt; /* * End processing models and begin to loop * through all the instances of the model */ ................................................................................. for (here = model->BSIM4instances; here != NULL ; here=here->BSIM4nextInstance) { /* allocate a chunk of the state vector */ /* process drain series resistance */ createNode = 0; if ( (model->BSIM4rdsMod != 0) || (model->BSIM4tnoiMod != 0 && noiseAnalGiven)) { createNode = 1; } else if (model->BSIM4sheetResistance > 0) { if (here->BSIM4drainSquaresGiven && here->BSIM4drainSquares > 0) { createNode = 1; } else if (!here->BSIM4drainSquaresGiven && (here->BSIM4rgeoMod != 0)) { BSIM4RdseffGeo(here->BSIM4nf, here->BSIM4geoMod, here->BSIM4rgeoMod, here->BSIM4min, here->BSIM4w, model->BSIM4sheetResistance, DMCGeff, DMCIeff, DMDGeff, 0, &Rtot); if(Rtot > 0) createNode = 1; } } if ( createNode != 0 && (here->BSIM4dNodePrime == 0)) { error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"drain"); if(error) return(error); here->BSIM4dNodePrime = tmp->number; } else { here->BSIM4dNodePrime = here->BSIM4dNode; } /* process source series resistance */ createNode = 0; if ( (model->BSIM4rdsMod != 0) || (model->BSIM4tnoiMod != 0 && noiseAnalGiven)) { createNode = 1; } else if (model->BSIM4sheetResistance > 0) { if (here->BSIM4sourceSquaresGiven && here->BSIM4sourceSquares > 0) { createNode = 1; } else if (!here->BSIM4sourceSquaresGiven && (here->BSIM4rgeoMod != 0)) { BSIM4RdseffGeo(here->BSIM4nf, here->BSIM4geoMod, here->BSIM4rgeoMod, here->BSIM4min, here->BSIM4w, model->BSIM4sheetResistance, DMCGeff, DMCIeff, DMDGeff, 1, &Rtot); if(Rtot > 0) createNode = 1; } } if ( createNode != 0 && here->BSIM4sNodePrime == 0) { error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"source"); if(error) return(error); here->BSIM4sNodePrime = tmp->number; } else here->BSIM4sNodePrime = here->BSIM4sNode; ........................................................................................ in b4temp.c /* Processing S/D resistance and conductance below */ if(here->BSIM4sNodePrime != here->BSIM4sNode) { here->BSIM4sourceConductance = 0.0; if(here->BSIM4sourceSquaresGiven) { here->BSIM4sourceConductance = model->BSIM4sheetResistance * here->BSIM4sourceSquares; } else if (here->BSIM4rgeoMod > 0) { BSIM4RdseffGeo(here->BSIM4nf, here->BSIM4geoMod, here->BSIM4rgeoMod, here->BSIM4min, pParam->BSIM4weffCJ, model->BSIM4sheetResistance, DMCGeff, DMCIeff, DMDGeff, 1, &(here->BSIM4sourceConductance)); } else { here->BSIM4sourceConductance = 0.0; } if (here->BSIM4sourceConductance > 0.0) here->BSIM4sourceConductance = 1.0 / here->BSIM4sourceConductance; else { here->BSIM4sourceConductance = 1.0e3; /* mho */ printf ("Warning: Source conductance reset to 1.0e3 mho.\n"); } } else { here->BSIM4sourceConductance = 0.0; } if(here->BSIM4dNodePrime != here->BSIM4dNode) { here->BSIM4drainConductance = 0.0; if(here->BSIM4drainSquaresGiven) { here->BSIM4drainConductance = model->BSIM4sheetResistance * here->BSIM4drainSquares; } else if (here->BSIM4rgeoMod > 0) { BSIM4RdseffGeo(here->BSIM4nf, here->BSIM4geoMod, here->BSIM4rgeoMod, here->BSIM4min, pParam->BSIM4weffCJ, model->BSIM4sheetResistance, DMCGeff, DMCIeff, DMDGeff, 0, &(here->BSIM4drainConductance)); } else { here->BSIM4drainConductance = 0.0; } if (here->BSIM4drainConductance > 0.0) here->BSIM4drainConductance = 1.0 / here->BSIM4drainConductance; else { here->BSIM4drainConductance = 1.0e3; /* mho */ printf ("Warning: Drain conductance reset to 1.0e3 mho.\n"); } } else { here->BSIM4drainConductance = 0.0; } /* End of Rsd processing */ ......................................................................................... b4geo.c ......................................................................................... BSIM4RdseffGeo(nf, geo, rgeo, minSD, Weffcj, Rsh, DMCG, DMCI, DMDG, Type, Rtot) ......................................................................................... { ......................................................................................... if(*Rtot==0.0) printf("Warning: Zero resistance returned from RdseffGeo\n"); return 0; } 3 Bug #2: ------ Bug reporters: Alexandre Zavorine (Circuit Semantics) C files involved: b4ld.c bug description: this is a fundamental bug propagated from bsim3 for CAPMOD=0,40/60 partition C code with the bug: here->BSIM4cbdb = -(here->BSIM4cgdb + here->BSIM4cddb + T11); Fix: here->BSIM4cbdb = -(here->BSIM4cgdb + here->BSIM4cddb + T10);