<@U016EM8L91B> For GF180MCU models available <here...
# gf180mcu
h
@Tim Edwards For GF180MCU models available here There is subckt for nfet_03v3_dss But there is no subckt for nfet_03v3 Why? The model file intro mentions: * nfet_03v3 Subcircuit model for 3.3V NMOS But actually it is a plain model with binning: nfet_03v3.0, nfet_03v3.1, etc. Also do you plan to fix the multiplier bug we discussed before? PS: The subckt is a must to fix the multiplier issue @Stefan Schippers this may be relevant to xschem as well
a
@Hesham Omran It's subcircuit.
I'll send the link shortly.
Copy code
XM1 net1 net2 VDD VDD pfet_03v3 L=41.75u W=20.0u nf=1.0 m=1.0 ldif=0.18u
+ ad='int((nf+1)/2) * W/nf * 0.18u' as='int((nf+2)/2) * W/nf * 0.18u' 
+ pd='2*int((nf+1)/2) * (W/nf + 0.18u)' ps='2*int((nf+2)/2) * (W/nf + 0.18u)' nrd='0.18u / W' nrs='0.18u / W' 
+ sa=0 sb=0 sd=0 m=1

XM1 net1 net2 VDD VDD nfet_03v3 L=41.75u W=20.0u nf=1.0 m=1.0 ldif=0.18u
+ ad='int((nf+1)/2) * W/nf * 0.18u' as='int((nf+2)/2) * W/nf * 0.18u' 
+ pd='2*int((nf+1)/2) * (W/nf + 0.18u)' ps='2*int((nf+2)/2) * (W/nf + 0.18u)' nrd='0.18u / W' nrs='0.18u / W' 
+ sa=0 sb=0 sd=0 m=1
Copy code
.lib "sm141064.ngspice" sf
.lib "sm141064.ngspice" mimcap_typical
.lib "sm141064.ngspice" res_typical
.lib "sm141064.ngspice" bjt_typical

.param
+ sw_stat_global = 0
+ sw_stat_mismatch = 0
+ mc_skew = 3
+ res_mc_skew = 3
+ cap_mc_skew = 3
+ fnoicor = 1
.end
h
@Amro Tork • nfet_03v3_dss subckt is defined 6 times for all corners • nfet_03v3 subckt is defined one time only in fets_mm • nfet_03v3 subckt refers to the nfet_03v3 model (both have the same name) causing circular dependency errors
a
@Hesham Omran Ignore nfet_03v3_dss
@Hesham Omran nfet_03v3 use libs to define parameters for corners.
the "fets_mm" is the base library, but when you add "typcial" library as shown above it takes the missing parameter from that library.
I hope that helps.
There is no circular dependency because for the subcircuit model you call it with
X
but for the device model you call it with
M
. Using device model is not recommended as it ignore the parameters set for corners.
@Hesham Omran Please don't hesitate to ask if you have other questions.
h
@Amro Tork • Using the same name twice is not a good practice as it doesn't work for simulators that ignore the first letter rule like spectre
a
@Hesham Omran • These models are made for ngspice not for spectre. • _dss is a different device. •
Typical
lib has
fet_mm
as well and the parameters needed to complete the model:
Copy code
.LIB typical
 .lib 'sm141064.ngspice' nfet_03v3_t
 .lib 'sm141064.ngspice' pfet_03v3_t
*
 .param rsh_nplus_u_m=60
 .param rsh_pplus_u_m=185
 .param nfet_06v0_vsat = 1         
 .param nfet_06v0_vth0 = 0              
 .param nfet_06v0_xl = 0
 .param nfet_06v0_xw = 0
 .param nfet_06v0_tox = 0
 .param nfet_06v0_cgso = 1
 .param nfet_06v0_cgdo = 1
 .param nfet_06v0_nvt_u0 = '0.070102'
 .param nfet_06v0_nvt_vth0 = '-0.039'
 .param nfet_06v0_nvt_xl = '0'
 .param nfet_06v0_nvt_xw = '0'
 .param nfet_06v0_nvt_tox = '1.52e-008'
 .param nfet_06v0_nvt_cgso = '1e-010'
 .param nfet_06v0_nvt_cgdo = '1e-010'
 .param pfet_06v0_dvth0 = 0            
 .param pfet_06v0_dxl = 0              
 .param pfet_06v0_dxw = 0              
 .param pfet_06v0_dtox = 0             
 .param pfet_06v0_dcgdo = 1            
 .param pfet_06v0_dcgso = 1            

 .lib 'sm141064.ngspice' nfet_06v0_t
 .lib 'sm141064.ngspice' pfet_06v0_t
 .lib 'sm141064.ngspice' nfet_06v0_nvt_t
 .lib 'sm141064.ngspice' noise_corner
 .lib 'sm141064.ngspice' fets_mm
.ENDL
👍 1
You could access closed source models via Global-foundries if you would like.
_dss devices are for ESD mainly as it has drain side SAB (Silicidation Block)
@Hesham Omran Happy to always help. I have provided an example netlist above for usage.
h
Thanks @Amro Tork But I think the multiplier MC bug exists for ngspice/xschem https://www.linkedin.com/pulse/why-using-device-multiplier-can-make-your-monte-carlo-hesham-omran/
@Amro Tork The way you instantiated the device is a bit different from the one in @Stefan Schippers xschem examples ``XM1 D G S B nfet_03v3 L=0.28u W=0.22u nf=1 ad='int((nf+1)/2) * W/nf * 0.18u' as='int((nf+2)/2) * W/nf * 0.18u' pd='2*int((nf+1)/2) * (W/nf + 0.18u)' + ps='2*int((nf+2)/2) * (W/nf + 0.18u)' nrd='0.18u / W' nrs='0.18u / W' sa=0 sb=0 sd=0 m=1``
It doesn't have ldif=0.18u
a
@Hesham Omran ‘Ldif’ is a user defined parameter. I should have removed it from the example. In xschem, it replaces that with a constant number to represent diffusion dimension.
@Hesham Omran I’m not sure I understand the multiplier MC bug you are referring too. I didn’t read the entire post. But based on the header, I assume that you are referring to mismatch analysis and distribution for devices that are placed correctly in the layout (common centroid). It should have a more controlled distribution in Mismatch/MC. Do I understand your intent correctly? If yes, then yes, I know that is a problem in ngspice. NGSPICE doesn’t have proper netlist analysis. But with careful netlist writing you could create such setup. In my team, we have done that internally. Unfortunately, we can’t publicly share.
h
@Amro Tork give the article a 5 min read and you will get it 🙂
👍 1
s
Using m parameter is not a good move for mismatch analysis, since the '`m`' parallel devices are 100% correlated (simulator just multiplies currrents). Much better to instantiate a vectored instance, like
M1[3:0]
instead of
M1
with
m=4
. Vectored instances will just be unrolled as regular independent parallel devices in netlist,
M1[3], M1[2], M1[1], M1[0]
. In sky130 the
m
parameter is also aliased as
mult
. mult is used in addition to m since mult as a user parameter is accessible from inside the model. Standard deviation of key model parameters is scaled as 1/sqrt(W * L * mult):
Copy code
delvto = {0.004+sw_vth0_sky130_fd_pr__pfet_g5v0d10v5*1.25+sw_vth0_sky130_fd_pr__pfet_g5v0d10v5_mc*1.25+sw_mm_vth0_sky130_fd_pr__pfet_g5v0d10v5*mismatch_factor*MC_MM_SWITCH*AGAUSS(0,1.0,1)/sqrt(l*w*mult)}
I tried a mismatch simulation (1000 runs) of the vth@100nA of m=10 w=0.5 l=0.15 nfet_01v8 transistor and 10 individual w=0.5 l=0.15 transistors (M1[9:0]) in parallel: there is an offset in the vth distributions.
👍 1
h
@Stefan Schippers Exactly! That's what my article is all about. It is funny that this bug exists in many commercial PDKs.