Title: List of Bugs in BSIM4.4.0 and Bug Fixes in BSIM4.5.0 ===================================================== Xuemei (Jane) Xi, Ali M. Niknejad and Chenming Hu The following is a list of the bugs and code robustness improvements found in BSIM4.4.0 along with the bug fixes and improvement, which have been evaluated by BSIM team and the bug reporters and were approved by Compact Model Council (CMC) member companies (Please see "CMC's Bug Reporting and Resolution Procedure" attached at the bottom of this file). Improvement 1: ------ Reporter: Geoffrey J. Coram, Analog Device C files involved: b4ld.c C code containing the bug: capMod == 2 Proposed fix: define VgDP to replace (Vgsteff - DeltaPhi), where, T0 = Vgsteff - DeltaPhi - 0.001; dT0_dVg = 1.0 - dDeltaPhi_dVg; T1 = sqrt(T0 * T0 + Vgsteff * 0.004); VgDP = 0.5 * (T0 + T1); dVgDP_dVg = 0.5 * (dT0_dVg + (T0 * dT0_dVg + 0.002) / T1); Improvement 2: ------ Reporter: Andre Martinez, Analog Device C files involved: b4set.c C code containing the bug: if (!here->BSIM4sdGiven) here->BSIM4sd = 0.0; Proposed fix: if (!here->BSIM4sdGiven) here->BSIM4sd = model->BSIM4dmcg; Bug 1: ------ Bug reporters: Peter Lee, Renesas, Laurens Weiss, Infinion, and Richard Gaupsas, Synopsys C files involved: b4ld.c C code containing the bug: if ((model->BSIM4vtss - vbs) < 1e-3) . . . dT6_dVb = T10 * dT0_dVb; } Proposed bug fix: 1. vbs ====>vbs_jct; 2. vbd ====>vbd_jct; 3. (model->BSIM4vtxx - vbs) < 1e-3 ====> (model->BSIM4vtxx - vbs) / model->BSIM4vtxx < 1e-3 4. Line 916. DEXP(T0, T4, T10) ====> DEXP(T0, T6, T10) Bug 2: ------ Bug reporters: Peter Lee, Renesas C files involved: b4check.c Proposed enhancement: /* diode model */ if (model->BSIM4SbulkJctBotGradingCoeff >= 0.99) { fprintf(fplog, "Warning: MJS = %g is too big. Set to 0.99.\n", model->BSIM4SbulkJctBotGradingCoeff); printf("Warning: MJS = %g is too big. Set to 0.99.\n", model->BSIM4SbulkJctBotGradingCoeff); model->BSIM4SbulkJctBotGradingCoeff = 0.99; } if (model->BSIM4SbulkJctSideGradingCoeff >= 0.99) { fprintf(fplog, "Warning: MJSWS = %g is too big. Set to 0.99.\n", model->BSIM4SbulkJctSideGradingCoeff); printf("Warning: MJSWS = %g is too big. Set to 0.99.\n", model->BSIM4SbulkJctSideGradingCoeff); model->BSIM4SbulkJctSideGradingCoeff = 0.99; } if (model->BSIM4SbulkJctGateSideGradingCoeff >= 0.99) { fprintf(fplog, "Warning: MJSWGS = %g is too big. Set to 0.99.\n", model->BSIM4SbulkJctGateSideGradingCoeff); printf("Warning: MJSWGS = %g is too big. Set to 0.99.\n", model->BSIM4SbulkJctGateSideGradingCoeff); model->BSIM4SbulkJctGateSideGradingCoeff = 0.99; } if (model->BSIM4DbulkJctBotGradingCoeff >= 0.99) { fprintf(fplog, "Warning: MJD = %g is too big. Set to 0.99.\n", model->BSIM4DbulkJctBotGradingCoeff); printf("Warning: MJD = %g is too big. Set to 0.99.\n", model->BSIM4DbulkJctBotGradingCoeff); model->BSIM4DbulkJctBotGradingCoeff = 0.99; } if (model->BSIM4DbulkJctSideGradingCoeff >= 0.99) { fprintf(fplog, "Warning: MJSWD = %g is too big. Set to 0.99.\n", model->BSIM4DbulkJctSideGradingCoeff); printf("Warning: MJSWD = %g is too big. Set to 0.99.\n", model->BSIM4DbulkJctSideGradingCoeff); model->BSIM4DbulkJctSideGradingCoeff = 0.99; } if (model->BSIM4DbulkJctGateSideGradingCoeff >= 0.99) { fprintf(fplog, "Warning: MJSWGD = %g is too big. Set to 0.99.\n", model->BSIM4DbulkJctGateSideGradingCoeff); printf("Warning: MJSWGD = %g is too big. Set to 0.99.\n", model->BSIM4DbulkJctGateSideGradingCoeff); model->BSIM4DbulkJctGateSideGradingCoeff = 0.99; } Bug 3: ------ Bug reporters: Peter Lee, Renesas C files involved: b4set.c C code containing the bug: model->BSIM4aigbacc = 0.43; model->BSIM4bigbacc = 0.054; model->BSIM4aigbinv = 0.35; model->BSIM4bigbinv = 0.03; Proposed bug fix: model->BSIM4aigbacc = 1.36e-2; model->BSIM4bigbacc = 1.71e-3; model->BSIM4aigbinv = 1.11e-2; model->BSIM4bigbinv = 9.49e-4; Bug 4: ------ Bug reporters: Selim, Mohamed, Mentor Graphics C files involved: b4noi.c Proposed fix: if (DelClm < 0.0) DelClm = 0.0; Bug 5: ------ Bug reporters:Takahiro Iizuka, NEC Electronics C files involved: b4noi.c Bug description: 1/f noise (FNOIMOD=1) scale erroneously with respect to the number of fingers, NF C code containing the bug: ...... T7 = 1.0e10 * EffFreq * Leffsq * pParam->BSIM4weff; ...... T11 = pParam->BSIM4weff * pParam->BSIM4leff * pow(data->freq, model->BSIM4ef) * 1.0e10 * here->BSIM4nstar * here->BSIM4nstar; ...... Proposed fix: ...... T7 = 1.0e10 * EffFreq * Leffsq * pParam->BSIM4weff * here->BSIM4nf; ...... T11 = pParam->BSIM4weff * here->BSIM4nf * pParam->BSIM4leff * pow(data->freq, model->BSIM4ef) * 1.0e10 * here->BSIM4nstar * here->BSIM4nstar; ...... Bug 6: ------ Bug reporters:Lee Wai Kit , HKUST C files involved: b4ld.c Bug description: NQS matrix element calculation for Vds<0 C code containing the bug: ggts = here->BSIM4gtd = T0 * here->BSIM4gcrgs; ggtd = here->BSIM4gts = T0 * here->BSIM4gcrgd; Proposed fix: ggts = here->BSIM4gts = T0 * here->BSIM4gcrgd; ggtd = here->BSIM4gtd = T0 * here->BSIM4gcrgs; Bug 7: ------ Bug reporters: Laurens Weiss, Infinion C files involved: b4ld.c Bug description: Pigcd default value derivative error C code containing the bug: dPigcd_dVg = T14 * (2.0 + 0.5 * (dVdseff_dVg * Vgsteff - 3.0 * Vdseff) / T12); dPigcd_dVd = 0.5 * T14 * dVdseff_dVd + dPigcd_dVg * dVgsteff_dVd; dPigcd_dVb = 0.5 * T14 * dVdseff_dVb + dPigcd_dVg * dVgsteff_dVb; dPigcd_dVg *= dVgsteff_dVg; Proposed fix: dPigcd_dVg = T14 * (2.0 + 0.5 * (dVdseff_dVg - 3.0 * Vdseff / T12)); dPigcd_dVd = 0.5 * T14 * dVdseff_dVd; dPigcd_dVb = 0.5 * T14 * dVdseff_dVb; CMC Bug Reporting Procedure for BSIM3/4 1. User reports bug to simulator vendor. 2. Spice provider reports bug to Berkeley with recommended fix, test case and significance. 3. Berkeley will immediately post on the website with the recommended fix. 4. Berkeley will notify CMC, BSIM3/4 mailing list and FSA 5. CMC members review bug and proposed fixes 6. At the next CMC meeting the CMC will decide on what action to take on each bug. A revision number (e.g. 3.2.1) will be assigned to the code with the accepted bug fixes. 7. Berkeley will post the list of approved bug fixes on the website along with the revision number assigned. Where appropriate this may include sections of revised code but Berkeley will not post a complete new release of the code for each minor version. For example v3.2.1 might be specified as equivalent to v3.2 with the bug fixes posted on a particular Web page.