4、模拟存内计算:基于RRAM的模拟计算原理、电流求和与权重映射、ADC/DAC接口设计
各位同学,今天我们来聊聊模拟存内计算。说实话,这个方向我研究了快十年。从最早在实验室里搭分立器件验证,到后来真正流片做测试,踩过的坑真不少。但模拟存内计算的价值,值得我们去深挖。
4.1 基于RRAM的模拟计算原理
RRAM,也就是阻变存储器。它的核心特性很简单——电阻值可以连续变化。你想想看,一个器件能存数据,还能同时做乘法,这不就是存算一体最理想的载体吗?
我习惯把RRAM的模拟计算拆成三步理解:
- 权重存储:通过调节RRAM的电阻状态,把神经网络的权重存进去
- 输入调制:输入信号以电压形式施加在RRAM两端
- 电流输出:根据欧姆定律 I = V/R,输出电流就是输入电压和权重的乘积
说白了,一个RRAM单元就是一个模拟乘法器。这在数字电路里需要几十个门才能实现,但在模拟域里,一个器件就搞定了。
核心公式:
Iout = Vin × GRRAM
其中 GRRAM = 1/RRRAM,代表电导值
我在项目中遇到过一个问题:RRAM的电导值并不是完全线性的。写操作时,你希望它从1μS变到10μS,但实际可能只到了8μS。嗯,这里要注意,非理想特性是模拟计算最大的敌人。
4.2 电流求和与权重映射
单个RRAM做乘法没问题,但神经网络需要的是向量-矩阵乘法。怎么做?把多个RRAM的电流在一条线上加起来。
这就是基尔霍夫电流定律的应用。每个RRAM的输出电流,通过位线(Bit Line)汇聚到一起,自然就完成了求和操作。
避坑指南:
我曾经在设计8×8的阵列时,忽略了位线上的寄生电阻。结果测出来的电流和理论值差了15%。后来我学乖了,大阵列一定要做IR Drop仿真,否则流片回来哭都来不及。
权重映射这块,我建议用差分对结构。为什么?因为RRAM的电导值不能为负,但神经网络的权重有正有负。解决办法是用两个RRAM组成一对:
- 正权重:G+ - G- > 0
- 负权重:G+ - G- < 0
- 零权重:G+ = G-
你想想看,这样每个权重需要两个RRAM,面积翻倍了。但换来的是正负权重的完整表达能力,值不值?我个人觉得值。
下面这张图展示了典型的RRAM存内计算阵列结构:
4.3 ADC/DAC接口设计
模拟计算做完,结果还是电流信号。要跟数字处理器通信,必须经过模数转换。这里有个大问题——ADC的功耗和面积。
我做过一个统计,在典型的存内计算芯片中,ADC占了总功耗的40%~60%。你想想看,本来用模拟计算省下来的功耗,全被ADC吃回去了。
| ADC类型 | 分辨率 | 功耗 | 面积 | 适用场景 |
|---|---|---|---|---|
| Flash ADC | 4-6 bit | 高 | 大 | 高速,低精度 |
| SAR ADC | 8-12 bit | 中 | 中 | 通用,最常用 |
| Sigma-Delta ADC | 12-16 bit | 低 | 小 | 高精度,低速 |
| 时间域ADC | 6-8 bit | 极低 | 极小 | 新兴,有潜力 |
我个人习惯用SAR ADC。为什么?因为它在功耗、面积和精度之间取得了最好的平衡。8位SAR ADC在28nm工艺下,单通道功耗能做到50μW左右,面积不到0.01mm²。
注意:
DAC的设计同样重要。输入信号需要从数字域转换到模拟电压域,才能驱动RRAM阵列。我建议使用电阻串DAC,虽然面积大一点,但线性度好,不容易出问题。
这里分享一个我踩过的坑。有一次做8位精度的设计,我选了6位的ADC,想着反正神经网络对精度不敏感。结果测试时发现,量化噪声把网络精度从95%直接拉到了82%。后来我总结了一个经验公式:
ADC精度选择建议:
ADC位数 ≥ 权重精度位数 + 2
例如:权重用6位表示,ADC至少选8位
DAC这边,我建议用分段式结构。高位用电阻串,低位用R-2R网络。这样面积和精度都能兼顾。
嗯,最后说一句。模拟存内计算不是万能的。它擅长的是大规模并行乘累加,但如果你需要高精度或者频繁更新权重,数字方案可能更合适。选型的时候,一定要想清楚自己的应用场景。
好了,这一讲的内容就到这里。记住,RRAM的模拟计算核心就是用物理定律做数学运算——欧姆定律做乘法,基尔霍夫定律做加法。理解了这个,你就抓住了模拟存内计算的精髓。
个人经验总结:
做模拟存内计算设计,我建议按这个顺序来:
- 先确定精度需求(决定ADC/DAC位数)
- 再设计RRAM阵列规模(决定计算吞吐量)
- 最后优化接口电路(降低功耗和面积)
千万别反过来做,否则你会像我一样,改版改到怀疑人生。