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

AboutContactPrivacyTerms
Skip to lesson

Course contents

  • RTL Foundations36
  • Combinational Design25
  • Sequential Design27
  • FSM & Control27
  • Timing & Clocking39
    • STA Foundations
      • Where RTL Meets STA
      • Canonical STA Flow
      • Corners
      • SDC Starter Set
      • Why RTL Architecture Dominates
    • Setup, Hold and Slack
    • Skew and Variation
    • Timing Exceptions
    • Clock Gating
    • RTL for Timing
    • Clock Architecture
  • Reset & CDC34
  • Memory & Buses57
  • Advanced RTL28
  • Senior & Interview76
  • Glossary and Notation
Loading lesson

‹STA Foundations
  1. Topics
  2. RTL Design
  3. Timing & Clocking
  4. STA Foundations
  5. SDC Starter Set

Part 5 · Timing & Clocking · Intermediate

SDC Starter Set

Clocks, delays, uncertainty and exceptions form the starter constraint set.

On this page

    Why this matters

    The netlist does not say the clock speed, when inputs arrive or what outputs need. Without the SDC the tool cannot check them, and a wrong false path removes a real check, so the bug first appears in silicon.

    After this lesson you can: write the starter constraints (clocks, input and output delays, uncertainty), compute the input and output budgets, and audit coverage after applying them.

    A complete starter SDC

    The netlist omits the clock speed, input arrival times and output requirements. The SDC file supplies them.

    Here is the whole file for a tiny block: one clock clk, an input bus din with a valid bit, an output bus dout, and an active-low reset rst_n that goes to a reset synchroniser. Read it top to bottom; each numbered comment is one decision.

    Diagram
    # 1. The clock: 500 MHz (2.0 ns), 50% duty cycle
    create_clock -name clk -period 2.0 [get_ports clk]
    
    # 2. Margin for jitter and skew that the tool does not know yet
    set_clock_uncertainty -setup 0.15 [get_clocks clk]
    set_clock_uncertainty -hold  0.05 [get_clocks clk]
    
    # 3. Inputs arrive 40% into the cycle after the clock edge (outside logic uses the rest)
    set_input_delay  -clock clk -max 0.8 [get_ports {din[*] valid}]
    set_input_delay  -clock clk -min 0.2 [get_ports {din[*] valid}]
    
    # 4. The next chip needs 0.6 ns of the cycle after our data leaves
    set_output_delay -clock clk -max 0.6 [get_ports {dout[*]}]
    set_output_delay -clock clk -min 0.0 [get_ports {dout[*]}]
    
    # 5. Drive and load of the pins
    set_driving_cell -lib_cell BUF_X2 [get_ports {din[*] valid}]
    set_load 0.05 [get_ports {dout[*]}]
    
    # 6. Reset is asynchronous: scope the exception to the reset synchroniser flops only
    # Recovery/removal on the synchronised reset net stay checked against the destination clock.
    # Never an unscoped false path from the reset port into the whole design.
    set_false_path -from [get_ports rst_n] -to [get_pins {rst_sync_ff*/RST}]
    # Confirm in the timing report what the exception covered: tools differ on whether a false path also removes recovery/removal checks.

    Constraint

    What it means

    If missing

    create_clock

    Period and waveform at a port or pin

    The register paths are not timed at all

    set_clock_uncertainty

    Extra margin on every capture edge

    Optimistic slack; fails after clock tree synthesis

    set_input_delay -max / -min

    When inputs change, relative to a clock edge

    Input paths are unconstrained in STA (reported by check_timing); some synthesis tools default to zero input delay, which is optimistic. Either way, define it.

    set_output_delay -max / -min

    How much of the cycle the next block needs

    Output paths unconstrained

    set_driving_cell, set_load

    Realistic input slew and output load

    Over-optimistic port timing

    set_false_path, set_multicycle_path

    Paths that are not single-cycle or never active

    Over-constraining: the tool wastes effort or fails real timing

    Input and output delay budgets

    The input and output delays decide how much of the cycle is left for your own logic. The outside world uses one part of the period, the uncertainty takes another, and you get the rest.

    tour_logic​+tsetup​≤T−tin_delay​−us​tcq​+tour_logic​≤T−tout_delay​−us​
    One 2.0 ns cycle split two ways. Input path: 0.8 ns input delay, 1.05 ns left for logic plus setup, 0.15 ns uncertainty. Output path: 1.25 ns for clock-to-Q plus logic, 0.15 ns uncertainty, 0.6 ns output delay.

    Read each bar from the launching edge on the left to the capturing edge on the right. The highlighted segment is the time your block owns.

    • Input bar: the outside logic uses the first 0.8 ns, so your logic plus setup gets 2.0 - 0.8 - 0.15 = 1.05 ns.

    • Output bar: the next chip needs the last 0.6 ns, so your clock-to-Q plus logic gets 2.0 - 0.6 - 0.15 = 1.25 ns.

    • Uncertainty sits just before the capturing edge in both bars. It is margin, so it shrinks your segment, not the outside one.

    These budgets assume the ideal, zero-latency clocks above. Propagated clock latencies and external clock relationships must also be included when present.

    Check yourself With this SDC, does an input path with 1.10 ns of logic plus setup pass?

    No. Arrival plus setup and uncertainty is 0.80 + 1.10 + 0.15 = 2.05 ns, giving -0.05 ns setup slack. Omitting uncertainty would incorrectly predict +0.10 ns.

    When both neighbouring blocks share an owner, split the cycle between them. Write the budget into both SDC files.

    Tip

    Registered boundaries isolate interface paths from internal combinational work, but still need max/min I/O delays, clock relationships, uncertainty, input slew and output load. With the budgets above, an input register with 0.12 ns setup leaves 0.93 ns for input logic/wire; an output register with 0.35 ns clock-to-Q leaves 0.90 ns for output logic/wire. Internal register paths still need period, setup/hold and uncertainty checks. Extra register ranks also change the interface latency contract.

    Hardening the file for a real flow

    The starter file assumes one rising-edge clock, ns time units, pF capacitance units, synchronous external data referenced to that clock, a library containing BUF_X2, and a reset synchroniser whose asynchronous pins match rst_sync_ff*/RST. Confirm units from the loaded Liberty/tool report before using 2.0 or 0.05. Negative output -min values may be needed for a real receiver's hold budget; 0.0 above is only an assumed interface contract.

    Guard every collection

    A pattern that matches nothing applies no constraint and gives no error. In OpenSTA, collections are Tcl lists. After linking the design and loading libraries, run these guards before applying the file (adapt collection-size APIs in other STA tools):

    Diagram
    proc require_nonempty {label objects} {
      if {[llength $objects] == 0} { error "Empty timing collection: $label" }
      return $objects
    }
    require_nonempty clock_port [get_ports clk]
    require_nonempty reset_port [get_ports rst_n]
    require_nonempty data_bus [get_ports {din[*]}]
    require_nonempty valid_port [get_ports valid]
    require_nonempty output_bus [get_ports {dout[*]}]
    require_nonempty reset_sync_pins [get_pins {rst_sync_ff*/RST}]
    require_nonempty input_driver [get_lib_cells */BUF_X2]

    Audit coverage after applying constraints

    Diagram
    # OpenSTA examples: inspect warnings and both delay directions.
    check_timing -verbose
    report_checks -path_delay max
    report_checks -path_delay min

    Illustrative audit result (not tool output)

    Action

    din/valid -> input-register D: clock + max/min input delay present

    Inspect setup AND hold slack

    Internal register Q -> register D: clk present

    Check period, uncertainty and both delay directions

    Output-register Q -> dout: max/min output delay present

    Check external receiver contract and output load

    status output has no output delay

    Unconstrained: add its interface contract before claiming closure

    reset exception matches synchronizer async pins only

    Audit exceptions and downstream recovery/removal; a nonempty match alone does not prove correct scope

    Also compare collection widths and full matched names against the intended interface; partial bus matches can pass a nonempty guard. Check the library cell identity, clock coverage and exception coverage in the actual tool. See OpenSTA examples and units and command reference.

    Warning

    Limits. This is an adaptation template, not a validated SDC/netlist pair, and no SDC or physical timing result is established by it. A missing clock definition is silent in the sense that the design simply isn't checked: always look at the unconstrained endpoints report before trusting a clean timing summary.

    Common mistakes

    Common pitfall

    set_false_path on a path that is actually used is the most dangerous constraint in the file: it removes the check and the bug first appears in silicon. Every false path needs a written justification (see exceptions).

    Check yourself A block has a 4 ns ideal clock, zero uncertainty and set_input_delay -max 3.0. How much time is left for logic and setup between the input pin and the first register?

    4.0 − 3.0 = 1.0 ns. If the register's setup time is 0.1 ns, the logic and wiring must fit in 0.9 ns. Any setup uncertainty reduces that budget further.

    Remember

    • With a 2.0 ns clock, 0.8 ns input delay and 0.15 ns uncertainty, the input budget is 1.05 ns for logic plus setup.

    • The output budget is the clock period minus the output delay and uncertainty (1.25 ns here), for clock-to-Q plus logic.

    • Every false path needs a written justification.

    Rule of thumb: a missing clock is silent, so check the unconstrained endpoints before you trust a clean summary.

    How this was checked

    The SDC is an adaptation template, not a validated SDC and netlist pair. The audit table is illustrative, not tool output. No SDC or physical timing result is established by it.

    Keep going

    • Interview: run a mock interview on this topic

    Related topics

    • Architecture dominates

    Previous

    119 / 350

    Next: Why RTL Architecture Dominates

    Up next

    Up nextWhy RTL Architecture Dominates

    Sign in to save progress

    Practice this lessonReport an error

    See also

    • Where RTL Meets STA
    • Canonical STA Flow