GLS · Chapter 4 · SDF Annotation
MIN:TYP:MAX and Delay Selection
Every delay in an SDF is not one number but three, a min, typ, and max triplet, and the simulator picks exactly one at annotation time. Min is the fastest delay, typ the nominal, and max the slowest, and you choose among them with a run option or an SDF command file. Which one matters depends on the check: the max value stresses setup by asking whether the logic is fast enough, while the min value stresses hold by asking whether data holds long enough. This is the same intuition as process corners, but with a difference worth keeping straight, since the triplet lives within one characterised SDF while corners are separate SDF files. The pitfall to avoid is running the typical value, or a tool default that varies, when the check you care about needs the maximum, because that quietly removes setup margin from what you observe.
Foundation11 min readGLSSDFMIN:TYP:MAXDelay SelectionSetup/Hold
Chapter 4 · Section 4.4 · SDF Annotation
Project thread — 4.3 applied the counter's SDF; this lesson decides which of each triplet's three values the counter run uses. 4.6 picks one deliberately.
1. Why Should I Learn This?
Every SDF delay is three numbers; your run uses one. Pick the wrong one and your "timed" run stresses the wrong thing.
- MAX = slow → setup pressure; MIN = fast → hold pressure; TYP = nominal.
- Selection is an explicit option — and tool defaults vary.
- The triplet is within one SDF; corners are separate SDFs (3.4) — related but different axes.
This follows the annotation flow (4.3) and precedes debugging (4.5) and the counter capstone (4.6).
2. Real Silicon Story — the setup margin that TYP hid
A team ran SDF-annotated GLS at the typical delay value and saw comfortable timing. STA (at the slow corner) later flagged a setup violation.
The GLS run used TYP — the nominal delay — so logic arrived with nominal, not worst-case, delay. MAX (the slow value in the triplet) would have pushed arrival later and made setup pressure visible in the functional behaviour. Running TYP quietly understated the delay that setup cares about.
Lesson: the triplet value you select changes what your run can show. Setup is a MAX (slow) concern; running TYP or a tool default can hide it.
3. Concept — the triplet and how it's selected
The triplet: each SDF delay is (MIN:TYP:MAX):
- MIN — fastest / shortest delay.
- TYP — typical / nominal.
- MAX — slowest / longest delay.
Selection (at annotation):
- Run option:
+mindelays/+typdelays/+maxdelays, or an SDF command file. - The simulator applies one value from each triplet to the arcs.
- Defaults vary by tool — never assume; state it explicitly.
Which value for which check:
- MAX (slow) → stresses setup (logic must be fast enough).
- MIN (fast) → stresses hold (data must hold past the edge).
- TYP → nominal behaviour, not a worst case.
Triplet vs corners (important):
- The triplet is min/typ/max within one characterised SDF (one corner).
- Corners (3.4) are separate SDFs from separate
.libs. - Both shift delay, but they are different axes — and neither GLS selection replaces all-corner STA (0.3).
4. Mental Model — three speed estimates for the same trip
Each delay triplet is three estimates of the same signal's travel time.
- MIN = the optimistic estimate (everything fast) → relevant to hold (things arriving too soon).
- MAX = the pessimistic estimate (everything slow) → relevant to setup (things arriving too late).
- TYP = the average day → not the worst case for either.
Selecting a value is choosing which estimate your run believes. A worst-case setup question needs the pessimistic (MAX) estimate — the average won't reveal the tight margin.
5. Working Example — the triplet, selection, and a min-vs-max waveform
The same arc, one triplet, two selections:
# SDF triplet — REPRESENTATIVE. One delay, three values: MIN:TYP:MAX
(IOPATH CK Q (0.08:0.11:0.15))
# MIN TYP MAX
# +mindelays -> 0.08 (fast; hold-flavoured)
# +typdelays -> 0.11 (nominal)
# +maxdelays -> 0.15 (slow; setup-flavoured)Practical context (representative, tool-neutral):
# Select the triplet value explicitly (tool-neutral idea):
# setup-flavoured GLS: annotate with MAX (+maxdelays or command-file MAX)
# hold-flavoured GLS: annotate with MIN (+mindelays)
# nominal functional: TYP
# DO NOT rely on the tool default (varies). State the selection in the run log.
# Reminder: triplet != corners. Different SDFs per corner (3.4); STA covers all corners.MIN vs MAX arrival at a capture edge, as a real waveform:
Same path, MIN (fast) vs MAX (slow) selection — different arrival relative to the clock edge
8 cycles6. Debugging Session — a comfortable TYP run that hid a setup violation
An SDF-annotated GLS at the TYP (or tool-default) value shows comfortable timing, but STA flags a setup violation — TYP understates delay, and setup is a MAX concern, so the nominal selection could not reveal the tight margin
SETUP NEEDS MAX; TYP/DEFAULT HIDES ITSDF-annotated GLS run at TYP looks comfortable. STA (slow corner) reports a setup violation.
Each SDF delay is a MIN:TYP:MAX triplet, and the run selected TYP — the nominal delay. Setup asks whether logic arrives before the capture edge, which is worst at MAX (the slowest delay). With TYP, logic arrived with nominal delay — earlier than worst case — so the observed behaviour understated setup pressure and could not reveal the tight margin. Often this is not even a conscious choice: the run used the tool default (which varies by simulator) rather than an explicit selection. It is not a wrong SDF — it is the wrong value from the triplet for the check in question.
Select the triplet value to match the check: MAX for setup-flavoured runs, MIN for hold-flavoured runs, and state the selection explicitly (option or SDF command file) rather than trusting the default. But keep scope honest: even a MAX-selected GLS is one selection of one SDF (one corner) — the exhaustive check across all corners (and both setup/hold extremes) is STA (0.3/3.4). Use MIN/TYP/MAX selection to make a GLS run stress the right thing functionally; rely on STA for timing closure. The lesson: each SDF delay is a MIN:TYP:MAX triplet; the simulator applies one, MAX for setup and MIN for hold — running TYP or a tool default can hide the margin you meant to check.
7. Common Mistakes
- Trusting the tool default. Defaults vary — select explicitly.
- Running TYP for a setup question. Setup needs MAX; TYP understates delay.
- Running MAX for a hold question. Hold needs MIN.
- Confusing the triplet with corners. Triplet is within one SDF; corners are separate SDFs (3.4).
- Treating one selection as timing closure. STA across all corners is signoff (0.3).
8. Industry Best Practices
- Select MIN/TYP/MAX to match the check (MAX→setup, MIN→hold).
- State the selection explicitly and log it (reproducibility).
- Keep triplet and corner axes distinct — both matter, differently.
- Use an SDF command file for corner + selection + scaling.
- Defer closure to STA across all corners; use selection to stress GLS functionally.
Senior Engineer Thinking
- Beginner: "I annotated the SDF, so the timing is real."
- Senior: "Which value of the triplet did I apply — and was it the tool default? Setup is MAX, hold is MIN. And this is one selection of one SDF; all-corner closure is STA."
The senior chooses the triplet value deliberately and never confuses it with corner coverage.
Silicon Impact
Silicon delays span the whole MIN–MAX range at every corner. Verify at TYP (or an unknown default) and call it done, and a setup margin (MAX) or hold margin (MIN) can be understated in your functional runs — letting a real violation slip toward silicon as a marginal, condition-dependent failure (0.3). The triplet exists precisely because one delay value never represents the spread. GLS min/typ/max selection lets a run stress the right extreme functionally; STA across all corners and both extremes is what proves the margins.
Engineering Checklist
- Selected the triplet value to match the check (MAX→setup, MIN→hold).
- Made the selection explicit (not the tool default) and logged it.
- Kept triplet selection distinct from corner selection (3.4).
- Used an SDF command file for corner + selection where needed.
- Relied on STA (all corners, both extremes) for closure.
Try Yourself
- Annotate the representative
(IOPATH CK Q (0.08:0.11:0.15))with+maxdelaysand check a tight path against the clock — setup pressure appears (late arrival). - Observe: at MAX the result arrives latest.
- Change: re-annotate with
+mindelays(0.08) and re-run. - Expect: the path arrives earliest — setup pressure gone, but hold is now the concern. Confirm TYP sits between, and that no single selection shows both.
Any free Verilog simulator supports +mindelays/+typdelays/+maxdelays. Real triplets come from characterisation, but selection behaves identically. No paid tool required.
Interview Perspective
- Weak: "The SDF has one delay per arc."
- Good: "Each SDF delay is a
MIN:TYP:MAXtriplet; the simulator picks one at annotation." - Senior: "MAX is the slow value that stresses setup, MIN the fast value that stresses hold, TYP nominal. I select explicitly — defaults vary — and I keep the triplet distinct from corners: it's min/typ/max within one SDF, while corners are separate SDFs. All-corner closure is STA, not any single selection."
9. Interview / Review Questions
10. Key Takeaways
- Each SDF delay is a
MIN:TYP:MAXtriplet — MIN fastest, TYP nominal, MAX slowest — and the simulator applies one at annotation. - Select via a run option (
+mindelays/+typdelays/+maxdelays) or an SDF command file; tool defaults vary, so choose explicitly. - MAX (slow) stresses setup; MIN (fast) stresses hold; TYP is nominal — the same intuition as corners.
- The triplet is min/typ/max within one SDF (one corner); corners are separate SDFs (3.4) — a different axis.
- No single selection is timing closure — STA across all corners and both extremes is the signoff (0.3). Next: 4.5 — debugging failed & partial SDF annotation.
Quick Revision
Each SDF delay =
MIN:TYP:MAXtriplet; simulator applies one (+min/+typ/+maxdelaysor command file; defaults vary). MAX→setup, MIN→hold, TYP→nominal. Triplet is within one SDF; corners are separate SDFs (3.4) — different axis. No single selection = closure; STA (all corners) is signoff. Next: 4.5 — debugging failed & partial annotation.