16nm FinFET低功耗Memory Compiler:嵌入式SRAM的Vmin突破与工程实践
每年总会看到几则存储器IP圈子的新闻大多数时候扫一眼标题就过去了。但这次 sureCore 发布的“针对 16nm FinFET 工艺的低功耗 Memory Compiler”我确实停下来多看了几眼。原因很简单FinFET 工艺的漏电控制已经比平面工艺好了一大截可嵌入式 SRAM 想在低电压下稳定工作依然是整个低功耗 SoC 设计里最头疼的环节之一。sureCore 做的正是超低功耗嵌入式存储方案这次把编译器直接放到 16nm FinFET 上意味着以后做低功耗芯片的团队不必再去定制一套存储方案才有机会拿到低压低功耗 SRAM用编译器生成的存储阵列也能把功耗和良率兼顾起来。这篇文章我会从 Memory Compiler 的原理、FinFET 工艺的难点、sureCore 这类方案的核心技术、以及工程落地常见的坑几个角度把这则新闻背后真正值得关注的东西拆开聊一聊。适合 SoC 架构师、后端物理实现工程师、低功耗设计和验证的同学参考凡是手头正在做 IoT、可穿戴、移动设备的芯片都建议花几分钟看完。1. 这条新闻到底在说什么sureCore 给 16nm FinFET 带来了一款低功耗存储编译器1.1 先说结论这不是一条普通的 IP 发布消息sureCore 这家公司业内做低功耗芯片的朋友应该不陌生。它是一家总部在英国的低功耗嵌入式存储 IP 公司主打超低电压 SRAM 和存储编译方案。这次宣布的 16nm FinFET 低功耗 Memory Compiler本质上是一个“存储器生成器”你输入容量、位宽、端口、功耗模式等参数它自动生成对应的 SRAM 或寄存器文件阵列包括 GDS 版图、LEF、Liberty 时序功耗库、Verilog 行为模型等全套交付物。这类新闻单看标题很容易被忽略但如果你是做低功耗 SoC 的这个发布的分量其实不轻。FinFET 工艺下逻辑电路可以跑到很低的电压但 SRAM 不行低压下单元稳定性、读写噪声容限、良率都会急剧恶化。以前要拿到低压可工作的 SRAM往往得找定制存储团队一版流片周期加上验证成本都是不小开销。现在编译器级别的方案能覆盖低电压工作区间这对项目选型的影响是直接的。1.2 为什么 16nm FinFET 阶段才出现这样的低功耗编译器你可能想问FinFET 工艺都量产这么多年了为什么现在才有人把低功耗 Memory Compiler 放到这个节点上这里有一个技术背景层面的原因。FinFET 工艺相比平面工艺漏电和短沟道效应确实改善了但存储器编译器要做到低电压不是简单把标准单元库换个工艺就能实现。低电压下 SRAM 的读写辅助电路、位线分割策略、保持电压管理、温度补偿机制都需要针对工艺重新设计和验证。16nm FinFET 节点上做这件事意味着存储编译器不能再走“通用参数化”的老路而是要把低电压优化作为一等公民来设计。1.3 对设计团队来说这个方案补上了什么缺口补上的是“标准编译器性能不够好”和“定制存储成本太高”之间的中间地带。传统 Foundry 提供的 Memory Compiler 设计偏保守工作电压范围一般锁在正常操作区间低电压下的时序和良率余量不一定够。定制 SRAM 性能和功耗确实好但周期长、费用高、风险集中小团队根本玩不动。sureCore 这类低功耗编译器则直接把“低电压”作为核心卖点设计师不需要理解每一级电路怎么改只要在配置阶段告诉它工作电压范围、目标频率、功耗优化方向它就会生成相应的版本。对团队来说相当于拿编译器级别的成本买到接近定制方案的低压能力。2. Memory Compiler 是怎么工作的一个参数化拼装存储器的过程2.1 通俗理解像点菜一样配置存储器Memory Compiler 的工作方式可以类比成点菜。你告诉它要几个人吃、什么口味偏好、要不要忌口后厨就会给你配出一桌菜来。好的编译器生成的电路是经过反复验证的而不是临时拼凑。对存储阵列来说主要输入参数包括存储深度depth、字线宽度word width、列复用率column mux、bank 数、冗余行/列、ECC 是否开启、是否有 BIST、功耗模式、工作电压范围等。编译器根据这些参数自动切分存储阵列生成外围电路然后完成版图布局布线和特征化。2.2 生成的文件分别给谁用这个点很多初次接触编译器的同学容易搞混。编译器交付的一堆文件不是随便看看的每一个都有明确用途。GDS 和 LEF 是给物理实现用的GDS 是最终版图LEF 是抽象逻辑视图方便布局布线工具管理。Liberty 文件.lib是给时序和功耗分析用的里面有 setup、hold、power、leakage 等信息。Verilog 行为模型给前端仿真和 FPGA 验证用。某些编译器还会提供 SPICE 网表方便做更精细的功耗和可靠性和分析。千万别只盯着 GDS时序库文件才是决定你的 SoC 能不能跑出目标频率的关键。2.3 配置参数时的几个关键决策点我见过不少项目第一次用低功耗编译器配置阶段就埋了坑。第一个坑是目标电压范围设置得过宽。编译器会为电压范围做优化你填一个 0.5V 到 0.9V 的范围它内部的辅助电路和单元选择就会偏保守面积和功耗都会增大。如果实际只需要 0.6V 到 0.8V应该按真实需求填。第二个坑是 column mux 的选择。column mux 越高IO 电路复用越多面积越小但访问路径变长速度变慢。低电压下本来时序就紧张mux 选太高很容易出现 setup 违例。第三个坑是冗余和 ECC 的问题。先进工艺下不做 redundancy 良率会很难看但冗余行/列会带来面积开销ECC 又会在读延迟上增加一个周期。这些都是性能、面积、功耗、良率之间的权衡建议在项目早期就把规格定清楚别等版图阶段再返工。3. 16nm FinFET 工艺下做低功耗存储到底难在哪3.1 FinFET 结构看着漂亮但低压 SRAM 的麻烦一点没少说到 16nm FinFET首先绕不开的就是 FinFET 结构本身。网上搜 finfet 结构示意图会看到经典的三维画法衬底上立起一片片薄薄的硅鳍fin源漏位于鳍的两端栅极像一座桥横跨鳍并从上、左、右三个方向把沟道包住。这种结构解决了平面工艺在 28nm 以下遇到的短沟道效应亚阈值漏电大幅下降沟道控制能力也更强。打个比方平面工艺的栅极像一条铺在平地上的路路面越窄越难挡住两侧的水。FinFET 相当于把路修成了三面环绕的隧道即使路面窄了很多依然能有效控住水流。这也是 FinFET 工艺在先进节点成为主流的原因。但 FinFET 对 SRAM 来说并不全是好消息。单元晶体管的驱动能力按“根”数离散化一颗 FinFET 的鳍数只能取整数。这就导致单元尺寸和驱动强度无法像平面工艺那样连续调节工艺波动加剧单元的阈值电压失配更严重。低压下SRAM 单元对失配非常敏感读写噪声容限变小极限电压Vmin被显著抬高。换句话说FinFET 降低了漏电却让“往低压走”这件事变得更难。3.2 Vmin 才是低功耗 SRAM 的真正战场很多低功耗存储的宣传册上最显眼的指标是 Vddmin也就是单元能够可靠工作的最低电压。这个值每降低 0.1V动态功耗大致能降 20% 左右因为动态功耗和电压平方成正比。公式很简单P_dynamic α C VDD² f电压从 0.8V 降到 0.65V功耗接近打六折。所以各家都拼命把 Vmin 往下压。但 Vmin 不是想压就能压的它受读稳定性、写能力、保持稳定性三者共同约束还要考虑工艺角、温度、老化的影响。到了 16nm FinFET 阶段单靠工艺本身的进步已经压不动 Vmin 了必须靠电路设计手段来突破比如写辅助、读辅助、读端口分离等技术。3.3 低压下的时序和温度效应更加复杂低压下还有一个隐蔽的坑时序变化呈非线性放大。电压越低晶体管的过驱动电压越小延迟随电压变化越敏感。同一颗芯片上0.6V 时的 SS corner 延迟可能是 0.8V 时的两倍以上。配合 FinFET 工艺的温度反转效应低电压低温下时序反而更差这会让传统基于 SS/FF 角做的时序收敛策略失效。低功耗编译器如果只在典型电压点做特征化没有覆盖低电压角的建模集成到 SoC 里之后必然出现莫名其妙的时序违例。这也是为什么选编译器时一定得确认 Liberty 文件覆盖了目标低电压角和温度范围。4. 低功耗存储器编译器内部的核心技术细节4.1 读写辅助电路突破 Vmin 的关键武器低电压下 SRAM 单元读写困难靠的就是辅助电路“帮一把”。写辅助的常见思路是负位线写辅助在写操作瞬间把位线压到地以下让存储节点更容易翻转。还有 wordline 过驱动给字线一个高于 VDD 的脉冲增强写入能力。读辅助则偏向读端口隔离很多低压 SRAM 单元改用 8T 结构把读端口从存储节点上独立出来读操作不再直接扰动存储状态从而降低 Vmin。这些技术在定制 SRAM 里已经用得很普遍但要放进编译器并保证各种配置下的稳定性工程难度会大很多。对于一家做低功耗存储编译器的公司来说这部分积累才是真正的护城河。4.2 位线分割和层次化设计让低压读写更快位线是 SRAM 里最大的寄生电容来源之一。低位线越长读操作时位线放电越慢低电压下这个问题被进一步放大。低功耗编译器通常会采用位线分割bitline splitting技术把长位线切成若干段每段通过局部读电路连接到位线。这样读操作只对局部段放电位线电容大幅下降读速度和电压余量都提高了。对应的代价是多一层局部 IO 电路面积会增加。但低电压下这点面积换来的是可靠的读时序整体权衡下来非常划算。编译器能做到什么级别很大程度上取决于它在不同容量配置下如何切分位线。4.3 保持模式、电压域管理与动态电压调节低功耗设计的重点从来不只是工作状态更是睡眠和保持状态。编译器级别需要考虑支持 retention 模式也就是把电压降到保持电压单元里的数据依然不丢。sureCore 这类方案通常会提供宽范围电压支持让 SoC 可以通过 DVFS 动态调节电压。此时编译器生成的存储还必须包含或者兼容隔离单元、电平转换单元不然多个电压域之间互相咬合会出很多可靠性问题。我评估这类编译器时都会问一个问题保持电压最低能做到多少从保持电压切换回正常工作电压需要多少个周期唤醒路径的时序是否可控。这三个问题能回答清楚才说明方案是成熟的。4.4 单元库与工艺适配背后的工作量16nm FinFET 的编译器和平面工艺编译器不同它需要针对具体 foundry 的 PDK 重新设计 bitcell、辅助电路和特征化环境。查过 FinFET 结构示意的人会注意到FinFET 单元的引出、鳍共享、栅极切断规则都和平面工艺完全不同版图层面约束特别多。所以这类编译器通常都是按具体工厂和工艺节点绑定的不是拿一套软核到处移植。项目选型时要注意确认你打算用的代工厂和具体工艺版本是不是在支持列表里。5. 什么样的场景适合用这类低功耗存储编译器5.1 典型应用可穿戴、IoT、电池供电设备最典型的场景是电池供电且长期处于待机状态的产品。比如智能手表、TWS 耳机、智能传感器、助听器、医疗贴片这类设备处理器大部分时间都在睡觉只有传感器数据到了才醒来处理一小会儿然后又睡。这时 SRAM 的保持功耗往往是整机待机功耗的主要来源之一。低功耗编译器的价值在于把保持电压压低、把保持状态下的漏电降下来配上快速唤醒策略待机电流可以做到非常小。另一个应用方向是能量收集系统供电电压本身很低存储阵列必须能在 0.5V 甚至更低电压下工作这种需求只有低压优化过的编译器能承接。5.2 和 Foundry 编译器、定制 SRAM 的横向对比为了说清楚定位我列一张表对比一下三种常见方案方案工作电压范围面积/性能成本周期适用场景Foundry 标准编译器较窄通常覆盖典型电压中等优化保守低随工艺 PDK 提供常规手机 SoC不太在意极致功耗的模块第三方低功耗编译器宽覆盖低电压和保持模式优于标准编译器接近定制中需单独授权和评估低功耗 IoT、可穿戴、边缘设备全定制 SRAM IP可以做到极限低电压面积、功耗、性能最优极高周期长对功耗和面积极度敏感的核心模块从表格能看出低功耗编译器的定位就是“花中等的钱拿到接近定制的低功耗能力”。如果你的芯片对存储功耗不敏感用标准编译器就够了。如果整机功耗是核心卖点比如 TWS 耳机要撑一周使用那低功耗编译器带来的收益就非常明显。5.3 选型时的检查清单我一般会建议团队在选型时按下面几条过滤第一目标工作电压范围是否覆盖你们 DVFS 的最低档位。第二保持电压和唤醒功耗指标是否明确给出是否有实测或特征化数据支撑。第三Liberty 库覆盖的 PVT 角是否完整特别是低电压低温角。第四编译器生成的版图是否支持你们后端的金属层和布线要求。第五是否有配套的 BIST、修复、ECC 方案先进工艺没有这些良率和可靠性很难保证。最后一条授权模式和使用年限是不是跟产品生命周期匹配。6. 集成过程中我实际踩过的坑和排查思路6.1 低电压下读时序余量不足低功耗编译器导入项目后第一个容易翻车的地方是低电压读时序。现象往往是芯片跑到低电压档位时读出来的数据偶发错误或者静态时序分析在低电压角报出一堆 setup 违例。排查思路通常是先看有没有编译器选项没有开启 read assist。如果开启了还是不够那就是配置中的 column mux 选太高位线太长导致读路径过慢。还有一个被忽略的问题是位线预充电时间的设置低电压下预充不充分读操作大概率出错。我处理过类似问题最后是降低 mux、打开 read assist并且把预充电时序调整到合适位置才解决。6.2 保持模式下数据丢失数据保持模式和正常工作之间的切换是一个非常隐蔽的坑。低功耗编译器的保持电压通常有一个范围但温度会显著影响保持能力。低温时数据保持相对容易高温时漏电变大保持电压需要上调。另一个问题是唤醒路径上的时序如果从保持电压恢复到正常工作电压时没有等电压稳定就发起读写操作轻则丢数据重则闩锁。设计上需要加低电压检测和复位逻辑保证在电压建立完成之前存储阵列不接收读写请求。这个细节很多编译器 datasheet 里写得不够醒目但实际量产时影响很大。6.3 功耗数据评估不准有时候仿真出来的功耗和实测差异很大问题可能不在编译器而在使用方式。低电压下信号 transition 变慢cell 的短路功耗占比上升如果用典型的 transition 时间做功耗仿真数值会偏低。另一个容易被低估的是唤醒瞬间的电流冲击。大容量 SRAM 从保持模式切回工作模式时内部节点和位线重新初始化瞬时电流可能很大需要足够的去耦电容和电源供电能力。评估低功耗存储方案时不要只看平均待机电流要把唤醒峰值电流也纳入电源设计裕量。6.4 实用建议先做一个小模块验证如果团队第一次用这类低功耗编译器我强烈建议先在某一个不太关键的子模块上试水而不是直接替换核心存储。用实际的 workload 跑一轮功耗仿真和时序收敛确认编译器生成的库数据与真实行为一致再逐步推开。还可以让编译器生成同一容量的多个配置版本对比面积、功耗和时序选择最匹配项目需求的那一版。这个验证过程虽然多花几周时间但能省掉后续流片回来之后大量排查时间。7. 一些自己的体会sureCore 这次在 16nm FinFET 上推出低功耗 Memory Compiler背后的技术积累和趋势信号都很明确先进工艺节点的低功耗存储已经从“定制作坊”走向“可配置量产”。我个人在实际评估这类方案时的体会是不要被宣传的 Vmin 数字吸引住就急着做决策重点要看整个电压-温度区间内读写的稳定性、保持功耗、唤醒路径设计以及编译器的工艺适应度。多问几个为什么多跑几个配置版本用数据说话比什么都稳。