12 min read | Advanced Level
What You'll Learn
- Understand signal integrity challenges at power domain boundaries
- Define repeater insertion strategies using set_repeater
- Specify repeater placement and distance criteria
- Combine repeaters with isolation and level shifters
Signal Integrity at Power Domain Boundaries
Power domain crossings often involve long routing distances, creating signal integrity challenges.
The Long-Wire Problem
Domain A Long Wire (>1mm) Domain B ┌──────────┐ ────────────────── ┌──────────┐ │ Driver ├──────────────────────────────────────────> │ Receiver │ └──────────┘ High resistance + capacitance └──────────┘ Problems: - Excessive delay (RC delay ∝ distance²) - Slow slew rate (voltage transitions take longer) - Signal droop (voltage drops along wire) - Crosstalk from adjacent wires
RC Delay Scaling
Wire delay follows quadratic relationship with length:
Delay = R × C = (ρ × L) × (ε × L) = ρ × ε × L² Where: - R = Wire resistance (∝ length) - C = Wire capacitance (∝ length) - L = Wire length Result: Doubling wire length → 4× delay increase
This quadratic scaling means long wires quickly become timing bottlenecks.
In advanced process nodes (7nm, 5nm), metal resistivity increases due to grain boundary scattering and barrier thickness, making wire delay even worse. Repeater insertion becomes essential for maintaining timing closure on long nets.
Physical Separation in SoCs
In a large SoC, a CPU domain (top-left corner) might communicate with a memory controller (bottom-right corner) over wires spanning 5-10mm. Without repeaters, this routing distance could add 2-3ns of delay—completely unacceptable for high-speed interfaces running at 2-3GHz. Strategic repeater insertion every 1-2mm reduces delay to acceptable levels (~500ps total) while maintaining signal integrity.
What Are Repeaters?
A repeater is a buffer inserted along a long wire to restore signal strength and reduce delay.
Repeater Functionality
Without Repeaters (Long Wire):
Driver ─────────────────────────────────────> Receiver
└── 3mm wire → 2ns delay, poor slew ──┘
With Repeaters (Buffered):
Driver ──[Buf]──────[Buf]──────[Buf]─────> Receiver
└─1mm─┘ └─1mm─┘ └─1mm─┘
Total delay: 600ps (optimal spacing reduces delay 3×)
Each repeater:
- Restores signal to full voltage swing
- Improves slew rate (faster transitions)
- Breaks long wire into shorter segments (linear vs quadratic delay)
- Reduces crosstalk sensitivity
Optimal Repeater Spacing
For minimum delay, repeaters should be spaced at:
L_optimal = √(R_buf / (ρ × ε)) Where: - R_buf = Buffer input resistance - ρ = Wire resistivity per unit length - ε = Wire capacitance per unit length Typical: 500µm - 2mm spacing depending on metal layer and technology
Use physical design tool recommendations for repeater spacing. Modern tools calculate optimal spacing based on actual wire characteristics (metal layer, width, spacing) and buffer library data. UPF repeater strategies guide where repeaters are allowed, not exact spacing.
Quick Check
Q: Why do repeaters reduce delay even though they add buffer delay?
Show Answer
Repeaters reduce RC delay (quadratic with length) more than they add buffer delay (constant). Example: 3mm wire has ~2ns RC delay. Three 1mm segments with repeaters have ~300ps RC delay + 200ps buffer delay = 500ps total, saving 1.5ns. The key is breaking the quadratic RC scaling into linear segments.
When to Use Repeater Strategies
Repeaters are beneficial when:
| Scenario | Use Repeaters? | Rationale |
|---|---|---|
| Long distance between domains | Yes | Reduce RC delay, improve slew |
| High-speed signals (>1GHz) | Yes | Maintain timing and signal quality |
| Short distances (<500µm) | No | Added buffer delay hurts more than helps |
| Low-speed control signals | Maybe | Only if physical distance is very large |
| Signals with tight timing | Yes | Optimize delay with repeater insertion |
Syntax: set_repeater
The set_repeater command defines repeater insertion strategies for power domain crossings.
Basic Form
set_repeater strategy_name -domain domain_name \
-applies_to {outputs|inputs|both} \
[options]
Key Parameters
- strategy_name - Unique identifier for repeater strategy (required)
- -domain domain_name - Domain where repeaters are applied (required)
- -applies_to {outputs|inputs|both} - Signal direction (required)
- -location {self|parent|fanout|automatic} - Repeater placement domain
- -distance value - Maximum wire length before repeater insertion (optional)
- -elements {instance_list} - Specific signals to buffer (optional)
Usage Variations
1. Basic Repeater Strategy:
set_repeater REP_CPU -domain PD_CPU \
-applies_to outputs \
-location parent
2. Repeater with Distance Criterion:
set_repeater REP_LONG -domain PD_MEM \
-applies_to both \
-location automatic \
-distance 1000 # Insert repeater if wire > 1mm
3. Repeater for Specific Signals:
set_repeater REP_CRITICAL -domain PD_CPU \
-applies_to outputs \
-location self \
-elements {cpu_inst/critical_sig[*]}
Repeater Placement Strategies
Repeater placement affects signal integrity and which domain supplies power to repeaters.
Self Placement (Source Domain)
set_repeater REP_SELF -domain PD_CPU \
-applies_to outputs \
-location self
PD_CPU (source) PD_TOP (destination) ┌──────────────────┐ ┌─────────────┐ │ Driver──[Rep]───┼────────>│ Receiver │ │ (in CPU domain) │ │ │ └──────────────────┘ └─────────────┘
Characteristics:
- Repeaters powered by source domain (PD_CPU)
- If source is power-gated, repeaters turn off with domain
- Requires isolation if source can be powered off
Parent Placement (Destination Domain)
set_repeater REP_PARENT -domain PD_CPU \
-applies_to outputs \
-location parent
PD_CPU (source) PD_TOP (destination) ┌──────────┐ ┌──────────────────────┐ │ Driver──┼──────>│ [Rep]──> Receiver │ │ │ │ (in TOP domain) │ └──────────┘ └──────────────────────┘
Characteristics:
- Repeaters powered by destination domain (PD_TOP)
- Repeaters remain powered if destination is always-on
- Better for power-gated source domains
Automatic Placement (Tool Decides)
set_repeater REP_AUTO -domain PD_GPU \
-applies_to both \
-location automatic
Physical design tool determines optimal repeater placement based on:
- Wire route and congestion
- Power domain availability
- Timing requirements
Use -location parent (destination domain) for repeaters when the source domain can be power-gated. This ensures repeaters remain powered and functional even when the source is off, preventing X-propagation issues.
Distance-Based Repeater Insertion
The -distance option specifies maximum wire length before repeater insertion.
# Insert repeater if wire exceeds 1mm (1000µm)
set_repeater REP_1MM -domain PD_CPU \
-applies_to outputs \
-location automatic \
-distance 1000
Example: Conditional Insertion
| Wire Length | Distance Threshold | Repeater Inserted? |
|---|---|---|
| 500µm | 1000µm | No (below threshold) |
| 1000µm | 1000µm | Yes (at threshold) |
| 2500µm | 1000µm | Yes (likely 2-3 repeaters) |
The -distance parameter is a guideline, not a strict rule. Physical design tools use this as input for repeater insertion algorithms, combined with actual routing information and timing constraints. Final repeater count and spacing depend on detailed place-and-route results.
Repeaters with Isolation and Level Shifters
Repeaters often combine with other power management strategies.
Repeater + Isolation
For power-gated domains with long wires:
# Power-gated GPU with long outputs
set_repeater REP_GPU -domain PD_GPU \
-applies_to outputs \
-location parent # In always-on domain
set_isolation ISO_GPU -domain PD_GPU \
-isolation_supply_set SS_TOP \
-clamp_value 0 \
-isolation_signal gpu_iso \
-isolation_sense high \
-location parent # Same as repeaters
PD_GPU (gated) PD_TOP (always-on) ┌──────────┐ ┌────────────────────────┐ │ Driver──┼──────────>│ [ISO]──[Rep]─> Receiver│ │ │ │ (both in TOP domain) │ └──────────┘ └────────────────────────┘
Order: Isolation first, then repeater (ISO clamps before repeater buffers).
Repeater + Level Shifter
For multi-voltage domains with long distances:
# CPU (1.0V) to TOP (1.2V) with long wire
set_level_shifter LS_CPU -domain PD_CPU \
-applies_to outputs \
-location self
set_repeater REP_CPU -domain PD_CPU \
-applies_to outputs \
-location parent # After level shifter
-distance 1000
PD_CPU (1.0V) PD_TOP (1.2V) ┌─────────────┐ ┌──────────────────────┐ │ Driver─[LS]┼───────>│ [Rep]──> Receiver │ │ 1.0V→1.2V │ 1.2V │ (buffered at 1.2V) │ └─────────────┘ └──────────────────────┘
Order: Level shifter first, then repeater (buffer at destination voltage).
Combining Power Management Strategies
A mobile SoC's power-gated GPU (0.9V) sends signals to an always-on memory controller (1.2V) located 8mm away. The signal chain requires: (1) Isolation cell (in memory domain, powered by 1.2V) to clamp when GPU is off, (2) Level shifter (0.9V → 1.2V), (3) Multiple repeaters every 1.5mm to maintain signal integrity across the long distance. This combination ensures reliable communication despite power gating and voltage differences.
Repeater Library Cell Mapping
Map repeater strategies to physical buffer cells.
Syntax: map_repeater_cell
map_repeater_cell strategy_name -domain domain_name \
-lib_cells {cell_list}
Example
# Map repeater strategy to various buffer drive strengths
map_repeater_cell REP_CPU -domain PD_CPU \
-lib_cells {
BUF_X1 # Minimum drive
BUF_X2 # Standard drive
BUF_X4 # High drive
BUF_X8 # Maximum drive
}
Physical design tools select appropriate buffer size based on:
- Downstream capacitance
- Fanout
- Timing slack
- Power budget
Specialized Repeater Cells
Some technologies offer low-delay or low-power buffer variants:
# Critical path: Use fast buffers
map_repeater_cell REP_CRITICAL -domain PD_CPU \
-lib_cells {
BUF_FAST_X2
BUF_FAST_X4
BUF_FAST_X8
}
# Non-critical: Use low-power buffers
map_repeater_cell REP_GENERAL -domain PD_CPU \
-lib_cells {
BUF_LP_X1 # Low-power variant
BUF_LP_X2
}
Complete Repeater Example
# ===================================================================
# Repeater Strategy for Large SoC
# ===================================================================
# Domain structure
create_power_domain PD_TOP -include_scope
create_power_domain PD_CPU -elements {cpu_cluster}
create_power_domain PD_GPU -elements {gpu_subsystem}
create_power_domain PD_MEM -elements {mem_ctrl}
# Supply definitions (TOP=1.2V, CPU=1.0V, GPU=0.9V, MEM=1.0V)
# ... (supplies omitted for brevity)
# CPU Repeaters (CPU at 1.0V, TOP at 1.2V)
# Critical signals: Explicit control
set_repeater REP_CPU_CRITICAL -domain PD_CPU \
-applies_to outputs \
-location parent \ # In TOP domain (after level shifter)
-distance 800 \ # Conservative for critical paths
-elements {cpu_cluster/critical_if[*]}
# General CPU signals: Automatic with relaxed distance
set_repeater REP_CPU_GENERAL -domain PD_CPU \
-applies_to outputs \
-location automatic \
-distance 1500
# CPU inputs from TOP
set_repeater REP_CPU_IN -domain PD_CPU \
-applies_to inputs \
-location parent \
-distance 1000
# GPU Repeaters (power-gated, long distances)
# Place in parent (TOP) domain so repeaters stay powered
set_repeater REP_GPU -domain PD_GPU \
-applies_to outputs \
-location parent \ # Always-on domain
-distance 1000
set_repeater REP_GPU_IN -domain PD_GPU \
-applies_to inputs \
-location parent \
-distance 1000
# MEM Repeaters (same voltage as CPU: 1.0V)
# No level shifter needed between CPU-MEM
set_repeater REP_MEM -domain PD_MEM \
-applies_to both \
-location automatic \
-distance 1200
# Library Cell Mapping
# Critical paths: Fast buffers
map_repeater_cell REP_CPU_CRITICAL -domain PD_CPU \
-lib_cells {
BUF_FAST_X2
BUF_FAST_X4
BUF_FAST_X8
}
# General paths: Standard buffers
map_repeater_cell REP_CPU_GENERAL -domain PD_CPU \
-lib_cells {BUF_X1 BUF_X2 BUF_X4}
map_repeater_cell REP_CPU_IN -domain PD_CPU \
-lib_cells {BUF_X1 BUF_X2 BUF_X4}
map_repeater_cell REP_GPU -domain PD_GPU \
-lib_cells {BUF_X1 BUF_X2 BUF_X4 BUF_X8}
map_repeater_cell REP_GPU_IN -domain PD_GPU \
-lib_cells {BUF_X1 BUF_X2}
map_repeater_cell REP_MEM -domain PD_MEM \
-lib_cells {BUF_X1 BUF_X2 BUF_X4}
# ===================================================================
# Strategy Summary:
# - Critical paths: Tight distance threshold (800µm), fast buffers
# - General paths: Relaxed threshold (1000-1500µm), standard buffers
# - Power-gated domains: Repeaters in always-on parent domain
# - Multiple drive strengths for optimization flexibility
# ===================================================================
Common Beginner Mistakes
Mistake #1: Placing repeaters in power-gated source domain
# PROBLEMATIC: Repeaters in GPU domain (can be powered off)
set_repeater REP_GPU -domain PD_GPU \
-applies_to outputs \
-location self # Repeaters lose power when GPU is off!
# BETTER: Place in always-on domain
set_repeater REP_GPU -domain PD_GPU \
-applies_to outputs \
-location parent # Repeaters stay powered
Why? If repeaters are in a power-gated domain and that domain turns off, the repeaters lose power. This can cause X-propagation even with isolation cells. Place repeaters in always-on domains for power-gated sources.
Mistake #2: Using overly conservative distance thresholds
# TOO CONSERVATIVE: Inserting repeaters too frequently
set_repeater REP_EXCESSIVE -domain PD_CPU \
-applies_to outputs \
-distance 200 # 200µm is too short for most technologies
# REASONABLE: Based on technology recommendations
set_repeater REP_OPTIMAL -domain PD_CPU \
-applies_to outputs \
-distance 1000 # 1mm is typical for modern processes
Why? Excessive repeater insertion wastes area and power without timing benefit. Follow technology guidelines for optimal spacing (typically 0.5-2mm in advanced nodes). Too-short spacing adds buffer delay unnecessarily.
Mistake #3: Not providing multiple buffer drive strengths
# SUBOPTIMAL: Single drive strength
map_repeater_cell REP_CPU -domain PD_CPU \
-lib_cells {BUF_X1}
# OPTIMAL: Multiple options for different loads
map_repeater_cell REP_CPU -domain PD_CPU \
-lib_cells {BUF_X1 BUF_X2 BUF_X4 BUF_X8}
Why? Different signals have different loads and timing requirements. Providing multiple drive strengths allows tools to optimize each repeater individually for best timing/power/area tradeoff.
Practice Exercise
Challenge: Design Repeater Strategy for Long-Distance Communication
A CPU domain (PD_CPU, 1.0V) and an I/O domain (PD_IO, 1.8V) are physically separated by 6mm. The interface includes:
- 32-bit data bus (critical timing: <1ns)
- Control signals (relaxed timing: <5ns)
- Both domains are always-on (no power gating)
Design a repeater strategy that optimizes the critical data bus while using standard approach for control signals. Include library cell mappings.
Hint
For 6mm distance, you'll need multiple repeaters. Critical data bus should use tighter spacing (~800µm) with fast buffers. Control signals can use relaxed spacing (~1.5mm) with standard buffers. Don't forget level shifters for 1.0V ↔ 1.8V crossing.
Solution
# ===================================================================
# Repeater Strategy for 6mm CPU-IO Interface
# ===================================================================
# Assume domains and supplies already defined
# CPU at 1.0V, IO at 1.8V, both always-on
# LEVEL SHIFTERS (handle voltage crossing)
set_level_shifter LS_CPU_TO_IO -domain PD_CPU \
-applies_to outputs \
-location self # Shift before long route
set_level_shifter LS_IO_TO_CPU -domain PD_IO \
-applies_to outputs \
-location self
# REPEATER STRATEGIES
# Critical 32-bit data bus: Aggressive repeater insertion
set_repeater REP_DATA_BUS -domain PD_CPU \
-applies_to outputs \
-location automatic \ # Let tool optimize based on routing
-distance 800 \ # Repeater every ~800µm (6mm → ~7-8 repeaters)
-elements {cpu_inst/data_out[31:0]}
# Control signals: Relaxed repeater insertion
set_repeater REP_CONTROL -domain PD_CPU \
-applies_to outputs \
-location automatic \
-distance 1500 \ # Repeater every ~1.5mm (6mm → ~4 repeaters)
-elements {cpu_inst/ctrl_*}
# Inputs from IO domain (less critical, long distance)
set_repeater REP_CPU_IN -domain PD_CPU \
-applies_to inputs \
-location automatic \
-distance 1200
# IO domain repeaters (symmetric configuration)
set_repeater REP_IO_DATA -domain PD_IO \
-applies_to outputs \
-location automatic \
-distance 800 \
-elements {io_inst/data_out[31:0]}
set_repeater REP_IO_CONTROL -domain PD_IO \
-applies_to outputs \
-location automatic \
-distance 1500 \
-elements {io_inst/ctrl_*}
# LIBRARY CELL MAPPING
# Data bus: Fast, high-drive buffers for critical timing
map_repeater_cell REP_DATA_BUS -domain PD_CPU \
-lib_cells {
BUF_FAST_X4 # High drive for long routes
BUF_FAST_X8 # Very high drive option
}
map_repeater_cell REP_IO_DATA -domain PD_IO \
-lib_cells {
BUF_FAST_X4
BUF_FAST_X8
}
# Control signals: Standard buffers (non-critical)
map_repeater_cell REP_CONTROL -domain PD_CPU \
-lib_cells {BUF_X1 BUF_X2 BUF_X4}
map_repeater_cell REP_IO_CONTROL -domain PD_IO \
-lib_cells {BUF_X1 BUF_X2 BUF_X4}
# Inputs: Standard buffers
map_repeater_cell REP_CPU_IN -domain PD_CPU \
-lib_cells {BUF_X1 BUF_X2}
# ===================================================================
# Expected Results:
# - Data bus: ~7-8 fast repeaters (aggressive for <1ns timing)
# - Control: ~4 standard repeaters (relaxed for <5ns timing)
# - Total area: ~300-400 repeater cells
# - Timing: Data bus meets <1ns, control easily meets <5ns
# ===================================================================
Summary
In this tutorial, you learned:
- Repeaters (buffers) reduce RC delay on long wires crossing power domains, breaking quadratic delay scaling into linear segments
set_repeaterdefines repeater insertion with-distancethreshold and-locationplacement strategy- Placement strategies: self (source domain), parent (destination domain), automatic (tool decides)—prefer parent for power-gated sources
- Distance thresholds guide repeater spacing (typical: 0.5-2mm in advanced nodes), balancing delay reduction vs buffer overhead
- Repeaters combine with isolation (ISO first, then repeater) and level shifters (LS first, then repeater at destination voltage)
- Library cell mapping with multiple drive strengths enables optimization for varying loads and timing requirements