Useful skew: borrowing time between stages

Delay one register's clock on purpose to lend time from a short stage to a long one, and know the three limits: hold, loops and the cells that build the delay.

Lesson
L5.4
Time
30 min
Runs on
OpenROAD
Check
5 questions

A three-register pipeline missed a 1.25 ns clock by 0.3415 ns in its first stage. The stage after the middle register had 0.6964 ns to spare. Cutting the long stage again would add a cycle of latency.

Timing pathStage A misses the clockFlop a0 launches, the middle register r1 captures; six xor2_1 cells sit between them. The clock is ideal: every flop sees the edge at 0 ns.

a1 → r1setup check, latest arrival7 cells

  • Clock latency
  • Cell delay
  • Setup time
Stage A misses the clock00.20.40.60.811.21.4time (ns)launch clk ↑capture clk ↑Data arrivesRequired bya1/CLK → a1/Q (dfxtp_1): 0.4872 ns1 dfxtp_1m1/B → m1/X (xor2_1): 0.1173 ns2m2/A → m2/X (xor2_1): 0.1781 ns3 xor2_1m3/A → m3/X (xor2_1): 0.1781 ns4 xor2_1m4/A → m4/X (xor2_1): 0.1781 ns5 xor2_1m5/A → m5/X (xor2_1): 0.1781 ns6 xor2_1m6/A → m6/X (xor2_1): 0.1649 ns7 xor2_1setup −0.1096 nsslack −0.3415 ns · violatedarrival 1.4819required 1.1404Stage A misses the clock00.511.5time (ns)launch clk ↑capture clk ↑Data arrivesRequired bya1/CLK → a1/Q (dfxtp_1): 0.4872 ns1 dfxtp_1m1/B → m1/X (xor2_1): 0.1173 ns2m2/A → m2/X (xor2_1): 0.1781 ns3m3/A → m3/X (xor2_1): 0.1781 ns4m4/A → m4/X (xor2_1): 0.1781 ns5m5/A → m5/X (xor2_1): 0.1781 ns6m6/A → m6/X (xor2_1): 0.1649 ns7setup −0.1096 nsslack −0.3415 ns · violatedarrival 1.4819required 1.1404
  1. A long stage

    Clock-to-Q and six XOR gates: the data arrives at 1.4819 ns.

  2. The next edge

    r1 samples at 1.25 ns, less its setup time: required at 1.1404 ns.

  3. Violated

    The data comes too late for this edge, and the slack is -0.3415 ns.

Read the path as a table

Launch: clk rise edge at 0.0000 ns, clock latency 0.0000 ns (ideal). Capture: clk rise edge at 1.2500 ns, latency 0.0000 ns, library setup time −0.1096 ns.

Arrival 1.4819 ns, required 1.1404 ns, slack −0.3415 ns (violated).

CellArcThroughEdgeDelay (ns)Time (ns)Slew (ns)
1a1/CLK → a1/Qdfxtp_1rise0.48720.48720.2741
a1/Q → m1/Bwire qa1rise0.00000.48720.2741
2m1/B → m1/Xxor2_1fall0.11730.60450.0897
m1/X → m2/Awire s1fall0.00000.60450.0897
3m2/A → m2/Xxor2_1fall0.17810.78270.0897
m2/X → m3/Awire s2fall0.00000.78270.0897
4m3/A → m3/Xxor2_1fall0.17810.96080.0897
m3/X → m4/Awire s3fall0.00000.96080.0897
5m4/A → m4/Xxor2_1fall0.17811.13890.0897
m4/X → m5/Awire s4fall0.00001.13890.0897
6m5/A → m5/Xxor2_1fall0.17811.31700.0897
m5/X → m6/Awire s5fall0.00001.31700.0897
7m6/A → m6/Xxor2_1fall0.16491.48190.0723
m6/X → r1/Dwire s6fall0.00001.48190.0723
The report
Startpoint: a1 (rising edge-triggered flip-flop clocked by clk)
Endpoint: r1 (rising edge-triggered flip-flop clocked by clk)
Path Group: stageA
Path Type: max

Fanout       Cap      Slew     Delay      Time   Description
-------------------------------------------------------------------------------------
                    0.1000    0.0000    0.0000   clock clk (rise edge)
                              0.0000    0.0000   clock network delay (ideal)
                    0.1000    0.0000    0.0000 ^ a1/CLK (sky130_fd_sc_hd__dfxtp_1)
     7    0.0286    0.2741    0.4872    0.4872 ^ a1/Q (sky130_fd_sc_hd__dfxtp_1)
                                                 qa1 (net)
                    0.2741    0.0000    0.4872 ^ m1/B (sky130_fd_sc_hd__xor2_1)
     1    0.0042    0.0897    0.1173    0.6045 v m1/X (sky130_fd_sc_hd__xor2_1)
                                                 s1 (net)
                    0.0897    0.0000    0.6045 v m2/A (sky130_fd_sc_hd__xor2_1)
     1    0.0042    0.0897    0.1781    0.7827 v m2/X (sky130_fd_sc_hd__xor2_1)
                                                 s2 (net)
                    0.0897    0.0000    0.7827 v m3/A (sky130_fd_sc_hd__xor2_1)
     1    0.0042    0.0897    0.1781    0.9608 v m3/X (sky130_fd_sc_hd__xor2_1)
                                                 s3 (net)
                    0.0897    0.0000    0.9608 v m4/A (sky130_fd_sc_hd__xor2_1)
     1    0.0042    0.0897    0.1781    1.1389 v m4/X (sky130_fd_sc_hd__xor2_1)
                                                 s4 (net)
                    0.0897    0.0000    1.1389 v m5/A (sky130_fd_sc_hd__xor2_1)
     1    0.0042    0.0897    0.1781    1.3170 v m5/X (sky130_fd_sc_hd__xor2_1)
                                                 s5 (net)
                    0.0897    0.0000    1.3170 v m6/A (sky130_fd_sc_hd__xor2_1)
     1    0.0017    0.0723    0.1649    1.4819 v m6/X (sky130_fd_sc_hd__xor2_1)
                                                 s6 (net)
                    0.0723    0.0000    1.4819 v r1/D (sky130_fd_sc_hd__dfxtp_1)
                                        1.4819   data arrival time

                    0.1000    1.2500    1.2500   clock clk (rise edge)
                              0.0000    1.2500   clock network delay (ideal)
                              0.0000    1.2500   clock reconvergence pessimism
                                        1.2500 ^ r1/CLK (sky130_fd_sc_hd__dfxtp_1)
                             -0.1096    1.1404   library setup time
                                        1.1404   data required time
-------------------------------------------------------------------------------------
                                        1.1404   data required time
                                       -1.4819   data arrival time
-------------------------------------------------------------------------------------
                                       -0.3415   slack (VIOLATED)

OpenSTA 3.1.0, sky130_fd_sc_hd tt library, ideal clock with a 0.1 ns clock slew, no wires.

The fix that worked moved no logic and added no flop, only a clock edge.

A late clock lends time

Call the middle register R: stage A ends at R and stage B starts there. Now delay R's clock by a latency L. For stage A, R is the capture flop, so its skew Lcapture − Llaunch is +L and its setup slack gains L. For stage B, R is the launch flop, so its skew is −L and its setup slack loses L. Time moves from stage B to stage A. Using skew this way is called useful skew, or clock skew scheduling.

The plot is one OpenSTA run of seven copies of the pipeline. Each copy gives R a different ideal latency with a pin-level set_clock_latency. The two setup slacks move in opposite directions by exactly L.

Measured sweepThree checks against the middle register's clock latencyA 1.25 ns ideal clock. Stage A ends at R, stage B starts at R, and "hold into R" is the shortest path into R: one and2_1.
  • stage A setup
  • stage B setup
  • hold into R
-400 ps-200 ps0200 ps400 ps600 ps800 psSlack0100 ps200 ps300 ps400 ps500 ps600 psLatency of Rslack 0-400 ps-200 ps0200 ps400 ps600 ps800 psSlack0200 ps400 ps600 psLatency of Rslack 0
  1. Latency of R 0 sstage A setup = -341.5 ps · stage B setup = 696.4 ps · hold into R = 474.2 ps

    No skew: stage A -0.3415 ns, stage B 0.6964 ns, hold into R 0.4742 ns.

  2. Latency of R 400 psstage A setup = 58.5 ps · stage B setup = 296.4 ps · hold into R = 74.2 ps

    0.4 ns: stage A 0.0585 ns, stage B 0.2964 ns, hold 0.0742 ns. Every check passes.

  3. Latency of R 500 psstage A setup = 158.5 ps · stage B setup = 196.4 ps · hold into R = -25.8 ps

    0.5 ns: hold into R is -0.0258 ns. The late edge now catches the next value on the short path.

Read the plot as a table
Latency of Rstage A setupstage B setuphold into R
0 s-341.5 ps696.4 ps474.2 ps
100 ps-241.5 ps596.4 ps374.2 ps
200 ps-141.5 ps496.4 ps274.2 ps
300 ps-41.5 ps396.4 ps174.2 ps
400 ps58.5 ps296.4 ps74.2 ps
400 ps58.5 ps296.4 ps74.2 ps
500 ps158.5 ps196.4 ps-25.8 ps
600 ps258.5 ps96.4 ps-125.8 ps

OpenSTA 3.1.0, dfxtp_1, xor2_1 and and2_1 from the sky130_fd_sc_hd tt library, no wires.

The first limit is hold, on the stage that gains. Delaying R makes R hold its old value longer, so the shortest path into R must arrive later. Here hold fails above 0.4742 ns of latency, and stage A needs at least 0.3415 ns. The window between them is only 0.1327 ns wide. A wider one costs delay on the short path, which is hold repair (L5.5).

Stage A with R's clock 0.4 ns late
Timing pathStage A with a late capture edge

a1 → r1setup check, latest arrival7 cells

  • Clock latency
  • Cell delay
  • Setup time
Stage A with a late capture edge00.20.40.60.811.21.41.6time (ns)launch clk ↑capture clk ↑Data arrivesRequired bya1/CLK → a1/Q (dfxtp_1): 0.4872 ns1 dfxtp_1m1/B → m1/X (xor2_1): 0.1173 ns2m2/A → m2/X (xor2_1): 0.1781 ns3m3/A → m3/X (xor2_1): 0.1781 ns4m4/A → m4/X (xor2_1): 0.1781 ns5m5/A → m5/X (xor2_1): 0.1781 ns6m6/A → m6/X (xor2_1): 0.1649 ns7clock 0.4000 nssetup −0.1096 nsslack +0.0585 ns · metarrival 1.4819required 1.5404Stage A with a late capture edge00.511.5time (ns)launch clk ↑capture clk ↑Data arrivesRequired bya1/CLK → a1/Q (dfxtp_1): 0.4872 ns1 dfxtp_1m1/B → m1/X (xor2_1): 0.1173 ns2m2/A → m2/X (xor2_1): 0.1781 ns3m3/A → m3/X (xor2_1): 0.1781 ns4m4/A → m4/X (xor2_1): 0.1781 ns5m5/A → m5/X (xor2_1): 0.1781 ns6m6/A → m6/X (xor2_1): 0.1649 ns7clock 0.4000 nssetup −0.1096 nsslack +0.0585 ns · metarrival 1.4819required 1.5404
  1. Capture latency

    R's edge comes 0.4000 ns late, and the required time moves with it.

  2. Met

    The same data now meets setup with a slack of 0.0585 ns.

Read the path as a table

Launch: clk rise edge at 0.0000 ns, clock latency 0.0000 ns (ideal). Capture: clk rise edge at 1.2500 ns, latency 0.4000 ns, library setup time −0.1096 ns.

Arrival 1.4819 ns, required 1.5404 ns, slack 0.0585 ns (met).

CellArcThroughEdgeDelay (ns)Time (ns)Slew (ns)
1a1/CLK → a1/Qdfxtp_1rise0.48720.48720.2741
a1/Q → m1/Bwire qa1rise0.00000.48720.2741
2m1/B → m1/Xxor2_1fall0.11730.60450.0897
m1/X → m2/Awire s1fall0.00000.60450.0897
3m2/A → m2/Xxor2_1fall0.17810.78270.0897
m2/X → m3/Awire s2fall0.00000.78270.0897
4m3/A → m3/Xxor2_1fall0.17810.96080.0897
m3/X → m4/Awire s3fall0.00000.96080.0897
5m4/A → m4/Xxor2_1fall0.17811.13890.0897
m4/X → m5/Awire s4fall0.00001.13890.0897
6m5/A → m5/Xxor2_1fall0.17811.31700.0897
m5/X → m6/Awire s5fall0.00001.31700.0897
7m6/A → m6/Xxor2_1fall0.16491.48190.0723
m6/X → r1/Dwire s6fall0.00001.48190.0723
The report
Startpoint: a1 (rising edge-triggered flip-flop clocked by clk)
Endpoint: r1 (rising edge-triggered flip-flop clocked by clk)
Path Group: stageA
Path Type: max

Fanout       Cap      Slew     Delay      Time   Description
-------------------------------------------------------------------------------------
                    0.1000    0.0000    0.0000   clock clk (rise edge)
                              0.0000    0.0000   clock network delay (ideal)
                    0.1000    0.0000    0.0000 ^ a1/CLK (sky130_fd_sc_hd__dfxtp_1)
     7    0.0286    0.2741    0.4872    0.4872 ^ a1/Q (sky130_fd_sc_hd__dfxtp_1)
                                                 qa1 (net)
                    0.2741    0.0000    0.4872 ^ m1/B (sky130_fd_sc_hd__xor2_1)
     1    0.0042    0.0897    0.1173    0.6045 v m1/X (sky130_fd_sc_hd__xor2_1)
                                                 s1 (net)
                    0.0897    0.0000    0.6045 v m2/A (sky130_fd_sc_hd__xor2_1)
     1    0.0042    0.0897    0.1781    0.7827 v m2/X (sky130_fd_sc_hd__xor2_1)
                                                 s2 (net)
                    0.0897    0.0000    0.7827 v m3/A (sky130_fd_sc_hd__xor2_1)
     1    0.0042    0.0897    0.1781    0.9608 v m3/X (sky130_fd_sc_hd__xor2_1)
                                                 s3 (net)
                    0.0897    0.0000    0.9608 v m4/A (sky130_fd_sc_hd__xor2_1)
     1    0.0042    0.0897    0.1781    1.1389 v m4/X (sky130_fd_sc_hd__xor2_1)
                                                 s4 (net)
                    0.0897    0.0000    1.1389 v m5/A (sky130_fd_sc_hd__xor2_1)
     1    0.0042    0.0897    0.1781    1.3170 v m5/X (sky130_fd_sc_hd__xor2_1)
                                                 s5 (net)
                    0.0897    0.0000    1.3170 v m6/A (sky130_fd_sc_hd__xor2_1)
     1    0.0017    0.0723    0.1649    1.4819 v m6/X (sky130_fd_sc_hd__xor2_1)
                                                 s6 (net)
                    0.0723    0.0000    1.4819 v r1/D (sky130_fd_sc_hd__dfxtp_1)
                                        1.4819   data arrival time

                    0.1000    1.2500    1.2500   clock clk (rise edge)
                              0.4000    1.6500   clock network delay (ideal)
                              0.0000    1.6500   clock reconvergence pessimism
                                        1.6500 ^ r1/CLK (sky130_fd_sc_hd__dfxtp_1)
                             -0.1096    1.5404   library setup time
                                        1.5404   data required time
-------------------------------------------------------------------------------------
                                        1.5404   data required time
                                       -1.4819   data arrival time
-------------------------------------------------------------------------------------
                                        0.0585   slack (MET)

set_clock_latency 0.4 [get_pins {r0/CLK r1/CLK}] on the ideal clock.

Loops give nothing back

The second limit is loops. Follow a path of registers that returns to where it started. Each register's latency is added once as a capture and taken away once as a launch. So the skews around a loop add up to zero: skew can move time between the stages of a loop, but never add any. Ignoring hold, variation and other paths, two stage delays da and db have a lower period bound (da + db) / 2.

The MAC's registers and its one loopArrows are data. acc feeds the adder that feeds acc.
The MAC's registers and its one loopArrows are data. `acc` feeds the adder that feeds `acc`. component ra, rb operand registers component multiplier stage into p component p product register component adder acc + p component acc accumulator datadatadatasumacc
  1. A path that skew can help

    p → adder → acc: delaying acc gives it time, taken from paths that start at acc.

  2. A common vector latency cancels

    acc is a vector. This path crosses different bits; giving every bit the same latency moves both ends equally.

Read the diagram as text
  • ra, rb: operand registers
  • multiplier: stage into p
  • p: product register
  • adder: acc + p
  • acc: accumulator
  • ra, rb → multiplier: data
  • multiplier → p: data
  • p → adder: data
  • adder → acc: sum
  • acc → adder: acc

R4.5's MAC, mapped to sky130 cells.

At 4.2 ns the MAC's adder stage fails twice. The path from p fails by 0.0797 ns and the loop from acc by 0.0959 ns. Delay all of acc by 0.15 ns and the first path passes at 0.0703 ns, while the loop does not move at all.

Timing pathThe accumulator loop with acc's clock lateThe worst acc → acc path at 4.2 ns, with set_clock_latency 0.15 on all twenty acc clock pins.

_809_ → _827_setup check, latest arrival16 cells

  • Clock latency
  • Cell delay
  • Setup time
The accumulator loop with acc's clock late00.511.522.533.544.5time (ns)launch clk ↑capture clk ↑Data arrivesRequired byclock 0.1500 ns_809_/CLK → _809_/Q (dfrtp_1): 0.3700 ns1_607_/A → _607_/Y (xnor2_1): 0.2090 ns2_619_/A2 → _619_/Y (o21ai_0): 0.1481 ns3_641_/C → _641_/X (maj3_1): 0.3990 ns4_663_/C → _663_/X (maj3_1): 0.3921 ns5_685_/C → _685_/X (maj3_1): 0.3921 ns6_707_/C → _707_/X (maj3_1): 0.4037 ns7_727_/A1 → _727_/Y (a211oi_1): 0.2652 ns8_729_/A3 → _729_/Y (o31ai_1): 0.1414 ns9_731_/A2 → _731_/X (o211a_1): 0.2244 ns10_734_/A3 → _734_/Y (o311ai_0): 0.4243 ns11_736_/A3 → _736_/Y (a31oi_1): 0.1878 ns12_737_/A2 → _737_/Y (a21oi_1): 0.2650 ns13_740_/A2 → _740_/Y (a211oi_1): 0.1644 ns14_742_/C → _742_/Y (nand3_1): 0.1214 ns_748_/B → _748_/Y (xnor2_1): 0.1081 nsclock 0.1500 nssetup −0.0799 nsslack −0.0959 ns · violatedarrival 4.3659required 4.2701The accumulator loop with acc's clock late01234time (ns)launch clk ↑capture clk ↑Data arrivesRequired byclock 0.1500 ns_809_/CLK → _809_/Q (dfrtp_1): 0.3700 ns1_607_/A → _607_/Y (xnor2_1): 0.2090 ns2_619_/A2 → _619_/Y (o21ai_0): 0.1481 ns_641_/C → _641_/X (maj3_1): 0.3990 ns4_663_/C → _663_/X (maj3_1): 0.3921 ns5_685_/C → _685_/X (maj3_1): 0.3921 ns6_707_/C → _707_/X (maj3_1): 0.4037 ns7_727_/A1 → _727_/Y (a211oi_1): 0.2652 ns8_729_/A3 → _729_/Y (o31ai_1): 0.1414 ns_731_/A2 → _731_/X (o211a_1): 0.2244 ns_734_/A3 → _734_/Y (o311ai_0): 0.4243 ns11_736_/A3 → _736_/Y (a31oi_1): 0.1878 ns_737_/A2 → _737_/Y (a21oi_1): 0.2650 ns13_740_/A2 → _740_/Y (a211oi_1): 0.1644 ns_742_/C → _742_/Y (nand3_1): 0.1214 ns_748_/B → _748_/Y (xnor2_1): 0.1081 nsclock 0.1500 nssetup −0.0799 nsslack −0.0959 ns · violatedarrival 4.3659required 4.2701
  1. Late launch

    The launch edge at the acc flop comes 0.15 ns late.

  2. Late capture

    So does the capture edge: another acc bit, the same 0.15 ns.

  3. Unchanged

    The slack stays at -0.0959 ns, exactly what the loop had with no latency at all.

Read the path as a table

Launch: clk rise edge at 0.0000 ns, clock latency 0.1500 ns (ideal). Capture: clk rise edge at 4.2000 ns, latency 0.1500 ns, library setup time −0.0799 ns.

Arrival 4.3659 ns, required 4.2701 ns, slack −0.0959 ns (violated).

CellArcThroughEdgeDelay (ns)Time (ns)Slew (ns)
1_809_/CLK → _809_/Qdfrtp_1fall0.37000.52000.0674
_809_/Q → _607_/Awire acc[1]fall0.00000.52000.0674
2_607_/A → _607_/Yxnor2_1rise0.20900.72900.1928
_607_/Y → _619_/A2wire _080_rise0.00000.72900.1928
3_619_/A2 → _619_/Yo21ai_0fall0.14810.87710.1149
_619_/Y → _641_/Cwire _081_fall0.00000.87710.1149
4_641_/C → _641_/Xmaj3_1fall0.39901.27600.0920
_641_/X → _663_/Cwire _083_fall0.00001.27600.0920
5_663_/C → _663_/Xmaj3_1fall0.39211.66820.0920
_663_/X → _685_/Cwire _085_fall0.00001.66820.0920
6_685_/C → _685_/Xmaj3_1fall0.39212.06030.0920
_685_/X → _707_/Cwire _087_fall0.00002.06030.0920
7_707_/C → _707_/Xmaj3_1fall0.40372.46400.1013
_707_/X → _727_/A1wire _089_fall0.00002.46400.1013
8_727_/A1 → _727_/Ya211oi_1rise0.26522.72920.2531
_727_/Y → _729_/A3wire _093_rise0.00002.72920.2531
9_729_/A3 → _729_/Yo31ai_1fall0.14142.87060.0941
_729_/Y → _731_/A2wire _095_fall0.00002.87060.0941
10_731_/A2 → _731_/Xo211a_1fall0.22443.09500.0449
_731_/X → _734_/A3wire _097_fall0.00003.09500.0449
11_734_/A3 → _734_/Yo311ai_0rise0.42433.51920.4921
_734_/Y → _736_/A3wire _100_rise0.00003.51920.4921
12_736_/A3 → _736_/Ya31oi_1fall0.18783.70700.1296
_736_/Y → _737_/A2wire _101_fall0.00003.70700.1296
13_737_/A2 → _737_/Ya21oi_1rise0.26503.97200.2375
_737_/Y → _740_/A2wire _102_rise0.00003.97200.2375
14_740_/A2 → _740_/Ya211oi_1fall0.16444.13650.1196
_740_/Y → _742_/Cwire _105_fall0.00004.13650.1196
15_742_/C → _742_/Ynand3_1rise0.12144.25780.0801
_742_/Y → _748_/Bwire _107_rise0.00004.25780.0801
16_748_/B → _748_/Yxnor2_1rise0.10814.36590.1022
_748_/Y → _827_/Dwire _048_rise0.00004.36590.1022
The report
Startpoint: _809_ (rising edge-triggered flip-flop clocked by clk)
Endpoint: _827_ (rising edge-triggered flip-flop clocked by clk)
Path Group: accToAcc
Path Type: max

Fanout       Cap      Slew     Delay      Time   Description
-------------------------------------------------------------------------------------
                    0.0000    0.0000    0.0000   clock clk (rise edge)
                              0.1500    0.1500   clock network delay (ideal)
                    0.0000    0.0000    0.1500 ^ _809_/CLK (sky130_fd_sc_hd__dfrtp_1)
     4    0.0088    0.0674    0.3700    0.5200 v _809_/Q (sky130_fd_sc_hd__dfrtp_1)
                                                 acc[1] (net)
                    0.0674    0.0000    0.5200 v _607_/A (sky130_fd_sc_hd__xnor2_1)
     2    0.0065    0.1928    0.2090    0.7290 ^ _607_/Y (sky130_fd_sc_hd__xnor2_1)
                                                 _080_ (net)
                    0.1928    0.0000    0.7290 ^ _619_/A2 (sky130_fd_sc_hd__o21ai_0)
     2    0.0073    0.1149    0.1481    0.8771 v _619_/Y (sky130_fd_sc_hd__o21ai_0)
                                                 _081_ (net)
                    0.1149    0.0000    0.8771 v _641_/C (sky130_fd_sc_hd__maj3_1)
     2    0.0073    0.0920    0.3990    1.2760 v _641_/X (sky130_fd_sc_hd__maj3_1)
                                                 _083_ (net)
                    0.0920    0.0000    1.2760 v _663_/C (sky130_fd_sc_hd__maj3_1)
     2    0.0073    0.0920    0.3921    1.6682 v _663_/X (sky130_fd_sc_hd__maj3_1)
                                                 _085_ (net)
                    0.0920    0.0000    1.6682 v _685_/C (sky130_fd_sc_hd__maj3_1)
     2    0.0073    0.0920    0.3921    2.0603 v _685_/X (sky130_fd_sc_hd__maj3_1)
                                                 _087_ (net)
                    0.0920    0.0000    2.0603 v _707_/C (sky130_fd_sc_hd__maj3_1)
     3    0.0090    0.1013    0.4037    2.4640 v _707_/X (sky130_fd_sc_hd__maj3_1)
                                                 _089_ (net)
                    0.1013    0.0000    2.4640 v _727_/A1 (sky130_fd_sc_hd__a211oi_1)
     2    0.0052    0.2531    0.2652    2.7292 ^ _727_/Y (sky130_fd_sc_hd__a211oi_1)
                                                 _093_ (net)
                    0.2531    0.0000    2.7292 ^ _729_/A3 (sky130_fd_sc_hd__o31ai_1)
     3    0.0088    0.0941    0.1414    2.8706 v _729_/Y (sky130_fd_sc_hd__o31ai_1)
                                                 _095_ (net)
                    0.0941    0.0000    2.8706 v _731_/A2 (sky130_fd_sc_hd__o211a_1)
     2    0.0038    0.0449    0.2244    3.0950 v _731_/X (sky130_fd_sc_hd__o211a_1)
                                                 _097_ (net)
                    0.0449    0.0000    3.0950 v _734_/A3 (sky130_fd_sc_hd__o311ai_0)
     3    0.0073    0.4921    0.4243    3.5192 ^ _734_/Y (sky130_fd_sc_hd__o311ai_0)
                                                 _100_ (net)
                    0.4921    0.0000    3.5192 ^ _736_/A3 (sky130_fd_sc_hd__a31oi_1)
     2    0.0067    0.1296    0.1878    3.7070 v _736_/Y (sky130_fd_sc_hd__a31oi_1)
                                                 _101_ (net)
                    0.1296    0.0000    3.7070 v _737_/A2 (sky130_fd_sc_hd__a21oi_1)
     3    0.0096    0.2375    0.2650    3.9720 ^ _737_/Y (sky130_fd_sc_hd__a21oi_1)
                                                 _102_ (net)
                    0.2375    0.0000    3.9720 ^ _740_/A2 (sky130_fd_sc_hd__a211oi_1)
     4    0.0109    0.1196    0.1644    4.1365 v _740_/Y (sky130_fd_sc_hd__a211oi_1)
                                                 _105_ (net)
                    0.1196    0.0000    4.1365 v _742_/C (sky130_fd_sc_hd__nand3_1)
     1    0.0047    0.0801    0.1214    4.2578 ^ _742_/Y (sky130_fd_sc_hd__nand3_1)
                                                 _107_ (net)
                    0.0801    0.0000    4.2578 ^ _748_/B (sky130_fd_sc_hd__xnor2_1)
     1    0.0020    0.1022    0.1081    4.3659 ^ _748_/Y (sky130_fd_sc_hd__xnor2_1)
                                                 _048_ (net)
                    0.1022    0.0000    4.3659 ^ _827_/D (sky130_fd_sc_hd__dfrtp_1)
                                        4.3659   data arrival time

                    0.0000    4.2000    4.2000   clock clk (rise edge)
                              0.1500    4.3500   clock network delay (ideal)
                              0.0000    4.3500   clock reconvergence pessimism
                                        4.3500 ^ _827_/CLK (sky130_fd_sc_hd__dfrtp_1)
                             -0.0799    4.2701   library setup time
                                        4.2701   data required time
-------------------------------------------------------------------------------------
                                        4.2701   data required time
                                       -4.3659   data arrival time
-------------------------------------------------------------------------------------
                                       -0.0959   slack (VIOLATED)

OpenSTA 3.1.0 on the bundled MAC netlist, ideal clock, no wires.

The other two paths of this comparison
Timing pathp to acc, with acc's clock late

_793_ → _827_setup check, latest arrival16 cells

  • Clock latency
  • Cell delay
  • Setup time
p to acc, with acc's clock late00.511.522.533.544.5time (ns)launch clk ↑capture clk ↑Data arrivesRequired by_793_/CLK → _793_/Q (dfrtp_1): 0.3716 ns1_607_/B → _607_/Y (xnor2_1): 0.1911 ns2_619_/A2 → _619_/Y (o21ai_0): 0.1481 ns3_641_/C → _641_/X (maj3_1): 0.3990 ns4_663_/C → _663_/X (maj3_1): 0.3921 ns5_685_/C → _685_/X (maj3_1): 0.3921 ns6_707_/C → _707_/X (maj3_1): 0.4037 ns7_727_/A1 → _727_/Y (a211oi_1): 0.2652 ns8_729_/A3 → _729_/Y (o31ai_1): 0.1414 ns9_731_/A2 → _731_/X (o211a_1): 0.2244 ns10_734_/A3 → _734_/Y (o311ai_0): 0.4243 ns11_736_/A3 → _736_/Y (a31oi_1): 0.1878 ns12_737_/A2 → _737_/Y (a21oi_1): 0.2650 ns13_740_/A2 → _740_/Y (a211oi_1): 0.1644 ns14_742_/C → _742_/Y (nand3_1): 0.1214 ns_748_/B → _748_/Y (xnor2_1): 0.1081 nsclock 0.1500 nssetup −0.0799 nsslack +0.0703 ns · metarrival 4.1997required 4.2701p to acc, with acc's clock late01234time (ns)launch clk ↑capture clk ↑Data arrivesRequired by_793_/CLK → _793_/Q (dfrtp_1): 0.3716 ns1_607_/B → _607_/Y (xnor2_1): 0.1911 ns2_619_/A2 → _619_/Y (o21ai_0): 0.1481 ns_641_/C → _641_/X (maj3_1): 0.3990 ns4_663_/C → _663_/X (maj3_1): 0.3921 ns5_685_/C → _685_/X (maj3_1): 0.3921 ns6_707_/C → _707_/X (maj3_1): 0.4037 ns7_727_/A1 → _727_/Y (a211oi_1): 0.2652 ns8_729_/A3 → _729_/Y (o31ai_1): 0.1414 ns_731_/A2 → _731_/X (o211a_1): 0.2244 ns_734_/A3 → _734_/Y (o311ai_0): 0.4243 ns11_736_/A3 → _736_/Y (a31oi_1): 0.1878 ns_737_/A2 → _737_/Y (a21oi_1): 0.2650 ns13_740_/A2 → _740_/Y (a211oi_1): 0.1644 ns_742_/C → _742_/Y (nand3_1): 0.1214 ns_748_/B → _748_/Y (xnor2_1): 0.1081 nsclock 0.1500 nssetup −0.0799 nsslack +0.0703 ns · metarrival 4.1997required 4.2701
Read the path as a table

Launch: clk rise edge at 0.0000 ns, clock latency 0.0000 ns (ideal). Capture: clk rise edge at 4.2000 ns, latency 0.1500 ns, library setup time −0.0799 ns.

Arrival 4.1997 ns, required 4.2701 ns, slack 0.0703 ns (met).

CellArcThroughEdgeDelay (ns)Time (ns)Slew (ns)
1_793_/CLK → _793_/Qdfrtp_1fall0.37160.37160.0688
_793_/Q → _607_/Bwire p[1]fall0.00000.37160.0688
2_607_/B → _607_/Yxnor2_1rise0.19110.56280.1928
_607_/Y → _619_/A2wire _080_rise0.00000.56280.1928
3_619_/A2 → _619_/Yo21ai_0fall0.14810.71090.1149
_619_/Y → _641_/Cwire _081_fall0.00000.71090.1149
4_641_/C → _641_/Xmaj3_1fall0.39901.10980.0920
_641_/X → _663_/Cwire _083_fall0.00001.10980.0920
5_663_/C → _663_/Xmaj3_1fall0.39211.50200.0920
_663_/X → _685_/Cwire _085_fall0.00001.50200.0920
6_685_/C → _685_/Xmaj3_1fall0.39211.89410.0920
_685_/X → _707_/Cwire _087_fall0.00001.89410.0920
7_707_/C → _707_/Xmaj3_1fall0.40372.29780.1013
_707_/X → _727_/A1wire _089_fall0.00002.29780.1013
8_727_/A1 → _727_/Ya211oi_1rise0.26522.56300.2531
_727_/Y → _729_/A3wire _093_rise0.00002.56300.2531
9_729_/A3 → _729_/Yo31ai_1fall0.14142.70440.0941
_729_/Y → _731_/A2wire _095_fall0.00002.70440.0941
10_731_/A2 → _731_/Xo211a_1fall0.22442.92880.0449
_731_/X → _734_/A3wire _097_fall0.00002.92880.0449
11_734_/A3 → _734_/Yo311ai_0rise0.42433.35300.4921
_734_/Y → _736_/A3wire _100_rise0.00003.35300.4921
12_736_/A3 → _736_/Ya31oi_1fall0.18783.54080.1296
_736_/Y → _737_/A2wire _101_fall0.00003.54080.1296
13_737_/A2 → _737_/Ya21oi_1rise0.26503.80580.2375
_737_/Y → _740_/A2wire _102_rise0.00003.80580.2375
14_740_/A2 → _740_/Ya211oi_1fall0.16443.97030.1196
_740_/Y → _742_/Cwire _105_fall0.00003.97030.1196
15_742_/C → _742_/Ynand3_1rise0.12144.09160.0801
_742_/Y → _748_/Bwire _107_rise0.00004.09160.0801
16_748_/B → _748_/Yxnor2_1rise0.10814.19970.1022
_748_/Y → _827_/Dwire _048_rise0.00004.19970.1022
The report
Startpoint: _793_ (rising edge-triggered flip-flop clocked by clk)
Endpoint: _827_ (rising edge-triggered flip-flop clocked by clk)
Path Group: pToAcc
Path Type: max

Fanout       Cap      Slew     Delay      Time   Description
-------------------------------------------------------------------------------------
                    0.0000    0.0000    0.0000   clock clk (rise edge)
                              0.0000    0.0000   clock network delay (ideal)
                    0.0000    0.0000    0.0000 ^ _793_/CLK (sky130_fd_sc_hd__dfrtp_1)
     3    0.0091    0.0688    0.3716    0.3716 v _793_/Q (sky130_fd_sc_hd__dfrtp_1)
                                                 p[1] (net)
                    0.0688    0.0000    0.3716 v _607_/B (sky130_fd_sc_hd__xnor2_1)
     2    0.0065    0.1928    0.1911    0.5628 ^ _607_/Y (sky130_fd_sc_hd__xnor2_1)
                                                 _080_ (net)
                    0.1928    0.0000    0.5628 ^ _619_/A2 (sky130_fd_sc_hd__o21ai_0)
     2    0.0073    0.1149    0.1481    0.7109 v _619_/Y (sky130_fd_sc_hd__o21ai_0)
                                                 _081_ (net)
                    0.1149    0.0000    0.7109 v _641_/C (sky130_fd_sc_hd__maj3_1)
     2    0.0073    0.0920    0.3990    1.1098 v _641_/X (sky130_fd_sc_hd__maj3_1)
                                                 _083_ (net)
                    0.0920    0.0000    1.1098 v _663_/C (sky130_fd_sc_hd__maj3_1)
     2    0.0073    0.0920    0.3921    1.5020 v _663_/X (sky130_fd_sc_hd__maj3_1)
                                                 _085_ (net)
                    0.0920    0.0000    1.5020 v _685_/C (sky130_fd_sc_hd__maj3_1)
     2    0.0073    0.0920    0.3921    1.8941 v _685_/X (sky130_fd_sc_hd__maj3_1)
                                                 _087_ (net)
                    0.0920    0.0000    1.8941 v _707_/C (sky130_fd_sc_hd__maj3_1)
     3    0.0090    0.1013    0.4037    2.2978 v _707_/X (sky130_fd_sc_hd__maj3_1)
                                                 _089_ (net)
                    0.1013    0.0000    2.2978 v _727_/A1 (sky130_fd_sc_hd__a211oi_1)
     2    0.0052    0.2531    0.2652    2.5630 ^ _727_/Y (sky130_fd_sc_hd__a211oi_1)
                                                 _093_ (net)
                    0.2531    0.0000    2.5630 ^ _729_/A3 (sky130_fd_sc_hd__o31ai_1)
     3    0.0088    0.0941    0.1414    2.7044 v _729_/Y (sky130_fd_sc_hd__o31ai_1)
                                                 _095_ (net)
                    0.0941    0.0000    2.7044 v _731_/A2 (sky130_fd_sc_hd__o211a_1)
     2    0.0038    0.0449    0.2244    2.9288 v _731_/X (sky130_fd_sc_hd__o211a_1)
                                                 _097_ (net)
                    0.0449    0.0000    2.9288 v _734_/A3 (sky130_fd_sc_hd__o311ai_0)
     3    0.0073    0.4921    0.4243    3.3530 ^ _734_/Y (sky130_fd_sc_hd__o311ai_0)
                                                 _100_ (net)
                    0.4921    0.0000    3.3530 ^ _736_/A3 (sky130_fd_sc_hd__a31oi_1)
     2    0.0067    0.1296    0.1878    3.5408 v _736_/Y (sky130_fd_sc_hd__a31oi_1)
                                                 _101_ (net)
                    0.1296    0.0000    3.5408 v _737_/A2 (sky130_fd_sc_hd__a21oi_1)
     3    0.0096    0.2375    0.2650    3.8058 ^ _737_/Y (sky130_fd_sc_hd__a21oi_1)
                                                 _102_ (net)
                    0.2375    0.0000    3.8058 ^ _740_/A2 (sky130_fd_sc_hd__a211oi_1)
     4    0.0109    0.1196    0.1644    3.9703 v _740_/Y (sky130_fd_sc_hd__a211oi_1)
                                                 _105_ (net)
                    0.1196    0.0000    3.9703 v _742_/C (sky130_fd_sc_hd__nand3_1)
     1    0.0047    0.0801    0.1214    4.0916 ^ _742_/Y (sky130_fd_sc_hd__nand3_1)
                                                 _107_ (net)
                    0.0801    0.0000    4.0916 ^ _748_/B (sky130_fd_sc_hd__xnor2_1)
     1    0.0020    0.1022    0.1081    4.1997 ^ _748_/Y (sky130_fd_sc_hd__xnor2_1)
                                                 _048_ (net)
                    0.1022    0.0000    4.1997 ^ _827_/D (sky130_fd_sc_hd__dfrtp_1)
                                        4.1997   data arrival time

                    0.0000    4.2000    4.2000   clock clk (rise edge)
                              0.1500    4.3500   clock network delay (ideal)
                              0.0000    4.3500   clock reconvergence pessimism
                                        4.3500 ^ _827_/CLK (sky130_fd_sc_hd__dfrtp_1)
                             -0.0799    4.2701   library setup time
                                        4.2701   data required time
-------------------------------------------------------------------------------------
                                        4.2701   data required time
                                       -4.1997   data arrival time
-------------------------------------------------------------------------------------
                                        0.0703   slack (MET)

The same run: the capture edge moved, the launch edge did not.

Timing pathacc to acc, no latency

_809_ → _827_setup check, latest arrival16 cells

  • Clock latency
  • Cell delay
  • Setup time
acc to acc, no latency00.511.522.533.54time (ns)launch clk ↑capture clk ↑Data arrivesRequired by_809_/CLK → _809_/Q (dfrtp_1): 0.3700 ns1_607_/A → _607_/Y (xnor2_1): 0.2090 ns2_619_/A2 → _619_/Y (o21ai_0): 0.1481 ns3_641_/C → _641_/X (maj3_1): 0.3990 ns4_663_/C → _663_/X (maj3_1): 0.3921 ns5_685_/C → _685_/X (maj3_1): 0.3921 ns6_707_/C → _707_/X (maj3_1): 0.4037 ns7_727_/A1 → _727_/Y (a211oi_1): 0.2652 ns8_729_/A3 → _729_/Y (o31ai_1): 0.1414 ns9_731_/A2 → _731_/X (o211a_1): 0.2244 ns10_734_/A3 → _734_/Y (o311ai_0): 0.4243 ns11_736_/A3 → _736_/Y (a31oi_1): 0.1878 ns12_737_/A2 → _737_/Y (a21oi_1): 0.2650 ns13_740_/A2 → _740_/Y (a211oi_1): 0.1644 ns14_742_/C → _742_/Y (nand3_1): 0.1214 ns_748_/B → _748_/Y (xnor2_1): 0.1081 nssetup −0.0799 nsslack −0.0959 ns · violatedarrival 4.2159required 4.1201acc to acc, no latency01234time (ns)launch clk ↑capture clk ↑Data arrivesRequired by_809_/CLK → _809_/Q (dfrtp_1): 0.3700 ns1_607_/A → _607_/Y (xnor2_1): 0.2090 ns2_619_/A2 → _619_/Y (o21ai_0): 0.1481 ns_641_/C → _641_/X (maj3_1): 0.3990 ns4_663_/C → _663_/X (maj3_1): 0.3921 ns5_685_/C → _685_/X (maj3_1): 0.3921 ns6_707_/C → _707_/X (maj3_1): 0.4037 ns7_727_/A1 → _727_/Y (a211oi_1): 0.2652 ns8_729_/A3 → _729_/Y (o31ai_1): 0.1414 ns_731_/A2 → _731_/X (o211a_1): 0.2244 ns_734_/A3 → _734_/Y (o311ai_0): 0.4243 ns11_736_/A3 → _736_/Y (a31oi_1): 0.1878 ns_737_/A2 → _737_/Y (a21oi_1): 0.2650 ns13_740_/A2 → _740_/Y (a211oi_1): 0.1644 ns_742_/C → _742_/Y (nand3_1): 0.1214 ns_748_/B → _748_/Y (xnor2_1): 0.1081 nssetup −0.0799 nsslack −0.0959 ns · violatedarrival 4.2159required 4.1201
Read the path as a table

Launch: clk rise edge at 0.0000 ns, clock latency 0.0000 ns (ideal). Capture: clk rise edge at 4.2000 ns, latency 0.0000 ns, library setup time −0.0799 ns.

Arrival 4.2159 ns, required 4.1201 ns, slack −0.0959 ns (violated).

CellArcThroughEdgeDelay (ns)Time (ns)Slew (ns)
1_809_/CLK → _809_/Qdfrtp_1fall0.37000.37000.0674
_809_/Q → _607_/Awire acc[1]fall0.00000.37000.0674
2_607_/A → _607_/Yxnor2_1rise0.20900.57900.1928
_607_/Y → _619_/A2wire _080_rise0.00000.57900.1928
3_619_/A2 → _619_/Yo21ai_0fall0.14810.72710.1149
_619_/Y → _641_/Cwire _081_fall0.00000.72710.1149
4_641_/C → _641_/Xmaj3_1fall0.39901.12600.0920
_641_/X → _663_/Cwire _083_fall0.00001.12600.0920
5_663_/C → _663_/Xmaj3_1fall0.39211.51820.0920
_663_/X → _685_/Cwire _085_fall0.00001.51820.0920
6_685_/C → _685_/Xmaj3_1fall0.39211.91030.0920
_685_/X → _707_/Cwire _087_fall0.00001.91030.0920
7_707_/C → _707_/Xmaj3_1fall0.40372.31400.1013
_707_/X → _727_/A1wire _089_fall0.00002.31400.1013
8_727_/A1 → _727_/Ya211oi_1rise0.26522.57920.2531
_727_/Y → _729_/A3wire _093_rise0.00002.57920.2531
9_729_/A3 → _729_/Yo31ai_1fall0.14142.72060.0941
_729_/Y → _731_/A2wire _095_fall0.00002.72060.0941
10_731_/A2 → _731_/Xo211a_1fall0.22442.94500.0449
_731_/X → _734_/A3wire _097_fall0.00002.94500.0449
11_734_/A3 → _734_/Yo311ai_0rise0.42433.36920.4921
_734_/Y → _736_/A3wire _100_rise0.00003.36920.4921
12_736_/A3 → _736_/Ya31oi_1fall0.18783.55700.1296
_736_/Y → _737_/A2wire _101_fall0.00003.55700.1296
13_737_/A2 → _737_/Ya21oi_1rise0.26503.82200.2375
_737_/Y → _740_/A2wire _102_rise0.00003.82200.2375
14_740_/A2 → _740_/Ya211oi_1fall0.16443.98650.1196
_740_/Y → _742_/Cwire _105_fall0.00003.98650.1196
15_742_/C → _742_/Ynand3_1rise0.12144.10780.0801
_742_/Y → _748_/Bwire _107_rise0.00004.10780.0801
16_748_/B → _748_/Yxnor2_1rise0.10814.21590.1022
_748_/Y → _827_/Dwire _048_rise0.00004.21590.1022
The report
Startpoint: _809_ (rising edge-triggered flip-flop clocked by clk)
Endpoint: _827_ (rising edge-triggered flip-flop clocked by clk)
Path Group: accToAcc
Path Type: max

Fanout       Cap      Slew     Delay      Time   Description
-------------------------------------------------------------------------------------
                    0.0000    0.0000    0.0000   clock clk (rise edge)
                              0.0000    0.0000   clock network delay (ideal)
                    0.0000    0.0000    0.0000 ^ _809_/CLK (sky130_fd_sc_hd__dfrtp_1)
     4    0.0088    0.0674    0.3700    0.3700 v _809_/Q (sky130_fd_sc_hd__dfrtp_1)
                                                 acc[1] (net)
                    0.0674    0.0000    0.3700 v _607_/A (sky130_fd_sc_hd__xnor2_1)
     2    0.0065    0.1928    0.2090    0.5790 ^ _607_/Y (sky130_fd_sc_hd__xnor2_1)
                                                 _080_ (net)
                    0.1928    0.0000    0.5790 ^ _619_/A2 (sky130_fd_sc_hd__o21ai_0)
     2    0.0073    0.1149    0.1481    0.7271 v _619_/Y (sky130_fd_sc_hd__o21ai_0)
                                                 _081_ (net)
                    0.1149    0.0000    0.7271 v _641_/C (sky130_fd_sc_hd__maj3_1)
     2    0.0073    0.0920    0.3990    1.1260 v _641_/X (sky130_fd_sc_hd__maj3_1)
                                                 _083_ (net)
                    0.0920    0.0000    1.1260 v _663_/C (sky130_fd_sc_hd__maj3_1)
     2    0.0073    0.0920    0.3921    1.5182 v _663_/X (sky130_fd_sc_hd__maj3_1)
                                                 _085_ (net)
                    0.0920    0.0000    1.5182 v _685_/C (sky130_fd_sc_hd__maj3_1)
     2    0.0073    0.0920    0.3921    1.9103 v _685_/X (sky130_fd_sc_hd__maj3_1)
                                                 _087_ (net)
                    0.0920    0.0000    1.9103 v _707_/C (sky130_fd_sc_hd__maj3_1)
     3    0.0090    0.1013    0.4037    2.3140 v _707_/X (sky130_fd_sc_hd__maj3_1)
                                                 _089_ (net)
                    0.1013    0.0000    2.3140 v _727_/A1 (sky130_fd_sc_hd__a211oi_1)
     2    0.0052    0.2531    0.2652    2.5792 ^ _727_/Y (sky130_fd_sc_hd__a211oi_1)
                                                 _093_ (net)
                    0.2531    0.0000    2.5792 ^ _729_/A3 (sky130_fd_sc_hd__o31ai_1)
     3    0.0088    0.0941    0.1414    2.7206 v _729_/Y (sky130_fd_sc_hd__o31ai_1)
                                                 _095_ (net)
                    0.0941    0.0000    2.7206 v _731_/A2 (sky130_fd_sc_hd__o211a_1)
     2    0.0038    0.0449    0.2244    2.9450 v _731_/X (sky130_fd_sc_hd__o211a_1)
                                                 _097_ (net)
                    0.0449    0.0000    2.9450 v _734_/A3 (sky130_fd_sc_hd__o311ai_0)
     3    0.0073    0.4921    0.4243    3.3692 ^ _734_/Y (sky130_fd_sc_hd__o311ai_0)
                                                 _100_ (net)
                    0.4921    0.0000    3.3692 ^ _736_/A3 (sky130_fd_sc_hd__a31oi_1)
     2    0.0067    0.1296    0.1878    3.5570 v _736_/Y (sky130_fd_sc_hd__a31oi_1)
                                                 _101_ (net)
                    0.1296    0.0000    3.5570 v _737_/A2 (sky130_fd_sc_hd__a21oi_1)
     3    0.0096    0.2375    0.2650    3.8220 ^ _737_/Y (sky130_fd_sc_hd__a21oi_1)
                                                 _102_ (net)
                    0.2375    0.0000    3.8220 ^ _740_/A2 (sky130_fd_sc_hd__a211oi_1)
     4    0.0109    0.1196    0.1644    3.9865 v _740_/Y (sky130_fd_sc_hd__a211oi_1)
                                                 _105_ (net)
                    0.1196    0.0000    3.9865 v _742_/C (sky130_fd_sc_hd__nand3_1)
     1    0.0047    0.0801    0.1214    4.1078 ^ _742_/Y (sky130_fd_sc_hd__nand3_1)
                                                 _107_ (net)
                    0.0801    0.0000    4.1078 ^ _748_/B (sky130_fd_sc_hd__xnor2_1)
     1    0.0020    0.1022    0.1081    4.2159 ^ _748_/Y (sky130_fd_sc_hd__xnor2_1)
                                                 _048_ (net)
                    0.1022    0.0000    4.2159 ^ _827_/D (sky130_fd_sc_hd__dfrtp_1)
                                        4.2159   data arrival time

                    0.0000    4.2000    4.2000   clock clk (rise edge)
                              0.0000    4.2000   clock network delay (ideal)
                              0.0000    4.2000   clock reconvergence pessimism
                                        4.2000 ^ _827_/CLK (sky130_fd_sc_hd__dfrtp_1)
                             -0.0799    4.1201   library setup time
                                        4.1201   data required time
-------------------------------------------------------------------------------------
                                        4.1201   data required time
                                       -4.2159   data arrival time
-------------------------------------------------------------------------------------
                                       -0.0959   slack (VIOLATED)

The loop with an ideal clock and no latency.

With one shared latency for all accumulator bits, this path still needs 4.2959 ns. This is not a bound for arbitrary per-bit skew. Retiming can move registers within a loop while preserving its total register count; skew can redistribute stage budgets, but adds no total time around a cycle.

Building the delay

The third limit is that an ideal latency costs nothing, and silicon does. The delay must be real cells on R's clock branch. Here two clkdlybuf4s18_1 cells, clock delay buffers, stand in for the 0.4 ns of the SDC.

Timing pathStage A with R's clock through two delay buffersA propagated clock: every flop's latency is its real clock path. R's clock passes dl1 and dl2 (clkdlybuf4s18_1).

a1 → r1setup check, latest arrival7 cells

  • Clock latency
  • Cell delay
  • Setup time
Stage A with R's clock through two delay buffers00.20.40.60.811.21.41.6time (ns)launch clk ↑capture clk ↑Data arrivesRequired bya1/CLK → a1/Q (dfxtp_1): 0.4872 ns1 dfxtp_1m1/B → m1/X (xor2_1): 0.1173 ns2m2/A → m2/X (xor2_1): 0.1781 ns3m3/A → m3/X (xor2_1): 0.1781 ns4m4/A → m4/X (xor2_1): 0.1781 ns5m5/A → m5/X (xor2_1): 0.1781 ns6m6/A → m6/X (xor2_1): 0.1649 ns7clock 0.3935 nssetup −0.1217 nsslack +0.0399 ns · metarrival 1.4819required 1.5218Stage A with R's clock through two delay buffers00.511.5time (ns)launch clk ↑capture clk ↑Data arrivesRequired bya1/CLK → a1/Q (dfxtp_1): 0.4872 ns1 dfxtp_1m1/B → m1/X (xor2_1): 0.1173 ns2m2/A → m2/X (xor2_1): 0.1781 ns3m3/A → m3/X (xor2_1): 0.1781 ns4m4/A → m4/X (xor2_1): 0.1781 ns5m5/A → m5/X (xor2_1): 0.1781 ns6m6/A → m6/X (xor2_1): 0.1649 ns7clock 0.3935 nssetup −0.1217 nsslack +0.0399 ns · metarrival 1.4819required 1.5218
  1. Launch

    a0 is clocked straight from the port, so its launch latency is 0.0000 ns.

  2. Built latency

    R's clock arrives 0.3935 ns late, through the two delay buffers.

  3. Met

    Stage A meets setup with the built delay, at a slack of 0.0399 ns.

Read the path as a table

Launch: clk rise edge at 0.0000 ns, clock latency 0.0000 ns. Capture: clk rise edge at 1.2500 ns, latency 0.3935 ns, library setup time −0.1217 ns.

Arrival 1.4819 ns, required 1.5218 ns, slack 0.0399 ns (met).

CellArcThroughEdgeDelay (ns)Time (ns)Slew (ns)
1a1/CLK → a1/Qdfxtp_1rise0.48720.48720.2741
a1/Q → m1/Bwire qa1rise0.00000.48720.2741
2m1/B → m1/Xxor2_1fall0.11730.60450.0897
m1/X → m2/Awire s1fall0.00000.60450.0897
3m2/A → m2/Xxor2_1fall0.17810.78270.0897
m2/X → m3/Awire s2fall0.00000.78270.0897
4m3/A → m3/Xxor2_1fall0.17810.96080.0897
m3/X → m4/Awire s3fall0.00000.96080.0897
5m4/A → m4/Xxor2_1fall0.17811.13890.0897
m4/X → m5/Awire s4fall0.00001.13890.0897
6m5/A → m5/Xxor2_1fall0.17811.31700.0897
m5/X → m6/Awire s5fall0.00001.31700.0897
7m6/A → m6/Xxor2_1fall0.16491.48190.0723
m6/X → r1/Dwire s6fall0.00001.48190.0723
The report
Startpoint: a1 (rising edge-triggered flip-flop clocked by clk)
Endpoint: r1 (rising edge-triggered flip-flop clocked by clk)
Path Group: stageA
Path Type: max

Fanout       Cap      Slew     Delay      Time   Description
-------------------------------------------------------------------------------------
                              0.0000    0.0000   clock clk (rise edge)
                              0.0000    0.0000   clock source latency
     4    0.0079    0.1000    0.0000    0.0000 ^ clk (in)
                                                 clk (net)
                    0.1000    0.0000    0.0000 ^ a1/CLK (sky130_fd_sc_hd__dfxtp_1)
     7    0.0286    0.2741    0.4872    0.4872 ^ a1/Q (sky130_fd_sc_hd__dfxtp_1)
                                                 qa1 (net)
                    0.2741    0.0000    0.4872 ^ m1/B (sky130_fd_sc_hd__xor2_1)
     1    0.0042    0.0897    0.1173    0.6045 v m1/X (sky130_fd_sc_hd__xor2_1)
                                                 s1 (net)
                    0.0897    0.0000    0.6045 v m2/A (sky130_fd_sc_hd__xor2_1)
     1    0.0042    0.0897    0.1781    0.7827 v m2/X (sky130_fd_sc_hd__xor2_1)
                                                 s2 (net)
                    0.0897    0.0000    0.7827 v m3/A (sky130_fd_sc_hd__xor2_1)
     1    0.0042    0.0897    0.1781    0.9608 v m3/X (sky130_fd_sc_hd__xor2_1)
                                                 s3 (net)
                    0.0897    0.0000    0.9608 v m4/A (sky130_fd_sc_hd__xor2_1)
     1    0.0042    0.0897    0.1781    1.1389 v m4/X (sky130_fd_sc_hd__xor2_1)
                                                 s4 (net)
                    0.0897    0.0000    1.1389 v m5/A (sky130_fd_sc_hd__xor2_1)
     1    0.0042    0.0897    0.1781    1.3170 v m5/X (sky130_fd_sc_hd__xor2_1)
                                                 s5 (net)
                    0.0897    0.0000    1.3170 v m6/A (sky130_fd_sc_hd__xor2_1)
     1    0.0017    0.0723    0.1649    1.4819 v m6/X (sky130_fd_sc_hd__xor2_1)
                                                 s6 (net)
                    0.0723    0.0000    1.4819 v r1/D (sky130_fd_sc_hd__dfxtp_1)
                                        1.4819   data arrival time

                              1.2500    1.2500   clock clk (rise edge)
                              0.0000    1.2500   clock source latency
     4    0.0079    0.1000    0.0000    1.2500 ^ clk (in)
                                                 clk (net)
                    0.1000    0.0000    1.2500 ^ dl1/A (sky130_fd_sc_hd__clkdlybuf4s18_1)
     1    0.0023    0.0352    0.2029    1.4529 ^ dl1/X (sky130_fd_sc_hd__clkdlybuf4s18_1)
                                                 rc1 (net)
                    0.0352    0.0000    1.4529 ^ dl2/A (sky130_fd_sc_hd__clkdlybuf4s18_1)
     2    0.0038    0.0482    0.1906    1.6435 ^ dl2/X (sky130_fd_sc_hd__clkdlybuf4s18_1)
                                                 rc2 (net)
                    0.0482    0.0000    1.6435 ^ r1/CLK (sky130_fd_sc_hd__dfxtp_1)
                              0.0000    1.6435   clock reconvergence pessimism
                             -0.1217    1.5218   library setup time
                                        1.5218   data required time
-------------------------------------------------------------------------------------
                                        1.5218   data required time
                                       -1.4819   data arrival time
-------------------------------------------------------------------------------------
                                        0.0399   slack (MET)

OpenSTA 3.1.0, propagated clock with a 0.1 ns slew at the port.

Hold into R with the built delay
Timing pathHold into R, built delay

a0 → r0hold check, earliest arrival2 cells

  • Clock latency
  • Cell delay
  • Hold time
Hold into R, built delay00.050.10.150.20.250.30.350.40.45time (ns)launch and capture clk ↑Data arrivesRequired aftera0/CLK → a0/Q (dfxtp_1): 0.3418 ns1 dfxtp_1g0/A → g0/X (and2_1): 0.1099 ns2 and2_1clock 0.3935 nshold −0.0293 nsslack +0.0875 ns · metarrival 0.4517required 0.3642Hold into R, built delay00.10.20.30.4time (ns)launch and capture clk ↑Data arrivesRequired aftera0/CLK → a0/Q (dfxtp_1): 0.3418 ns1 dfxtp_1g0/A → g0/X (and2_1): 0.1099 ns2 and2_1clock 0.3935 nshold −0.0293 nsslack +0.0875 ns · metarrival 0.4517required 0.3642
Read the path as a table

Launch: clk rise edge at 0.0000 ns, clock latency 0.0000 ns. Capture: clk rise edge at 0.0000 ns, latency 0.3935 ns, library hold time −0.0293 ns.

Arrival 0.4517 ns, required 0.3642 ns, slack 0.0875 ns (met).

CellArcThroughEdgeDelay (ns)Time (ns)Slew (ns)
1a0/CLK → a0/Qdfxtp_1rise0.34180.34180.0703
a0/Q → g0/Awire qa0rise0.00000.34180.0703
2g0/A → g0/Xand2_1rise0.10990.45170.0378
g0/X → r0/Dwire p0rise0.00000.45170.0378
The report
Startpoint: a0 (rising edge-triggered flip-flop clocked by clk)
Endpoint: r0 (rising edge-triggered flip-flop clocked by clk)
Path Group: intoR
Path Type: min

Fanout       Cap      Slew     Delay      Time   Description
-------------------------------------------------------------------------------------
                              0.0000    0.0000   clock clk (rise edge)
                              0.0000    0.0000   clock source latency
     4    0.0079    0.1000    0.0000    0.0000 ^ clk (in)
                                                 clk (net)
                    0.1000    0.0000    0.0000 ^ a0/CLK (sky130_fd_sc_hd__dfxtp_1)
     2    0.0060    0.0703    0.3418    0.3418 ^ a0/Q (sky130_fd_sc_hd__dfxtp_1)
                                                 qa0 (net)
                    0.0703    0.0000    0.3418 ^ g0/A (sky130_fd_sc_hd__and2_1)
     1    0.0017    0.0378    0.1099    0.4517 ^ g0/X (sky130_fd_sc_hd__and2_1)
                                                 p0 (net)
                    0.0378    0.0000    0.4517 ^ r0/D (sky130_fd_sc_hd__dfxtp_1)
                                        0.4517   data arrival time

                              0.0000    0.0000   clock clk (rise edge)
                              0.0000    0.0000   clock source latency
     4    0.0079    0.1000    0.0000    0.0000 ^ clk (in)
                                                 clk (net)
                    0.1000    0.0000    0.0000 ^ dl1/A (sky130_fd_sc_hd__clkdlybuf4s18_1)
     1    0.0023    0.0352    0.2029    0.2029 ^ dl1/X (sky130_fd_sc_hd__clkdlybuf4s18_1)
                                                 rc1 (net)
                    0.0352    0.0000    0.2029 ^ dl2/A (sky130_fd_sc_hd__clkdlybuf4s18_1)
     2    0.0038    0.0482    0.1906    0.3935 ^ dl2/X (sky130_fd_sc_hd__clkdlybuf4s18_1)
                                                 rc2 (net)
                    0.0482    0.0000    0.3935 ^ r0/CLK (sky130_fd_sc_hd__dfxtp_1)
                              0.0000    0.3935   clock reconvergence pessimism
                             -0.0293    0.3642   library hold time
                                        0.3642   data required time
-------------------------------------------------------------------------------------
                                        0.3642   data required time
                                       -0.4517   data arrival time
-------------------------------------------------------------------------------------
                                        0.0875   slack (MET)

The same run, the shortest path into R.

The built latency is 0.3935 ns, close to the target, and hold into R keeps 0.0875 ns. Cells come in steps, so the latency is whatever a chain of real cells gives. Each clock path that the launch and capture do not share also widens under on-chip variation (L2.9). A chosen ±5 % derate on 0.39 ns moves it by about 0.02 ns, out of a 0.13 ns window.

The pinned OpenROAD's clock_tree_synthesis balances its tree; its options include none that schedules skew. So here you set the target by hand and build it with cells.

Asked in interviews
  1. What is useful skew?

    A clock latency difference introduced on purpose. Delaying the clock of a register gives the stage that ends there more setup time and takes the same time from the stage that starts there.

  2. Does positive skew help setup or hold?

    With skew = L_capture − L_launch, positive skew helps setup and hurts hold by the same amount. So useful skew is always checked against the shortest path into the delayed register.

  3. Can useful skew fix a path inside a loop?

    Yes, by borrowing time from another stage, subject to hold. The total skew around a loop is zero. A true same-flop self-loop gains nothing.

  4. What are the risks of useful skew?

    Hold violations on short paths into the delayed register, extra clock cells and power, and more on-chip variation on the clock paths launch and capture do not share.

Try it

This is the pipeline with R's clock 0.4 ns late. Run it: worst setup slack 0.0585 ns, worst hold slack 0.0742 ns. Open Paths to see stage A, stage B and hold into R.

Change the latency to 0.5 and predict which check fails before you run. Then build the delay: delete the latency line, add set_propagated_clock [all_clocks] and set_input_transition 0.1 [get_ports clk], and put clock delay buffers such as sky130_fd_sc_hd__clkdlybuf4s18_1 between clk and the CLK pins of r0 and r1 in the netlist. Try one clkdlybuf4s50_1 instead.

STAOpenSTA in OpenROAD 26Q2 · sky130hd tt_025C_1v80 Liberty · simulator service
Edit the constraints or the netlist, then run

          
Expected: WNS 0.0585 ns worst minimum slack 0.0742 ns

Check yourself

Predict the outputThe MAC at 4.2 ns, with every acc clock pin 0.15 ns late. What worst setup slack (WNS) does OpenSTA report, in ns?
create_clock -name clk -period 4.2 [get_ports clk]
set_clock_latency 0.15 [get_pins {_808_/CLK _809_/CLK _810_/CLK _811_/CLK _812_/CLK _813_/CLK _814_/CLK _815_/CLK _816_/CLK _817_/CLK _818_/CLK _819_/CLK _820_/CLK _821_/CLK _822_/CLK _823_/CLK _824_/CLK _825_/CLK _826_/CLK _827_/CLK}]
group_path -name pToAcc -from [get_pins {_792_/CLK _793_/CLK _794_/CLK _795_/CLK _796_/CLK _797_/CLK _798_/CLK _799_/CLK _800_/CLK _801_/CLK _802_/CLK _803_/CLK _804_/CLK _805_/CLK _806_/CLK _807_/CLK}] -to [get_pins {_808_/D _809_/D _810_/D _811_/D _812_/D _813_/D _814_/D _815_/D _816_/D _817_/D _818_/D _819_/D _820_/D _821_/D _822_/D _823_/D _824_/D _825_/D _826_/D _827_/D}]
group_path -name accToAcc -from [get_pins {_808_/CLK _809_/CLK _810_/CLK _811_/CLK _812_/CLK _813_/CLK _814_/CLK _815_/CLK _816_/CLK _817_/CLK _818_/CLK _819_/CLK _820_/CLK _821_/CLK _822_/CLK _823_/CLK _824_/CLK _825_/CLK _826_/CLK _827_/CLK}] -to [get_pins {_808_/D _809_/D _810_/D _811_/D _812_/D _813_/D _814_/D _815_/D _816_/D _817_/D _818_/D _819_/D _820_/D _821_/D _822_/D _823_/D _824_/D _825_/D _826_/D _827_/D}]
ConceptIn a pipeline A → R → B, you delay R's clock by 0.2 ns. What changes?
ConceptStage X → Y fails setup by 0.1 ns; stage Y → Z has 0.5 ns to spare. Which clock do you delay, and by about how much?
ConceptTwo registers form a loop. The stage from the first to the second needs 1.4 ns and the stage back needs 0.8 ns, each including clock-to-Q and setup. Ignoring hold, uncertainty and other paths, what is the shortest period with unrestricted skew?
ConceptWhy is 0.4 ns of skew built from clock delay buffers riskier than set_clock_latency 0.4 on an ideal clock?

Remember

  • Delaying a register's clock gives the stage that ends there more setup time and takes the same from the stage that starts there.
  • Hold into the delayed register shrinks by the same amount, so the shortest path into it sets the upper limit.
  • Around a register cycle skew sums to zero. A true same-flop self-loop gains nothing; vector feedback needs a bit-level path analysis.
  • The skew must be built from real clock cells, in steps, with variation on the branch the other side does not share.