3、SRAM阵列架构:行译码与列译码、灵敏放大器、写入驱动电路、预充电电路

各位同学,今天我们来聊聊SRAM阵列的核心架构。这部分内容,说白了就是SRAM的“骨架”和“神经”。我做了十几年芯片设计,每次看到SRAM的版图,都觉得它像一座精心规划的城市——行译码是街道门牌号,列译码是楼栋单元号,灵敏放大器是快递分拣员,写入驱动是搬运工,预充电电路则是每天清晨的清扫车。

嗯,咱们一个一个拆开讲。

3.1 行译码与列译码:地址怎么找到存储单元?

SRAM的存储阵列,本质上是一个二维矩阵。行译码器负责选中某一行,列译码器负责选中某一列。两者配合,就能定位到唯一的存储单元。

行译码器,我习惯叫它“行选通”。它把地址信号翻译成字线(Word Line, WL)的使能信号。举个例子,一个256行的阵列,需要8位地址。译码器输出256根字线,每次只拉高一根。

这里有个设计要点:译码器的速度直接影响访问时间。我在一个28nm的项目里遇到过,行译码器的传播延迟占了整个读周期的30%。后来我们用了两级译码结构——先预译码,再最终译码,把延迟砍掉了一半。

行译码器设计原则:

  • 优先使用NAND/NOR树结构,面积小、速度快
  • 大容量SRAM建议用分级译码(预译码+主译码)
  • 注意字线驱动强度,避免长距离传输导致信号衰减

列译码器则负责选中某一位线(Bit Line, BL)对。它通常通过列选择信号(Column Select, CS)来控制传输门,把选中的位线对连接到灵敏放大器或写入驱动电路。

我曾经踩过一个坑:列译码器的晶体管尺寸没调好,导致位线负载不平衡。结果读操作时,灵敏放大器输入端出现共模偏差,读错数据。后来我养成了一个习惯——列译码器的传输门,PMOS和NMOS的宽长比一定要仔细匹配。

3.2 灵敏放大器:读操作的核心

灵敏放大器(Sense Amplifier, SA)是SRAM读路径上的“心脏”。它的任务很简单:把位线上微弱的电压差(通常只有几十到几百毫伏)放大到满摆幅的数字电平。

你想想看,存储单元里的电流就那么一点点,位线又长又带电容。如果不靠灵敏放大器,直接去读,根本读不出0和1的区别。

常用的灵敏放大器结构:

  • 电压型SA:基于锁存器结构,速度快,适合高速SRAM
  • 电流型SA:检测位线电流差,功耗低,适合低功耗设计
  • 差分型SA:利用差分输入,抗共模噪声能力强

我个人偏好电压型锁存SA。它在65nm以下工艺中表现稳定。但要注意,锁存SA有个“死区”——输入电压差太小的时候,它可能进入亚稳态。所以,一定要保证位线放电时间足够长,让电压差超过灵敏放大器的失调电压。

经验之谈: 灵敏放大器的失调电压,通常需要做蒙特卡洛仿真来评估。我一般要求SA的3-sigma失调电压不超过位线差分信号的20%。否则,良率会很难看。

3.3 写入驱动电路:把数据写进去

写入操作和读操作完全不同。读操作是“感知”,写操作是“强制”。写入驱动电路(Write Driver, WD)需要强行把位线拉到VDD或GND,从而翻转存储单元的状态。

写入驱动电路的核心是写辅助技术。为什么需要辅助?因为随着工艺微缩,存储单元的供电电压越来越低,写入裕度越来越小。你想想看,如果位线电压拉得不够低,存储单元里的交叉耦合反相器可能翻不过去。

常见的写辅助方法:

方法 原理 优缺点
降低VDD 写操作时临时降低存储单元供电 效果好,但需要额外电源管理
抬高VSS 写操作时抬高存储单元地电位 面积开销小,但时序复杂
负位线技术 将位线拉到负电压 写入能力最强,但需要负压产生器

我在一个低功耗IoT芯片项目中,用过负位线技术。当时为了省电,存储单元电压已经降到0.6V,普通写入根本写不进去。负位线技术帮了大忙,但代价是增加了电荷泵电路的面积。嗯,这就是trade-off。

注意: 写入驱动电路的驱动能力不能太强,否则可能破坏未选中的存储单元(半选问题)。写入脉冲宽度也要精确控制,太短写不进,太长浪费功耗。

3.4 预充电电路:读操作前的准备

预充电电路(Precharge Circuit)负责在读操作之前,把位线对预充到VDD。为什么需要预充?因为位线电容很大,如果不预充,读操作时位线电压变化太慢,会严重影响速度。

预充电电路通常由两个PMOS晶体管组成,一个连接VDD到位线BL,另一个连接VDD到位线BLB。还有一个均衡PMOS,把BL和BLB短接,确保两者电压完全相等。

预充电时序很关键:

  • 预充电信号(PRE)在字线使能之前拉低,开始预充
  • 字线使能之前,PRE必须拉高,结束预充
  • 预充时间要足够,保证位线电压达到VDD的98%以上

我曾经优化过一个SRAM的预充电电路。原设计用了标准尺寸的PMOS,预充时间占了读周期的40%。我加大了PMOS的宽长比,预充时间缩短到20%,但功耗增加了15%。后来我们采用了自适应预充电——根据位线电压反馈动态调整预充时间,既保证了速度,又没多耗电。

低功耗预充电技巧:

  • 使用分级预充电:先快速预充到90%,再慢速精确预充
  • 利用时钟门控:只在需要读操作的周期开启预充
  • 考虑使用NMOS预充(虽然速度慢,但漏电小)

3.5 整体架构与信号流

下面这张图展示了SRAM阵列的核心数据流。我特意用SVG画了,方便大家理解各个模块的协作关系。

行译码器 Row Decoder 存储阵列 Memory Array (行×列) 列译码器 Column Decoder 预充电电路 灵敏放大器 Sense Amp 写入驱动 Write Driver 字线 位线 读路径 写路径 预充 图例: 译码器 存储阵列 预充电 灵敏放大器 写入驱动

从图中可以看到,读操作时,数据从存储阵列经过列译码器,送到灵敏放大器放大,然后输出。写操作时,数据从写入驱动经过列译码器,强行写入存储单元。预充电电路在每个读周期开始前,默默地把位线准备好。

这里有个容易被忽略的点:读路径和写路径是共享列译码器的。所以列译码器的设计必须同时满足读和写两种模式的需求。读模式下,它要提供低阻抗路径给灵敏放大器;写模式下,它要承受写入驱动的大电流。

设计检查清单:

  1. 行译码器:检查字线上升时间是否满足时序要求
  2. 列译码器:检查传输门导通电阻是否对称
  3. 灵敏放大器:检查失调电压和建立时间
  4. 写入驱动:检查写入裕度和脉冲宽度
  5. 预充电电路:检查预充时间和漏电情况

好了,关于SRAM阵列架构的核心模块,就讲到这里。每个模块单独看都不复杂,但组合在一起,就需要仔细权衡速度、功耗和面积。我建议大家在设计时,先用仿真把每个模块的边界条件摸清楚,再去做整体集成。这样能少走很多弯路。


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