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画了,方便大家理解各个模块的协作关系。
从图中可以看到,读操作时,数据从存储阵列经过列译码器,送到灵敏放大器放大,然后输出。写操作时,数据从写入驱动经过列译码器,强行写入存储单元。预充电电路在每个读周期开始前,默默地把位线准备好。
这里有个容易被忽略的点:读路径和写路径是共享列译码器的。所以列译码器的设计必须同时满足读和写两种模式的需求。读模式下,它要提供低阻抗路径给灵敏放大器;写模式下,它要承受写入驱动的大电流。
设计检查清单:
- 行译码器:检查字线上升时间是否满足时序要求
- 列译码器:检查传输门导通电阻是否对称
- 灵敏放大器:检查失调电压和建立时间
- 写入驱动:检查写入裕度和脉冲宽度
- 预充电电路:检查预充时间和漏电情况
好了,关于SRAM阵列架构的核心模块,就讲到这里。每个模块单独看都不复杂,但组合在一起,就需要仔细权衡速度、功耗和面积。我建议大家在设计时,先用仿真把每个模块的边界条件摸清楚,再去做整体集成。这样能少走很多弯路。
公众号:蓝海资料掘金营,微信deep3321