Skip to content

GLS · Chapter 6 · X-Propagation

Controlling X-Propagation (Xprop Modes)

If RTL optimism hides bugs that the netlist exposes, you can make RTL more honest without waiting for full gate-level simulation. X-propagation modes tell the simulator to force unknowns through conditionals in RTL, so an if, case, or ternary with an unknown select yields an unknown instead of quietly picking a branch, just like a netlist mux would. This shifts the catch left, surfacing uninitialized-control and reset bugs earlier and more cheaply than in GLS. Common flavours are a pessimistic ternary mode and a less pessimistic merge mode that keeps a value only when both branches agree. This lesson explains the modes and their trade-offs, and makes clear that xprop is a modelling aid that complements gate-level simulation rather than replacing it, and that neither is literal silicon truth.

Foundation11 min readGLSXpropX-PropagationRTLShift-Left

Chapter 6 · Section 6.5 · X-Propagation

Project thread — the FSM's power-up X (5.5) is the kind of bug xprop catches in RTL. This lesson is the shift-left tool; 6.6 root-causes the FSM X end to end.

1. Why Should I Learn This?

Catching an X-hidden bug in RTL is far cheaper than in GLS or silicon — and xprop makes RTL catch it.

  • xprop forces X through RTL conditionals, defeating RTL optimism (6.4).
  • It shifts left — uninitialized-control bugs appear in RTL sim.
  • It is a complement to GLS, not a replacement — and a modelling aid, not silicon truth.

This is the practical response to 6.4, and it primes the FSM root-cause in 6.6.

2. Real Silicon Story — the bug caught a month earlier

A team repeatedly found uninitialized-control Xs late, in GLS, near tape-out — each one an expensive scramble.

They enabled xprop in their RTL regressions. The same class of bug — unknown selects, missing resets — now produced X in RTL simulation, weeks earlier, where fixes were cheap. GLS still ran (for real cell/timing X sources xprop can't model), but far fewer surprises reached it.

Lesson: xprop reproduces netlist-like X-pessimism in RTL, shifting the catch of X-optimism bugs left — cheaper and earlier — while GLS remains for what xprop cannot cover.

3. Concept — what xprop does, its modes, and its limits

What xprop does:

  • Overrides RTL's X-optimistic conditional semantics.
  • An if/case/?: with an unknown control yields X (instead of picking a branch).
  • Reproduces the netlist mux behaviour (6.3) in RTL.

Common modes:

  • Ternary / pessimistic: any unknown control → X. Maximum honesty, more X.
  • Merge: if both branches would produce the same value, keep it; else X. Less pessimistic (closer to the mux equal-data case, 6.3).

What it catches (shift-left):

  • Uninitialized selects/controls, missing resets — the X-optimism bugs of 6.4, in RTL.

Limits (important):

  • Not a GLS replacement. xprop models conditional X-pessimism, not real cell UDP X, timing-check X, or contention — GLS still needed for those.
  • Trade-offs: adds controlled pessimism (some false X to triage, 6.2) and simulation cost.
  • Not silicon truth — a modelling aid for uncertainty (as is GLS).
Xprop modes: default RTL optimistic hides X; ternary forces X on unknown control; merge keeps value if branches agree; complements GLSenable xpropRTL default(optimistic)unknown control → branch →hides bug (6.4)Xprop: ternaryunknown control → X (maxpessimism)Xprop: mergebranches agree → value;else X (less pessimistic)Shift-left in RTLcatch uninitialized-controlbugs earlyStill run GLScell/timing/contention Xxprop can't modelModelling aidnot silicon truth; somefalse X to triage12
Figure 1 — X-propagation (xprop) modes (representative). By default RTL is X-optimistic: an unknown control picks a branch -> definite value (hides bugs, 6.4). Xprop makes RTL honest: TERNARY mode forces X on any unknown control (max pessimism); MERGE mode keeps a definite value only if both branches agree, else X (less pessimistic). This shifts the catch of uninitialized-control bugs LEFT into RTL. Xprop complements GLS (which still models cell/timing/contention X) and is a modelling aid, not silicon truth.

4. Mental Model — a strictness dial on RTL's handling of unknowns

xprop is a strictness dial for how RTL treats unknowns.

  • Off (default): lenient — RTL guesses a branch on an unknown control (optimistic, hides bugs).
  • Merge: moderate — RTL keeps a value only if both branches agree; otherwise admits X.
  • Ternary: strict — any unknown control is admitted as X.

Turning the dial up makes RTL behave more like the honest netlist mux, catching bugs earlier — at the cost of more X to triage. GLS is a different instrument for X sources the dial can't reach (cells, timing, contention).

5. Working Example — the same conditional, xprop off vs on

The conditional and how xprop changes its result:

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
// Same RTL conditional — result depends on xprop mode
assign y = sel ? a : b;
//  xprop OFF (default):   sel = X -> picks a branch -> DEFINITE (hides bug, 6.4)
//  xprop TERNARY:         sel = X -> y = X           (honest; matches netlist mux)
//  xprop MERGE:           sel = X, a==b -> y = a==b  (definite); a!=b -> y = X

Practical context (representative, tool-neutral):

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
# Using xprop as a shift-left step (tool-neutral):
#   1) enable xprop (merge or ternary) in RTL regressions
#   2) triage the new X's: real uninitialized control (fix) vs added pessimism (6.2)
#   3) still run GLS -> catches cell/timing/contention X that xprop does NOT model
# xprop and GLS are COMPLEMENTARY; neither is silicon truth.

RTL default vs RTL+xprop (matching the netlist), as a real waveform:

Unknown select: RTL default (definite, hides bug) vs RTL+xprop (X, matches netlist)

8 cycles
With an unknown select, default RTL shows a definite output while RTL with xprop shows X like the netlistxprop reproduces netlist X in RTLxprop reproduces netli…clksel (uninit)XXXXXXXXy (RTL default)y (RTL + xprop)XXXXXXXXt0t1t2t3t4t5t6t7
Representative. sel is uninitialized (X). Default RTL picks a branch (definite) and hides the bug. RTL with xprop (ternary) forces X — reproducing the netlist mux behaviour in RTL, so the bug is caught early. The GLS trace matches the xprop trace here: xprop shifted the catch left.

6. Debugging Session — reproduce a GLS-only X in RTL with xprop

1

A GLS-only X keeps surfacing late; enabling xprop in RTL reproduces it earlier by forcing X through conditionals, shifting the catch left — but GLS is still required for cell/timing/contention X that xprop does not model

XPROP SHIFTS THE CATCH LEFT; GLS STILL NEEDED
Symptom

An uninitialized-control X is found only in GLS, late in the cycle. The team wants to catch this class earlier, in RTL regressions.

Root Cause

The bug is an X-optimism case (6.4): RTL's default conditional semantics resolve the unknown control to a branch, so RTL sim hides it and only the netlist mux (in GLS) exposes it. This isn't a limitation of the design checks — it is RTL's default X-optimistic modelling. Without xprop, RTL simply cannot show this X, so the catch lands late in GLS.

Fix

Enable xprop (merge or ternary) in the RTL regressions so unknown controls yield X in RTL — reproducing the netlist behaviour and shifting the catch left. Then triage the new Xs (real uninitialized control to fix, vs added pessimism to manage, 6.2). Keep running GLS: xprop models only conditional X-pessimism, not real cell UDP X, timing-check X, or contention — GLS remains necessary for those. The lesson: xprop makes RTL honest about unknowns (forcing X through conditionals), shifting the catch of X-optimism bugs left — a modelling aid that complements, not replaces, GLS; neither is silicon truth. (GLS stays dynamic — STA signs off timing, 0.3.)

7. Common Mistakes

  • Treating xprop as a GLS replacement. It models conditional X only — not cell/timing/contention X.
  • Leaving xprop off and finding X-optimism bugs late.
  • Not triaging xprop Xs. Some are added pessimism (6.2) to manage.
  • Confusing merge and ternary. Merge keeps agreeing branches; ternary forces X on any unknown control.
  • Calling xprop (or GLS) silicon truth. Both are modelling aids for uncertainty.

8. Industry Best Practices

  • Enable xprop in RTL regressions to shift X-optimism catching left.
  • Choose the mode deliberately (merge for less noise, ternary for max honesty).
  • Triage xprop Xs (real vs pessimism, 6.2).
  • Still run GLS — for cell/timing/contention X xprop can't model.
  • Set expectations: xprop and GLS are complementary modelling aids, not silicon.

Senior Engineer Thinking

  • Beginner: "We found the X in GLS — that's the only place to catch it."
  • Senior: "That's an X-optimism bug — I can reproduce it in RTL with xprop and catch the whole class weeks earlier. GLS still runs for cell/timing/contention X xprop can't model."

The senior uses xprop to shift-left X-optimism bugs while keeping GLS for what xprop cannot cover.

Silicon Impact

xprop is a cost-and-schedule multiplier for X quality. The uninitialized-control/reset bugs that RTL optimism hides (6.4) are expensive when caught late (GLS near tape-out) and catastrophic when missed (silicon power-up failures, 0.3). Enabling xprop moves that catch left into RTL, where fixes are cheap and fast — dramatically reducing late-stage X surprises. It does not eliminate GLS: real cell UDP X, timing-check X, and contention live only at the gate level. Used together — xprop to shift-left, GLS to cover the rest — they form a layered X defence that keeps uninitialized-state bugs off the tape-out.

Engineering Checklist

  • Enabled xprop (merge/ternary) in RTL regressions.
  • Triaged xprop Xs (real uninitialized control vs pessimism, 6.2).
  • Kept running GLS for cell/timing/contention X.
  • Chose the xprop mode deliberately (noise vs honesty).
  • Communicated xprop/GLS as complementary modelling aids (not silicon truth).

Try Yourself

  1. Simulate sel ? a : b in RTL default with sel uninitialized — output is definite (bug hidden).
  2. Observe: RTL optimism at work.
  3. Change: enable xprop (ternary) and re-run the RTL.
  4. Expect: the output is now X — the bug reproduced in RTL, earlier than GLS. Then try merge mode with a == b and see the definite value return (less pessimism).

Many free/OSS simulators offer an xprop-style mode; the concept is universal even where the option name differs. No paid tool required.

Interview Perspective

  • Weak: "You can only catch X-optimism bugs in GLS."
  • Good: "xprop forces X through RTL conditionals so unknown controls yield X, catching them in RTL."
  • Senior: "xprop reproduces netlist X-pessimism in RTL (ternary or merge), shifting the catch of uninitialized-control bugs left. It's a modelling aid with trade-offs — added pessimism to triage — and it complements GLS, which still covers cell/timing/contention X. Neither is silicon truth; together they're a layered X defence."

9. Interview / Review Questions

10. Key Takeaways

  • X-propagation (xprop) modes make RTL force X through conditionals, so an unknown control yields X (like a netlist mux, 6.3) instead of RTL's default branch-pick — defeating the X-optimism of 6.4.
  • Common modes: ternary (any unknown control → X, max honesty) and merge (branches agree → keep value, else X, less pessimistic).
  • It shifts the catch left — uninitialized-control/reset bugs surface in RTL simulation, earlier and cheaper than GLS.
  • xprop is a modelling aid with trade-offs (added, controlled pessimism to triage, 6.2; simulation cost) and complements — does not replace — GLS (which models cell/timing/contention X xprop cannot).
  • Neither xprop nor GLS is silicon truth — both are honest models of uncertainty; GLS stays dynamic (STA signs off, 0.3). Next: 6.6 — root-causing an X in the FSM.

Quick Revision

xprop = make RTL honest about unknowns: force X through if/case/?: on an unknown control (ternary = always X; merge = agree→value, else X). Shifts the catch of X-optimism bugs LEFT into RTL (cheaper than GLS). A modelling aid with trade-offs (pessimism to triage); complements, not replaces, GLS (cell/timing/contention X). Neither is silicon truth. Next: 6.6 — root-causing an X in the FSM.