GLS · Chapter 6 · X-Propagation
How X Flows Through Muxes, Flops & Latches
Tracing an unknown means knowing how it moves through logic, and the rules are learnable. A mux with an unknown select and differing data outputs an unknown, but with equal data it can stay definite. A flip-flop captures an unknown on its data, and goes unknown if its clock or asynchronous reset is unknown. A latch passes an unknown when its enable is unknown. Ordinary gates either block or pass an unknown depending on controlling values: an AND with a zero forces zero and an OR with a one forces one, while a non-controlling input lets the unknown through. Controlling values are how an unknown gets absorbed, and non-controlling paths are how it spreads. This lesson lays out those mechanics so you can follow an unknown from source to symptom and spot when it travels further, or less far, than expected.
Foundation12 min readGLSX-PropagationMuxFlip-FlopControlling Values
Chapter 6 · Section 6.3 · X-Propagation
Project thread — the FSM's state X (5.5) reaches busy/done through the output logic. These mechanics are how you'll trace that path in 6.6.
1. Why Should I Learn This?
Root-causing an X means following it — backward to its source, forward to its symptom. That needs the flow rules.
- Muxes/flops/latches each have specific
Xrules. - Controlling values (
AND-0,OR-1) absorbX; non-controlling paths spread it. - Knowing the rules tells you when an
Xshould stop — and flags when it doesn't.
This is the mechanics layer between "where X comes from" (6.1) and root-causing the FSM X (6.6).
2. Real Silicon Story — the X that stopped where it shouldn't have
An engineer tracing an X expected it to reach a status output, but the output was a clean 0. They concluded the X had "gone away" and closed the investigation.
The X hadn't gone away — it hit an AND gate whose other input was 0, a controlling value that forced the output to 0 regardless (AND(X,0)=0), absorbing the X on that path. The X was still live on other paths. Mistaking absorption for resolution left a real upstream X un-fixed.
Lesson: X flow follows controlling values — an X can be absorbed by a dominating 0/1 on one path while still propagating on others. Trace by the rules, not by where the X happens to disappear.
3. Concept — the X-flow rules
Muxes:
- Unknown select + differing data →
X. - Unknown select + equal data → definite (both branches agree; less pessimistic).
Xon an unselected input → no effect (select routes around it).
Flip-flops:
Xon D → capturedXat the clock edge.Xon the clock → outputX(can't tell if/when it triggered).Xon async set/reset → outputX(can't tell if it's asserted).
Latches:
Xon enable →X(can't tell open vs closed).
Ordinary gates — controlling values:
- Controlling value dominates and absorbs
X:AND(X,0)=0,OR(X,1)=1,NAND(X,0)=1,NOR(X,1)=0. - Non-controlling input passes
X:AND(X,1)=X,OR(X,0)=X,XOR(X,anything)=X,NOT(X)=X.
Reading it:
- Controlling value on any input →
Xon the other input is absorbed. - All non-controlling →
Xpropagates. - Some rules (mux equal-data) are less pessimistic; others may be conservative (6.2).
4. Mental Model — X is a rumour; controlling values are people who know the truth
Treat X as a rumour spreading through the logic.
- A gate with a controlling value is someone who knows the fact — they stop the rumour cold (
AND-0 says "definitely 0", ignoring the rumour). - A gate with only non-controlling inputs just passes the rumour on (
AND-1 has nothing to counter it →X). - A mux with an unknown select is at a fork with no directions — it can only shrug (
X), unless both roads lead the same place (equal data). - A flop writes the rumour down (captures
X) and repeats it next cycle.
Follow the rumour: it dies where someone knows the truth (controlling value), spreads where nobody does.
5. Working Example — X absorbed vs propagated
The controlling-value truth table, and a flop capturing X:
# Gate X-flow — REPRESENTATIVE (controlling value in brackets)
AND(X, 0) = 0 # [0] controlling -> ABSORBS X
AND(X, 1) = X # 1 non-controlling -> PASSES X
OR (X, 1) = 1 # [1] controlling -> ABSORBS X
OR (X, 0) = X # 0 non-controlling -> PASSES X
XOR(X, 0) = X # XOR has no controlling value -> always PASSES X
NOT(X) = X// Flop capturing X on D; and X on reset forcing X — REPRESENTATIVE
DFFRX1 u_q (.D(x_data), .CK(clk), .RN(rst_n), .Q(q));
// D = X -> q captures X at the edge
// RN = X (bad reset) -> q = X (can't tell if reset is asserted)Practical context (representative, tool-neutral):
# Tracing an X in a waveform (tool-neutral):
# backward: follow the X to the first net that is X -> toward the SOURCE (6.1)
# forward: follow it until a CONTROLLING value (AND-0 / OR-1) ABSORBS it
# a mux X? check the SELECT (unknown select + differing data = X)
# a flop X? check D, clock, and async reset for XAn X absorbed by a controlling value vs propagated, as a real waveform:
Controlling value absorbs X (AND with 0) while a non-controlling path propagates it (AND with 1)
8 cycles6. Debugging Session — an X that "disappeared" (was absorbed)
An X trace appears to end at a clean output and the investigation is closed, but the X was absorbed by a controlling value (AND with 0) on that path while still propagating on others — absorption is not resolution
CONTROLLING VALUES ABSORB X; IT MAY STILL LIVE ELSEWHEREAn engineer traces an X forward; at one gate the output is a clean 0, so they conclude the X "resolved" and close the investigation. A downstream symptom persists.
The X was absorbed, not resolved. It reached an AND gate whose other input was 0 — a controlling value that forces the output to 0 regardless of the X (AND(X,0)=0). On that path the X vanished, but the source X is still live and propagates on other paths (through non-controlling gates, or a mux with an unknown select). Mistaking a controlling-value absorption for the X being fixed leaves the real upstream X in place. The X-flow rules — controlling values absorb, non-controlling pass — explain exactly where it stopped and where it continues.
Trace by the rules, not by where the X happens to disappear: an X that stops at a gate with a controlling value (AND-0, OR-1) is absorbed on that path only — follow it on the other paths and, more importantly, backward to its source (6.1). Fix the source (reset the flop, initialize the select, resolve the contention), not the symptom. The lesson: X flows by learnable rules — muxes propagate on unknown selects (differing data), flops capture X on D/clock/reset, and controlling values (AND-0, OR-1) absorb X while non-controlling inputs pass it; an absorbed X is not a resolved one. (Some rules are conservative — pessimism, 6.2; X is a modelling value; GLS stays dynamic, STA signs off, 0.3.)
7. Common Mistakes
- Thinking an absorbed
Xis resolved. A controlling value hides it on one path; the source lives. - Ignoring the mux equal-data case. Equal data can keep a definite output despite an unknown select.
- Forgetting
Xon clock/reset. A flop goesXfrom anXclock or async reset, not justXdata. - Overlooking
XOR.XORhas no controlling value — it always passesX. - Tracing forward only. The fix is at the source — trace backward (6.1).
8. Industry Best Practices
- Trace
Xboth ways — backward to source, forward to symptom. - Use controlling values to explain where an
Xstops (absorbed, not resolved). - Check select/clock/reset first for mux/flop
X. - Fix the source, not the absorbed symptom.
- Flag conservative rules as possible pessimism (6.2) when relevant.
Senior Engineer Thinking
- Beginner: "The
Xturned into0at this gate — it's fixed." - Senior: "That's an
ANDwith a0— a controlling value absorbing theXon this path. The sourceXis still live. Let me trace backward and fix the source, not celebrate the absorption."
The senior reads X flow by controlling values and always traces to the source.
Silicon Impact
Understanding X flow is what makes root-causing reliable. Mistake absorption for resolution and you leave a real source X (uninitialized state, bad reset) in place — it keeps propagating on other paths and can reach silicon as a power-up/intermittent failure (0.3). Conversely, knowing that controlling values absorb X prevents chasing an X down a dead path. And recognising which flow rules are conservative (mux/UDP pessimism, 6.2) keeps you from waiving a real X or drowning in a false one. The flow rules turn X tracing from guesswork into a deterministic walk to the root cause.
Engineering Checklist
- Traced each
Xbackward to source and forward to symptom. - Explained where
Xstopped via a controlling value (absorbed ≠ resolved). - Checked select (mux) and clock/reset (flop) for
X. - Fixed the source, not an absorbed symptom.
- Noted conservative rules as possible pessimism (6.2).
Try Yourself
- Drive an
Xinto anANDgate with the other input0— the output is0(absorbed). - Observe: change the other input to
1— the output becomesX(passed). - Change: feed an unknown select into a mux with differing data (→
X), then make the data equal (→ definite). - Expect: you can now predict where an
Xstops (controlling values, equal-data muxes) and where it spreads — trace one end to end.
Any free Verilog simulator demonstrates all these X-flow rules. No paid tool required.
Interview Perspective
- Weak: "
Xjust spreads everywhere." - Good: "A mux with an unknown select outputs
X; a flop capturesXon D; controlling values likeAND-0 block it." - Senior: "
Xflows by rules: muxes propagate on unknown selects with differing data, flops captureXon D/clock/reset, and controlling values (AND-0,OR-1) absorbXwhile non-controlling inputs pass it. An absorbedXisn't resolved — the source is still live, so I trace backward to fix the source. Some rules are conservative (pessimism)."
9. Interview / Review Questions
10. Key Takeaways
- Muxes: unknown select + differing data →
X; equal data can stay definite; anXon an unselected input has no effect. - Flip-flops:
Xon D is captured;Xon the clock or async reset drives the outputX. Latches:Xon enable →X. - Ordinary gates flow
Xby controlling value:AND-0→0andOR-1→1absorbX; non-controlling inputs (AND-1,OR-0, anyXOR) passX. - An absorbed
Xis not a resolved one — a controlling value hides it on one path while the sourceXlives and spreads on others; trace backward to the source (6.1). - Some flow rules are conservative (pessimism, 6.2);
Xis a modelling value, and GLS stays dynamic (STA signs off, 0.3). Next: 6.4 — why RTL hides bugs the netlist exposes.
Quick Revision
X-flow rules: mux (unknown select + differing data →
X; equal data → definite); flop (X on D/clock/reset →X); latch (X enable →X). Gates: controlling values absorb (AND-0→0,OR-1→1), non-controlling pass (AND-1,OR-0,XOR→X). Absorbed ≠ resolved — trace backward to the source (6.1). Some rules conservative (pessimism). Next: 6.4 — why RTL hides bugs the netlist exposes.