Languages

CommunityCategory: XMODELModeling the pulling behavior of an injection-locked oscillator

XMODEL

Modeling the pulling behavior of an injection-locked oscillator

SA Support Team Staff 2023-02-27

An injection-locked oscillator (ILO) may exhibit a pulling behavior. That is, when the injection frequency is close to the free-running frequency of the oscillator but not within its lock range, the phase and frequency of the oscillator may show beat notes, rather than converging to the steady-state values. For example, the figure below from B. Razavi, “A Study of Injection Locking and Pulling in Oscillators,” IEEE Journal of Solid-State Circuits, September 2014 shows the time trajectories of the phase and frequency when the oscillator is being pulled (Figure 9).

Can the 'ilo' primitive of XMODEL model such a behavior?

1 Answers
SA Support Team Staff 2023-02-27

Yes. The 'ilo' primitive models an injection-locked oscillator (ILO) using an advanced concept called “Perturbation Projection Vector (PPV)” and can model various nonlinear behavior of an ILO including the pulling behavior. For more information, please refer to the reference documentation on the 'ilo' primitive and the article, J. Jang and J. Kim, “PPV-based Modeling and Event-Driven Simulation of Injection-Locked Oscillators in SystemVerilog,” IEEE Transactions on Circuits and Systems I, August 2015.

Here is a simple example demonstrating the pulling behavior of an ILO. In this example, an ILO is modeled by the 'ilo' primitive having one injection input and eight phase outputs. In this case, the 'ilo' primitive has the PPV of an 8-phase ring oscillator by default, whose magnitude is scaled by the parameter 'scale' equal to 0.1. The rest of the testbench describes a situation when the ILO has the free-running frequency ('fosc') of 1.05GHz while the injection frequency ('finj') is at 1.0GHz.

`include "xmodel.h"

module tb_ilo ();

    xbit [7:0] out;
    xbit inj_xbit;
    xreal inj;
    xreal freq_out, phase_out;

    parameter real finj = 1.0e9;
    parameter real fosc = 1.05e9;

    ilo           #(.num_in(1), .num_phase(8), .freq('{fosc}), .scale('{0.1}))
                  ILO (.in(inj), .out(out[7:0]), .ctrl(`ground));

    clk_gen       #(.freq(finj))
                  ICLK (inj_xbit);
    transition    #(.value0(-1.0), .value1(1.0))
                  ITRAN (.in(inj_xbit), .out(inj));

    clk_to_freq   IFREQ (.in(out[0]), .out(freq_out));
    clk_to_phase  #(.freq(finj)) IPHASE (.in(out[0]), .out(phase_out));

    initial begin
        $xmodel_dumpfile();
        $xmodel_dumpvars();
    end

endmodule

The simulated waveforms below show the time trajectories of the phase and frequency of the oscillator's output clock 'out[0]'. You can observe the beating notes in the phase and frequency trajectories. This is the pulling behavior, which happens when the injection frequency is close to the free-running frequency of the oscillator but not close enough to achieve a lock.

On the other hand, when the free-running frequency of the oscillator is closer to the injection frequency, the oscillator can achieve an injection lock. The waveforms below show the simulated phase and frequency trajectories of the oscillator when its free-running frequency ('fosc') is at 0.98, 0.99, 1.0, 1.01, and 1.02GHz, respectively. You can obtain these waveforms by using the '--sweep' option of the 'xmodel' launcher script.

xmodel tb_ilo.sv --top tb_ilo --simtime 100ns \
       --sweep tb_ilo.fosc=0.98G,0.99G,1.0G,1.01G,1.02G

You can observe that when the injection frequency is close enough to the free-running frequency of the oscillator, the phase and frequency of the oscillator converge to the steady-state values. In particular, the frequency of the oscillator becomes equal to the frequency of the injection input. On the other hand, the phase of the oscillator may not be exactly equal to that of the injection input, when there is a difference between the free-running frequency and the injection frequency.

XMODEL

Injection-locked 오실레이터의 pulling 동작 모델링하기

SA Support Team Staff 2023-02-27

Injection-locked 오실레이터(ILO) 회로에서는 pulling 현상이 나타날 수 있습니다. 즉, injection되는 입력신호의 주파수가 오실레이터의 free-running 주파수와 가깝기는 하지만, lock range 밖에 있을때, 오실레이터의 위상과 주파수가 각각 일정된 값으로 수렴하지 못하고, 맥놀이 현상을 보이는 것을 말합니다. 예를 들어, B. Razavi, “A Study of Injection Locking and Pulling in Oscillators,” IEEE Journal of Solid-State Circuits, September 2014 논문에서는 오실레이터 회로가 pulling 현상을 보일때의 위상과 주파수의 시간에 따른 변화를 아래 그래프를 통해 보여주고 있습니다 (그림 9).

이러한 현상을 XMODEL의 'ilo' primitive로 표현할 수 있나요?

1 Answers
SA Support Team Staff 2023-02-27

Yes. The 'ilo' primitive models an injection-locked oscillator (ILO) using an advanced concept called “Perturbation Projection Vector (PPV)” and can model various nonlinear behavior of an ILO including the pulling behavior. For more information, please refer to the reference documentation on the 'ilo' primitive and the article, J. Jang and J. Kim, “PPV-based Modeling and Event-Driven Simulation of Injection-Locked Oscillators in SystemVerilog,” IEEE Transactions on Circuits and Systems I, August 2015.

Here is a simple example demonstrating the pulling behavior of an ILO. In this example, an ILO is modeled by the 'ilo' primitive having one injection input and eight phase outputs. In this case, the 'ilo' primitive has the PPV of an 8-phase ring oscillator by default, whose magnitude is scaled by the parameter 'scale' equal to 0.1. The rest of the testbench describes a situation when the ILO has the free-running frequency ('fosc') of 1.05GHz while the injection frequency ('finj') is at 1.0GHz.

`include "xmodel.h"

module tb_ilo ();

    xbit [7:0] out;
    xbit inj_xbit;
    xreal inj;
    xreal freq_out, phase_out;

    parameter real finj = 1.0e9;
    parameter real fosc = 1.05e9;

    ilo           #(.num_in(1), .num_phase(8), .freq('{fosc}), .scale('{0.1}))
                  ILO (.in(inj), .out(out[7:0]), .ctrl(`ground));

    clk_gen       #(.freq(finj))
                  ICLK (inj_xbit);
    transition    #(.value0(-1.0), .value1(1.0))
                  ITRAN (.in(inj_xbit), .out(inj));

    clk_to_freq   IFREQ (.in(out[0]), .out(freq_out));
    clk_to_phase  #(.freq(finj)) IPHASE (.in(out[0]), .out(phase_out));

    initial begin
        $xmodel_dumpfile();
        $xmodel_dumpvars();
    end

endmodule

The simulated waveforms below show the time trajectories of the phase and frequency of the oscillator's output clock 'out[0]'. You can observe the beating notes in the phase and frequency trajectories. This is the pulling behavior, which happens when the injection frequency is close to the free-running frequency of the oscillator but not close enough to achieve a lock.

On the other hand, when the free-running frequency of the oscillator is closer to the injection frequency, the oscillator can achieve an injection lock. The waveforms below show the simulated phase and frequency trajectories of the oscillator when its free-running frequency ('fosc') is at 0.98, 0.99, 1.0, 1.01, and 1.02GHz, respectively. You can obtain these waveforms by using the '--sweep' option of the 'xmodel' launcher script.

xmodel tb_ilo.sv --top tb_ilo --simtime 100ns \
       --sweep tb_ilo.fosc=0.98G,0.99G,1.0G,1.01G,1.02G

You can observe that when the injection frequency is close enough to the free-running frequency of the oscillator, the phase and frequency of the oscillator converge to the steady-state values. In particular, the frequency of the oscillator becomes equal to the frequency of the injection input. On the other hand, the phase of the oscillator may not be exactly equal to that of the injection input, when there is a difference between the free-running frequency and the injection frequency.