← Physical Design Interviews

Interview Question · Code Reading

Multicycle Paths and the Hold Edge

L1 JuniorL2 Mid-Levelstaexceptions
  • Likely at Qualcomm

The Question

The interviewer asks

A slow datapath updates every other cycle, so someone adds the exception at the end of this SDC. Setup now passes. What else changed?

sdc
create_clock -name clk -period 1.0 [get_ports clk]
set_clock_transition 0.1 [all_clocks]
set_input_delay 0.2 -clock clk [delete_from_list [all_inputs] [get_ports clk]]
set_multicycle_path 2 -setup -from [get_cells {a0_reg a1_reg}] -to [get_cells {y0_reg y1_reg}]
Reveal the Model Answer

The hold check moved too. Hold is checked one edge before the setup capture edge. So moving setup to the second edge moves hold to the first, a full period later than intended. Now hold fails. Pair -setup 2 with -hold 1 to put hold back at the launch edge. Then prove in simulation that the data really is stable for two cycles, because STA trusts the exception.

Where the Setup and Hold Edges SitData launched by a at edge 0. A 1 marks the edge each check uses.
0123clkena (launched)D0D1setup, defaultsetup, -setup 2hold, -setup 2 onlyhold, plus -hold 1
  1. Cycle 0

    By default, setup is checked at edge 1 and hold at edge 0, the launch edge itself.

  2. Cycle 1

    With -setup 2 alone, hold moves to edge 1. D0 must stay stable for a whole period after launch.

  3. Cycle 2

    Setup is at edge 2, where y loads. -hold 1 brings hold back from edge 1 to edge 0.

Edges 0 to 3 of the 1 ns clock, with the edge each check uses marked as a 1.

Timing pathHold of the Short Path with Only the Setup MultiplierFlop a0_reg launches; y0_reg captures after one nand2_1. Both are enable flops on the same en.

a0_reg → y0_reghold check, earliest arrival2 cells

  • Clock latency
  • Cell delay
  • Hold time
Hold of the short path with only the setup multiplier00.10.20.30.40.50.60.70.80.91time (ns)launch clk ↑capture clk ↑Data arrivesRequired aftera0_reg/CLK → a0_reg/Q (edfxtp_1): 0.4802 ns1 edfxtp_1u0/A → u0/Y (nand2_1): 0.0840 ns2hold −0.0969 nsslack −0.3389 ns · violatedarrival 0.5642required 0.9031Hold of the short path with only the setup multiplier00.20.40.60.81time (ns)launch clk ↑capture clk ↑Data arrivesRequired aftera0_reg/CLK → a0_reg/Q (edfxtp_1): 0.4802 ns1 edfxtp_1u0/A → u0/Y (nand2_1): 0.0840 ns2hold −0.0969 nsslack −0.3389 ns · violatedarrival 0.5642required 0.9031
  1. Fast data

    Clock-to-Q and one gate: the new value reaches y0_reg at 0.5642 ns.

  2. A hold edge one period late

    The hold check now uses the edge at 1 ns, not 0 ns. Required after 0.9031 ns.

  3. Violated

    Slack -0.3389 ns: the data would have to stay put for most of a period.

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.0000 ns, latency 0.0000 ns, library hold time −0.0969 ns.

Arrival 0.5642 ns, required 0.9031 ns, slack −0.3389 ns (violated).

CellArcThroughEdgeDelay (ns)Time (ns)Slew (ns)
1a0_reg/CLK → a0_reg/Qedfxtp_1fall0.48020.48020.1478
a0_reg/Q → u0/Awire a0fall0.00000.48020.1478
2u0/A → u0/Ynand2_1rise0.08400.56420.0363
u0/Y → y0_reg/Dwire s0rise0.00000.56420.0363
The report
Startpoint: a0_reg (rising edge-triggered flip-flop clocked by clk)
Endpoint: y0_reg (rising edge-triggered flip-flop clocked by clk)
Path Group: clk
Path Type: min

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 ^ a0_reg/CLK (sky130_fd_sc_hd__edfxtp_1)
     5    0.0190    0.1478    0.4802    0.4802 v a0_reg/Q (sky130_fd_sc_hd__edfxtp_1)
                                                 a0 (net)
                    0.1478    0.0000    0.4802 v u0/A (sky130_fd_sc_hd__nand2_1)
     1    0.0019    0.0363    0.0840    0.5642 ^ u0/Y (sky130_fd_sc_hd__nand2_1)
                                                 s0 (net)
                    0.0363    0.0000    0.5642 ^ y0_reg/D (sky130_fd_sc_hd__edfxtp_1)
                                        0.5642   data arrival time

                    0.1000    1.0000    1.0000   clock clk (rise edge)
                              0.0000    1.0000   clock network delay (ideal)
                              0.0000    1.0000   clock reconvergence pessimism
                                        1.0000 ^ y0_reg/CLK (sky130_fd_sc_hd__edfxtp_1)
                             -0.0969    0.9031   library hold time
                                        0.9031   data required time
-------------------------------------------------------------------------------------
                                        0.9031   data required time
                                       -0.5642   data arrival time
-------------------------------------------------------------------------------------
                                       -0.3389   slack (VIOLATED)

The short path with only -setup 2: hold is now checked one period late, and fails by 0.3389 ns.

Self-Check

Tick each key point you covered in your answer.

What Interviewers Listen For (Junior)

A good junior answer says the exception moves the setup check to the second edge. It adds that hold needs its own -hold setting.

Cross-Questions

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

WhyWhat IfProve ItBreak ItCompare

  1. Multicycle Paths and the Hold Edge
  2. WhyWhy Hold Follows the Setup EdgeL1 JuniorL2 Mid-Level

    Why does moving the setup capture edge also move the hold check?

    Reveal the Model Answer

    The tool defines the hold check relative to the setup relationship. One capture edge earlier, it checks that the next launch does not overwrite what the setup capture edge should catch. Move setup to edge two and that earlier edge becomes edge one. -hold 1 pulls the hold check back by one cycle to the launch edge.

    Timing pathHold of the Short Path with Both Multipliers

    a0_reg → y0_reghold check, earliest arrival2 cells

    • Clock latency
    • Cell delay
    • Hold time
    Hold of the short path with both multipliers-0.100.10.20.30.40.5time (ns)launch and capture clk ↑Data arrivesRequired aftera0_reg/CLK → a0_reg/Q (edfxtp_1): 0.4802 ns1 edfxtp_1u0/A → u0/Y (nand2_1): 0.0840 ns2 nand2_1hold −0.0969 nsslack +0.6611 ns · metarrival 0.5642required −0.0969Hold of the short path with both multipliers00.20.4time (ns)launch and capture clk ↑Data arrivesRequired aftera0_reg/CLK → a0_reg/Q (edfxtp_1): 0.4802 ns1 edfxtp_1u0/A → u0/Y (nand2_1): 0.0840 ns2hold −0.0969 nsslack +0.6611 ns · metarrival 0.5642required −0.0969
    1. Back at the launch edge

      The hold edge is back at 0 ns, the edge that launched the data.

    2. Met

      Slack 0.6611 ns: this is the normal hold check of a path launched and captured on one edge.

    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 0.0000 ns, latency 0.0000 ns, library hold time −0.0969 ns.

    Arrival 0.5642 ns, required −0.0969 ns, slack 0.6611 ns (met).

    CellArcThroughEdgeDelay (ns)Time (ns)Slew (ns)
    1a0_reg/CLK → a0_reg/Qedfxtp_1fall0.48020.48020.1478
    a0_reg/Q → u0/Awire a0fall0.00000.48020.1478
    2u0/A → u0/Ynand2_1rise0.08400.56420.0363
    u0/Y → y0_reg/Dwire s0rise0.00000.56420.0363
    The report
    Startpoint: a0_reg (rising edge-triggered flip-flop clocked by clk)
    Endpoint: y0_reg (rising edge-triggered flip-flop clocked by clk)
    Path Group: clk
    Path Type: min
    
    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 ^ a0_reg/CLK (sky130_fd_sc_hd__edfxtp_1)
         5    0.0190    0.1478    0.4802    0.4802 v a0_reg/Q (sky130_fd_sc_hd__edfxtp_1)
                                                     a0 (net)
                        0.1478    0.0000    0.4802 v u0/A (sky130_fd_sc_hd__nand2_1)
         1    0.0019    0.0363    0.0840    0.5642 ^ u0/Y (sky130_fd_sc_hd__nand2_1)
                                                     s0 (net)
                        0.0363    0.0000    0.5642 ^ y0_reg/D (sky130_fd_sc_hd__edfxtp_1)
                                            0.5642   data arrival time
    
                        0.1000    0.0000    0.0000   clock clk (rise edge)
                                  0.0000    0.0000   clock network delay (ideal)
                                  0.0000    0.0000   clock reconvergence pessimism
                                            0.0000 ^ y0_reg/CLK (sky130_fd_sc_hd__edfxtp_1)
                                 -0.0969   -0.0969   library hold time
                                           -0.0969   data required time
    -------------------------------------------------------------------------------------
                                           -0.0969   data required time
                                           -0.5642   data arrival time
    -------------------------------------------------------------------------------------
                                            0.6611   slack (MET)

    The same short path with -setup 2 and -hold 1: hold is back at the launch edge and passes.

    Self-Check

    Tick each key point you covered in your answer.

  3. CompareFalse Path vs Multicycle PathL1 JuniorL2 Mid-Level

    Compare a false path with a multicycle path. When is each the right exception?

    Reveal the Model Answer

    A false path removes paths from timing entirely. It is for signals that can never propagate in one cycle in practice, such as static configuration written before use. A multicycle path keeps the check but gives it N cycles, for data that is guaranteed stable for N cycles. A false path is the riskier promise, because a wrong one hides a real path forever; never false-path a reset release.

    Self-Check

    Tick each key point you covered in your answer.

  4. What IfA Configuration Register Written While RunningL2 Mid-Level

    What if software writes the false-pathed configuration register while the block is running?

    Reveal the Model Answer

    Then the false path is no longer true. The new value can reach a capture flop in any cycle, untimed. Some bits may then be caught a cycle late or go metastable. Either forbid writes while the block runs, and check that rule with an assertion. Or time the path for real.

    Self-Check

    Tick each key point you covered in your answer.

    Half-Truth

    "It is a configuration register, so it is always a false path."

    The exception holds only if software writes it before use. A write in mission mode makes the path real.

    Source Lesson L2.8 key points

  5. Break ItA Multicycle Path Whose Enable DisappearedL2 Mid-LevelL3 Senior

    An ECO removes the enable that made the datapath update every other cycle, but the exception below stays in the SDC. What happens, and who catches it?

    sdc
    set_multicycle_path 2 -setup -from [get_cells {a0_reg a1_reg}] -to [get_cells {y0_reg y1_reg}]
    set_multicycle_path 1 -hold  -from [get_cells {a0_reg a1_reg}] -to [get_cells {y0_reg y1_reg}]
    Reveal the Model Answer

    STA still gives the path two cycles and reports it clean, while the silicon now captures every cycle and fails. The exception is a promise only the design can keep, so the check belongs in verification. The check is an assertion that the enable alternates and the source is stable at every capture edge. Rerunning that assertion after every ECO catches the broken promise.

    Self-Check

    Tick each key point you covered in your answer.

  6. Prove ItSolve L2.8.1: Restore the Same-Edge Hold CheckSimulator-graded

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

    Open Problem L2.8.1

What People Get Wrong

Common wrong answers and why they fail. Run It shows the wrong belief failing on a real simulator.

Misconception

"-setup 2 gives the path two cycles; nothing else moves."

The hold check follows the setup edge, so with -setup 2 alone hold lands one period late and fails at -0.3389 ns. Adding -hold 1 restores it.

Run It

The two-cycle datapath from lesson L2.8 with -setup 2 only.

create_clock -name clk -period 1.0 [get_ports clk]
set_clock_transition 0.1 [all_clocks]
set_input_delay 0.2 -clock clk [delete_from_list [all_inputs] [get_ports clk]]
set_multicycle_path 2 -setup -from [get_cells {a0_reg a1_reg}] -to [get_cells {y0_reg y1_reg}]

Prints: 0.2419 slack (MET) -0.3389 slack (VIOLATED)

See the Fix
create_clock -name clk -period 1.0 [get_ports clk]
set_clock_transition 0.1 [all_clocks]
set_input_delay 0.2 -clock clk [delete_from_list [all_inputs] [get_ports clk]]
set_multicycle_path 2 -setup -from [get_cells {a0_reg a1_reg}] -to [get_cells {y0_reg y1_reg}]
set_multicycle_path 1 -hold -from [get_cells {a0_reg a1_reg}] -to [get_cells {y0_reg y1_reg}]

Prints: 0.2419 slack (MET)

Half-Truth

"Multicycle paths are just a way to make setup pass."

A multicycle path is a promise about the design: the data changes only every N cycles. Without an enable that enforces it, the chip fails while STA reports clean.

Source ASIC Point lesson L2.8

Learn It, Then Prove It