2、SRAM基本结构:6T单元结构、位线(BL/BLB)与字线(WL)原理、SRAM的读操作与写操作

好,咱们今天聊聊SRAM。这东西在芯片里太常见了,缓存、寄存器堆、FIFO,哪哪都有它。做逆向的时候,你看到一堆规整的阵列,十有八九就是SRAM。我个人习惯,拿到一块芯片的显微照片,先找这种“田字格”一样的结构,基本一找一个准。

2.1 6T单元:SRAM的心脏

SRAM存储一个bit,需要6个晶体管。所以叫6T。你想想看,一个D触发器存一个bit要二十多个管子,SRAM这密度优势一下就出来了。

这6个管子怎么搭的呢?说白了就是两个反相器交叉耦合,再加两个访问管。

  • 两个反相器(M1-M4):一个反相器的输出连到另一个的输入,形成正反馈。这就能锁住一个状态——要么Q=1,QB=0;要么Q=0,QB=1。只要不断电,这状态就不丢。
  • 两个访问管(M5、M6):这两个NMOS管,栅极连到字线(WL),源/漏分别连到位线(BL、BLB)和存储节点(Q、QB)。它们就像两个门卫,字线一拉高,门就打开,位线和存储节点就能交换数据。

我在项目中遇到过一种情况,有些老工艺的SRAM,访问管尺寸画得偏小,结果读操作时存储节点电压被拉偏,直接读翻车了。嗯,这里要注意,6T单元的尺寸比例是有讲究的,不是随便画的。

核心要点:6T单元的本质是“锁存器 + 开关”。锁存器负责存数据,开关负责读写数据。

下面这张图,是我用SVG画的6T单元结构,你看一眼就明白了:

6T SRAM 单元结构 VDD GND M1 PMOS M2 NMOS M3 PMOS M4 NMOS Q QB M5 NMOS WL BL M6 NMOS WL BLB M1/M3: 上拉PMOS | M2/M4: 下拉NMOS | M5/M6: 访问NMOS

2.2 位线与字线:读写数据的“高速公路”

有了6T单元,怎么把数据读出来、写进去?这就靠位线和字线了。

  • 字线(WL, Word Line):水平方向走线,一行SRAM单元共享一根WL。它控制这一行所有单元的访问管是否打开。WL拉高,这一行单元全部“激活”,准备读写。
  • 位线(BL/BLB, Bit Line):垂直方向走线,一列SRAM单元共享一对位线(BL和BLB)。它们负责传输数据。BL和BLB总是互补的,一个高一个低。

你想想看,整个SRAM阵列就是一个网格。WL选行,BL/BLB选列。行列交叉点,就是一个6T单元。这结构,在芯片版图里一眼就能认出来——规整的阵列,横竖交错的金属线。

我的小技巧:逆向分析时,找到WL的驱动电路(行译码器)和BL的灵敏放大器(列电路),基本就能圈定SRAM的范围了。我曾经靠这个,在一颗蓝牙芯片里半小时就定位了128KB的SRAM。

2.3 读操作:小心别把数据读没了

读操作,说白了就是把存储节点的电压,通过位线传出来。但这里有个坑——读操作可能会破坏存储的数据。

具体过程是这样的:

  1. 预充电:先把BL和BLB都充到VDD(高电平)。
  2. 打开WL:WL拉高,M5和M6导通。
  3. 位线放电:假设Q存的是0(低电平),QB存的是1(高电平)。那么BL通过M5和M2(M2是导通的,因为Q=0,QB=1,M2栅极接QB=1)对地放电,BL电压开始下降。而BLB那边,因为QB=1,M4关断,BLB保持高电平。
  4. 灵敏放大器检测:当BL和BLB之间产生一个微小的电压差(比如100mV),灵敏放大器就启动,快速把BL拉到0,BLB拉到1,输出读出的数据。

为什么会说可能破坏数据呢?因为BL放电时,电流会经过M5流入Q节点。如果M5的驱动能力比M2强,Q节点的电压就会被拉高。一旦Q电压超过反相器的翻转阈值,数据就翻掉了。这就是所谓的“读破坏”。

避坑指南:我曾经在分析一颗65nm的SRAM时,发现它的读操作时序特别长。后来一查,是M5/M2的尺寸比没调好,读破坏风险大,设计者故意放慢了读速度来保可靠性。所以,逆向时看到读操作时间异常,不妨往这个方向想想。

2.4 写操作:强行改写,不讲道理

写操作就粗暴多了。它不管单元里原来存的是什么,直接强行写入。

过程如下:

  1. 驱动位线:把BL驱动到要写入的值,BLB驱动到相反的值。比如要写1,就把BL拉到VDD,BLB拉到GND。
  2. 打开WL:WL拉高,M5和M6导通。
  3. 强行改写:BL的高电平通过M5灌入Q节点,把Q拉高。同时BLB的低电平通过M6把QB拉低。只要驱动能力足够,就能强行翻转存储节点的状态。
  4. 关闭WL:写入完成后,WL拉低,M5/M6关断,新数据被锁存在交叉耦合的反相器中。

写操作的关键在于:位线的驱动能力要足够强,能压倒反相器的反馈。所以写驱动器的尺寸通常比单元内的晶体管大得多。嗯,这里要注意,写操作不需要灵敏放大器,直接硬写就行。

操作 WL BL BLB 关键电路
保持 0(关断) 预充电到VDD 预充电到VDD 交叉耦合反相器
1(导通) 放电(若Q=0) 保持高(若QB=1) 灵敏放大器
写1 1(导通) VDD GND 写驱动器
写0 1(导通) GND VDD 写驱动器

最后说一句,SRAM的读和写,在时序上有个重要区别:读操作依赖位线的微小电压差,所以慢;写操作是强行驱动,所以快。逆向分析时,如果你看到一组存储阵列的读写时序不对称,读慢写快,那基本就是SRAM没跑了。

总结一下:6T单元是基础,WL选行,BL/BLB传数据。读操作要“温柔”,防止破坏数据;写操作要“暴力”,确保改写成功。搞懂这些,逆向分析SRAM就成功了一半。


专注资料整理