Introduction to Low Power Design

Power consumption has become one of the most critical design constraints in modern digital systems. From mobile devices fighting for battery life to data centers consuming megawatts of electricity, power directly impacts product success, operating costs, and environmental sustainability. While early digital designs focused primarily on performance and area, today's designs must carefully balance the "PPA triad": Performance, Power, and Area.

Digital circuits consume power through two primary mechanisms:

Dynamic Power: Power consumed during signal transitions

P_dynamic = α × C × V² × f

Where:
- α = activity factor (fraction of time signal toggles)
- C = capacitance being switched
- V = supply voltage
- f = clock frequency

Static Power (Leakage): Power consumed even when circuits are idle

P_static = V × I_leakage

Where leakage current increases with temperature and smaller process nodes

In modern designs (especially below 28nm), static power can equal or exceed dynamic power, making both crucial optimization targets. This module explores four key techniques for reducing power consumption while maintaining functionality.

Clock Gating: The Foundation of Low Power Design

Understanding Clock Power Consumption

The clock network is often the largest consumer of dynamic power in a design, typically accounting for 30-50% of total chip power. This happens because:

  • Clock signals toggle every cycle (α = 1.0 vs. 0.1-0.2 for data signals)
  • Clock trees drive huge capacitance (millions of flip-flops)
  • Clock buffers are large to meet timing requirements

What is Clock Gating?

Clock gating disables the clock to portions of the design when those blocks aren't performing useful work, eliminating unnecessary switching activity:

// Without clock gating - always clocking
always @(posedge clk) begin
    if (enable)
        register <= new_data;
    else
        register <= register;  // Wasteful: clocking to keep same value
end

The problem: Even when enable is low, the flip-flop still consumes power from clock switching and internal transitions.

Integrated Clock Gating (ICG) Cells

Modern designs use Integrated Clock Gating (ICG) cells—special library cells that safely gate clocks:

// RTL style that inference tools convert to ICG
always @(posedge clk) begin
    if (enable)
        register <= new_data;
end

// Synthesis converts to:
// [clk] ──→ [ICG Cell] ──gated_clk──→ [FF]
//            ↑
//         [enable]

ICG Cell Architecture

A proper ICG cell includes:

         ┌──────────────┐
clk  ────┤              │
         │    Latch     │    AND    gated_clk
enable ──┤   (avoid     ├────(or)────→
         │  glitches)   │    OR
         └──────────────┘

Key components:

  1. Enable Latch: Triggered on clock's inactive edge to prevent glitches
  2. AND/OR Gate: Combines latched enable with clock
  3. Glitch-Free Operation: Enable changes only when clock is stable

Latch-Based ICG Implementation

module icg_cell (
    input  wire clk,
    input  wire enable,
    input  wire test_enable,  // For DFT
    output wire gated_clk
);

    reg enable_latched;
    
    // Latch opens on clock low (for AND-based gating)
    always @(*) begin
        if (!clk)
            enable_latched = enable | test_enable;
    end
    
    // Generate gated clock
    assign gated_clk = clk & enable_latched;

endmodule

Critical: The latch captures enable when clk is low. When clk goes high, enable_latched is stable, preventing glitches on gated_clk.

Clock Gating Guidelines

Guideline 1: Let Synthesis Tools Insert ICG Cells

Write simple enable-based code; let tools handle ICG insertion:

// Good: Clear enable condition
always @(posedge clk) begin
    if (state_machine_active)
        result <= compute(input_data);
end

// Tools automatically insert: clk → ICG → gated_clk → result_reg

Guideline 2: Group Registers for Efficiency

ICG cells have area/power overhead. Only gate groups of registers (typically ≥4):

// Efficient: One ICG for 32-bit register
always @(posedge clk) begin
    if (update_enable)
        data_reg[31:0] <= new_data[31:0];
end

// Inefficient: 32 separate ICGs (if enable differs per bit)
generate
    for (i = 0; i < 32; i++) begin
        always @(posedge clk) begin
            if (enable[i])
                data_reg[i] <= new_data[i];
        end
    end
endgenerate

Guideline 3: Verify DFT Compatibility

ICG cells must include test enable signals to allow scan chain operation:

module design_top (
    input clk,
    input test_mode,  // From DFT controller
    // ... other ports
);

    wire gated_clk;
    
    icg_cell u_icg (
        .clk(clk),
        .enable(functional_enable),
        .test_enable(test_mode),    // Disables gating in test mode
        .gated_clk(gated_clk)
    );

endmodule

Clock Gating Benefits

Properly applied clock gating typically saves:

  • 20-40% dynamic power in control logic
  • 10-25% total chip power in typical applications
  • 50%+ power in blocks with low activity factors

Power Gating: Shutting Down Unused Blocks

What is Power Gating?

Power gating completely removes power from inactive circuit blocks, eliminating both dynamic and static power:

Normal Operation:
VDD ───────────────→ [Circuit Block]
GND ───────────────→

Power Gated:
VDD ──┤│──[Header SW]───→ [Circuit Block]
      OPEN               (No power = No leakage!)

Power Switch Implementation

Power switches use large PMOS (header) or NMOS (footer) transistors:

// Conceptual power domain
module power_domain (
    input power_enable,
    input vdd,
    input gnd,
    // ... functional signals
);

    // Header switch (PMOS): connects VDD when enabled
    wire virtual_vdd;
    
    // In actual implementation, this is a special cell
    power_switch_cell u_pwr_sw (
        .vdd_in(vdd),
        .vdd_out(virtual_vdd),
        .enable(power_enable)
    );
    
    // All circuitry in domain uses virtual_vdd
    // ... functional logic here

endmodule

State Retention

When powering down, register state is lost. Solutions include:

1. Retention Flops: Special flip-flops with battery/always-on power:

// Standard FF: loses state when powered down
always @(posedge clk) state <= next_state;

// Retention FF: keeps state in special latch
(* retention_purpose = "save" *) 
reg [7:0] critical_state;

always @(posedge clk) begin
    if (save_enable)
        critical_state <= current_state;
end

2. Memory Shadowing: Save state to always-on memory before power-down:

// Before entering power-down
always @(posedge clk) begin
    if (entering_sleep_mode) begin
        backup_memory[addr] <= critical_registers;
        power_gate_enable <= 1'b1;
    end
end

// After power-up
always @(posedge clk) begin
    if (exiting_sleep_mode) begin
        critical_registers <= backup_memory[addr];
    end
end

Power Gating Challenges

Inrush Current: Turning on all switches simultaneously causes huge current spike:

Solution: Gradual power-up sequence
Time:    t0    t1    t2    t3
Switch:  25% → 50% → 75% → 100% (staged activation)

Wake-up Latency: Power-gating transitions take microseconds to milliseconds—too slow for fine-grained control. Use for coarse-grained blocks (entire subsystems).

Isolation Cells: Powered-off blocks can output undefined values. Insert isolation cells at domain boundaries:

module isolation_cell (
    input  data_in,
    input  iso_enable,  // From power controller
    output data_out
);

    // When isolated, force known value
    assign data_out = iso_enable ? 1'b0 : data_in;

endmodule

Multi-Threshold Voltage (Multi-Vt) Cells

Understanding Threshold Voltage

Threshold voltage (Vt) is the gate voltage needed to turn on a transistor. This parameter profoundly affects both performance and leakage:

Low-Vt:  Fast switching, HIGH leakage   ⚡ 💧💧💧
Mid-Vt:  Balanced performance/leakage   ⚖️  💧💧
High-Vt: Slow switching, LOW leakage    🐌 💧

Why Multi-Vt Matters

At advanced nodes (28nm and below), leakage power dominates. Multi-Vt libraries provide cells with different Vt options for the same logic function, enabling designers to trade off speed vs. leakage.

Multi-Vt Cell Selection Strategy

Synthesis tools select cell Vt based on timing criticality:

Critical Path: A → B → C → D
                ↓   ↓   ↓   ↓
               LVT LVT LVT LVT  (Fast, but leaky)

Non-Critical:  E → F → G
                ↓   ↓   ↓
               HVT HVT HVT      (Slow, but low leakage)

Optimization Process:

  1. Initial Synthesis: All standard-Vt cells
  2. Timing Analysis: Identify critical paths
  3. LVT Assignment: Use LVT on critical paths to meet timing
  4. HVT Assignment: Use HVT on non-critical paths (have timing slack)
  5. Iteration: Balance until timing met with minimum leakage

Multi-Vt in RTL (Directives)

While tools auto-select Vt, designers can guide the process:

// Hint: This path is timing-critical
(* use_low_vt = "true" *)
module high_speed_datapath (
    input  clk,
    input  [31:0] data_in,
    output [31:0] data_out
);
    // Critical arithmetic operations
endmodule

// Hint: This is non-critical control logic
(* use_high_vt = "true" *)
module control_unit (
    input  clk,
    input  start,
    output reg done
);
    // State machine with loose timing
endmodule

Multi-Vt Results

Typical multi-Vt optimization achieves:

  • 20-40% leakage reduction
  • 0-5% timing degradation (if done correctly)
  • Minimal area impact (same footprint cells)

Power Analysis in Liberty Files

Liberty File Structure

.lib files (Liberty format) contain timing, power, and functional information for standard cells:

library (my_library_typ) {
    voltage_unit : "1V";
    current_unit : "1mA";
    leakage_power_unit : "1nW";
    
    cell (AND2_X1) {
        area : 2.5;
        
        leakage_power () {
            value : 0.025;  /* 25 pW static leakage */
        }
        
        pin (A) {
            direction : input;
            capacitance : 0.5;  /* Input cap in fF */
        }
        
        pin (Y) {
            direction : output;
            function : "(A & B)";
            
            internal_power () {
                related_pin : "A";
                rise_power (power_template) {
                    values ("0.15, 0.18, 0.22");  /* Energy per transition */
                }
                fall_power (power_template) {
                    values ("0.12, 0.14, 0.17");
                }
            }
        }
    }
}

Key Power Parameters

1. Leakage Power: Static power consumption when idle

leakage_power () {
    when : "A & !B";     /* State-dependent leakage */
    value : 0.030;        /* Higher leakage in this state */
}
leakage_power () {
    when : "!A & B";
    value : 0.020;        /* Lower leakage here */
}

2. Internal Power: Energy consumed by cell switching

internal_power () {
    related_pin : "CLK";
    rise_power (scalar) {
        values ("0.50");  /* Energy when CLK rises */
    }
}

3. Switching Power: Energy to charge output capacitance (calculated by tools)

Switching Power = C_load × V² × f × α

Where C_load from pin capacitances in Liberty file

Power Analysis Flow

Step 1: Activity Annotation

Tools need signal activity (toggle rates):

# From simulation VCD file
read_vcd simulation.vcd -strip_path testbench/dut

# From static probability (less accurate)
set_switching_activity -period 10 -toggle_rate 0.1 [get_nets data_bus*]

Step 2: Power Calculation

# Run power analysis
report_power -hierarchy -verbose

# Output example:
# Instance          Dynamic    Leakage    Total
# -----------       -------    -------    -----
# datapath          45.2 mW    12.3 mW    57.5 mW
# control           5.8 mW     2.1 mW     7.9 mW
# clock_tree        30.5 mW    0.5 mW     31.0 mW
# -----------       -------    -------    -----
# Total             81.5 mW    14.9 mW    96.4 mW

Step 3: Optimization

Based on report, apply techniques:

  • Clock gating for high-activity, low-utilization blocks
  • Multi-Vt for blocks with timing slack
  • Power gating for rarely used subsystems

Multi-Corner Power Analysis

Power varies with PVT (Process, Voltage, Temperature):

# Worst leakage: Fast process, high voltage, high temp
set_operating_conditions -library fast_1.2V_125C

# Best leakage: Slow process, low voltage, low temp  
set_operating_conditions -library slow_0.8V_-40C

report_power -scenario worst_leakage
report_power -scenario best_leakage

Design must meet power budgets across all corners.

Integrated Low Power Flow

Modern low-power design integrates all techniques:

1. RTL Design
   ↓ (Code with enable conditions for clock gating)
2. Synthesis  
   ↓ (Insert ICG cells, select multi-Vt)
3. Power Analysis
   ↓ (Identify high-power blocks)
4. Optimization
   ↓ (More clock gating, Vt tuning)
5. Power Domain Definition
   ↓ (UPF: Unified Power Format)
6. Implementation
   ↓ (Insert power switches, isolation, level shifters)
7. Verification
   ↓ (Power-aware simulation, formal checks)
8. Sign-off
   └→ (Multi-corner power analysis, IR drop)

UPF Example (Unified Power Format)

# Define power domains
create_power_domain PD_CORE
create_power_domain PD_PERIPHERAL -elements {peripheral_block}

# Supply network
create_supply_port VDD
create_supply_net VDD_CORE -domain PD_CORE
create_supply_net VDD_PERIPH -domain PD_PERIPHERAL

# Power states
add_power_state PD_PERIPHERAL \
    -state ACTIVE {-supply_expr {VDD_PERIPH == 1.0}} \
    -state OFF    {-supply_expr {VDD_PERIPH == 0.0}}

# Isolation strategy
set_isolation iso_periph -domain PD_PERIPHERAL \
    -isolation_signal iso_enable \
    -clamp_value 0

Conclusion

Low power design requires a comprehensive approach spanning multiple abstraction levels and employing complementary techniques:

  • Clock gating reduces dynamic power in active logic (20-40% savings)
  • Power gating eliminates static power in inactive blocks (near 100% savings when off)
  • Multi-Vt cells optimize the performance/leakage tradeoff (20-40% leakage reduction)
  • Liberty files provide the foundational data enabling accurate power analysis

Success requires understanding the interplay between these techniques and the tools that apply them. Start with RTL that enables clock gating, use synthesis tools to optimize Vt assignment, and employ power gating for coarse-grained power management. Always validate with comprehensive power analysis across all operating conditions.

The investment in low-power techniques pays immediate dividends in battery life, thermal management, and operating costs while becoming increasingly critical as process geometries shrink and leakage currents rise.


Key Takeaways:

  • Dynamic power (α × C × V² × f) and static power (V × I_leakage) both matter
  • Clock gating is the most effective technique for dynamic power reduction
  • Power gating eliminates both dynamic and static power but has state retention challenges
  • Multi-Vt optimization balances speed and leakage on a cell-by-cell basis
  • Liberty files encode the power characteristics that enable accurate analysis
Did you find what you were looking for?

Quiz

No quiz questions available for this article.