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)。字线是行,位线是列,每个交叉点放一个存算单元。

矩阵向量乘法:输入向量通过字线施加电压,每个单元的电导代表权重,位线上收集的电流就是乘累加结果。

我画了一张图,帮你理解这个结构:

模拟计算交叉阵列结构图 输入向量 V1 V2 V3 V4 G G G G G G G G G G G G G G G G I1 I2 I3 I4 Ij = Σ (Vi × Gij) 输入电压 × 电导 = 输出电流 字线(输入) 位线(输出) 存算单元

阵列规模怎么定?我建议看应用场景。做图像处理,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 数据流与控制逻辑

硬件搭好了,怎么让数据跑起来?这就是数据流和控制逻辑的事。

典型数据流:

  1. 外部输入数据 → 数字接口 → 输入缓冲区
  2. 输入缓冲区 → DAC → 模拟计算阵列
  3. 模拟计算阵列 → ADC → 输出缓冲区
  4. 输出缓冲区 → 数字处理单元(激活函数、池化等)
  5. 结果写回存储或输出到外部

控制逻辑负责调度这些步骤。我建议用有限状态机(FSM)实现,简单可靠。

控制逻辑的关键状态:

  • IDLE:等待计算指令
  • LOAD:加载输入数据和权重
  • COMPUTE:执行模拟计算
  • READOUT:ADC转换并读出结果
  • POST_PROCESS:数字后处理
  • STORE:存储结果

这里有个设计要点:数据流要尽量流水线化。比如LOAD阶段和COMPUTE阶段可以重叠——当前层计算时,预加载下一层的数据。

我记得有一次做加速器设计,发现控制逻辑成了瓶颈。计算阵列只用了30%的时间在算,剩下70%都在等数据。后来加了双缓冲,效率直接翻倍。

优化建议:数据搬运是存算一体系统的常见瓶颈。我建议在架构设计阶段就考虑数据复用。比如卷积计算时,输入特征图可以多次复用,减少DAC的切换次数。

好了,硬件基础就讲到这里。这些内容看起来多,但核心就几个点:存算单元怎么选、阵列怎么搭、接口怎么配、数据怎么流。搞清楚了这些,后面讲编译器映射的时候,你就能理解为什么有些优化策略是必要的了。

想要更多资料,联系可可