Why Learn Isolation Strategies? When a power domain turns off, its outputs float to unknown values that can propagate to always-on logic, causing corruption, increased power consumption, and functional failures. Isolation strategies prevent this X-propagation by inserting isolation cells that clamp signals to known values when domains are powered down. Understanding isolation is critical for safe power gating implementation. In this tutorial, you'll master UPF isolation strategy specification.

16 min read | Intermediate Level

What You'll Learn

  • Understand the X-propagation problem and why isolation is required
  • Define isolation strategies using set_isolation
  • Specify isolation control signals and clamp values
  • Choose appropriate isolation cell locations and supply sets

Understanding the X-Propagation Problem

When a power domain is gated off, all logic in that domain loses power and its outputs become undefined (X in simulation, floating voltage in silicon).

The Problem Without Isolation

Power-Gated Domain          Always-On Domain
┌──────────────┐            ┌───────────────┐
│  VDD = OFF   │            │  VDD = ON     │
│              │            │               │
│  Logic   ────┼───────X───>│  Combinational│
│  (unpowered) │  Undefined │  Logic        │
└──────────────┘   Value    └───────────────┘
                                   ↓
                            Corrupted output
                            Shoot-through current
                            Oscillation

Consequences of X-propagation:

  • Functional Errors: Unknown values corrupt always-on logic computations
  • Shoot-Through Current: Intermediate voltages cause both PMOS and NMOS to conduct simultaneously, wasting power
  • Metastability: Flip-flops receiving X may oscillate or take unpredictable values
  • Simulation Mismatches: X-propagation in simulation doesn't match silicon behavior

Without isolation, power gating is unsafe. Even if the unpowered domain is functionally "disconnected" by software, physical signal connections remain and X-values will propagate, potentially crashing the system or causing data corruption.

Real Silicon Failures from Missing Isolation

A mobile SoC taped out without proper isolation on a power-gated GPU domain. When the GPU was powered down, floating outputs propagated into the memory controller, causing random bit flips in cache coherency logic. The chip passed simulation (X-propagation detected) but failed in silicon with mysterious crashes during GPU sleep. The fix required a respin with proper isolation cells, costing months of schedule and millions in engineering costs.

Isolation Cell Fundamentals

An isolation cell is a combinational cell that:

  1. Passes signals normally when isolation is disabled
  2. Clamps outputs to a known value (0 or 1) when isolation is enabled
  3. Uses always-on supply (not the gated domain supply)

Isolation Cell Operation

Input from                        Output to
Gated Domain    [Isolation Cell]  Always-On Domain
    │                 │                 │
    ├─────────────────┤                 │
    │  Enable Signal  │                 │
    │  (Always-On)    │                 │
    └─────────────────┘                 │
                                        │
When Enable = 0 (normal): Output = Input (pass-through)
When Enable = 1 (isolate): Output = Clamp Value (0 or 1)

Powered by Always-On Supply (VDD_TOP)

Common Isolation Cell Types

Cell TypeLogic FunctionClamp Value
ISO_AND_0out = in AND !isoClamps to 0 when isolated
ISO_OR_1out = in OR isoClamps to 1 when isolated
ISO_AND_1out = in AND iso_nClamps to 0 (active-low enable)
ISO_OR_0out = in OR !iso_nClamps to 1 (active-low enable)

Isolation cells are powered by the always-on domain supply (e.g., VDD_TOP), not the gated domain supply. This ensures they remain functional to clamp outputs even when the source domain is unpowered.

Quick Check

Q: Why must isolation cells be powered by the always-on supply?

Show Answer

If isolation cells were powered by the gated domain supply (VDD_GPU), they would lose power when the domain is gated off, defeating their purpose. Isolation cells must remain operational during power-down to actively drive the clamp value (0 or 1) to prevent X-propagation. Therefore, they use the always-on supply (VDD_TOP) from the parent/destination domain.

When to Use Isolation

Isolation is required when:

ScenarioIsolation Needed?Reason
Power-gated domain outputsAlways YESPrevent X when domain is OFF
Same-voltage, both always-onNoNo power-off condition
Multi-voltage (both powered)No (use level shifters)Level shifters handle voltage, not isolation
Power-gated + multi-voltageYES (both isolation + LS)Need isolation AND level shifting

Rule of thumb: Any domain that can be powered OFF requires isolation at its outputs. If the domain is always-on (never gated), isolation is not needed. Multi-voltage alone doesn't require isolation—only power gating does.

Syntax: set_isolation

The set_isolation command defines isolation strategies for power domain boundaries.

Basic Form


set_isolation strategy_name -domain domain_name \
  -isolation_supply_set supply_set_name \
  -clamp_value {0|1} \
  [options]

Key Parameters

  • strategy_name - Unique identifier for isolation strategy (required)
  • -domain domain_name - Domain being isolated (required)
  • -isolation_supply_set set_name - Supply set for isolation cells (required, must be always-on)
  • -clamp_value {0|1} - Value to clamp when isolated (required)
  • -isolation_signal signal_name - Control signal (required)
  • -isolation_sense {high|low} - Signal polarity (active-high or active-low)
  • -location {self|parent|fanout} - Where to place isolation cells
  • -applies_to {from|to|both} - Signal direction (outputs, inputs, or both)

Usage Variations

1. Basic Isolation (Clamp to 0):


set_isolation ISO_GPU -domain PD_GPU \
  -isolation_supply_set SS_TOP \
  -clamp_value 0 \
  -isolation_signal iso_gpu_enable \
  -isolation_sense high

2. Isolation with Location:


set_isolation ISO_CPU -domain PD_CPU \
  -isolation_supply_set SS_TOP \
  -clamp_value 0 \
  -isolation_signal iso_cpu \
  -isolation_sense high \
  -location parent

3. Isolation on Inputs (Rare):


set_isolation ISO_INPUT -domain PD_DSP \
  -isolation_supply_set SS_TOP \
  -clamp_value 1 \
  -isolation_signal iso_dsp \
  -isolation_sense high \
  -applies_to to

Choosing Clamp Value

The -clamp_value determines the safe logic level when isolation is active.

Clamp to 0 (Most Common)


set_isolation ISO_GPU -domain PD_GPU \
  -isolation_supply_set SS_TOP \
  -clamp_value 0 \
  -isolation_signal iso_gpu \
  -isolation_sense high

Use when:

  • Receiving logic interprets 0 as inactive/safe state
  • Enable signals (active-high) should be disabled (0 = off)
  • Data signals where 0 is safe default

Clamp to 1


set_isolation ISO_MODEM -domain PD_MODEM \
  -isolation_supply_set SS_TOP \
  -clamp_value 1 \
  -isolation_signal iso_modem \
  -isolation_sense high

Use when:

  • Receiving logic needs 1 for safe state
  • Active-low signals (e.g., reset_n) should be asserted (1 = inactive)
  • Protocol requires 1 for idle state

Signal-Specific Clamp Values

Different signals may need different clamp values:

Signal TypeRecommended ClampReason
Enable (active-high)0Disable when source is off
Enable (active-low)1Disable (inactive high)
Reset_n (active-low)1Keep out of reset
Data bus0All-zeros is safe default
Valid/Ready0Not valid, not ready

Choosing the wrong clamp value can cause functional errors even with isolation in place. Analyze receiving logic to determine safe values. When in doubt, use 0 for most signals, but verify with design requirements.

Isolation Control Signals

The -isolation_signal and -isolation_sense control when isolation is active.

Active-High Isolation (isolation_sense high)


set_isolation ISO_GPU -domain PD_GPU \
  -isolation_supply_set SS_TOP \
  -clamp_value 0 \
  -isolation_signal iso_gpu_enable \
  -isolation_sense high

Behavior:

  • iso_gpu_enable = 0: Isolation disabled (signals pass through)
  • iso_gpu_enable = 1: Isolation active (outputs clamped to 0)

Active-Low Isolation (isolation_sense low)


set_isolation ISO_CPU -domain PD_CPU \
  -isolation_supply_set SS_TOP \
  -clamp_value 0 \
  -isolation_signal iso_cpu_n \
  -isolation_sense low

Behavior:

  • iso_cpu_n = 1: Isolation disabled (signals pass through)
  • iso_cpu_n = 0: Isolation active (outputs clamped to 0)

Power Sequencing with Isolation

Proper isolation timing is critical:

Power-Down Sequence:
1. Assert isolation signal (iso_enable = 1)
   → Isolation cells clamp outputs to safe values
2. Wait for isolation to propagate
3. De-assert power enable
   → Power switch opens, domain loses power
4. Domain OFF, outputs safely clamped by isolation cells

Power-Up Sequence:
1. Assert power enable
   → Power switch closes, domain receives power
2. Wait for VDD_domain to stabilize
3. Release reset
4. De-assert isolation signal (iso_enable = 0)
   → Isolation cells pass real signals
5. Domain fully operational

Isolation must be asserted before power-down and de-asserted after power-up and reset release. This ensures outputs are clamped to safe values during the entire period when the domain is unpowered or resetting.

Quick Check

Q: What happens if you power down a domain without asserting isolation first?

Show Answer

If power is removed before isolation is asserted, there's a brief window where outputs transition from valid logic levels through intermediate voltages to undefined/floating. During this transition, X-values propagate to always-on logic before isolation cells can clamp them. This can corrupt state in receiving logic, exactly the problem isolation is meant to prevent. Always assert isolation before initiating power-down.

Isolation Cell Location

The -location option controls where isolation cells are placed.

Location Options

LocationPlacementUse Case
selfInside gated domainAt output of source domain (less common)
parentIn always-on domainOutside gated domain boundary (most common)
fanoutAt each sinkOne isolation cell per receiving instance

Parent Location (Recommended)


set_isolation ISO_GPU -domain PD_GPU \
  -isolation_supply_set SS_TOP \
  -clamp_value 0 \
  -isolation_signal iso_gpu \
  -isolation_sense high \
  -location parent
Power-Gated Domain (VDD_GPU)    Always-On Domain (VDD_TOP)
┌─────────────────────┐         ┌────────────────────────┐
│  Logic          ────┼────────>│ [Isolation Cell]       │
│                     │         │ (powered by VDD_TOP)   │
│  (can be OFF)       │         │        ↓               │
└─────────────────────┘         │   Always-On Logic      │
                                └────────────────────────┘

Benefits:

  • Isolation cells remain powered when domain is off
  • Cleaner physical design (isolation at domain boundary)
  • Standard approach for most designs

Use -location parent as default for isolation. This ensures isolation cells are in the always-on domain where they can function during power-down. Only use -location self if you have specific physical design constraints requiring isolation inside the gated domain.

Complete Isolation Example


# ===================================================================
# Complete Power Gating with Isolation
# ===================================================================

# TOP DOMAIN: Always-on
create_power_domain PD_TOP -include_scope
create_supply_net VDD_TOP -domain PD_TOP
create_supply_net VSS -domain PD_TOP

create_supply_set SS_TOP \
  -function {power VDD_TOP} \
  -function {ground VSS}
associate_supply_set SS_TOP -handle PD_TOP

add_power_state VDD_TOP -state {ON 1.2}

# GPU DOMAIN: Power-gated (no retention)
create_power_domain PD_GPU -elements {gpu_inst}
create_supply_net VDD_GPU -domain PD_GPU
create_supply_net VSS -domain PD_GPU

create_supply_set SS_GPU \
  -function {power VDD_GPU} \
  -function {ground VSS}
associate_supply_set SS_GPU -handle PD_GPU

add_power_state VDD_GPU \
  -state {ACTIVE 0.9} \
  -state {OFF off}

# Power switch
create_power_switch PSW_GPU -domain PD_GPU \
  -input_supply_port {vin VDD_TOP} \
  -output_supply_port {vout VDD_GPU} \
  -control_port {ctrl gpu_power_enable} \
  -on_state {on vin {ctrl}}

# Isolation strategy
set_isolation ISO_GPU -domain PD_GPU \
  -isolation_supply_set SS_TOP \
  -clamp_value 0 \
  -isolation_signal gpu_iso_enable \
  -isolation_sense high \
  -location parent

# ===================================================================
# Power-Down Sequence:
# 1. Assert gpu_iso_enable = 1 (activate isolation, clamp to 0)
# 2. De-assert gpu_power_enable = 0 (turn off power switch)
# 3. VDD_GPU = OFF, GPU outputs safely clamped by isolation cells
#
# Power-Up Sequence:
# 1. Assert gpu_power_enable = 1 (turn on power switch)
# 2. Wait for VDD_GPU stable at 0.9V
# 3. Release reset to GPU
# 4. De-assert gpu_iso_enable = 0 (disable isolation, pass signals)
# 5. GPU fully operational
# ===================================================================

Isolation Cell Overhead

A typical GPU with 2000 output signals to always-on logic requires 2000 isolation cells. At ~5% area per cell relative to a flip-flop, isolation adds approximately 1-2% to overall GPU area. This modest overhead is essential for safe power gating—without isolation, power gating would corrupt system state and be unusable. The power savings from gating (90%+ reduction in GPU leakage) far outweighs the isolation cell area cost.

Mapping Isolation Cells to Library

UPF isolation strategies are mapped to physical library cells during synthesis.

Syntax: map_isolation_cell


map_isolation_cell strategy_name -domain domain_name \
  -lib_cells {cell_list}

Example


# Map isolation strategy to AND-based isolation cells (clamp to 0)
map_isolation_cell ISO_GPU -domain PD_GPU \
  -lib_cells {
    ISO_AND_0_X1    # Standard drive
    ISO_AND_0_X2    # 2× drive
    ISO_AND_0_X4    # 4× drive
  }

# Map strategy with clamp to 1 to OR-based cells
map_isolation_cell ISO_MODEM -domain PD_MODEM \
  -lib_cells {
    ISO_OR_1_X1
    ISO_OR_1_X2
  }

Synthesis tools select appropriate drive strengths based on fanout and timing requirements.

Isolation cell naming is technology-specific. Common patterns: ISO_AND_0 (AND-based, clamps to 0), ISO_OR_1 (OR-based, clamps to 1), with drive strength suffixes (_X1, _X2, _X4). Consult your standard cell library for available isolation cells.

Isolation Combined with Retention

Power-gated domains with retention need both isolation and retention strategies.


# ===================================================================
# Power Gating with Retention AND Isolation
# ===================================================================

create_power_domain PD_CPU -elements {cpu_inst}

# Supplies
create_supply_net VDD_CPU -domain PD_CPU
create_supply_net VDD_CPU_RET -domain PD_CPU
create_supply_net VSS -domain PD_CPU

# Supply sets
create_supply_set SS_CPU_ACTIVE \
  -function {power VDD_CPU} \
  -function {ground VSS}

create_supply_set SS_CPU_RET \
  -function {power VDD_CPU_RET} \
  -function {ground VSS}

associate_supply_set SS_CPU_ACTIVE -handle PD_CPU

# Power states
add_power_state VDD_CPU -state {ACTIVE 1.0} -state {OFF off}
add_power_state VDD_CPU_RET -state {RETENTION 0.6}

# Power switch
create_power_switch PSW_CPU -domain PD_CPU \
  -input_supply_port {vin VDD_TOP} \
  -output_supply_port {vout VDD_CPU} \
  -control_port {ctrl cpu_power_enable} \
  -on_state {on vin {ctrl}}

# Retention strategy
set_retention RET_CPU -domain PD_CPU \
  -retention_supply_set SS_CPU_RET \
  -retention_condition {cpu_retention_enable}

# Isolation strategy
set_isolation ISO_CPU -domain PD_CPU \
  -isolation_supply_set SS_TOP \
  -clamp_value 0 \
  -isolation_signal cpu_iso_enable \
  -isolation_sense high \
  -location parent

# ===================================================================
# Power-Down Sequence (with retention):
# 1. Assert cpu_retention_enable (save state to VDD_CPU_RET)
# 2. Assert cpu_iso_enable (activate isolation)
# 3. De-assert cpu_power_enable (turn off VDD_CPU)
# 4. CPU off, state retained, outputs isolated
#
# Power-Up Sequence:
# 1. Assert cpu_power_enable (restore VDD_CPU)
# 2. De-assert cpu_retention_enable (switch FFs back to VDD_CPU)
# 3. De-assert cpu_iso_enable (disable isolation)
# 4. CPU operational with retained state
# ===================================================================

Common Beginner Mistakes

Mistake #1: Using gated domain supply for isolation cells


# WRONG: Isolation cells use gated supply (will lose power!)
set_isolation ISO_GPU -domain PD_GPU \
  -isolation_supply_set SS_GPU \  # GPU supply gets turned off!
  -clamp_value 0 \
  -isolation_signal iso_gpu \
  -isolation_sense high

# CORRECT: Use always-on supply from parent/top domain
set_isolation ISO_GPU -domain PD_GPU \
  -isolation_supply_set SS_TOP \  # Always-on supply
  -clamp_value 0 \
  -isolation_signal iso_gpu \
  -isolation_sense high

Why? Isolation cells must remain powered to clamp outputs when the source domain is off. Using the gated domain supply defeats the purpose—the isolation cells would lose power along with the domain.

Mistake #2: De-asserting isolation before power is stable

Problem: Disabling isolation while domain is still powering up allows X-propagation during the power-up transient.

Solution: Power-up sequence must be: (1) Enable power, (2) Wait for stable VDD, (3) Release reset, (4) Disable isolation. Never disable isolation before power and reset are stable.

Mistake #3: Choosing wrong clamp value


# Consider an active-low reset signal: reset_n
# WRONG: Clamping to 0 puts receiving logic in reset
set_isolation ISO_BAD -domain PD_PERIPH \
  -isolation_supply_set SS_TOP \
  -clamp_value 0 \    # This asserts reset! (reset_n = 0 = active)
  -isolation_signal iso \
  -isolation_sense high

# CORRECT: Clamp to 1 to keep receiving logic out of reset
set_isolation ISO_GOOD -domain PD_PERIPH \
  -isolation_supply_set SS_TOP \
  -clamp_value 1 \    # reset_n = 1 = inactive (not in reset)
  -isolation_signal iso \
  -isolation_sense high

Why? The safe clamp value depends on signal polarity. Active-high enables should clamp to 0 (disabled), active-low signals should clamp to 1 (inactive high). Analyze each signal individually.

Practice Exercise

Challenge: Implement Complete Power Gating

Create UPF for a DSP domain with power gating, retention, and isolation:

  • Primary supply: VDD_DSP (0.9V, switchable)
  • Retention supply: VDD_DSP_RET (0.6V, always-on)
  • Isolation: Clamp to 0, active-high control (dsp_iso_enable)
  • Retention control: dsp_retention_enable (active-high)
  • Power control: dsp_power_enable

Write complete UPF including power switch, retention strategy, and isolation strategy.

Hint

You need power switch (VDD_TOP → VDD_DSP), retention strategy using SS_DSP_RET, and isolation strategy using SS_TOP (always-on supply for isolation cells). Remember proper supply set associations and power states.

Solution

# ===================================================================
# Complete Power Gating: DSP with Retention and Isolation
# ===================================================================

# TOP DOMAIN (always-on context)
create_power_domain PD_TOP -include_scope
create_supply_net VDD_TOP -domain PD_TOP
create_supply_net VSS -domain PD_TOP

create_supply_set SS_TOP \
  -function {power VDD_TOP} \
  -function {ground VSS}
associate_supply_set SS_TOP -handle PD_TOP

add_power_state VDD_TOP -state {ON 1.2}

# DSP DOMAIN with retention and isolation
create_power_domain PD_DSP -elements {dsp_engine}

# Supply nets
create_supply_net VDD_DSP -domain PD_DSP
create_supply_net VDD_DSP_RET -domain PD_DSP
create_supply_net VSS -domain PD_DSP

# Active supply set
create_supply_set SS_DSP_ACTIVE \
  -function {power VDD_DSP} \
  -function {ground VSS}

# Retention supply set
create_supply_set SS_DSP_RET \
  -function {power VDD_DSP_RET} \
  -function {ground VSS}

associate_supply_set SS_DSP_ACTIVE -handle PD_DSP

# Power states
add_power_state VDD_DSP \
  -state {ACTIVE 0.9} \
  -state {OFF off}

add_power_state VDD_DSP_RET \
  -state {RETENTION 0.6}

add_power_state VSS -state {ON 0.0}

# Power switch
create_power_switch PSW_DSP -domain PD_DSP \
  -input_supply_port {vin VDD_TOP} \
  -output_supply_port {vout VDD_DSP} \
  -control_port {ctrl dsp_power_enable} \
  -on_state {on vin {ctrl}}

# Retention strategy
set_retention RET_DSP -domain PD_DSP \
  -retention_supply_set SS_DSP_RET \
  -retention_condition {dsp_retention_enable}

# Isolation strategy
set_isolation ISO_DSP -domain PD_DSP \
  -isolation_supply_set SS_TOP \
  -clamp_value 0 \
  -isolation_signal dsp_iso_enable \
  -isolation_sense high \
  -location parent

# ===================================================================
# Complete Power Sequencing:
#
# Power-Down:
# 1. dsp_retention_enable = 1 (save state)
# 2. dsp_iso_enable = 1 (activate isolation, clamp to 0)
# 3. dsp_power_enable = 0 (turn off VDD_DSP)
# 4. DSP off, state retained, outputs isolated
#
# Power-Up:
# 1. dsp_power_enable = 1 (restore VDD_DSP to 0.9V)
# 2. Wait for VDD_DSP stable
# 3. Release DSP reset
# 4. dsp_retention_enable = 0 (restore state)
# 5. dsp_iso_enable = 0 (disable isolation, pass signals)
# 6. DSP fully operational
# ===================================================================

Summary

In this tutorial, you learned:

  • Isolation prevents X-propagation from power-gated domains by clamping outputs to known values (0 or 1) using always-on isolation cells
  • set_isolation defines isolation strategies with -isolation_supply_set (always-on), -clamp_value (0 or 1), and control signals
  • Isolation cells must be powered by always-on supply (parent domain) to remain functional during source domain power-down
  • Clamp value choice is signal-specific: active-high enables → 0, active-low signals → 1, analyze receiving logic requirements
  • Proper sequencing critical: assert isolation before power-down, de-assert after power-up and reset release
  • Isolation combined with retention enables safe power gating with fast wake-up for frequently-cycled domains
Did you find what you were looking for?

Quiz

No quiz questions available for this article.