Ken Kundert
|
I do not believe you are doing a good job starting your oscillator. The oscillator should start with default tolerances.
Here is how to start a resonant oscillator: 1. Set maxstep so that you will get at least 10 steps per cycle but no more than 20 (this is optional) 2. Apply damped sine wave to the resonator (either voltage or current, which ever is more convenient). The built-in sinusoidal sources accept 'damp', a damping factor parameter, when present the amplitude goes to zero with a time constant of 1/damp. a. choose the frequency to equal the resonant frequency of the resonator. b. choose the amplitude to be as large as possible without being unreasonable. c. choose the damping factor so that the oscillator starts quickly with default tolerances. Try not to overdrive the oscillator.
You should not be adjusting the secondary accuracy settings unless you know what you are doing. This includes relref and method. Instead, you should follow the following algorithm: 1. Start with the default tolerances (always do this). That means, that all of the tolerance and accuracy settings should be left unspecified (reltol, vabstol, iabstol, method, gmin, errpreset, relref, etc.). To be clear, the default tolerances are reltol=0.001, vabstol=1uV, iabstol=1pA; view the logfile to assure that these are being used. 2. Simulate. 3. Examine the results. If they look good, you are done. If they are not accurate enough, tighten reltol. If the simulator seems to be misbehaving, set errpreset=conservative. If you see point-to-point ringing in your results (check the supply currents), set method=gear2only. 4. Go to step 2
relref=sigglobal is the default. It is adequate when all signals levels are roughly the same size, as in your circuit. relref=alllocal is used when the signals are badly scaled. This can happen if you use behavioral models. For example, if in your circuit you were to write a frequency meter that output the VCO frequency in volts, then it would appear as if there were a 2.4GV signal present in your circuit. In this situation you would use relref=alllocal. You can determine if this is this is needed by setting the 'diagnose' option. It will tell you the largest voltage found anywhere in the circuit. If it is much larger than Vdd, then you should either use errpreset=conservative (recommended) or relref=alllocal. Never use relref=allglobal, it is too loose. I don't recommend relref=pointlocal. I have never seen a situation where it was called for.
You should still try to understand the situation with the varactor currents. If you like, you can email the varactor model directly to me and I will look to see if it has any of the common problems. PDKs are notorious for having problematic behavioral models.
-Ken
|