4. 低功耗SRAM技术:电压 scaling,近阈值计算,电源门控,数据保持电压

各位同学,咱们今天聊点实在的。SRAM 在芯片里到底有多耗电?我做过一个 28nm 的 AI 加速器项目,片上 SRAM 占了将近 60% 的功耗预算。你想想看,这要是能砍掉一半,整个芯片的散热和续航问题就解决了一大半。

低功耗 SRAM 不是单一技术,而是一套组合拳。我习惯把它拆成四个维度来看:电压怎么降、降到什么程度、不用的时候怎么断电、断电后数据怎么保住。下面咱们一个一个说。

低功耗 SRAM 技术体系 低功耗 SRAM 电压 Scaling 近阈值计算 电源门控 数据保持电压 核心思路:动态功耗 ∝ V²·f,静态功耗 ∝ 漏电流 四种技术分别从动态和静态两个维度降低功耗,需根据应用场景组合使用

4.1 电压 Scaling:最直接的降功耗手段

动态功耗和电压的平方成正比,这个公式大家都熟。所以降电压是最立竿见影的方法。但问题来了——电压降太多,SRAM 单元就翻不动了。

我遇到过这样一个坑:某次做低功耗 IoT 芯片,把 SRAM 电压从 1.1V 直接降到 0.8V,仿真通过,流片回来发现低温下读写失败。为什么?因为低温下晶体管阈值电压升高,单元翻转裕度不够了。

电压 Scaling 的关键约束:

  • 读稳定性:电压降低 → 存储节点噪声容限下降 → 读操作可能翻转数据
  • 写能力:电压降低 → 写驱动能力减弱 → 写操作可能失败
  • 工艺波动:先进工艺下,Vt 失配随电压降低而恶化

我个人的经验是:电压 Scaling 不是无脑降,而是找到那个「甜点」。对于 28nm 工艺,典型 SRAM 最低工作电压在 0.7V-0.8V 之间。再往下,就得用近阈值技术了。

4.2 近阈值计算:在刀尖上跳舞

近阈值计算,说白了就是把电压降到接近晶体管阈值电压附近。比如阈值 0.5V,工作电压 0.6V。这时候功耗能降 5-10 倍,但代价也很大。

我记得有个项目做可穿戴设备,要求 SRAM 功耗低于 1mW。常规电压根本做不到,最后只能走近阈值路线。结果呢?

参数 常规电压 (1.0V) 近阈值 (0.6V) 变化
动态功耗 100% ~36% 降 64%
静态功耗 100% ~20% 降 80%
访问延迟 1.0x 2.5-4.0x 增 150-300%
良率 >99% 85-95% 下降明显

⚠ 近阈值设计的三大痛点:

  1. 时序收敛难:延迟随电压非线性增长,PVT 波动放大
  2. 良率损失:6T SRAM 单元在近阈值下,SNM 可能下降 50% 以上
  3. 温度反转效应:低温下延迟反而比高温大,和常规电压行为相反

怎么解决?我建议用 8T 或 10T SRAM 单元替代传统 6T。读端口和写端口分离,读稳定性大幅提升。代价是面积增加 30-50%,但功耗收益远大于面积损失。

4.3 电源门控:不用时就彻底关掉

电压 Scaling 和近阈值解决的是「工作时怎么省电」。但芯片大部分时间可能处于空闲状态。这时候电源门控就派上用场了。

电源门控的原理很简单:在 SRAM 阵列和电源之间加一个开关管。需要时打开,不需要时关断。但实现起来全是细节。

💡 我踩过的坑:

曾经在一个项目中,电源门控的开关管尺寸选小了。结果唤醒时 IR drop 太大,SRAM 供电电压瞬间掉到 0.5V,数据全丢了。后来我把开关管尺寸加大到原来的 3 倍,同时加了去耦电容,问题才解决。

电源门控的设计要点:

  • 开关管尺寸:需要平衡漏电和 IR drop。我一般按峰值电流的 10-15% 裕度来选
  • 唤醒时间:从关断到稳定供电,通常需要 10-100 个时钟周期
  • 状态保持:如果数据需要保留,不能完全断电,要用数据保持电压
  • 浪涌电流:唤醒瞬间电容充电会产生大电流,需要做软启动
// 电源门控控制状态机示例
typedef enum {
    SLEEP,      // 完全关断
    RETENTION,  // 数据保持模式
    WAKEUP,     // 唤醒中
    ACTIVE      // 正常工作
} pg_state_t;

void pg_controller(pg_state_t *state, int wake_req) {
    switch(*state) {
        case SLEEP:
            if (wake_req) {
                // 先进入保持模式,再逐步唤醒
                set_vdd_retention(0.6V);  // 数据保持电压
                *state = RETENTION;
            }
            break;
        case RETENTION:
            // 等待供电稳定
            delay_us(10);
            set_vdd_full(1.0V);
            *state = WAKEUP;
            break;
        case WAKEUP:
            // 等待 SRAM 稳定
            delay_us(5);
            *state = ACTIVE;
            break;
        case ACTIVE:
            if (!wake_req) {
                set_vdd_retention(0.6V);
                *state = RETENTION;
            }
            break;
    }
}

4.4 数据保持电压:省电但不丢数据

这是电源门控的「温柔版」。完全断电数据就丢了,但保持全电压又太费电。数据保持电压(Data Retention Voltage, DRV)就是那个平衡点。

DRV 是多少?理论上,6T SRAM 单元只要供电电压高于两个反相器的阈值就能保持数据。实际中,考虑到工艺波动和噪声,我一般取 0.5V-0.7V。

DRV 的确定方法:

  1. 理论计算:DRV ≈ max(Vt_n, Vt_p) + 噪声裕度
  2. 蒙特卡洛仿真:跑 10000 次,取 6σ 良率对应的电压
  3. 硅片测试:逐步降低电压,找到数据翻转的临界点

我习惯的做法是:先仿真出一个基准值,然后加 100mV 的裕量。比如仿真得到 0.45V,我就设 0.55V。为什么?因为硅片上的波动比仿真模型更严重。曾经有个项目,仿真说 0.4V 就能保持,结果芯片在 0.45V 下数据就丢了。从那以后,我宁可多花点漏电,也要留足裕量。

数据保持模式下的功耗能降多少?以 28nm 为例,全电压 1.0V 时漏电约 10μA/Mb,降到 0.6V 后漏电只有 0.5μA/Mb,降了 20 倍。对于电池供电的设备,这个收益非常可观。

💡 实用建议:

如果你的芯片有多个 SRAM 块,可以按使用频率分组:

  • 频繁访问的块 → 全电压工作
  • 偶尔访问的块 → 数据保持模式
  • 长期不用的块 → 完全断电

这种分级管理,我做过的一个项目里让整体 SRAM 功耗降低了 70%。

好了,低功耗 SRAM 的四个核心技术就讲到这里。电压 Scaling 是基础,近阈值是极限,电源门控是策略,数据保持电压是细节。实际项目中,这四个技术往往要组合使用。比如:工作时用近阈值电压,空闲时切到数据保持模式,长期不用直接断电。怎么组合、怎么切换,就看你的具体场景了。