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单元的版图,再跑一下读写仿真,感受会更深刻。