3、存算一体硬件架构基础:SRAM存算单元、RRAM/ReRAM存算单元、模拟计算阵列、ADC/DAC接口、数据流与控制逻辑
各位同学,今天我们聊聊存算一体的硬件基础。说实话,这部分内容我当年啃了很久。你想想看,要把存储和计算揉在一起,硬件上到底怎么实现?
我个人习惯,先看物理实现,再看系统集成。咱们从最底层的存算单元开始,一步步往上搭。
3.1 SRAM存算单元
SRAM存算单元,说白了就是用静态随机存储器来干活。它不光是存数据,还能直接做计算。
基本原理:SRAM单元通常由6个晶体管组成(6T结构)。存算一体时,我们利用位线(BL)和字线(WL)的电压关系,实现布尔逻辑运算。
核心操作模式:
- 读模式:WL置高,BL预充电,通过BL电压变化读取存储值
- 写模式:WL置高,BL强制写入目标电压
- 计算模式:同时激活多行WL,BL上产生加权电流和
我在项目中遇到过一个问题:SRAM做计算时,读干扰特别严重。你同时激活多行,存储节点的电压会漂移。嗯,这里要注意,必须加读辅助电路。
避坑指南:我曾经在28nm工艺下做过一个SRAM存算宏。第一次流片回来,计算精度完全不对。后来发现是位线寄生电容太大,导致电荷共享不均匀。解决办法是加了一组参考单元,做差分读出。
SRAM的优势是速度快,和CMOS工艺兼容性好。但缺点也明显——面积大,6T单元占地方,存储密度低。
3.2 RRAM/ReRAM存算单元
RRAM( resistive random-access memory),我更喜欢叫它忆阻器。这东西很有意思,它的电阻值可以连续变化。
工作原理:RRAM单元是金属-绝缘体-金属结构。施加电压后,绝缘层中形成导电细丝,电阻降低。反向电压可以熔断细丝,电阻升高。
为什么适合存算一体?因为它的电阻状态可以表示权重值。模拟计算时,输入电压乘以电导(电阻的倒数),就是电流。这不就是乘法吗?
RRAM存算单元的关键参数:
| 参数 | 典型值 | 影响 |
|---|---|---|
| 电阻范围 | 1KΩ ~ 1MΩ | 决定动态范围 |
| 电阻态数量 | 4~16个 | 决定量化精度 |
| 写电压 | 1~3V | 影响功耗和可靠性 |
| 保持时间 | >10年 | 数据持久性 |
我记得有一次调试RRAM阵列,发现相邻单元的电阻会互相影响。说白了就是热串扰——写一个单元时,热量传到隔壁,导致电阻漂移。后来我们加了隔离结构,才解决这个问题。
注意事项:RRAM的写操作有随机性。同样电压下,每次形成的导电细丝形状不一样,电阻值会有波动。做高精度计算时,必须考虑这个噪声。
3.3 模拟计算阵列
有了存算单元,怎么组织成阵列?这就是模拟计算阵列要做的事。
最常见的结构是交叉阵列(crossbar array)。字线是行,位线是列,每个交叉点放一个存算单元。
矩阵向量乘法:输入向量通过字线施加电压,每个单元的电导代表权重,位线上收集的电流就是乘累加结果。
我画了一张图,帮你理解这个结构:
阵列规模怎么定?我建议看应用场景。做图像处理,256×256起步。做语音识别,128×128就够了。阵列太大,寄生参数会严重影响精度。
经验之谈:我曾经设计过一个1024×1024的阵列,结果仿真时发现最远端的单元电流几乎读不出来。后来拆成4个512×512的子阵列,中间加中继放大器,问题就解决了。
3.4 ADC/DAC接口
模拟计算阵列输出的是电流,但数字处理器要的是二进制数。这中间就需要ADC和DAC。
DAC(数模转换器):把数字输入向量转换成模拟电压,驱动字线。
ADC(模数转换器):把位线上的模拟电流转换成数字结果。
这里有个矛盾:ADC的精度和速度是 trade-off。高精度ADC(比如12位)速度慢,面积大。低精度ADC(比如4位)速度快,但计算精度差。
常见ADC架构对比:
| 架构 | 精度 | 速度 | 面积 | 功耗 |
|---|---|---|---|---|
| 逐次逼近型 | 8~12位 | 中 | 小 | 低 |
| 流水线型 | 8~14位 | 高 | 大 | 中 |
| 闪存型 | 4~6位 | 极高 | 极大 | 高 |
| Σ-Δ型 | 16~24位 | 低 | 中 | 中 |
我个人习惯,神经网络推理用6~8位ADC就够了。训练的话,至少12位。为什么?因为训练时梯度更新需要高精度,推理时对噪声容忍度高。
注意:ADC的参考电压一定要稳。我遇到过因为电源纹波导致ADC结果跳变的情况,排查了三天才发现是LDO输出电容老化。
3.5 数据流与控制逻辑
硬件搭好了,怎么让数据跑起来?这就是数据流和控制逻辑的事。
典型数据流:
- 外部输入数据 → 数字接口 → 输入缓冲区
- 输入缓冲区 → DAC → 模拟计算阵列
- 模拟计算阵列 → ADC → 输出缓冲区
- 输出缓冲区 → 数字处理单元(激活函数、池化等)
- 结果写回存储或输出到外部
控制逻辑负责调度这些步骤。我建议用有限状态机(FSM)实现,简单可靠。
控制逻辑的关键状态:
- IDLE:等待计算指令
- LOAD:加载输入数据和权重
- COMPUTE:执行模拟计算
- READOUT:ADC转换并读出结果
- POST_PROCESS:数字后处理
- STORE:存储结果
这里有个设计要点:数据流要尽量流水线化。比如LOAD阶段和COMPUTE阶段可以重叠——当前层计算时,预加载下一层的数据。
我记得有一次做加速器设计,发现控制逻辑成了瓶颈。计算阵列只用了30%的时间在算,剩下70%都在等数据。后来加了双缓冲,效率直接翻倍。
优化建议:数据搬运是存算一体系统的常见瓶颈。我建议在架构设计阶段就考虑数据复用。比如卷积计算时,输入特征图可以多次复用,减少DAC的切换次数。
好了,硬件基础就讲到这里。这些内容看起来多,但核心就几个点:存算单元怎么选、阵列怎么搭、接口怎么配、数据怎么流。搞清楚了这些,后面讲编译器映射的时候,你就能理解为什么有些优化策略是必要的了。
想要更多资料,联系可可