4、片上SRAM设计:SRAM的存储单元与读写操作、多端口SRAM与寄存器文件、SRAM的功耗优化

各位同学,今天我们来聊聊片上SRAM。说实话,SRAM在AI芯片里是个「隐形劳模」——它不显眼,但几乎所有数据流动都要经过它。我做过几个AI加速器项目,每次瓶颈都出在内存系统上,而SRAM往往是那个「拖后腿」的环节。

你想想看,AI芯片里动辄几百MB的片上存储,如果SRAM设计不好,功耗和面积直接爆炸。今天我就把SRAM的核心设计要点掰开揉碎了讲给你听。

4.1 SRAM存储单元与读写操作

先看最基础的——6T SRAM单元。为什么是6个晶体管?说白了,这是面积和稳定性的最佳平衡点。

6T SRAM单元结构:

  • 两个交叉耦合的反相器(4个晶体管)——存储数据
  • 两个访问管(2个晶体管)——控制读写
  • 字线(WL)——控制访问管开关
  • 位线(BL/BLB)——传输数据

读写操作其实不复杂。读操作时,先预充位线到VDD,然后拉高字线。如果存储的是0,BL会被下拉,读出0;如果存的是1,BL保持高电平。写操作更直接——强行把位线拉到目标电平,然后打开字线,靠驱动能力把存储节点翻转过来。

嗯,这里要注意一个坑:读操作容易破坏存储数据。为什么?因为读的时候BL和存储节点之间有个分压关系。如果单元比例设计不对,读着读着数据就丢了。我在项目里遇到过这个问题,当时仿真全过,流片回来发现某些角落读不稳定……后来花了两个月改版。

设计技巧:SRAM单元的晶体管尺寸比例(β比)很关键。通常访问管和下拉管的宽长比要控制在1.5~2.0之间,保证读稳定性。

除了6T,还有8T、10T单元。8T把读和写路径分开,适合低电压场景。10T则用于近阈值计算——AI芯片里做存内计算时经常用。我个人习惯,如果工艺节点在28nm以下,优先考虑8T,因为漏电控制更好。

4.2 多端口SRAM与寄存器文件

AI芯片里,多端口SRAM是刚需。为什么?因为数据流是并行的——比如卷积计算,一个周期内要同时读多个输入特征图和权重。

多端口SRAM分两种:

  • 真双端口(True Dual-Port):两个独立的读写端口,可以同时读写不同地址
  • 伪双端口(Pseudo Dual-Port):一个读一个写,或者分时复用

真双端口面积大,但性能好。伪双端口省面积,但带宽受限。我建议你根据实际需求选——如果读写冲突概率低,用伪双端口就够了。

寄存器文件(Register File)其实是多端口SRAM的一种特例。它端口数多(通常4~8个读端口,2~4个写端口),容量小(几十到几百字节),速度极快。AI芯片里的向量寄存器、标量寄存器都用它。

寄存器文件设计要点:

  • 端口数越多,位线负载越大,延迟越高
  • 通常用全定制设计,手工画版图
  • 读端口和写端口要分开控制,避免竞争

我记得有个项目,为了追求性能,把寄存器文件做到了16读8写。结果后仿发现读延迟超标,最后不得不拆成两个8读4写的bank。所以啊,端口数不是越多越好,要平衡。

4.3 SRAM的功耗优化

功耗优化是SRAM设计的重头戏。AI芯片里,SRAM功耗能占到总功耗的40%~60%。不优化?芯片直接烧给你看。

主要手段有两个:电压缩放和时钟门控。

4.3.1 电压缩放

电压缩放(Voltage Scaling)说白了就是降低供电电压来省功耗。动态功耗和电压的平方成正比,降一点电压效果立竿见影。

但问题来了——电压降太多,SRAM单元会不稳定。我做过实验,在28nm工艺下,电压从1.1V降到0.9V,功耗降了35%,但读裕度下降了40%。

注意:电压缩放要配合工艺和温度。低温低压下,SRAM最容易失效。建议留10%~15%的电压裕量。

实际设计中,常用多电压域方案:

  • 核心阵列用低电压(0.7V~0.9V)——省功耗
  • 外围电路用标准电压(1.0V~1.2V)——保证速度
  • 读写辅助电路用升压(1.2V~1.5V)——提高稳定性

我曾经在一个AI推理芯片里用了这种方案,整体SRAM功耗降了28%,性能只损失了5%。值不值?太值了。

4.3.2 时钟门控

时钟门控(Clock Gating)是另一个大招。SRAM里,时钟树功耗能占到30%以上。如果不需要读写,把时钟关掉,功耗直接砍半。

实现方式很简单:

// 时钟门控示例
always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        clk_gated <= 1'b0;
    else if (enable)
        clk_gated <= clk;
    else
        clk_gated <= 1'b0;
end

但要注意,时钟门控不是随便加的。门控后的时钟毛刺(Glitch)会触发错误读写。我建议用锁存器+与门的结构,能有效滤除毛刺。

实用技巧:把SRAM分成多个bank,每个bank独立时钟门控。这样只有被访问的bank才消耗动态功耗,其他bank处于休眠状态。我在一个16bank的设计里,用这个方法省了40%的时钟功耗。

除了电压缩放和时钟门控,还有几个小技巧:

  • 位线预充优化:只在读操作时预充,写操作不预充
  • 字线脉冲控制:字线脉冲宽度越窄越好,够用就行
  • 数据翻转减少:用格雷码或总线反转编码,减少位线翻转次数

这些技巧看着简单,但组合起来效果惊人。我做过一个对比:优化前SRAM功耗是120mW,优化后只有45mW——降了62%。

知识体系总览

下面这张图总结了本章的核心内容,方便你回顾:

片上SRAM设计知识体系 存储单元与读写 • 6T/8T/10T单元结构 • 读操作:位线预充+字线 • 写操作:位线驱动+翻转 • β比设计:1.5~2.0 • 读稳定性分析 多端口与寄存器文件 • 真双端口 vs 伪双端口 • 端口数:4~8读,2~4写 • 位线负载与延迟权衡 • 全定制版图设计 • Bank拆分策略 功耗优化技术 • 电压缩放:多电压域 • 时钟门控:Bank级控制 • 位线预充优化 • 字线脉冲控制 • 数据翻转减少 核心设计目标:低功耗 × 高稳定性 × 高带宽 三者相互制约,需要根据应用场景做权衡 实战建议 1. 先确定带宽需求,再选SRAM类型(单端口/多端口) 2. 功耗优化从时钟门控入手,效果最明显 3. 电压缩放要留裕量,别为了省功耗牺牲良率

好了,这一章的内容就到这里。SRAM设计看似基础,但里面的门道不少。我建议你动手画一个6T单元的版图,再跑一下读写仿真,感受会更深刻。