Skip to content

DFT · Chapter 2 · Fault Models

Stuck-At Faults

The stuck-at model is the workhorse of manufacturing test and the model behind the first coverage number any team signs off. It treats each signal node as possibly stuck-at-0 or stuck-at-1, frozen to a constant regardless of what the logic tries to drive, giving exactly two faults per node. Detecting a stuck-at fault requires two things in the same pattern: excite the node by driving it to the opposite value of the fault, and propagate that value along a sensitized path to an observable output. A pattern detects the fault only when the good machine and the faulty machine differ at an observable point. Stuck-at stands in for hard shorts to a rail, many opens, and contact defects, and high coverage around 95 to 99 percent is the baseline signoff bar. Fault collapsing merges equivalent faults to shrink the list without changing coverage, and stuck-at is only a proxy that misses timing and bridging defects.

Foundation14 min readDFTStuck-AtExcitePropagateFault Collapsing

Chapter 2 · Section 2.2 · Fault Models

Project thread — 2.1 built the fault list; here we put SA0/SA1 on the counter's nodes and generate the excite + propagate pattern that detects one.

1. Why Should I Learn This?

Stuck-at is the default vocabulary of manufacturing test — and excite + propagate is the reasoning behind every ATPG pattern.

  • SA0 / SA1 — a node frozen to a constant, 2 faults per node.
  • Detection = excite (drive the opposite value) and propagate (sensitize an observable path) — both, same pattern.
  • A pattern detects iff good machine ≠ faulty machine at an observable point.
  • High stuck-at coverage (~95–99%+, representative) is the first signoff bar.

2. Real Silicon Story — the fault you could excite but not propagate

A team saw a node's SA0 fault reported undetected, and assumed the ATPG tool was weak. Digging in, they found the pattern could excite the node to 1 — but every path from that node to an observable output was blocked by side-inputs held at non-controlling values. The fault was excited but not propagated: the good and faulty machines produced the same value at every observable point, so no pattern could distinguish them.

The node was buried behind logic whose observability was poor — a design/testability issue, not a tool weakness. Once scan (Chapter 3) added an observable capture point closer to the node, the same fault became easily detected. Lesson: detection needs both excite and propagate — a fault you can excite but not observe is undetected, and the fix is usually observability, bought with scan.

3. Factory Perspective — how each role reads a stuck-at fault

  • What the test engineer sees: the stuck-at fault list and the patterns that detect each fault by excite + propagate; their metric is stuck-at coverage at acceptable test time.
  • What the yield engineer sees: when parts fail specific stuck-at patterns, a diagnosis pointing at which node/region is defective — feeding physical failure analysis.
  • What the RTL/DV engineer sees: that undetected stuck-at faults usually mean poor controllability/observability in their logic — a design signal to add scan/observe points (Chapters 4/6).
  • What management cares about: stuck-at coverage is the headline signoff number in the quality plan — the first commitment tied to DPPM (1.5).

4. Concept — SA0/SA1, excite + propagate, collapsing

The model:

  • Every node (gate input, gate output, net) may be stuck-at-0 or stuck-at-1 — held constant independent of the driving logic.
  • Two faults per node. A netlist with N nodes has ~2N stuck-at faults before collapsing.

Detection = excite AND propagate (both, in one pattern):

  • Excite (activate): set inputs so the faulty node should take the opposite value of the fault. For SA0, drive the node to 1 — now good = 1, faulty = 0: a difference exists at the node.
  • Propagate (sensitize): hold the side-inputs along a path from the node to an observable output at their non-controlling values, so the difference travels to where you can measure it (a primary output or a scan flop).
  • Detected iff good machine and faulty machine differ at an observable point. Excite without propagate → undetected (the story).

Fault collapsing — shrink the list, not the coverage:

  • Equivalent faults produce identical behavior at outputs — e.g. any input SA0 of an AND gate is equivalent to the output SA0 (both force the output to 0). Keep one representative.
  • Dominance: if every pattern detecting fault A also detects fault B, A dominates B; the list can drop the dominated one.
  • Collapsing yields the collapsed fault listfewer patterns for the same coverage (helps test time, 1.4).

Fault coverage vs test coverage (light — full in Ch6):

  • Fault coverage = detected / (collapsed) faults.
  • Test coverage additionally accounts for faults proven undetectable/untestable (2.5) — usually the higher, more honest signoff number.
Two-input AND gate with input a stuck-at-0; driving a=1 and b=1 makes the output differ between good and faulty machinesAND gate: input a stuck-at-0 — excite with a=1, b=1; y differs 1 vs 0 → detectedAND gate: input a stuck-at-0 — excite with a=1, b=1; y differs 1 vs 0 → detecteda (SA0)b=1 (non-ctrl)y: good=1 / faulty=0and
Figure 1 — a stuck-at fault on an AND-gate input and how it is excited (representative). The gate computes y = a AND b. Model input 'a' as STUCK-AT-0. To EXCITE it, drive a=1 (good: a=1) so the fault (a forced to 0) would change something; also drive b=1 (the NON-CONTROLLING value for AND) so the difference at 'a' reaches y. Good machine: y = 1 AND 1 = 1. Faulty machine (a stuck-at-0): y = 0 AND 1 = 0. y DIFFERS (1 vs 0) -> if y is observable, the fault is DETECTED. Note b=0 would MASK the fault (y=0 either way) -- that is why side-inputs must be non-controlling to PROPAGATE.

The difference must reach an observable point over time — a waveform makes 'good vs faulty' concrete:

Detection = good vs faulty differ at an observable point

8 cycles
Good-machine output follows the intended value while the faulty-machine output is stuck, producing a mismatch at the compare cycleexcite+propagateexcite+propagatey_good≠y_faulty → DETECTEDy_good≠y_faulty → DETE…clkexcitey_goody_faultyt0t1t2t3t4t5t6t7
Figure 2 — good machine vs faulty machine at an observable output (representative). The test pattern excites a node (drives it to the fault's opposite value) and propagates it to an observable output 'y'. In the GOOD machine y follows the intended value; in the FAULTY machine (node stuck) y is frozen/wrong. The tester compares the observed y to the GOLDEN (good-machine) response: at the marked cycle y_good != y_faulty -> MISMATCH -> the fault is DETECTED. If y_good == y_faulty every cycle, the fault is undetected by this pattern.

5. Mental Model — a stuck light switch you must prove is stuck

Imagine checking whether a light switch is jammed OFF (a node stuck-at-0).

  • Excite: you must flip it to ON — if you never try to turn it on, a jammed-off switch looks identical to one you simply left off. You have to demand the opposite of the fault.
  • Propagate: you must be able to see the light it controls — if the bulb is removed (unobservable) or another switch also forces it off (a controlling side-input masks it), flipping the switch tells you nothing.
  • Detect: only when flipping the switch should change the light but doesn't do you know it's jammed — that's good ≠ faulty at something you can observe.

You can't detect a jam by staring at an off switch; you must command ON and watch a wired-up bulb. That's excite + propagate.

6. Working Example — a stuck-at pattern on the counter

Enumerate and detect a stuck-at fault on the project's counter:

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
// SystemVerilog — the counter under test (project thread); nodes carry stuck-at faults
module counter4 (input logic clk, rst_n, output logic [3:0] count);
  always_ff @(posedge clk)
    if (!rst_n) count <= 4'd0;
    else        count <= count + 4'd1;
endmodule
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
# Stuck-at detection — REPRESENTATIVE, SIMPLIFIED, tool-neutral:
# Target fault: count[0]  STUCK-AT-1
#   EXCITE   : force count[0] to 0  (e.g. reset -> count = 0000, so count[0] should be 0)
#   PROPAGATE: make count[0] OBSERVABLE (a primary output here, or a scan flop after Ch3)
#   GOOD machine  : count[0] = 0
#   FAULTY machine: count[0] = 1  (stuck-at-1)
#   OBSERVE  : count[0] reads 1 instead of 0  -> good != faulty -> DETECTED
#
# Target fault: rst_n STUCK-AT-1  (reset never asserts)
#   EXCITE   : assert reset (drive rst_n=0); good -> count clears to 0000
#   FAULTY   : rst_n stuck-at-1 -> reset ignored -> count keeps counting (not 0000)
#   OBSERVE  : count != 0000 after reset -> DETECTED
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
# Fault collapsing — REPRESENTATIVE:
#   AND gate y = a & b :  a-SA0  ==  b-SA0  ==  y-SA0   (all force y=0)  -> keep ONE representative
#   Collapsing shrinks the list (fewer patterns, SAME coverage) -> helps test time (1.4).

7. Industry Flow — where stuck-at sits

Stuck-at is the first structural test built on the scan-inserted netlist:

Scan-inserted netlist to collapsed stuck-at fault list to ATPG excite-propagate patterns to stuck-at coverage to testerThe stuck-at test flowThe stuck-at test flow1Scan-inserted netlistcontrollable/observable via scan (Ch3–4)2Collapsed stuck-at listSA0/SA1 per node, equivalents merged3ATPG: excite + propagatedetect iff good ≠ faulty at an observable point4Stuck-at coveragefirst signoff bar (~95–99%+, Ch6)5Testerapply patterns → sort dies
Figure 3 — the stuck-at flow (representative). The scan-inserted NETLIST (Ch3-4) feeds the STUCK-AT FAULT LIST (collapsed). ATPG generates EXCITE+PROPAGATE patterns; a fault is DETECTED when good != faulty at an observable point. STUCK-AT COVERAGE (detected/list) is the first signoff bar (Ch6). Patterns become the tester program applied at silicon test. Undetected faults loop back to TESTABILITY fixes in RTL/scan (better controllability/observability).

8. Debugging Session — a fault reported undetected

1

ATPG reports a node's stuck-at fault as undetected and the team blames the tool; in fact the fault can be EXCITED but not PROPAGATED -- every path to an observable point is masked by controlling side-inputs, so good and faulty machines never differ where you can measure -- and the fix is observability (a scan/observe point), not a stronger tool

DETECTION NEEDS EXCITE *AND* PROPAGATE — UNOBSERVABLE = UNDETECTED
Symptom

ATPG reports a specific node's SA0 as undetected. The team assumes the ATPG tool is weak and asks for higher effort or a different tool.

Root Cause

Detection requires excite AND propagate in the same pattern, and this fault can be excited but not propagated — so good and faulty machines never differ at any observable point. ATPG can set the node to 1 (exciting the SA0 — good=1, faulty=0), so a difference exists at the node. But to detect it, that difference must reach an observable output (a primary output or a scan flop), and every path from the node is blocked: a side-input along the path sits at its controlling value (e.g. a 0 on an AND, a 1 on an OR), which forces the downstream gate's output regardless of the faulty node — the difference is masked. With no sensitized path, the good machine and faulty machine produce identical values everywhere you can measure, so no pattern can distinguish them — the fault is genuinely undetected by this circuit as-is. This is not a tool weakness (higher effort can't create observability that the logic doesn't offer); it's a controllability/observability limitation of the design — exactly the property scan exists to fix. (If the tool instead aborted under effort limits, that's different — that fault might be testable with more effort; a truly untestable one is proven undetectable, 2.5.)

Fix

Add observability so the difference can propagate — this is a testability (design) fix, usually scan. Insert a scan/observe point closer to the node (or make the masking side-input controllable) so a sensitized path to an observable capture point exists; then the same excite + propagate succeeds and the fault is detected. This is precisely why the next chapters exist: scan (Chapter 3) turns ordinary flops into controllable/observable capture points, and scan insertion + testability improvement (Chapters 4/6) systematically remove undetectable faults rooted in poor observability. The principle to lock in: a stuck-at fault is detected only when a single pattern both EXCITES it (drives the node to the fault's opposite value) AND PROPAGATES it (sensitizes a path so an observable output depends on it), producing good-machine != faulty-machine at a measurable point — so a fault you can excite but not observe is undetected, and the remedy is observability (scan), not a stronger ATPG tool. (Fault collapsing shrinks the list; untestable/redundant faults are 2.5; scan is Chapter 3.)

9. Common Mistakes

  • Thinking exciting a fault detects it. You also need to propagate it to an observable point — both, one pattern.
  • Blaming ATPG for undetected faults. Usually a controllability/observability (design) limit — fix with scan.
  • Forgetting side-inputs mask faults. A controlling value on a path blocks propagation.
  • Confusing fault collapsing with losing coverage. Collapsing removes equivalent faults — coverage is unchanged.
  • Treating 100% stuck-at as fully tested. It misses timing/bridging defects (2.3/2.4) — stuck-at is a proxy.

10. Industry Best Practices

  • Target excite + propagate explicitly — undetected faults almost always fail on propagation (observability).
  • Collapse faults to cut pattern count and test time (1.4) without touching coverage.
  • Treat undetected stuck-at as a testability signal — feed back to scan/observe decisions (Ch4/6).
  • Report fault and test coverage — distinguish detected from proven-undetectable (2.5, Ch6).
  • Set a stuck-at signoff bar (~95–99%+, representative) tied to the DPPM goal (1.5).

11. Senior Engineer Thinking

  • Beginner: "The tool can't detect this fault — get a better tool."
  • Senior: "Can I excite it? Yes. Can I propagate it to something observable? No — a side-input masks the path. That's an observability problem in the design, not the tool. I add a scan/observe point and it's detected. Detection is excite and propagate; 'undetected' usually means can't observe."

The senior reads 'undetected' as an observability cue and reaches for scan, not tool effort.

12. Silicon Impact

Stuck-at is where most of manufacturing test's defect-catching value comes from at the lowest cost — it's the cheap, high-correlation baseline, which is why stuck-at coverage is the first number on every signoff sheet and the first commitment tied to DPPM (1.5). The excite + propagate requirement is not a stuck-at detail — it's the engine of all ATPG (Chapter 5) and the reason scan exists (Chapter 3): a fault is only as detectable as the design is controllable and observable, so undetected stuck-at faults are a direct readout of testability debt in the RTL. Fault collapsing keeps the pattern count — and thus test time and cost (1.4) — down without sacrificing coverage. And the 2.1 caveat still governs: 100% stuck-at is 100% of the stuck-at model — real quality needs transition/delay (2.3) for timing defects and bridging/IDDQ (2.4) for shorts/leakage. For the RTL/DV engineer, the takeaway is concrete and actionable: every undetected stuck-at fault is an invitation to improve observability, and doing so early — in RTL and scan architecture — is what lets the part hit its stuck-at bar cheaply and, ultimately, meet its DPPM commitment.

13. Engineering Checklist

  • Confirmed each target fault is both excitable and propagatable to an observable point.
  • Ran fault collapsing to minimize pattern count (test time, 1.4).
  • Treated undetected faults as observability signals → scan/observe fixes (Ch4/6).
  • Reported fault coverage and test coverage distinctly (2.5, Ch6).
  • Set the stuck-at signoff bar against the DPPM goal (1.5); planned other models for timing/shorts.

14. Try Yourself

  1. Enumerate SA0/SA1 for 4 nodes of the counter (8 faults). Collapse the obvious equivalents.
  2. For count[0] SA1, write the excite (force count[0]=0 via reset) and propagate (observe count[0]) steps.
  3. For rst_n SA1, show the detection: assert reset, observe count ≠ 0000 in the faulty machine.
  4. Construct a case where a fault is excited but not propagated (put a controlling value on a side-input) — confirm it's undetected.
  5. Add an observe point and show the same fault becomes detected — the scan motivation for Chapter 3.

Reasoning is tool-neutral — pen and paper (or a free simulator for good/faulty responses) suffices. Real fault lists and coverage come from any ATPG flow (Chapters 5–6). No paid tool required.

15. Interview Perspective

  • Weak: "A stuck-at fault is when a wire is stuck at 0 or 1."
  • Good: "Each node is modeled SA0 or SA1; to detect it you set the opposite value and observe the effect."
  • Senior: "The stuck-at model gives two faults per node — SA0/SA1, a node frozen independent of the driving logic. Detection needs both excite (drive the node to the fault's opposite value) and propagate (sensitize a path with non-controlling side-inputs so an observable output depends on it) — a pattern detects only when good and faulty machines differ at a measurable point. Fault collapsing merges equivalent faults to cut patterns without changing coverage. And it's a proxy — 100% stuck-at still misses timing and bridging defects, so it's the baseline, not the whole story."

16. Interview / Review Questions

17. Key Takeaways

  • The stuck-at model freezes each node to a constant — SA0 or SA1, independent of the driving logic — giving two faults per node; it's the workhorse baseline.
  • Detection needs both, in one pattern: excite (drive the node to the fault's opposite value) and propagate (sensitize a path with non-controlling side-inputs to an observable output) — a pattern detects iff good machine ≠ faulty machine at a measurable point.
  • A fault you can excite but not observe is undetected — usually a controllability/observability limit in the design, fixed with scan (Chapter 3), not a stronger tool.
  • Fault collapsing merges equivalent/dominated faults to cut pattern count and test time (1.4) without changing coverage; fault coverage (detected/list) differs from test coverage (accounts for undetectable, 2.5/Ch6).
  • High stuck-at coverage (~95–99%+, representative) is the first signoff bar and first DPPM commitment — but it's a proxy that misses timing/bridging defects (2.3/2.4). Next: 2.3 — transition & delay faults (timing defects stuck-at can't see).

18. Quick Revision

Stuck-at — the workhorse model. Each NODE modeled SA0 / SA1 (frozen constant, independent of driven value) → 2 faults/node. DETECT = EXCITE (drive the opposite value) AND PROPAGATE (non-controlling side-inputs → observable output); detected iff good ≠ faulty at a measurable point. Excite-but-not-observe = undetected → fix with observability (scan), not a better tool. Fault collapsing merges equivalents → fewer patterns, SAME coverage (test-time win). High stuck-at coverage (~95–99%+, representative) = first signoff bar, but a PROXY (misses timing/bridging). Next: 2.3 — transition & delay faults.