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单元结构,你看一眼就明白了:
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 读操作:小心别把数据读没了
读操作,说白了就是把存储节点的电压,通过位线传出来。但这里有个坑——读操作可能会破坏存储的数据。
具体过程是这样的:
- 预充电:先把BL和BLB都充到VDD(高电平)。
- 打开WL:WL拉高,M5和M6导通。
- 位线放电:假设Q存的是0(低电平),QB存的是1(高电平)。那么BL通过M5和M2(M2是导通的,因为Q=0,QB=1,M2栅极接QB=1)对地放电,BL电压开始下降。而BLB那边,因为QB=1,M4关断,BLB保持高电平。
- 灵敏放大器检测:当BL和BLB之间产生一个微小的电压差(比如100mV),灵敏放大器就启动,快速把BL拉到0,BLB拉到1,输出读出的数据。
为什么会说可能破坏数据呢?因为BL放电时,电流会经过M5流入Q节点。如果M5的驱动能力比M2强,Q节点的电压就会被拉高。一旦Q电压超过反相器的翻转阈值,数据就翻掉了。这就是所谓的“读破坏”。
避坑指南:我曾经在分析一颗65nm的SRAM时,发现它的读操作时序特别长。后来一查,是M5/M2的尺寸比没调好,读破坏风险大,设计者故意放慢了读速度来保可靠性。所以,逆向时看到读操作时间异常,不妨往这个方向想想。
2.4 写操作:强行改写,不讲道理
写操作就粗暴多了。它不管单元里原来存的是什么,直接强行写入。
过程如下:
- 驱动位线:把BL驱动到要写入的值,BLB驱动到相反的值。比如要写1,就把BL拉到VDD,BLB拉到GND。
- 打开WL:WL拉高,M5和M6导通。
- 强行改写:BL的高电平通过M5灌入Q节点,把Q拉高。同时BLB的低电平通过M6把QB拉低。只要驱动能力足够,就能强行翻转存储节点的状态。
- 关闭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就成功了一半。