Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

no convergence in dc sweep curves error

Status
Not open for further replies.

liz16

Newbie level 4
Joined
Feb 2, 2016
Messages
7
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
146
Hi, I'm trying to simulate a ring oscillator with variation block on its parameters in hspice, but I get " no convergence in dc sweep curves" errors, I tried some convergence solutions, but no success. These are the codes & results:
Code:
V1 vdd 0 0.9V
V2 vss 0 0V

.PARAM bias=1m
 MN11 vss 15 11 vss N1 L=120n W=280n x=-7000u y=2000u
 MP11 vdd 15 11 vdd P1 L=120n W=980n x=-7000u y=6000u
 MN12 vss 11 12 vss N1 L=120n W=280n x=-5500u y=2000u
 MP12 vdd 11 12 vdd P1 L=120n W=980n x=-5500u y=6000u
 MN13 vss 12 13 vss N1 L=120n W=280n x=-4000u y=2000u
 MP13 vdd 12 13 vdd P1 L=120n W=980n x=-4000u y=6000u
 MN14 vss 13 14 vss N1 L=120n W=280n x=-2500u y=2000u
 MP14 vdd 13 14 vdd P1 L=120n W=980n x=-2500u y=6000u
 MN15 vss 14 15 vss N1 L=120n W=280n x=-1000u y=2000u
 MP15 vdd 14 15 vdd P1 L=120n W=980n x=-1000u y=6000u


.MODEL  N1  NMOS  LEVEL = 54
.MODEL  P1  PMOS  LEVEL = 54


.Variation
  .Global_Variation
  Parameter var=N() Y='180 + 8.02 * var' Z='17.5 + 0.37 * var'
  Nmos N1
 + VTH0=Perturb('Y')
  Pmos P1
 + VTH0=Perturb('Y')
.End_Global_Variation
.Local_Variation
  Parameter var=N() T='11.46 * var' U='0.54 * var'
  Nmos N1
 + VTH0=Perturb('T')
  Pmos P1
+ VTH0=Perturb('T')
.End_Local_Variation

.End_Variation

.op

.dc bias 1m 1m 1m monte=10
.print I(MN11) I(MN12)
.measure dc I11 find I(MN11) at=1m
.measure dc I12 find I(MN12) at=1m

.END

The errors:
Code:
 sweep: monte_carlo     monte_carlo1     begin, #sweeps =  10
 output: ring40.ms0
 sweep: dc dc1    begin, #sweeps=   1 cpu clock=  6.41E+00
 dcop: begin pseudo transient
 dcop: ...failed with iteration exhausted
 dcop: end pseudo transient
 dcop: gshunt =      0.1000000E-03
 dcop: gshunt =      0.5050000E-03
 dcop: gshunt =      0.7277500E-03
 dcop: gshunt =      0.8502625E-03
 dcop: gshunt =      0.9176444E-03
 dcop: gshunt =      0.9547044E-03
 dcop: gshunt =      0.9750874E-03
 dcop: gshunt =      0.9862981E-03
 dcop: gshunt =      0.9924639E-03
 dcop: gshunt =      0.9958552E-03
 dcop: gshunt =      0.9977203E-03
 dcop: gshunt =      0.9987462E-03
 dcop: gshunt =      0.9993104E-03
 dcop: gshunt =      0.9996207E-03
 dcop: gshunt =      0.9997914E-03
 dcop: gshunt =      0.9998853E-03
 dcop: gshunt =      0.9999369E-03
 dcop: gshunt =      0.9999653E-03
 dcop: gshunt =      0.9999809E-03
 dcop: gshunt =      0.9999895E-03
 dcop: gshunt =      0.9999942E-03
 dcop: gshunt =      0.9999968E-03
 dcop: gshunt =      0.9999983E-03
 dcop: gshunt =      0.9999990E-03
 dcop: gshunt =      0.9999995E-03
 dcop: gshunt =      0.9999997E-03
 dcop: gshunt =      0.9999998E-03
 dcop: gshunt =      0.9999999E-03
 **error** no convergence in dc sweep curves at  1.00000E-03
 sweep: dc dc1    end,  cpu clock=  1.27E+01 peak memory=        52 mb
 output: ring40.ms0
 sweep: dc dc2    begin, #sweeps=   1 cpu clock=  1.27E+01
 dcop: begin pseudo transient
 dcop: ...failed with iteration exhausted
 dcop: end pseudo transient
 dcop: gshunt =      0.1000000E-03
 dcop: gshunt =      0.5050000E-03
 dcop: gshunt =      0.7277500E-03
 dcop: gshunt =      0.8502625E-03
 dcop: gshunt =      0.9176444E-03
 dcop: gshunt =      0.9547044E-03
 dcop: gshunt =      0.9750874E-03
 dcop: gshunt =      0.9862981E-03
 dcop: gshunt =      0.9924639E-03
 dcop: gshunt =      0.9958552E-03
 dcop: gshunt =      0.9977203E-03
 dcop: gshunt =      0.9987462E-03
 dcop: gshunt =      0.9993104E-03
 dcop: gshunt =      0.9996207E-03
 dcop: gshunt =      0.9997914E-03
 dcop: gshunt =      0.9998853E-03
 dcop: gshunt =      0.9999369E-03
 dcop: gshunt =      0.9999653E-03
 dcop: gshunt =      0.9999809E-03
 dcop: gshunt =      0.9999895E-03
 dcop: gshunt =      0.9999942E-03
 dcop: gshunt =      0.9999968E-03
 dcop: gshunt =      0.9999983E-03
 dcop: gshunt =      0.9999990E-03
 dcop: gshunt =      0.9999995E-03
 dcop: gshunt =      0.9999997E-03
 dcop: gshunt =      0.9999998E-03
 dcop: gshunt =      0.9999999E-03
 **error** no convergence in dc sweep curves at  1.00000E-03
 

Just guessing:

1. I don't see where bias is connected to

2. Your bias sweep
Code:
.dc bias 1m 1m 1m ...
means to step bias from 1mV to 1mV with steps of 1mV ???
 

Sometimes it helps to install high ohm resistors across troublesome nodes, or from a node to ground, etc. The high-ohm resistors permit a little current flow to exist, instead of no current flow.

I believe the simulator has a more drastic decision to turn On a component that is completely Off, compared to when that component is already On a little bit. So the harder decisions require more iterations to reach convergence.
 

Thanks erikl.
1.I tried to do what is said in hspice reference. Chapter Monte Carlo statistical simulation.
2.I tried with other values, but no success.

- - - Updated - - -

The goal of my simulations is that I want to measure leakage current of a ring oscillator with variation on Vth, in 45 nm node technology. variation is a gaussian distribution with a mean and sigma, ( T & Y in the code). I do a monte carlo simulation as is mentioned in the code. In this code I want to try for measuring current. If the result will be correct, then I try for leakage current. So the result must be a distribution of leakage currents.
In the meantime I have another question: I want to measure leakage current, I searched & found these 3 threads, I wonder which one is applicable for my case?

https://www.edaboard.com/threads/75617/
or
https://www.edaboard.com/threads/161766/
or
https://www.edaboard.com/threads/320119/
 


Hi, I changed the code a bit:

Code:
*40ring
V1 vdd 0 0.9V
V2 vss 0 0V

.PARAM bias=1m
MN11 vss 15 11 vss N1 L=120n W=280n x=-7000u y=2000u
MP11 vdd 15 11 vdd P1 L=120n W=980n x=-7000u y=6000u
MN12 vss 11 12 vss N1 L=120n W=280n x=-5500u y=2000u
MP12 vdd 11 12 vdd P1 L=120n W=980n x=-5500u y=6000u
MN13 vss 12 13 vss N1 L=120n W=280n x=-4000u y=2000u
MP13 vdd 12 13 vdd P1 L=120n W=980n x=-4000u y=6000u
MN14 vss 13 14 vss N1 L=120n W=280n x=-2500u y=2000u
MP14 vdd 13 14 vdd P1 L=120n W=980n x=-2500u y=6000u
MN15 vss 14 15 vss N1 L=120n W=280n x=-1000u y=2000u
MP15 vdd 14 15 vdd P1 L=120n W=980n x=-1000u y=6000u
.ic v(11)=0.0003



.MODEL  N1  NMOS  LEVEL = 54


.MODEL  P1  PMOS  LEVEL = 54



.Variation
  .Global_Variation
      Parameter var=N() Y='180 + 8.02 * var' Z='17.5 + 0.37 * var'
      Nmos N1
  + VTH0=Perturb('Y')
      Pmos P1
  + VTH0=Perturb('Y')
  .End_Global_Variation
  .Local_Variation
      Parameter var=N() T='11.46 * var' U='0.54 * var'
      Nmos N1
  + VTH0=Perturb('T')
      Pmos P1
  + VTH0=Perturb('T')
  .End_Local_Variation

.End_Variation


.dc bias 1 1 1 monte=10
.print I(MN11) I(MP11)
.print I(MN12) I(MP12)
.print I(MN13) I(MP13)
.print I(MN14) I(MP14)
.print I(MN15) I(MP15)

.END

and Hspice tried one of its methods, I think it was successful. This is the result:


Code dot - [expand]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
MONTE CARLO DEFINITIONS
 
 
Random number generator is MOA            , and seed =      1, stream =   1
 
 Only variation block is active, to enable agauss format variation, set option sampling_method = SRS.
 
Global variations:    model               parameter
                      n1                  vth0            
                      p1                  vth0            
 
Local variations:     model               parameter
                      n1                  vth0            
                      p1                  vth0            
 **info** set option symb=1 internally to help for convergence.
 *****************************************************************
 ******  option summary
 ******
 runlvl  = 3         bypass  = 2         
 **warning**(n1:mn11)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp11)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(n1:mn12)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp12)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(n1:mn13)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp13)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(n1:mn14)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp14)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(n1:mn15)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp15)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning** the perturbation  180.00     on the first sample is not zero.
 **warning** the perturbation  180.00     on the first sample is not zero.
 **warning**(n1:mn11)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(n1:mn12)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(n1:mn13)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(n1:mn14)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(n1:mn15)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp11)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp12)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp13)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp14)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp15)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 ** Warning ** Convergence problem in the first
               dc sweep value, Pseudo tran is tried.
 
 **info** number of iteration exceeds min(7000, 20*itl1)=  4000 in pseudo
 tran process (converge=1 process). Usually this happens when the
 models are discontinous, or there are uninitialized bi-stable cells
 (flip-flop) in the circuit. By setting options dcon=-1 and converge=-1
 you can disable auto convergence process. Retry the run, non-convergence
 diagnostics will provide useful information about the nodes and devices
 which can be used to work around the non-convergence problems.
  *** final try failed *** 
 ** Warning ** Convergence problem in the first
             dc sweep value, gmath ramping is tried.
 
 
 [COLOR="#FF0000"]**info** op convergence successful with gmath ramping method[/COLOR]
 
 ******  
 *40ring
 
  ******  dc transfer curves tnom=  25.000 temp=  25.000 *****
 
   *** monte carlo  index =            1 ***
 
x
 
      bias      current      current    
                   mn11         mp11    
    1.00000    -6.236e-28    106.8910m  
y
-----------------------------------------------
x
 
      bias      current      current    
                   mn12         mp12    
    1.00000       0.         111.9755m  
y
-----------------------------------------------
x
 
      bias      current      current    
                   mn13         mp13    
    1.00000    -6.762e-28    112.2295m  
y
-----------------------------------------------
x
 
      bias      current      current    
                   mn14         mp14    
    1.00000    -7.038e-28    111.7191m  
y
-----------------------------------------------
x
 
      bias      current      current    
                   mn15         mp15    
    1.00000    -6.348e-28    167.3795m  
y
-----------------------------------------------
 **warning**(n1:mn11)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp11)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(n1:mn12)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp12)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(n1:mn13)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp13)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(n1:mn14)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp14)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(n1:mn15)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp15)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(n1:mn11)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(n1:mn12)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(n1:mn13)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(n1:mn14)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(n1:mn15)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp11)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp12)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp13)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp14)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp15)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 ** Warning ** Convergence problem in the first
               dc sweep value, Pseudo tran is tried.
 
 **info** number of iteration exceeds min(7000, 20*itl1)=  4000 in pseudo
 tran process (converge=1 process). Usually this happens when the
 models are discontinous, or there are uninitialized bi-stable cells
 (flip-flop) in the circuit. By setting options dcon=-1 and converge=-1
 you can disable auto convergence process. Retry the run, non-convergence
 diagnostics will provide useful information about the nodes and devices
 which can be used to work around the non-convergence problems.
  *** final try failed *** 
 ** Warning ** Convergence problem in the first
             dc sweep value, gmath ramping is tried.
 
[COLOR="#FF0000"]
 **info** op convergence successful with gmath ramping method[/COLOR]
 
 
   *** monte carlo  index =            2 ***
 
x
 
      bias      current      current    
                   mn11         mp11    
    1.00000    -6.861e-28    210.2369m  
y
-----------------------------------------------
x
 
      bias      current      current    
                   mn12         mp12    
    1.00000       0.         119.6979m  
y
-----------------------------------------------
x
 
      bias      current      current    
                   mn13         mp13    
    1.00000    -6.486e-28    210.2991m  
y
-----------------------------------------------
x
 
      bias      current      current    
                   mn14         mp14    
    1.00000    -6.762e-28    170.7002m  
y
-----------------------------------------------
x
 
      bias      current      current    
                   mn15         mp15    
    1.00000    -7.038e-28    205.4880m  
y



Are the result correct? Can I rely on them?
In the meantime, it was said in the hspice reference, that for measuring op values such as current, voltage,... in monte carlo simulation, we must use .MEASURE command. I tried with this command, but no success:

Code:
.Variation
  .Global_Variation
      Parameter var=N() Y='180 + 8.02 * var' Z='17.5 + 0.37 * var'
      Nmos N1
  + VTH0=Perturb('Y')
      Pmos P1
  + VTH0=Perturb('Y')
  .End_Global_Variation
  .Local_Variation
      Parameter var=N() T='11.46 * var' U='0.54 * var'
      Nmos N1
  + VTH0=Perturb('T')
      Pmos P1
  + VTH0=Perturb('T')
  .End_Local_Variation

.End_Variation


.dc bias 1 1 1 monte=10
.measure dc I11 find I(MN11) at=1m
.measure dc I12 find I(MP12) at=1m

.END

result of .MEASURE command:


Code dot - [expand]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
**warning**(p1:mp11)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp12)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp13)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp14)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp15)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 ** Warning ** Convergence problem in the first
               dc sweep value, Pseudo tran is tried.
 
 **info** number of iteration exceeds min(7000, 20*itl1)=  4000 in pseudo
 tran process (converge=1 process). Usually this happens when the
 models are discontinous, or there are uninitialized bi-stable cells
 (flip-flop) in the circuit. By setting options dcon=-1 and converge=-1
 you can disable auto convergence process. Retry the run, non-convergence
 diagnostics will provide useful information about the nodes and devices
 which can be used to work around the non-convergence problems.
  *** final try failed *** 
 ** Warning ** Convergence problem in the first
             dc sweep value, gmath ramping is tried.
 
 
 **info** op convergence successful with gmath ramping method
 
 
   *** monte carlo  index =            8 ***
 
[COLOR="#FF0000"]   i11= failed
   i12= failed[/COLOR]
 **warning**(n1:mn11)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.
 **warning**(p1:mp11)Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.



With using .Measure command, hspice will tell us the sigma & mean & other statistical information of output like:

Code:
 **info** op convergence successful with gmath ramping method


   *** monte carlo  index =           10 ***

   i11= failed
   i12= failed

   meas_variable = i11
   mean  =   0.       varian =   0.     
   sigma =   0.       avgdev =   0.     
   max   =   0.       min    =   0.     
    1-sigma =   0.      median =   0.     

   meas_variable = i12
   mean  =   0.       varian =   0.     
   sigma =   0.       avgdev =   0.     
   max   =   0.       min    =   0.     
    1-sigma =   0.      median =   0.     

          ***** job concluded

That in my case, as is shown, all are 0.

I'm confused about this:?::???::shock:
 
Last edited by a moderator:

You do know that the whole point of an oscillator is that
it has no stable DC solution, right? And that to simulate
such critters, you often need to use some methods like
an asserted initial condition that is released, or a kick-start,
and time domain or quasi-AC, time domain based schemes
like PSS?

Now some oscillators, especially ones with low gain, can be
made to give a DC solution. But this is simulator being lazy,
pretty much, and you can't count on a natural free running
oscillator to give the same result if anything minor changes.
 

So, what do I have to do?can you explain more?

I know that it doesn't have a stable dc status, I add the initial condition 0.003 to that. I know that in the monte carlo simulation, we have to do DC/AC/TRAN simulation. For getting operating point, we need to define a PARAM like that bias and then .dc bias command to measure the operating point. The following is hspice example (it's located in demo/hspice/variability/opampmc.sp folder that hspice is installed):

Code:
.GLOBAL gnda vdda
.PARAM vdd=2.5 vin=vdd/2 k=2

.subckt opamp gnda inn inp out vdda nmosbulk pmosbulk
mn1 net031 inn net044 nmosbulk snps20N L='k*0.5u' W='k*3.5u' M=4
mn2 net18 inp net044 nmosbulk snps20N L='k*0.5u' W='k*3.5u' M=4
mp3 net031 net031 vdda pmosbulk snps20P L='k*0.5u' W='k*4.5u' M=4
mp4 net18 net031 vdda pmosbulk snps20P L='k*0.5u' W='k*4.5u' M=4
mp5 out net18 vdda pmosbulk snps20P L=400e-9 W=10e-6 M=3
mn8 net0148 net0148 gnda nmosbulk snps20N L=3e-6 W=18e-6 M=5
mn7 net044 net0148 gnda nmosbulk snps20N L=3e-6 W=18e-6 M=2
mn6 out net0148 gnda nmosbulk snps20N L=3e-6 W=18e-6 M=12
ccomp out net058 900e-15
rcomp net18 net058 7e3
r0 net0148 vdda 1e6

.ends opamp

c0 in_neg 0 1m
c1 out 0 5e-12
r1 0 out 1e6
r0 in_neg out 10e6
xi82 gnda in_neg in_pos out vdda gnda vdda opamp
v2 0 gnda DC=0
v1 in_pos 0 DC=vin AC 1
v0 vdda 0 DC=vdd

.variation
  .global_variation
     nmos snps20N vth0=0.07 u0=10 %
     pmos snps20P vth0=0.08 u0=8 %
  .end_global_variation
  .local_variation
     nmos snps20N vth0='1.234e-9/sqrt(get_E(W)*get_E(L)*get_E(M))' 
+                 u0='2.345e-6/sqrt(get_E(W)*get_E(L)*get_E(M))' %
     pmos snps20P vth0='1.234e-9/sqrt(get_E(W)*get_E(L)*get_E(M))' 
+                 u0='2.345e-6/sqrt(get_E(W)*get_E(L)*get_E(M))' %
     .element_variation
         R r=10 %
     .end_element_variation
  .end_local_variation
.end_variation

.dc k start=1 stop=4 step=1 monte=1000

.meas DC systoffset1 find V(in_pos,in_neg) at=1
.meas DC systoffset2 find V(in_pos,in_neg) at=2
.meas DC systoffset3 find V(in_pos,in_neg) at=3
.meas DC systoffset4 find V(in_pos,in_neg) at=4

.TEMP 25
.option nomod dcon=1
.option post
.END

As you can see it does the same for opamp. What's my mistake in my code?

1) my converge problem solved. My mistake was with the units on variation, I had to add E-009 to variation.
but now I have a problem:

2) When I use Print command to get current value, it works & give me back the currents of every transistor in each of monte carlo iteration. But I want to use .Measure command to get these values, because they give me the sigma ,& etc like the hspice example above. But no success, what should I do?

3) In my netlist, as you can see, I have a guassian distribution with u=180mv and sigma=8.02mv on vth. But in the model card or library that we include in the netlist, there is a value for vth=0.25. I mean itself has a u value=0.25 If i'm correct.So Is my variation command true?
Code:
 Parameter var=N() Y='180E-009 + 8.02E-009 * var' 
      Nmos N1
  + VTH0=Perturb('Y')
      Pmos P1
  + VTH0=Perturb('Y')
Because I'm applying a new u to the circuit. I saw in the hspice example that it just apply the sigma, not u:
Code:
     nmos snps20N vth0='1.234e-9/sqrt(get_E(W)*get_E(L)*get_E(M))'

So is my command true, or I have to omit the u value & just consider the sigma as below:
Code:
 Parameter var=N() Y='8.02E-009 * var' 
      Nmos N1
  + VTH0=Perturb('Y')
      Pmos P1
  + VTH0=Perturb('Y')
 

You say your .MEAS is not working. Are there simulator
errors / warnings about ignoring them, or any clue about
syntax? I use SmartSpice and the syntax here looks a bit
different than what I have seen (and that syntax is always
a bit of a struggle, when I'm not reusing a known-good
snippet).

Having suffered under a Monte Carlo obsessed regime at
one point in my career, and all of the brittleness that
large PVT MC loops expose at the most inopportune time
(like, crashing over and over as you try to hit your design
review date) I favor the notion of building run file per
PVTM-point and getting a data file apiece, and parsing /
aggregating the results outside the simulator. A good
data file would also include the conditions, so you know
what's what. Some sort of generator script can make
the few changes per file and another could read back
in an orderly way for some postprocessing. An advantage
here is that (if you have the license keys) you can run
as many jobs in parallel as you have hardware and most
significantly, bombing one iteration doesn't kill the rest
that are waiting their turn.
 

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top