Phase-Locked Loop (PLL) is used to compensate delay in its feedback path, which can be used for different purposes. The most frequent uses are to compensate the clock tree delay/depth or to compensate the IO delay (or both).
A decade ago, accounting for the compensation in STA timing used to be a haedache. See P. Zimmer. Working with PLLs in PrimeTime – avoiding the phase locked oops, SNUG San Jose 2005, http://www.zimmerdesignservices.com/mydownloads/zimmer_pll_update_051405.pdf
Presently, EDA vendors provide methods to identify a PLL cell and its feedback path, hence letting STA engines to account for the compensation themselves.
The timing model has to achieve the following:
- Identify a cell is indeed a PLL.
- Identify the critical pin functions (i.e. the reference clock input, feedback input and PLL clock output) that create the compensation loop.
- Identify PLL internal delay (from the reference input to the clock output).
Here is an example we will be using:
cell(xpll) {
is_pll_cell : true;
pin( REFCLK ) {
direction : input;
is_pll_reference_pin : true;
}
pin( FBKCLK ) {
direction : input;
is_pll_feedback_pin : true;
}
pin (PLLCLK) {
direction : output;
is_pll_output_pin : true;
timing() {
related_pin: "REFCLK";
timing_sense: positive_unate;
cell_fall(scalar) { values("1.5"); }
cell_rise(scalar) { values("1.5"); }
fall_transition(scalar) { values("0.1"); }
rise_transition(scalar) { values("0.1"); }
}
}
}
Let us consider the following circuit:
module circ_pll(clk);
wire clkref, clkpll;
wire cts1, clkfb;
wire a, b, c;
bufx4 buf1( .A(clk), .Y(clkref) );
xpll pll( .REFCLK(clkref), .FBKCLK(clkfb), .PLLCLK(clkpll) );
bufx4 buf1( .A(clkpll), .Y(cts1) );
bufx4 buf1( .A(cts1), .Y(clkfb) );
dffrx1 FF1( .CK(clkref), .RB(1'b1), .D(a), .Q(b) );
dffrx1 FF2( .CK(clkfb), .RB(1'b1), .D(b), .Q(c) );
dffrx1 FF2a( .CK(cts1), .RB(1'b1), .D(b), .Q() );
dffrx1 FF3( .CK(clkref), .RB(1'b1), .D(c), .Q() );
endmodule
create_clock -name CLK -period 10 clk
create_generated_clock -name PLLCLK -multiply_by 1 -source pll/REFCLK pll/PLLCLK
Startpoint: FF2 (rising edge-triggered flip-flop clocked by PLLCLK)
Endpoint: FF3 (rising edge-triggered flip-flop clocked by CLK)
Last common pin: buf1/Y
Path Group: CLK
Path Type: max
Point Incr Path
------------------------------------------------------------------------------
clock PLLCLK (rise edge) 0.00 0.00
clock CLK (source latency) 0.00 0.00
clk (in) 0.00 0.00 r
buf1/Y (bufx4) 1.00 1.00 r
pll/PLLCLK (xpll) (gclock source) 1.50 2.50 r
buf2/Y (bufx4) 1.00 3.50 r
buf3/Y (bufx4) 1.00 4.50 r
FF2/CK (dffrx1) 0.00 4.50 r
FF2/Q (dffrx1) 3.00 7.50 r
FF3/D (dffrx1) 0.00 7.50 r
data arrival time 7.50
clock CLK (rise edge) 10.00 10.00
clock source latency 0.00 10.00
clk (in) 0.00 10.00 r
buf1/Y (bufx4) 1.00 11.00 r
FF3/CK (dffrx1) 0.00 11.00 r
clock reconvergence pessimism 0.00 11.00
library setup time -0.70 10.30
data required time 10.30
------------------------------------------------------------------------------
data required time 10.30
data arrival time -7.50
------------------------------------------------------------------------------
slack (MET) 2.80
create_generated_clock -name PLLCLK -multiply_by 1 -source pll/REFCLK pll/PLLCLK -pll_output pll/PLLCLK -pll_feedback pll/FBKCLK
Startpoint: FF2 (rising edge-triggered flip-flop clocked by PLLCLK)
Endpoint: FF3 (rising edge-triggered flip-flop clocked by CLK)
Last common pin: clk
Path Group: CLK
Path Type: max
Point Incr Path
------------------------------------------------------------------------------
clock PLLCLK (rise edge) 0.00 0.00
clock CLK (source latency) 0.00 0.00
clk (in) 0.00 0.00 r
buf1/Y (bufx4) 1.00 1.00 r
pll/PLLCLK (xpll) (gclock source) -2.00 H -1.00 r
buf2/Y (bufx4) 1.00 0.00 r
buf3/Y (bufx4) 1.00 1.00 r
FF2/CK (dffrx1) 0.00 1.00 r
FF2/Q (dffrx1) <- 3.00 4.00 r
FF3/D (dffrx1) 0.00 4.00 r
data arrival time 4.00
clock CLK (rise edge) 10.00 10.00
clock source latency 0.00 10.00
clk (in) 0.00 10.00 r
buf1/Y (bufx4) 1.00 11.00 r
FF3/CK (dffrx1) 0.00 11.00 r
clock reconvergence pessimism 0.00 11.00
library setup time -0.70 10.30
data required time 10.30
------------------------------------------------------------------------------
data required time 10.30
data arrival time -4.00
------------------------------------------------------------------------------
slack (MET) 6.30
Startpoint: FF1 (rising edge-triggered flip-flop clocked by CLK)
Endpoint: FF2a (rising edge-triggered flip-flop clocked by PLLCLK)
Last common pin: clk
Path Group: PLLCLK
Path Type: max
Point Incr Path
------------------------------------------------------------------------------
clock CLK (rise edge) 0.00 0.00
clock source latency 0.00 0.00
clk (in) 0.00 0.00 r
buf1/Y (bufx4) 1.00 1.00 r
FF1/CK (dffrx1) 0.00 1.00 r
FF1/Q (dffrx1) 3.00 4.00 r
FF2a/D (dffrx1) 0.00 4.00 r
data arrival time 4.00
clock PLLCLK (rise edge) 10.00 10.00
clock CLK (source latency) 0.00 10.00
clk (in) 0.00 10.00 r
buf1/Y (bufx4) 1.00 11.00 r
pll/PLLCLK (xpll) (gclock source) -2.00 H 9.00 r
buf2/Y (bufx4) 1.00 10.00 r
FF2a/CK (dffrx1) 0.00 10.00 r
clock reconvergence pessimism 0.00 10.00
library setup time -0.70 9.30
data required time 9.30
------------------------------------------------------------------------------
data required time 9.30
data arrival time -4.00
------------------------------------------------------------------------------
slack (MET) 5.30
Path 1: MET Setup Check with Pin FF3/CK
Endpoint: FF3/D (v) checked with leading edge of 'CLK'
Beginpoint: FF2/Q (v) triggered by leading edge of 'PLLCLK'
Path Groups: {CLK}
Other End Arrival Time 1.000
- Setup 0.700
+ Phase Shift 10.000
= Required Time 10.300
- Arrival Time 7.500
= Slack Time 2.800
Clock Rise Edge 0.000
= Beginpoint Arrival Time 0.000
Timing Path:
-------------------------------------------------------------------------------------
Instance Arc Cell Delay Arrival Required Generated Clock
Time Time Adjustment
-------------------------------------------------------------------------------------
- clk ^ - - 0.000 2.800 -
buf1 A ^ -> Y ^ bufx4 1.000 1.000 3.800 -
pll REFCLK ^ -> PLLCLK ^ xpll 1.500 2.500 5.300 PLLCLK Adj. = 0.000
buf2 A ^ -> Y ^ bufx4 1.000 3.500 6.300 -
buf3 A ^ -> Y ^ bufx4 1.000 4.500 7.300 -
FF2 CK ^ -> Q v dffrx1 3.000 7.500 10.300 -
FF3 D v dffrx1 0.000 7.500 10.300 -
-------------------------------------------------------------------------------------
Clock Rise Edge 0.000
= Beginpoint Arrival Time 0.000
Other End Path:
-----------------------------------------------------------------------
Instance Arc Cell Delay Arrival Required Generated Clock
Time Time Adjustment
-----------------------------------------------------------------------
- clk ^ - - 0.000 -2.800 -
buf1 A ^ -> Y ^ bufx4 1.000 1.000 -1.800 -
FF3 CK ^ dffrx1 0.000 1.000 -1.800 -
-----------------------------------------------------------------------
set_pll_timing [get_cells pll] -reference_pin REFCLK -feedback_pin FBKCLK -output_pin PLLCLK -output_clock [get_clock PLLCLK]
Path 1: MET Setup Check with Pin FF3/CK
Endpoint: FF3/D (v) checked with leading edge of 'CLK'
Beginpoint: FF2/Q (v) triggered by leading edge of 'PLLCLK'
Path Groups: {CLK}
Other End Arrival Time 1.000
- Setup 0.700
+ Phase Shift 10.000
= Required Time 10.300
- Arrival Time 4.000
= Slack Time 6.300
Clock Rise Edge 0.000
= Beginpoint Arrival Time 0.000
Timing Path:
---------------------------------------------------------------------------------
Instance Arc Cell Delay Arrival Required Generated Clock
Time Time Adjustment
---------------------------------------------------------------------------------
- clk ^ - - 0.000 6.300 -
buf1 A ^ -> Y ^ bufx4 1.000 1.000 7.300 -
pll PLLCLK ^ - - -1.000 5.300 PLLCLK Pll Adj. = -2.000
buf2 A ^ -> Y ^ bufx4 1.000 0.000 6.300 -
buf3 A ^ -> Y ^ bufx4 1.000 1.000 7.300 -
FF2 CK ^ -> Q v dffrx1 3.000 4.000 10.300 -
FF3 D v dffrx1 0.000 4.000 10.300 -
---------------------------------------------------------------------------------
Clock Rise Edge 0.000
= Beginpoint Arrival Time 0.000
Other End Path:
-----------------------------------------------------------------------
Instance Arc Cell Delay Arrival Required Generated Clock
Time Time Adjustment
-----------------------------------------------------------------------
- clk ^ - - 0.000 -6.300 -
buf1 A ^ -> Y ^ bufx4 1.000 1.000 -5.300 -
FF3 CK ^ dffrx1 0.000 1.000 -5.300 -
-----------------------------------------------------------------------