When you need to include noisy oscillators in SpectreRF transceiver simulations, you have at least 3 options:

1) Semi-autonomous simulation is the most accurate approach, recommended whenever the transistor-level model of the oscillator is available.

2) rfLib/osc model is less accurate but it’s well-suited for "what-if" design exploration. Since rfLib/osc uses Leeson’s noise formula, it doesn’t allow for arbitrary specification of phase noise profiles as a function of frequency.

3) Use PORTs and other sources with noisefiles. This approach lets users specify arbitrary noise profiles, but it omits sideband correlation data. In practice, this means that AM and PM components of the noise are modeled incorrectly. For oscillators in particular, the AM component is grossly exaggerated and the PM component of the noise is underestimated. As a result, this approach isn’t recommend for oscillator noise modeling.

**Our Goal: Develop a Behavioral Oscillator Model w/ an Arbitrary Phase Noise Profile for Use in Virtuoso/SpectreRF**

One strategy is:

Use a frequency-dependent noise source which directly phase-modulates an otherwise ideal oscillator.

The noise source is modeled using a voltage source + noisefile.

This gives us two main benefits:

1. By virtue of direct phase modulation the oscillator’s noise is now all PM, which a good model of near-carrier oscillator noise.

2. By virtue of using noisefiles, we can now specify arbitrary noise profiles as a function of frequency.

**A Simple Mathematical Model of the Oscillator**

Below is a simple mathematical model of the oscillator.

Let v(t) be the open-circuit voltage of our oscillator and φ(t) the random phase:Using the small noise assumption, and remembering that sin(x+y)=cos(x)sin(y)+sin(x)cos(y),

An equivalent system model of the above equation (1) is shown below:

**Below is the Verilog-A Implementation**

`include "constants.vams"

`include "disciplines.vams"

// power: available power (dBm) default: 10 dBm

// freq: output frequency (Hz) default: 1 GHz

// rout: output impedance (Ohm) default: 50 Ohm

`define db10_real(x) pow(10, (x)/10)

`define dbm2pow(x) `db10_real( ((x)-30) )

`define pow2v(x,r) sqrt(8*(r)*(x))

module oscwphnoise(out, ph);

inout out;

input ph;

electrical out;

electrical ph;

electrical gnd;

ground gnd;

electrical int;

parameter real power = 10 ;

parameter real rout = 50 ;

parameter real freq = 1e+09 ;

isource #(.type("sine"), .ampl(`pow2v(`dbm2pow(power),rout)/rout), .freq(freq) ) is1(gnd,out);

vsource #(.type("sine"), .ampl(`pow2v(`dbm2pow(power),rout)/rout), .sinephase(-90), .freq(freq) ) vs1(gnd,int);

analog begin

I(out) <+ -V(int)*V(ph);

I(out) <+ V(out)/rout;

end

endmodule

**What Do We Apply to the Terminal φ to Model Noise?**

Use the well-known relationship between the single sideband noise to carrier ratio and the spectral density of φ(t), which is valid for small offsets f:

L(f) = 0.5*Sφ(f)

So the phase φ(t) is a signal whose noise spectrum is given by:

2*pow(10, LdBc(f)/10)

To model this in Spectre, use a DC voltage source and specify the noise spectrum in a noisefile. You calculate the noisefile using Excel.

**Calculating the Noisefile Contents in Excel**

**A Complete Model**

The complete model is shown below:

**Example Results**

Below are results showing hb and hbnoise (phase noise) results:

**To explore this further,** login into Cadence Online Support and see __https://support.cadence.com/__ Solution 11775686.

Have fun simulating!

best regards,

Tawna