ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

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时关掉VDDVDDM保持存储单元里的数据不丢同时漏电被压到极低。用生活里的例子类比就是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模式下的工作电流大约350uAStandby模式下约120uARetention模式下可以降到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里的电源模式真值表。不同的引脚组合对应不同的工作状态。例如VDDON、VDDMON、RETN1时是Normal模式VDDOFF、VDDMON、RETN0、ISO1时是Retention模式VDDOFF、VDDMOFF时是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控制VDDISO使能方式选择输出钳位为0ISO信号由电源管理单元产生。对应的关键引脚连接关系是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下游逻辑属于常开电源域BISO 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 SwitchRTL阶段的配置只是画出了“怎么控制”真正把控制落地到物理实现的是UPF。UPF通常在逻辑综合阶段就开始编写贯穿到后端布局布线和签核验证是电源管理设计的核心载体。针对SRAM做Power Gating和RetentionUPF里至少要描述清楚三件事电源域划分、电源开关连接、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与RetentionUPF里对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配置是否真正生效非常有效。它能把隐藏的供电网络问题、时序问题、控制信号极性问题的概率一次性暴露出来。等这个流程稳定通过之后再做细粒度的逐块断电和动态唤醒测试调试效率会高很多。
返回列表