Skip to main content

Level Shifter Strategies

Isolation Strategies handled signals that go undefined when a domain loses power entirely. This page covers a different problem: two domains that are both powered, simultaneously, but at genuinely different voltages — where a signal crossing between them needs translating, not clamping.

Why voltage, not just logic level, matters here​

A signal driven at 0.8V read directly by logic expecting a full 1.2V swing may not register as a clean logic-1 at all — and the reverse direction has its own risk: a signal driven at the full 1.2V fed directly into transistors sized for 0.8V can, over time, actually damage them. Neither direction is safe to leave unhandled, and neither is the same circuit problem as the other.

set_level_shifter​

set_level_shifter LtoH_sig \
-domain pd_gated_aon -applies_to inputs \
-rule low_to_high -location self -threshold 0.02

set_level_shifter HtoL_sig \
-domain pd_gated_aon -applies_to outputs \
-rule high_to_low -location self
  • -rule low_to_high — a low-to-high shifter amplifies a signal from a lower-voltage source so a higher-voltage destination reads it reliably as a clean logic level.
  • -rule high_to_low — a high-to-low shifter attenuates a signal from a higher-voltage source, specifically to avoid over-driving lower-voltage transistors on the receiving side. -rule both covers a boundary needing both directions at once.
  • -threshold is a real voltage-difference number, not a formality: below it, the tool may determine no level shifter is actually needed at all — two domains close enough in voltage can sometimes cross safely without translation. 0.02 above means a shifter is inserted only once the voltage gap between the two sides exceeds 20mV.
  • -applies_to <inputs|outputs|both> picks which side of the domain boundary the strategy covers, the same option isolation strategies use.
  • -no_shift explicitly declares that no level shifter should be inserted at all for the named signal(s) — an intentional override, distinct from simply never writing a strategy for that boundary, useful when an author has already confirmed by other means that the crossing is safe untranslated.

-location, with one more option than isolation had​

self, parent, and sibling mean the same thing here as they did for isolation — where the shifter cell physically sits and which domain's power it draws from — plus fanout, splitting the shifter's placement across each individual destination when a single source signal fans out to multiple receiving domains at different voltages. A fifth option, automatic, exists specifically because voltage-boundary placement is usually unambiguous enough for a tool to infer correctly on its own — worth noting as a real contrast with isolation, where self/parent is more often set explicitly rather than left to inference.

map_level_shifter_cell: binding the abstract strategy to a real cell​

Just like a power switch (see Power Switches), set_level_shifter only declares intent — it doesn't by itself pick a physical gate. That binding happens with map_level_shifter_cell:

map_level_shifter_cell LtoH_sig \
-domain pd_gated_aon \
-lib_cells {LS_LH_X1 LS_LH_X2}

-lib_cells supplies a list, not a single cell — handing synthesis multiple candidate library cells (here, two drive strengths of the same low-to-high shifter) lets the tool pick per-instance based on timing, area, and load, rather than forcing one fixed cell everywhere the strategy applies. Without this mapping, a set_level_shifter strategy describes a requirement synthesis has no way to actually implement.

It's also worth knowing that low-to-high and high-to-low shifter cells aren't symmetric in complexity: a low-to-high (LH) shifter — amplifying a weaker signal up to a stronger logic level — is generally a larger, more complex cell than a high-to-low (HL) shifter, which only needs to attenuate an already-strong signal. The rule of thumb: it takes more circuitry to reliably create a clean higher-voltage level than to simply clamp a signal down to a lower one.

Bidirectional signals: a special case set_level_shifter's directions don't cover​

Everything above assumes a signal crosses the boundary in one fixed direction — but a bidirectional pin (a shared data bus that's sometimes driven from the low-voltage side, sometimes from the high-voltage side) doesn't fit -rule low_to_high/high_to_low cleanly, since which direction needs shifting changes at runtime. Specialized bidirectional level shifter cells exist — bundling two directional shifters, direction-control logic, and tri-state buffers into one cell — but they're genuinely complex and not available in every library. The more common real-world fix is architectural, not a UPF construct: redesign the interface to split the bidirectional signal into separate, always-one-direction input and output paths with explicit direction control, so each path is just an ordinary unidirectional set_level_shifter case again.

When both problems happen at the same boundary at once​

Isolation Strategies and this page solve two genuinely different problems — undefined power-down state versus mismatched-but-both-powered voltages — but they aren't mutually exclusive at a single signal. A boundary between a domain that both switches off entirely and runs at a different voltage than its neighbor needs isolation and level shifting on the exact same pin. Rather than stacking two separate cells there (one isolation cell feeding a level shifter, or vice versa — extra area and an extra stage of delay either way), real cell libraries commonly offer a combined enable level shifter (ELS) cell that performs both functions in a single gate: it isolates while the domain is powered down and translates voltage while it's active, in one instance rather than two. A tool that supports it can be directed to prefer this combined cell wherever a pin genuinely needs both strategies at once, rather than composing two separately-mapped cells — smaller and faster than the two-cell alternative, precisely because it's purpose-built for the combined case instead of two general-purpose cells bolted together.

What's next​

Isolation and level shifting both concern signals crossing a domain boundary while something is happening on one or both sides. The next page covers something different: what happens inside a domain, to its own internal state, the moment it loses power entirely.