news 2026/10/7 19:16:32

SRAM低功耗设计:Power Gating与Retention配置实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SRAM低功耗设计:Power Gating与Retention配置实战指南

做低功耗芯片的工程师,几乎没有人能绕开SRAM的Power Gating和Retention配置。这两个概念说出来很直白:要省电就把暂时用不到的SRAM整个断电,要保数据就给存储阵列单独留一路电源。但真到了SRAM compiler里把这些引脚、时序、Isolation逻辑全部配清楚,再配合后端的UPF一起做,我见过不少项目在这里反复返工。这篇文章把我自己在多个低功耗项目里沉淀下来的Power Gating与Retention实战配置流程完整梳理一遍,讲讲哪些选项要勾、哪些引脚该怎么连、时序怎么卡,以及那些常规文档里根本不会写的坑,给正在做相关方案的朋友一个可以直接落地的参考。

Power Gating和Retention虽然经常被放在一起讨论,但它们的应用边界、配置复杂度、对后端的影响差别非常大。我倾向于把整个问题拆成三步来看:先搞清楚SRAM的功耗来自哪里,再想明白该用哪一种低功耗模式,最后才是具体到Compiler里怎么配、配完怎么验。这个顺序如果反了,很容易出现“省了功耗丢了数据”或者“数据保住了电流却没降下来”的尴尬局面。

1. 先搞清楚Power Gating和Retention到底在干什么

1.1 从SRAM功耗构成推导省电思路

SRAM的功耗大致由三块组成:读写时的动态功耗、时钟翻转带来的充放电功耗,以及晶体管本身的静态漏电功耗。动态功耗好理解,读写位线、驱动字线、翻转敏感放大器,这些动作都会消耗电流。时钟翻转的功耗则来自时钟树在每个周期对大量寄存器和存储单元进行充放电。真正让低功耗设计头疼的是静态漏电,在先进工艺节点下,漏电功耗占比会随温度上升迅速增大,尤其在IoT、可穿戴这类长期待机的场景里,漏电甚至可能成为芯片最主要的功耗来源。

Power Gating的思路就是把整个SRAM宏的电源直接切断,漏电和动态功耗一起归零。代价是存储单元里的数据全部丢失,而且重新上电后需要有固定的恢复时间。Retention的思路则不同,它把SRAM宏内部的电源网络拆成两路:一路为主电源VDD,负责地址解码、读写驱动、敏感放大器、控制逻辑这些外围电路;另一路为存储阵列专用电源VDDM,只给bitcell供电。进入Retention时关掉VDD,VDDM保持,存储单元里的数据不丢,同时漏电被压到极低。

用生活里的例子类比就是:Power Gating相当于整栋楼拉闸,电表不转了,但冰箱里的菜全坏了;Retention相当于大楼晚上熄灯但给冷库留了一路照明电,菜保住了,电费也降下来了。实际项目中,一般把不需要保留数据的SRAM用Power Gating处理,把需要保留关键状态、配置信息、缓存数据的SRAM用Retention处理。

1.2 三种低功耗模式的应用边界

SRAM Compiler通常会提供多种电源管理模式,业界比较常见的是Normal、Standby、Retention和Power Off四种。Normal就是正常工作,该读写读写,功耗最高。Standby模式会关闭时钟、停止读写操作,但电源不切断,动态功耗基本降为零,静态漏电还在。Retention模式通过关闭外围电路电源、保留存储阵列电源来降低漏电,数据保持。Power Off则是完全断电,数据彻底丢失。

从功耗数字上可以更直观地感受一下它们之间的差距。以某工艺库上的一块32KB SRAM为例,Normal模式下的工作电流大约350uA,Standby模式下约120uA,Retention模式下可以降到10uA左右,Power Off模式下就是0uA。这个对比告诉我们两件事:第一,Standby省电效果非常有限,因为它只消灭了动态功耗,漏电还在;第二,Retention和Power Off才是真正能大幅度降功耗的手段,代价分别是数据保持和流程复杂度不同。

实际选型的时候,我的习惯是先列一张“哪块SRAM存什么”的表格。被CPU频繁访问的指令缓存、存放关键上下文的状态寄存器文件、保存校准参数的配置存储,这类数据掉电就完蛋,必须用Retention。中间计算结果的临时buffer、可以重新从Flash加载的普通数据缓存,这类数据丢了也能恢复,优先考虑Power Gating,还能节省VDDM网络的布线资源。一个项目里很少有超过三种电源管理模式的需求,配置越复杂,验证成本和后端工作量就越大。

1.3 为什么不是所有SRAM都适合断电

这里要泼一盆冷水:不是所有SRAM都适合做深度的电源管理。原因有几个。第一,SRAM Compiler支持的模式取决于工艺库本身的实现,有些库只在特定容量和特定列数下提供Retention模式,选不到就是选不到。第二,每次进入和退出Power Gating或Retention都需要一段稳定时间,如果SRAM被频繁唤醒和休眠,这部分时间会直接影响系统性能和响应速度。第三,断电和恢复过程中需要设计额外的Isolation逻辑,否则SRAM输出引脚会出现悬浮或毛刺,把下游逻辑打进错误状态。

我见过一个项目,做的是一个BLE SoC,设计初期把内部所有的SRAM都加上了Power Gating,结果后端跑电源网络规划时发现,每个SRAM宏都要单独走一路switched power网络,电源开关数量巨大,IR drop和布线拥塞双双超标,最终只能被迫把部分SRAM改回Standby或直接常开。所以实践中我一直建议:对SRAM做电源管理之前,先评估“这块SRAM多久被访问一次”“数据掉电后能否接受”“频繁开关带来的性能损失是否可容忍”。只有数据必须保持、访问频率低、功耗占比高的SRAM,才值得上Retention或Power Gating,做精细化控制。

2. SRAM Compiler中的模式配置与引脚规划

2.1 必须熟悉的电源引脚与控制信号

在SRAM Compiler里选好带低功耗功能的SRAM宏之后,最先面对的就是引脚表。常见库的引脚大致分成三类:功能引脚、电源引脚、控制引脚。功能引脚就是地址、数据、CEN、WEN、CLK这些常规信号,和普通SRAM完全一样。电源引脚这里要注意了,支持Retention的宏会同时出现VDD和VDDM两个电源引脚,有的库还会把地也拆成VSS和VSSM。

控制引脚是配置的重点,不同工艺库叫法有差异,但常见的一般是PG、RETN、ISO这三个的变体,也有的库用SLP、SD、DS等命名。PG控制主电源的内部开关,PG拉低表示关断VDD。RETN是Retention使能信号,RETN拉低表示进入Retention状态。ISO是Isolation控制信号,ISO拉高表示输出总线被钳位到安全电平。有些Compiler内置了电源开关,PG引脚直接控制内部开关;有些库不提供内置开关,需要外接Power Switch Cell。这一点必须在选型时就确认清楚,否则后端做UPF时会发现SRAM宏根本没法关电。

拿到引脚表之后,第一件事不是连线,而是去读datasheet里的电源模式真值表。不同的引脚组合对应不同的工作状态。例如VDD=ON、VDDM=ON、RETN=1时是Normal模式;VDD=OFF、VDDM=ON、RETN=0、ISO=1时是Retention模式;VDD=OFF、VDDM=OFF时是Power Off。把真值表画成自己的速查表,后面写约束和做仿真的时候会省很多事。

2.2 配置选项与时钟处理的实战建议

SRAM Compiler通常提供一系列和低功耗相关的配置选项。比如是否启用Retention单元、是否集成内部电源开关、是否提供独立的VDDM引脚、是否支持多组ISO输出,以及可选的retention电压档位。这些选项不是越多越好,而是要符合项目实际。选集成式电源开关的好处是后端不用额外摆Power Switch Cell,控制逻辑相对简单;坏处是开关面积和导通电阻都是固定的,没法像外接开关那样自由优化。

另一个容易忽略的点是时钟处理。进入Retention之前必须确保SRAM的时钟被安全关闭,同时CEN拉高、片选无效。如果时钟还在翻转,即使VDD被关掉,时钟输入路径上的缓冲器依然会通过ESD保护二极管产生漏电路径,省电效果大打折扣。我习惯在RTL里,由时钟管理单元先关掉SRAM的时钟,再等几个周期确认时钟彻底停摆,然后才允许进入Retention流程。同样,退出Retention时也要先把时钟准备好,再解除ISO,避免下游逻辑在电源恢复但时钟未稳定的窗口期采样到错误数据。

配置选项里还有一个容易被忽略的“输出保持”选择。有些SRAM库在ISO使能时,输出数据总线可以被钳位为0或者保持上一拍数据。如果数据总线连接的是CPU总线,建议选择钳位为0,这样总线不会处于悬浮状态,也不会有不确定的保持值干扰总线仲裁。如果连接的是FIFO接口,保持上一拍数据可能更方便,但这通常需要额外的总线保持器,面积和漏电都有代价,需要结合整体架构权衡。

2.3 一块64KB SRAM的配置参数样例

为了让你能直接对照操作,我这里给一个实际的配置样例。假设项目里需要一块64KB的SRAM用作系统配置信息存储,掉电不能丢数据,访问频率很低,工艺是某40nm低功耗库,SRAM Compiler支持Retention模式。我的配置选择如下:容量64KB,位宽32位,行数和列数选择Compiler推荐的最优组合;启用Retention功能,启用VDDM电源引脚;不启用内部集成电源开关,而是外接Power Switch控制VDD;ISO使能方式选择输出钳位为0,ISO信号由电源管理单元产生。

对应的关键引脚连接关系是:VDD连接到由Power Switch控制的switched power网络,VDDM连接到always-on电源网络,PG连接电源管理单元的输出控制信号,RETN连接Retention控制信号,ISO连接Isolation控制信号。CEN接到系统总线decoder的输出,通常低有效。CLK接功能时钟,由时钟管理单元负责在进入Retention前关闭。

这里特别提醒一下:VDDM的Layout在顶层需要单独规划,不能图省事直接把VDDM和VDD接到同一个电源网格上,否则Power Gating一关,VDDM跟着一起掉电,Retention就名存实亡了。我检查过好几个项目的版图,都有过这种低级错误,往往在仿真阶段看不出问题,到了样片测试阶段才发现断电后数据全丢,再回头追查,发现根因就是版图阶段把两根供电网络short了。

3. Retention时序与Isolation逻辑的配合

3.1 进入Retention的五个步骤

进入Retention看起来很直观,但对时序的要求很严格。我把它拆成五步,每一步顺序都不能反。

第一步,完成当前读写事务,确保SRAM内部没有正在进行的访问操作。第二步,CEN拉高无效化片选,同时时钟停摆,让SRAM进入静止状态。第三步,使能ISO,把输出总线钳位到安全电平,防止后续电源关断时输出引脚悬浮。第四步,拉低RETN,让SRAM内部把存储单元的供电切换到VDDM保持状态。第五步,通过PG关断VDD。

这里最容易被忽略的是第三步和第四步的顺序关系。ISO必须先于RETN有效,而且要保证在PG关断VDD之前ISO已经完全稳定。否则VDD下降过程中,SRAM输出数据线上的电平会不确定地跌落,下游逻辑可能把中间电平当成有效数据,导致状态机误触发。

时序上还要查datasheet里的进入Retention时间和恢复时间。这些时间参数在不同工艺、不同库之间差异很大,同一块SRAM在冷启动和热启动时也可能不同。比如进入Retention后,需要等待tRETENTER时间才能认为SRAM已经稳定处于Retention状态;退出Retention时,VDD恢复后需要等待tRESTORE时间,SRAM内部的存储单元才能恢复到可正常访问的状态。这些参数建议直接写进UPF或者验证环境的时序约束里,并且留一定余量,不要卡在规格边界上。

3.2 Isolation管脚放哪里、怎么接

Isolation逻辑放置的位置直接决定整条数据通路的电源管理策略。SRAM的输出数据总线、输出Valid信号、甚至地址总线的回读路径,只要可能被下游逻辑在电源关断期间采样,都需要被隔离。Isolation Cell一般放在接收端逻辑的电源域入口处,也就是说,SRAM属于可关断的电源域A,下游逻辑属于常开电源域B,ISO Cell要放在电源域B这一侧,靠近SRAM输出引脚的地方,这样SRAM输出虽然会悬浮,但悬浮信号在进入常开域之前就被钳位住了。

ISO信号的极性也要和库保持一致。有的库要求ISO拉高时进入隔离状态,有的库正好相反。我吃过这个亏,在一个项目里把ISO接反了,结果仿真时怎么看怎么对,综合后带RC的网表仿真就出现总线毛刺,最后发现是库的文档里写的是ISO_N,而RTL里用的是高有效,后端没有做反相器插入。所以拿到引脚表之后,第一件事就是把每个控制信号的极性、有效电平、时序要求全部标注出来,再写RTL和UPF,能少走很多弯路。

3.3 退出Retention时最容易翻车的三个点

退出Retention比进入Retention更容易出问题,这个结论我是在多次实战之后才总结出来的。第一点,VDD恢复和RETN拉高的顺序。标准做法是先恢复VDD,等电源稳定,再拉高RETN,然后等待tRESTORE,最后解除ISO。如果RETN先拉高而VDD还没稳定,存储单元可能会进入一个不稳定的半供电状态,数据有损坏风险。第二点,ISO解除太早。解除ISO的时机必须在SRAM输出已经完全有效之后,否则下游逻辑会采到从钳位值切换到真实数据的跳变过程中的中间态。第三点,时钟没有真正准备好就恢复访问。

为了处理这三个点,我习惯在电源管理单元里做一个简单的定时状态机,用一组计数器管理PG、RETN、ISO的先后时序。每个定时器的周期都取datasheet参数的1.5倍到2倍,宁可多等一会也不卡边界。比如datasheet写tRESTORE是500ns,我在状态机里就设1us,多出来的时间对系统功耗影响微乎其微,但对可靠性的提升非常明显。

4. 配合后端UPF统一描述电源意图

4.1 UPF里定义电源域和Power Switch

RTL阶段的配置只是画出了“怎么控制”,真正把控制落地到物理实现的是UPF。UPF通常在逻辑综合阶段就开始编写,贯穿到后端布局布线和签核验证,是电源管理设计的核心载体。针对SRAM做Power Gating和Retention,UPF里至少要描述清楚三件事:电源域划分、电源开关连接、Isolation和Retention策略。

电源域划分要区分出常开电源域和可关断电源域。假设芯片里有CPU、SRAM、外设逻辑,SRAM需要Retention,那么UPF里就会创建两个电源域:一个是顶层常开域,VDD常开;另一个是SRAM所在的关断域,由Power Switch控制供电。关键一步是给SRAM的VDDM单独声明电源网络,并连到常开电源域,这样UPF工具才能理解VDD可以关、VDDM必须保持。

Power Switch的定义在UPF里通常用create_power_switch来描述,要指定输入电源、输出电源、控制信号。对于SRAM宏,如果Compiler已经内置了开关,UPF里就不需要额外创建Power Switch,但需要把VDD连接到由外部开关控制的网络上,同时给SRAM标注其拥有隔离单元和Retention单元。如果外接开关,要定义好开和关的控制条件,以及开关的acknowledge信号,方便电源管理单元确认电源状态。

4.2 在UPF中约束Isolation与Retention

UPF里对Isolation的描述用的是set_isolation命令,包括隔离信号、隔离位置、隔离值。以我们前面64KB SRAM的例子为例,需要把SRAM输出总线设置为隔离,隔离信号是ISO,隔离值设为0,隔离位置在关断域输出端。这里有一个非常影响后端实现质量的细节:set_isolation后面要写清楚isolation_target,是用来约束always on域还是off域,不同的target会决定Isolation Cell插入的位置。

Retention约束在UPF里用的是set_retention,需要把SRAM标注为retention cell,并指明save和restore的信号。有些库支持retention pin映射,需要把SRAM的RETN信号映射到UPF语义里的retention_pin。映射不全会导致综合工具不识别Retention单元,甚至把VDDM网络优化掉。这部分做完之后,记得跑一次UPF一致性检查,确认电源域、供电网络、Isolation和Retention的描述之间没有冲突。

4.3 芯片级电源网络与多个SRAM宏的协同

单块SRAM在UPF里还好处理,一旦芯片里有十几块RAM,电源规划就开始复杂了。我的经验是要先做一个“开关分组”的决策:哪些SRAM共享一个Power Switch,哪些独立控制。共享开关意味着它们同时上电同时掉电,可以减少开关面积和控制信号数量,但如果某一块SRAM需要保持数据而另一块不需要,就无法共享。所以合理的做法是:需要Retention的SRAM全部接到独立的VDDM常开网络,而按照唤醒分组规划VDD的开关路径。

版图阶段特别要注意多块SRAM之间的电源网络连接。同一电源域的SRAM,它们的VDD网络可以共用网格;VDDM网络则全部接到常开电源,不允许被Power Switch切断。这些约束如果在UPF里描述清楚,后端工具会自动生成符合要求的电源网络连接,但如果UPF写得粗糙,后端人员手动连线时就容易出错。我在项目里还会额外要求后端在签核前做一次“供电网络连通性检查”,逐个确认每块SRAM的VDDM网络都能在关断模式下保持供电。

5. 功能验证与问题排查实录

5.1 用行为级模型把时序卡在仿真里

RTL仿真阶段,SRAM通常使用的是行为级模型。行为级模型对Power Gating和Retention的建模完整度差异很大,有些模型只支持功能读写,完全不检查PG、RETN、ISO的时序关系,这会导致仿真提前通过,但在综合后的门级仿真里问题爆发。

我建议在RTL仿真环境里,自己额外加一层“电源时序监控器”,用SystemVerilog Assertion检查ISO、PG、RETN、VDD状态之间的先后顺序。例如断言ISO在PG下降之前已经有效、断言VDD恢复并稳定之后RETN才拉高、断言解除ISO之后至少等待一个时钟周期才能发起读写操作。这些断言写得不复杂,但能把RTL阶段的时序错误提前暴露出来,成本远低于门级仿真阶段再去抓。

5.2 MBIST中的Retention测试思路

Memory BIST是SRAM测试的标准方法,Retention功能的测试思路是:先用BIST引擎向SRAM写入特定pattern,然后暂停BIST,把SRAM切入Retention模式并等待一段时间,再退出Retention,让BIST引擎读出数据并与期望值比较。如果数据不匹配,说明Retention功能有问题。

实际项目中,BIST引擎的时钟和电源管理单元的时钟通常是同一个,要在BIST流程中嵌入Retention测试,需要额外设计一个测试状态机,协调BIST暂停、电源管理控制、等待时间和BIST恢复。这条链路在RTL阶段就要仿真覆盖,否则流片后Test模式下的Retention测试跑不通,只能干瞪眼。

5.3 实测排查清单与经验

最后分享几个我调试低功耗SRAM时用过的排查手段。一是实测待机电流。Retention模式下如果电流比datasheet高出一个数量级,优先检查VDD是否真的被关断,用热成像或者直接用电流探针分开量VDD和VDDM供电路径。二是检查ISO信号在断电期间的波形,如果ISO在VDD下降后才翻转,说明时序控制有问题。三是确认唤醒过程是否触发了总线上的毛刺,必要时在总线上挂一个毛刺检测逻辑,专门抓非法跳变。

如果这些问题都排查完仍然复现数据丢失,那就要回到最基础的VDDM物理连接了。用万用表直接量芯片上VDDM引脚到电源网络的导通情况,确认没有因为layout简化把VDDM和VDD短在一起。这个场景我在上个月刚帮一个团队查过,他们用传统的SRAM宏做底板设计,硬件工程师误以为VDDM和VDD只要都接同一个电源就行,结果板级测试一进入Retention就丢数据,最后把引脚定义翻出来仔细看才找到问题。

根据我个人习惯,每次流片回来做低功耗测试时,我都会先跑一遍“全SRAM写数据-全部进入Retention-等30秒-全部退出-逐块读回比对”的完整测试流程。这个流程虽然简单,但对验证Retention配置是否真正生效非常有效。它能把隐藏的供电网络问题、时序问题、控制信号极性问题的概率一次性暴露出来。等这个流程稳定通过之后,再做细粒度的逐块断电和动态唤醒测试,调试效率会高很多。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/7 19:14:39

端侧Agent工程化实战:Function Calling与MCP的落地避坑指南

1. 端侧 Agent 工程化到底在解决什么问题1.1 从 Demo 到产品之间那道鸿沟很多人第一次跑通端侧 Agent 的时候,心态是崩了又立、立了又崩。本地模型加载成功、Function Calling 能返回结构化 JSON、MCP 工具也能调起来,看着终端里一行行日志滚出来&#x…

作者头像 李华
网站建设 2026/10/7 19:13:00

模型调用实战:从大模型API到跨语言服务部署的通用套路

之前接项目需求,经常听到一句话:“把模型接进来。”第一次听我没怎么放心上,后面几个项目跑完,越来越觉得“模型的调用”这个词的迷惑性特别大。你说调用模型,别人以为是调一个现成接口,到现场发现是让你搬…

作者头像 李华
网站建设 2026/10/7 19:12:28

大模型Agent开发实战:从ReAct循环到生产环境避坑

这两年如果有人问我什么方向最值得投入,我一定会先说Agent开发。大模型本身是能力的基座,但真正让模型从“回答问题”变成“解决问题”的,是围绕它构建的Agent系统。从跑通一个最简单的ReAct循环,到给Agent装上工具、记忆、权限控…

作者头像 李华
网站建设 2026/10/7 19:11:14

图工程驱动的UI评估:用关系建模重构设计质量标准

1. 什么是图工程(Graph Engineering)?它和UI设计评估到底有什么关系?“图工程”这个词最近两年在技术圈里被反复提起,但很多人一听到就下意识联想到“图数据库”“Neo4j”“知识图谱”,甚至直接等同于“画流…

作者头像 李华
网站建设 2026/10/7 19:11:09

C#与ABB机器人工业级通讯控制实战:PC SDK与OPC UA双路径解析

简介:本资源是一套基于C#开发的ABB工业机器人通讯与运动控制完整源码工程,面向自动化工程师、机器人二次开发初学者及高校机电/自动化专业学生,解决C#环境下与ABB机器人建立TCP/IP或串口通信、发送运动指令、实现六轴精确定位及气囊抛光工艺集…

作者头像 李华
网站建设 2026/10/7 19:11:03

AI工程三支柱:安全防御、多模态API治理与AI原生SDLC落地指南

1. 这不是一份“新闻简报”,而是一份AI工程实践者的行动清单2026年8月24日这天,三条看似独立的消息——OpenAI发布AI网络攻击风险预警、DeepSeek正式开放视觉API、Anthropic推出AI原生SDLC手册——在技术社区刷屏。但如果你只把它当“早报”扫一眼就划走…

作者头像 李华