Skip to content
DenseChip
Learn
PracticeCode labInterview

DenseChip

Navigate

Menu

LearnPracticeCode labInterview

Tools

All toolsSV editorCode repoResume
DenseChip

Practice, courses, and chip-design tools in one focused workspace.

LearnPracticeCode labInterviewToolsLearning paths

© 2026 DenseChip

AboutRoadmapCareersInternshipsFAQContactPrivacyTerms
Skip to lesson

Course contents

  • Logic Synthesis Glossary
  • Logic Synthesis Cheatsheet
  • Synthesis Foundations14
  • Logic Optimisation and Mapping20
  • Constraints and Timing15
    • SDC for Synthesis
    • Delay Models and Slack
      • Arrival, Required Time and Slack
      • Setup, Hold and Clock-to-Q
      • Cell Delay Models
      • Wire Delay at Synthesis Time
      • A Static Timing Calculator
    • Timing-Driven Synthesis
  • Sequential, FSM and Memory19
  • Datapath Synthesis14
  • Area, Power and Test14
  • Verification, ECO and Handoff15
  • Flows and Debugging15
  • Interview and Judgment11
Loading lesson

←Delay Models and Slack
  1. Topics
  2. Logic Synthesis
  3. Constraints and Timing
  4. Delay Models and Slack
  5. Arrival, Required Time and Slack
On this page

    Part 3 of 9, lesson 6 of 15Part 3 of 9/Constraints and Timing/Lesson 6 of 15Intermediate

    Arrival, Required Time and Slack

    Arrival, required time and slack on the shared four-stage path.

    Two numbers decide whether a clock is fast enough, and beginners routinely swap them. One path with both numbers recorded settles the direction for the whole topic.

    After this lesson you can: define arrival, required time and slack with the sign convention, read an ABC delay and an ltp report, and explain why a tighter target can change nothing.

    The question

    Two numbers decide whether a clock is fast enough: when the data arrives at the capturing flop, and when it is required there. Their difference is the slack. The path lives in vipexp, a launch flop and a capture flop around four combinational stages, mapped below against course.lib with the typical output load and a loose 1000 ps target.

    The taps t1 to t4 each export one intermediate net. They are not product features; they pin every stage so the mapper must keep all four cells. Without them ABC would fold the chain, and the path the later lessons price would not exist in the recording.

    yosys
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    read_verilog <<EOV
    module vipexp(input clk, input a, b, c, d, input din, output reg qout, output t1, t2, t3, t4);
      reg q1;
      wire s1, s2, s3, s4;
      always @(posedge clk) q1 <= din;
      assign s1 = ~(q1 & a);
      assign s2 = ~(s1 | b);
      assign s3 = s2 ^ c;
      assign s4 = ~(s3 ^ d);
      always @(posedge clk) qout <= s4;
      assign t1 = s1;
      assign t2 = s2;
      assign t3 = s3;
      assign t4 = s4;
    endmodule
    EOV
    hierarchy -check -top vipexp
    synth -top vipexp -flatten
    dfflegalize -cell $_DFF_P_ 01 -cell $_DFF_PN0_ 01
    tee -o ltp_generic.txt ltp
    design -save generic
    dfflibmap -liberty course.lib
    tee -o abc_typ.txt abc -liberty course.lib -constr typical.constr -D 1000
    clean
    tee -o stat_typ.txt stat -liberty course.lib
    write_json net_typ.json
    select -assert-none t:$not t:$and t:$or t:$xor t:$mux t:$_NOT_ t:$_AND_ t:$_OR_ t:$_XOR_ t:$_NAND_ t:$_NOR_ t:$_DFF_P_ t:$_MUX_
    select -assert-count 2 t:DFF
    select -assert-count 1 t:NAND2
    select -assert-count 1 t:NOR2
    select -assert-count 1 t:XOR2
    select -assert-count 1 t:XNOR2
    check
    design -load generic
    dfflibmap -liberty course.lib
    tee -o abc_tight.txt abc -liberty course.lib -constr typical.constr -D 100
    clean
    select -assert-none t:$not t:$and t:$or t:$xor t:$mux t:$_NOT_ t:$_AND_ t:$_OR_ t:$_XOR_ t:$_NAND_ t:$_NOR_ t:$_DFF_P_ t:$_MUX_
    select -assert-count 2 t:DFF
    select -assert-count 1 t:NAND2
    select -assert-count 1 t:NOR2
    select -assert-count 1 t:XOR2
    select -assert-count 1 t:XNOR2
    log PASS: launch flop plus four stages plus capture flop mapped

    The script elaborates and flattens the RTL, legalizes the flops, saves the generic netlist, then lets ABC cover the rest. The assertions pin the cover: no generic gate survives, and the histogram must read two library flops plus one cell of each combinational kind.

    typical.constr gives ABC a BUF driver and a 0.05 pF load on every output. That load is a lumped pin load, not a wire model; the wire lesson takes it apart. ABC reads the load number as femtofarads, so 0.05 pF lands as 50 fF.

    Predict first The 1000 ps target is far looser than anything four course.lib cells need. Roughly what will ABC report, and will the second run at 100 ps report anything different?

    Expect a few hundred picoseconds: four small cells plus the output loads cannot fill a nanosecond. The 100 ps run then reports exactly the same netlist. course.lib offers one size per cell, so a tighter target buys nothing; the table below shows it.

    What the runs printed

    Run

    Cells

    Area

    Delay reached

    1000 ps target

    4

    14

    610 ps

    100 ps target

    4

    14

    610 ps

    Both runs report 4 cells at area 14 with arrival 610 ps: the loose run already takes the cheapest cover and the tight run returns it unchanged. The recorded histogram reads DFF x2, NAND2 x1, NOR2 x1, XNOR2 x1, XOR2 x1. A target below what the library can give changes nothing.

    The 100 ps line is the break-it: this one-size library has no faster cover to give, so the report is identical down to the picosecond. If tightening a target ever leaves every number frozen, check the library before blaming the tool.

    Arrival and required time

    Arrival time is when a transition reaches a node: clock-to-Q, then each stage delay in turn. On the recorded path ABC's number is the combinational part only, 0.61 ns from launch output to endpoint. The full arrival adds the launching flop's clock-to-Q, priced from the DFF table at 0.163 ns, for a model total of 0.781 ns.

    Required time is the deadline at that node: the capturing clock edge minus margins. For a setup check with zero skew it is the period minus the capturing flop's setup time, read from the DFF table as 0.058 ns, so against a hand-derived 1.00 ns period the requirement is 0.942 ns, labelled model throughout.

    The sign convention for the whole topic is stated here once: slack is required minus arrival, so positive slack meets timing and negative slack violates it by that magnitude. Every later lesson uses this direction without restating it. One reporting habit to know: some tools clamp the reported worst slack at zero when nothing violates, so a clean headline can print 0 where the true margin is positive; read the per-endpoint slacks, not just the headline.

    The path against the clock

    The model arrival against a 1.00 ns clock: clock-to-Q plus four stages reach 0.781 ns against a 0.942 ns requirement, slack plus 0.16 ns.

    Read the figure left to right. Each segment is one model stage delay from the calculator lesson at its own slew and a 0.06 pF load. The stack ends at the model arrival and the dashed line marks the requirement; the gap is the slack. The figure carries model numbers, not tool output; the only recorded delay on this page is the table value above.

    Topology first, timing second

    Before any delay arithmetic, the script asks for the shape of the design: ltp walks the generic netlist and prints the longest topological path. The report below names a 6-level path from the clock through the launch flop, one stage per tap, into the capture flop. That count is structure, not time: it ignores cell delays, so it can rank paths differently from timing.

    Diagram
    5. Executing LTP pass (find longest path).
    
    Longest topological path in vipexp (length=6):
        0: \clk
        1: \q1 (via $auto$ff.cc:337:slice$91)
        2: \t1 (via $abc$92$blif$92$0)
        3: \t2 (via $abc$92$blif$92$1)
        4: \t3 (via $abc$92$blif$92$2)
        5: \t4 (via $abc$92$blif$92$3)
        6: \qout (via $auto$ff.cc:337:slice$90)

    The excerpt is shown exactly as printed. ltp counts cells along a topological path, not delay, with the taps as waypoints. After mapping, the same command reports zero, because the library cells are unknown modules with no pin directions; read_liberty -lib course.lib first lets it walk mapped cells. A path through a flop is not one timing path, so ltp -noff excludes flop cells. This lesson records the generic depth so nobody quotes the mapped zero as a path.

    Common mistakes

    Reversing the subtraction turns a 0.16 ns margin into a phantom violation on paper, or hides a real one the same way. Arrival grows to the right, the requirement is a fixed line, and slack is the gap measured from arrival back to the line.

    What do arrival, required time and slack mean on this path?

    Weak: arrival is the delay and slack is how much is left. Strong: arrival is 0.781 ns from the launch edge (0.163 ns of clock-to-Q plus four interpolated stages), required is 0.942 ns (1.00 ns minus 0.058 ns of setup), so the slack is positive; ABC's recorded part from the table above excludes clock-to-Q. Follow-up: the period drops to 0.80 ns. Recompute.

    Answer: the required time falls to 0.74 ns while arrival stays at 0.78 ns. The slack goes slightly negative, so the same path now fails: the requirement moved, not the logic.

    Check yourself The table reports the ABC delay and the model clock-to-Q is 0.163 ns. What is the model arrival at the capture flop, and which part did ABC measure?

    About 0.77 ns: 0.61 ns recorded plus 0.163 ns of model clock-to-Q. ABC measured launch-output-to-endpoint only; the flop delay is a library-table addition, not tool output.

    Check yourself The 100 ps run reports the same delay as the 1000 ps run. Does the design meet a 100 ps clock?

    No. The report is the delay ABC achieved, not the target it accepted: 610 ps of arrival against a 100 ps requirement is a large negative slack. An unchanged report means the library is exhausted, never that the target is met.

    • Slack is required minus arrival: positive meets, negative violates by that magnitude.

    • ABC's delay is the combinational part only; the full arrival adds clock-to-Q on top.

    • A one-size library has no faster cover to give, so a tighter target returns the same report.

    Rule of thumb: measure arrival from the launch edge and the requirement from the capture edge, never the reverse.

    How this was checked

    Arrival, area and cell counts on this page come from one Yosys run of the script shown, recorded by the course checker (scripts/tools/run-rtl-testbenches.mjs with COURSE=synth): the vipexp block (launch flop, four stages, capture flop, one tap per stage) mapped with ABC against the teaching library course.lib at a 1000 ps target with typical.constr (BUF driver, 0.05 pF load), plus a 100 ps re-run from the saved generic netlist. The ltp excerpt is the recorded generic report. The library is fictional, so absolute delays are teaching values; the slack arithmetic is the point. Stage arrivals and the required time are model numbers interpolated from the exact library rows, labelled so on the page.

    • Interview: run a mock interview on this topic

    Related topics

    • Setup, Hold and Clock-to-Q

    • A Static Timing Calculator

    • SDC for Synthesis

    Previous

    42 / 139

    Next: Setup, Hold and Clock-to-Q

    Up next

    Up nextSetup, Hold and Clock-to-Q

    Sign in to save progress

    Practice this lessonPrevious lessonReport an error

    See also

    • Cell Delay Models
    • Wire Delay at Synthesis Time
    • A Static Timing Calculator