2. SRAM设计与优化:6T SRAM单元原理、SRAM访问时序、低功耗SRAM技术

各位同学,今天我们来聊聊SRAM。说实话,在无线SoC芯片里,SRAM占的面积和功耗比例越来越高。我做过一个低功耗蓝牙芯片,SRAM占了将近60%的芯片面积。所以,搞懂SRAM的设计与优化,是内存子系统的基本功。

2.1 6T SRAM单元原理

先看最基本的存储单元——6T SRAM。为什么叫6T?因为它用了6个晶体管。两个交叉耦合的反相器构成锁存器,再加两个访问管。

我个人习惯把6T单元画成这样的结构:

WL (字线)
   |
   M5 (访问管)     M6 (访问管)
   |                |
BL --- M1 --- M3 --- BLB
       |      |
       M2     M4
       |      |
      VSS    VSS

M1和M2组成一个反相器,M3和M4组成另一个。两个反相器首尾相连,形成正反馈。只要上电,这个锁存器就能稳定地存一个0或1。

读操作时,WL拉高,M5和M6导通。如果存储节点Q是0,BL会被下拉,BLB保持高电平。差模信号被灵敏放大器检测到,输出数据。

写操作时,BL和BLB被强制驱动到相反的电平。比如写1,BL拉高,BLB拉低。这个驱动强度必须大于锁存器的反馈强度,才能把数据写进去。

关键设计参数:单元比(Cell Ratio)和上拉比(Pull-up Ratio)。

  • 单元比 = W(M2)/W(M5) —— 影响读稳定性
  • 上拉比 = W(M4)/W(M6) —— 影响写能力

我在项目中遇到过一个问题:为了省面积,把单元比设得太小。结果读操作时,存储节点被干扰翻转了。嗯,这就是所谓的读破坏(Read Disturb)。后来我把M2的宽度从120nm调到180nm,问题就解决了。

2.2 SRAM访问时序

SRAM的访问时序,说白了就是地址到数据输出的延迟。我习惯把它拆成几个阶段:

  1. 地址译码:地址信号经过预译码和主译码,选中某一行
  2. 字线激活:WL从低到高,访问管打开
  3. 位线放电:存储单元开始对BL/BLB放电,产生差模信号
  4. 灵敏放大:差模信号达到一定幅度(通常50-100mV),灵敏放大器启动
  5. 数据输出:放大后的数据送到输出锁存器

这里有个容易踩的坑——建立时间(Setup Time)和保持时间(Hold Time)。

我曾经犯过的错:在设计一个高速SRAM时,没留够地址的建立时间。结果地址变化和时钟沿几乎同时到达,导致读出了错误的数据。后来我在地址路径上加了一级流水线寄存器,才把时序收敛。

SRAM的访问时间可以用这个公式估算:

T_access = T_decoder + T_wl + T_bitline + T_sense + T_output

其中,位线放电时间T_bitline是最长的。为什么?因为位线电容很大,放电速度受限于单元驱动电流。你想想看,一条位线上挂了几百个单元,每个单元都有漏电流和寄生电容。

2.3 低功耗SRAM技术

低功耗是无线SoC的命门。SRAM的功耗主要来自三个方面:漏电流、动态读写功耗、位线充放电。我给大家介绍几种实用的低功耗技术。

2.3.1 电源门控(Power Gating)

当SRAM块不使用时,直接关掉它的电源。听起来简单,做起来有讲究。

  • 细粒度门控:每个Bank独立控制,粒度可以到KB级别
  • 状态保持门控:用高阈值电压的保持管,关掉大部分电源,只留一点维持数据
  • 唤醒时间:从关断到恢复工作,需要几十纳秒到几微秒

我个人建议:对于经常访问的SRAM块,用状态保持门控。对于很少访问的,直接全关。我在一个IoT芯片上做过测试,全关能省70%的漏电。

2.3.2 读写辅助技术

随着工艺微缩,SRAM单元的稳定性越来越差。读写辅助技术就是帮单元一把,让它能稳定工作。

技术 原理 效果
写辅助:负位线 写操作时,BL拉到负电压 增强写能力,降低写失败率
写辅助:VDD降低 写操作时,降低单元电源电压 减弱锁存器反馈,便于写入
读辅助:WL升压 读操作时,字线电压高于VDD 增大读电流,加快位线放电
读辅助:VDD升高 读操作时,提高单元电源电压 增强读稳定性,防止读破坏

我的经验:负位线技术效果很好,但需要额外的负压产生电路。如果芯片面积紧张,我建议优先考虑VDD降低方案。它只需要一个简单的电压调节器,面积开销小很多。

2.3.3 其他低功耗技巧

  • 分层位线:把长位线分成多段,只激活需要的段
  • 数据保持模式:降低SRAM的电源电压到数据保持电压(通常0.6-0.7V)
  • 时钟门控:不访问时,关掉SRAM的时钟树

2.4 SRAM编译器选择

做SoC芯片,很少自己画SRAM单元。我们用的是SRAM编译器——一个自动生成SRAM硬宏的工具。

市面上主流的SRAM编译器有:

  • ARM Artisan:最常用,支持多种工艺节点
  • Synopsys DesignWare:集成度高,带DFT功能
  • 台积电自家编译器:针对自家工艺优化

选择SRAM编译器时,我关注这几个点:

  1. 容量范围:能不能生成我需要的深度和宽度
  2. 功耗模式:支不支持电源门控、数据保持
  3. 时序模型:Liberty文件是否准确,有没有温度反转效应模型
  4. 测试支持:有没有MBIST接口,能不能做修复
  5. 面积效率:同样容量下,面积越小越好

避坑指南:我曾经选了一个小众的SRAM编译器,因为它面积特别小。结果流片回来,高温下时序不收敛。后来发现它的时序模型没考虑温度反转。从那以后,我只用经过量产验证的编译器。

还有一个细节:SRAM编译器的配置参数很多。比如字线宽度、位线预充电电压、灵敏放大器类型。我建议先用默认参数跑一版,然后根据时序和功耗分析结果,逐步优化。

好了,SRAM这部分就讲到这里。记住,SRAM设计没有银弹。每个项目都要根据功耗、性能、面积的要求,找到最适合的折中点。


公众号:蓝海资料掘金营,微信deep3321