← Physical Design Interviews

Interview Question · Debug

Fixing Setup Violations

L1 JuniorL2 Mid-Levelstasetupoptimization

The Question

The interviewer asks

The stage summary below shows a block that met timing as a netlist and fails after global placement. What changed, and what would you try, in order?

log
MAC, 4.6 ns clock, 40 % utilization (lesson L4.5, measured)
stage                              WNS (ns)
netlist, no wires                   0.3041
global placement, wirelength only  -0.1371   TNS -0.3753
legalized                          -0.2361
Reveal the Model Answer

Placement added wire capacitance, which the driving cells now charge, so the same cells got slower. Try the cheap moves first: timing-driven placement, resizing the drivers and swapping to faster input pins. Also buffer long or heavily loaded nets, and clone high-fanout drivers. In lesson L4.5 timing-driven placement alone turned -0.1371 ns into +0.2145 ns. A path that no tool can fix goes back to the RTL for retiming or pipelining.

Timing pathThe Worst Path After Global Placement, with WiresFrom the accumulator's flop through the adder's carry chain to another accumulator flop, after global placement.

_809_ → _827_setup check, latest arrival16 cells

  • Clock latency
  • Cell delay
  • Wire delay
  • Setup time
The worst path after global placement, with wires00.511.522.533.544.5time (ns)launch clk ↑capture clk ↑Data arrivesRequired by_809_/CLK → _809_/Q (dfrtp_1): 0.3844 ns1_809_/Q → _607_/A: 0.0002 ns_607_/A → _607_/Y (xnor2_1): 0.2200 ns2_607_/Y → _619_/A2: 0.0001 ns_619_/A2 → _619_/Y (o21ai_0): 0.1720 ns3_619_/Y → _641_/C: 0.0002 ns_641_/C → _641_/X (maj3_1): 0.4277 ns4_641_/X → _663_/C: 0.0003 ns_663_/C → _663_/X (maj3_1): 0.4101 ns5_663_/X → _685_/C: 0.0002 ns_685_/C → _685_/X (maj3_1): 0.4107 ns6_685_/X → _707_/C: 0.0003 ns_707_/C → _707_/X (maj3_1): 0.4222 ns7_707_/X → _727_/A1: 0.0003 ns_727_/A1 → _727_/Y (a211oi_1): 0.3093 ns8_727_/Y → _729_/A3: 0.0002 ns_729_/A3 → _729_/Y (o31ai_1): 0.1727 ns9_729_/Y → _731_/A2: 0.0004 ns_731_/A2 → _731_/X (o211a_1): 0.2483 ns10_731_/X → _734_/A3: 0.0002 ns_734_/A3 → _734_/Y (o311ai_0): 0.5155 ns11_734_/Y → _736_/A3: 0.0003 ns_736_/A3 → _736_/Y (a31oi_1): 0.2184 ns12_736_/Y → _737_/A2: 0.0002 ns_737_/A2 → _737_/Y (a21oi_1): 0.3057 ns13_737_/Y → _740_/A2: 0.0003 ns_740_/A2 → _740_/Y (a211oi_1): 0.1879 ns14_740_/Y → _742_/C: 0.0003 ns_742_/C → _742_/Y (nand3_1): 0.1316 ns_742_/Y → _748_/B: 0.0001 ns_748_/B → _748_/Y (xnor2_1): 0.1148 ns_748_/Y → _827_/D: 0.0001 nssetup −0.0823 nsslack −0.1371 ns · violatedarrival 4.6549required 4.5177The worst path after global placement, with wires01234time (ns)launch clk ↑capture clk ↑Data arrivesRequired by_809_/CLK → _809_/Q (dfrtp_1): 0.3844 ns1_809_/Q → _607_/A: 0.0002 ns_607_/A → _607_/Y (xnor2_1): 0.2200 ns2_607_/Y → _619_/A2: 0.0001 ns_619_/A2 → _619_/Y (o21ai_0): 0.1720 ns_619_/Y → _641_/C: 0.0002 ns_641_/C → _641_/X (maj3_1): 0.4277 ns4_641_/X → _663_/C: 0.0003 ns_663_/C → _663_/X (maj3_1): 0.4101 ns5_663_/X → _685_/C: 0.0002 ns_685_/C → _685_/X (maj3_1): 0.4107 ns6_685_/X → _707_/C: 0.0003 ns_707_/C → _707_/X (maj3_1): 0.4222 ns7_707_/X → _727_/A1: 0.0003 ns_727_/A1 → _727_/Y (a211oi_1): 0.3093 ns8_727_/Y → _729_/A3: 0.0002 ns_729_/A3 → _729_/Y (o31ai_1): 0.1727 ns_729_/Y → _731_/A2: 0.0004 ns_731_/A2 → _731_/X (o211a_1): 0.2483 ns_731_/X → _734_/A3: 0.0002 ns_734_/A3 → _734_/Y (o311ai_0): 0.5155 ns11_734_/Y → _736_/A3: 0.0003 ns_736_/A3 → _736_/Y (a31oi_1): 0.2184 ns_736_/Y → _737_/A2: 0.0002 ns_737_/A2 → _737_/Y (a21oi_1): 0.3057 ns13_737_/Y → _740_/A2: 0.0003 ns_740_/A2 → _740_/Y (a211oi_1): 0.1879 ns_740_/Y → _742_/C: 0.0003 ns_742_/C → _742_/Y (nand3_1): 0.1316 ns_742_/Y → _748_/B: 0.0001 ns_748_/B → _748_/Y (xnor2_1): 0.1148 ns_748_/Y → _827_/D: 0.0001 nssetup −0.0823 nsslack −0.1371 ns · violatedarrival 4.6549required 4.5177
  1. The shared cells take longer in total

    The cells drive wire now as well as pins. Over the 16 cells this path shares with the netlist's worst path, the delay grew by 0.4353 ns.

  2. Violated

    Slack -0.1371 ns, against 0.3041 ns before placement.

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.6000 ns, latency 0.0000 ns, library setup time −0.0823 ns.

Arrival 4.6549 ns, required 4.5177 ns, slack −0.1371 ns (violated).

CellArcThroughEdgeDelay (ns)Time (ns)Slew (ns)
1_809_/CLK → _809_/Qdfrtp_1fall0.38440.38440.0797
_809_/Q → _607_/Awire acc[1]fall0.00020.38460.0797
2_607_/A → _607_/Yxnor2_1rise0.22000.60460.1940
_607_/Y → _619_/A2wire _080_rise0.00010.60470.1940
3_619_/A2 → _619_/Yo21ai_0fall0.17200.77670.1428
_619_/Y → _641_/Cwire _081_fall0.00020.77690.1428
4_641_/C → _641_/Xmaj3_1fall0.42771.20460.1041
_641_/X → _663_/Cwire _083_fall0.00031.20490.1041
5_663_/C → _663_/Xmaj3_1fall0.41011.61500.1002
_663_/X → _685_/Cwire _085_fall0.00021.61530.1002
6_685_/C → _685_/Xmaj3_1fall0.41072.02600.1017
_685_/X → _707_/Cwire _087_fall0.00032.02620.1017
7_707_/C → _707_/Xmaj3_1fall0.42222.44850.1119
_707_/X → _727_/A1wire _089_fall0.00032.44880.1119
8_727_/A1 → _727_/Ya211oi_1rise0.30932.75810.2965
_727_/Y → _729_/A3wire _093_rise0.00022.75820.2965
9_729_/A3 → _729_/Yo31ai_1fall0.17272.93100.1170
_729_/Y → _731_/A2wire _095_fall0.00042.93130.1170
10_731_/A2 → _731_/Xo211a_1fall0.24833.17960.0557
_731_/X → _734_/A3wire _097_fall0.00023.17980.0557
11_734_/A3 → _734_/Yo311ai_0rise0.51553.69530.5886
_734_/Y → _736_/A3wire _100_rise0.00033.69560.5886
12_736_/A3 → _736_/Ya31oi_1fall0.21843.91400.1495
_736_/Y → _737_/A2wire _101_fall0.00023.91410.1495
13_737_/A2 → _737_/Ya21oi_1rise0.30574.21980.2757
_737_/Y → _740_/A2wire _102_rise0.00034.22010.2757
14_740_/A2 → _740_/Ya211oi_1fall0.18794.40800.1324
_740_/Y → _742_/Cwire _105_fall0.00034.40830.1324
15_742_/C → _742_/Ynand3_1rise0.13164.53990.0857
_742_/Y → _748_/Bwire _107_rise0.00014.54000.0857
16_748_/B → _748_/Yxnor2_1rise0.11484.65480.1121
_748_/Y → _827_/Dwire _048_rise0.00014.65490.1121
The report
Startpoint: _809_ (rising edge-triggered flip-flop clocked by clk)
Endpoint: _827_ (rising edge-triggered flip-flop clocked by clk)
Path Group: clk
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.0122    0.0797    0.3844    0.3844 v _809_/Q (sky130_fd_sc_hd__dfrtp_1)
                                                 acc[1] (net)
                    0.0797    0.0002    0.3846 v _607_/A (sky130_fd_sc_hd__xnor2_1)
     2    0.0069    0.1940    0.2200    0.6046 ^ _607_/Y (sky130_fd_sc_hd__xnor2_1)
                                                 _080_ (net)
                    0.1940    0.0001    0.6047 ^ _619_/A2 (sky130_fd_sc_hd__o21ai_0)
     2    0.0098    0.1428    0.1720    0.7767 v _619_/Y (sky130_fd_sc_hd__o21ai_0)
                                                 _081_ (net)
                    0.1428    0.0002    0.7769 v _641_/C (sky130_fd_sc_hd__maj3_1)
     2    0.0105    0.1041    0.4277    1.2046 v _641_/X (sky130_fd_sc_hd__maj3_1)
                                                 _083_ (net)
                    0.1041    0.0003    1.2049 v _663_/C (sky130_fd_sc_hd__maj3_1)
     2    0.0096    0.1002    0.4101    1.6150 v _663_/X (sky130_fd_sc_hd__maj3_1)
                                                 _085_ (net)
                    0.1002    0.0002    1.6153 v _685_/C (sky130_fd_sc_hd__maj3_1)
     2    0.0100    0.1017    0.4107    2.0260 v _685_/X (sky130_fd_sc_hd__maj3_1)
                                                 _087_ (net)
                    0.1017    0.0003    2.0262 v _707_/C (sky130_fd_sc_hd__maj3_1)
     3    0.0122    0.1119    0.4222    2.4485 v _707_/X (sky130_fd_sc_hd__maj3_1)
                                                 _089_ (net)
                    0.1119    0.0003    2.4488 v _727_/A1 (sky130_fd_sc_hd__a211oi_1)
     2    0.0071    0.2965    0.3093    2.7581 ^ _727_/Y (sky130_fd_sc_hd__a211oi_1)
                                                 _093_ (net)
                    0.2965    0.0002    2.7582 ^ _729_/A3 (sky130_fd_sc_hd__o31ai_1)
     3    0.0124    0.1170    0.1727    2.9310 v _729_/Y (sky130_fd_sc_hd__o31ai_1)
                                                 _095_ (net)
                    0.1170    0.0004    2.9313 v _731_/A2 (sky130_fd_sc_hd__o211a_1)
     2    0.0066    0.0557    0.2483    3.1796 v _731_/X (sky130_fd_sc_hd__o211a_1)
                                                 _097_ (net)
                    0.0557    0.0002    3.1798 v _734_/A3 (sky130_fd_sc_hd__o311ai_0)
     3    0.0100    0.5886    0.5155    3.6953 ^ _734_/Y (sky130_fd_sc_hd__o311ai_0)
                                                 _100_ (net)
                    0.5886    0.0003    3.6956 ^ _736_/A3 (sky130_fd_sc_hd__a31oi_1)
     2    0.0085    0.1495    0.2184    3.9140 v _736_/Y (sky130_fd_sc_hd__a31oi_1)
                                                 _101_ (net)
                    0.1495    0.0002    3.9141 v _737_/A2 (sky130_fd_sc_hd__a21oi_1)
     3    0.0120    0.2757    0.3057    4.2198 ^ _737_/Y (sky130_fd_sc_hd__a21oi_1)
                                                 _102_ (net)
                    0.2757    0.0003    4.2201 ^ _740_/A2 (sky130_fd_sc_hd__a211oi_1)
     4    0.0132    0.1324    0.1879    4.4080 v _740_/Y (sky130_fd_sc_hd__a211oi_1)
                                                 _105_ (net)
                    0.1324    0.0003    4.4083 v _742_/C (sky130_fd_sc_hd__nand3_1)
     1    0.0054    0.0857    0.1316    4.5399 ^ _742_/Y (sky130_fd_sc_hd__nand3_1)
                                                 _107_ (net)
                    0.0857    0.0001    4.5400 ^ _748_/B (sky130_fd_sc_hd__xnor2_1)
     1    0.0026    0.1121    0.1148    4.6548 ^ _748_/Y (sky130_fd_sc_hd__xnor2_1)
                                                 _048_ (net)
                    0.1121    0.0001    4.6549 ^ _827_/D (sky130_fd_sc_hd__dfrtp_1)
                                        4.6549   data arrival time

                    0.0000    4.6000    4.6000   clock clk (rise edge)
                              0.0000    4.6000   clock network delay (ideal)
                              0.0000    4.6000   clock reconvergence pessimism
                                        4.6000 ^ _827_/CLK (sky130_fd_sc_hd__dfrtp_1)
                             -0.0823    4.5177   library setup time
                                        4.5177   data required time
-------------------------------------------------------------------------------------
                                        4.5177   data required time
                                       -4.6549   data arrival time
-------------------------------------------------------------------------------------
                                       -0.1371   slack (VIOLATED)

The worst path of lesson L4.5's MAC after global placement. The new wire delays push it to -0.1371 ns.

Self-Check

Tick each key point you covered in your answer.

What Interviewers Listen For (Junior)

A good junior answer explains that the load of the new wires slowed the cells. It lists cell sizing and buffering as fixes.

Cross-Questions

Where the interviewer goes next. Open a node to practise that follow-up.

WhyWhat IfProve ItBreak ItCompare

  1. Fixing Setup Violations
  2. WhyWhy Wire Capacitance Hurts More Than Wire ResistanceL1 JuniorL2 Mid-Level

    On short nets, why does the wire's capacitance cost more delay than its resistance?

    Reveal the Model Answer

    The driving cell has to charge the wire's capacitance through its own output resistance, which is far larger than the wire's resistance. In lesson L4.5, 100 µm of met1 adds about 17 fF and 121 Ω, and an inv_1 driving it slows from 0.044 to 0.143 ns. The wire's own RC delay grows with length squared and only dominates on long nets.

    Measured sweepinv_1 Falling Delay Against Load, One Curve per Input SlewEvery point is a delay OpenSTA reported. The load axis is logarithmic, like the table's own index.
    • input slew 0.01 ns
    • input slew 0.0388 ns
    • input slew 0.28 ns
    • input slew 1.5 ns
    00.2 ns0.4 ns0.6 ns0.8 ns1.0 ns1.2 ns1.4 ns1.6 nsDelay0.1 fF1 fF10 fF100 fF1 pFLoadmax_capacitancethe lookup: 0.0303 ns00.5 ns1.0 ns1.5 ns2.0 nsDelay0.1 fF10 fF1 pFLoadmax_capacitancethe lookup: 0.0303 ns
    1. Load 2.254 fFinput slew 0.01 ns = 20.7 ps · input slew 0.0388 ns = 30.3 ps · input slew 0.28 ns = 65.3 ps · input slew 1.5 ns = 83.7 ps

      The worked lookup: 2.254 fF at a 0.0388 ns slew gives 0.0303 ns.

    2. Load 100 fFinput slew 0.01 ns = 346.4 ps · input slew 0.0388 ns = 357.2 ps · input slew 0.28 ns = 451.5 ps · input slew 1.5 ns = 853.2 ps

      At 100 fF the fast input gives 0.3464 ns and the 1.5 ns input gives 0.8532 ns. The 1.5 ns input is slower than the 0.01 ns one at every load.

    3. Load 250 fFinput slew 0.01 ns = 845.4 ps · input slew 0.0388 ns = 855.8 ps · input slew 0.28 ns = 952.3 ps · input slew 1.5 ns = 1.496 ns

      At 0.25 pF the load is past the table's last column, 0.1813 pF. The tool extrapolates the last two columns in a straight line: 0.8558 ns.

    Read the plot as a table
    Loadinput slew 0.01 nsinput slew 0.0388 nsinput slew 0.28 nsinput slew 1.5 ns
    1 fF16.2 ps24.9 ps50.1 ps48.1 ps
    2.254 fF20.7 ps30.3 ps65.3 ps83.7 ps
    10 fF47.1 ps57.7 ps126.9 ps233.4 ps
    100 fF346.4 ps357.2 ps451.5 ps853.2 ps
    250 fF845.4 ps855.8 ps952.3 ps1.496 ns

    Measured inv_1 delays: more load capacitance means more delay, at every input slew.

    Self-Check

    Tick each key point you covered in your answer.

  3. CompareTiming-Driven Placement vs Post-Placement RepairL2 Mid-Level

    Compare timing-driven placement with running repair_timing -setup on a placed design.

    Reveal the Model Answer

    Timing-driven placement re-weights the nets on critical paths while cells are still moving, so the fix costs little area. repair_timing works on fixed positions by resizing, buffering, swapping pins and cloning, which adds cells and needs another legalization. In lesson L4.5 the repair alone reached +0.056 ns while timing-driven placement reached +0.2145 ns on the same block.

    Self-Check

    Tick each key point you covered in your answer.

  4. Prove ItSolve L4.5.1: Close Placement Timing Within AreaSimulator-graded

    Show it, don't just say it: this Silicon Lab problem is graded by the simulator.

    Open Problem L4.5.1

  5. Break ItDesign-Rule Violations Before TimingL1 JuniorL2 Mid-Level

    Your timing looks fine, but 123 nets break max transition. Why does that matter, and what do you do first?

    Reveal the Model Answer

    Past the library's max transition or max capacitance, the delay tables are extrapolated. So the slack is a number the library never measured. Repair the design rules first, with buffer trees and stronger drivers, then trust the timing. In lesson L4.4 repair_design added six buffers and took 123 slew violations to zero.

    One Large Net Split into a Buffer TreeArrows are signal flow. Each buffer drives a share of the loads, so no output sees the whole load.
    One large net split into a buffer treeArrows are signal flow. Each buffer drives a share of the loads, so no output sees the whole load. component rst_n port Driven by a weak cell component Buffer Near the first group component Buffer Near the secondgroup component Flops, group 1 RESET_B pins component Flops, group 2 RESET_B pins
    1. The port sees two pins

      The weak driver now loads only two buffer inputs and the wire to them.

    2. Each buffer sees its group

      Each buffer sits near its flops, so its wire is short and its load is within its limit.

    Read the diagram as text
    • rst_n port: Driven by a weak cell
    • Buffer: Near the first group
    • Buffer: Near the second group
    • Flops, group 1: RESET_B pins
    • Flops, group 2: RESET_B pins
    • rst_n port → Buffer
    • rst_n port → Buffer
    • Buffer → Flops, group 1
    • Buffer → Flops, group 2

    The shape only; repair_design chooses the number of buffers, their cells and their places.

    Self-Check

    Tick each key point you covered in your answer.

  6. What IfWhen a Path Goes Back to RTLL3 Senior

    Asked if no physical fix closes the path

    A path still fails by 15 % of the period after every physical fix. What do you do?

    Reveal the Model Answer

    Stop spending flow iterations on it. Take it to the RTL owner with the evidence: the path, its logic depth and the best slack each fix reached. The structural options are pipelining, retiming, or restructuring the logic, each with a cost in latency or verification. Agree on it early, because an RTL change late in the schedule restarts synthesis, equivalence and the flow.

    Self-Check

    Tick each key point you covered in your answer.

  7. ComparePipelining Versus Retiming as the RTL FixL3 Senior

    Compare pipelining with retiming as the fix. What does each one cost the verification team?

    Reveal the Model Answer

    Pipelining adds a register stage, so latency grows by a cycle. Every interface, model and test that counts cycles must change. Retiming moves existing registers and keeps the latency at the ports. But the internal flops no longer match the RTL, so equivalence needs a sequential check.

    Self-Check

    Tick each key point you covered in your answer.

    Half-Truth

    "Retiming is free; the tool just does it."

    It changes which flops exist. Combinational equivalence cannot map them, and debug sees different internal state.

What People Get Wrong

Common wrong answers and why they fail.

Misconception

"Upsize every cell on the critical path."

A bigger cell has a bigger input capacitance, which slows the cell that drives it. In lesson L2.2 upsizing one inverter from inv_1 to inv_4 raised the path arrival from 0.3713 to 0.4113 ns.

Source ASIC Point lesson L2.2 (measured, OpenSTA 3.1.0)

Wrong Altitude

Starts by asking for a higher-performance library or a lower utilization.

Those are expensive, block-wide answers. Check the constraint, then the local fixes; escalate only when they run out.

Learn It, Then Prove It