想象你经营着一个大型农贸市场。每天清晨,成百上千的顾客涌进来买菜。传统市场设有一个“中央结算中心”:顾客想买大蒜、土豆、番茄,得先挨个摊位问价、取菜,再抱着菜跑到结算中心称重、算总价、付款。来回奔波费时费力,结算中心门口永远排着长队,搬菜的路上还经常挤掉几根葱——这就是“数据搬运”的代价。 存内计算(Computing-in-Memory, CIM)彻底颠覆了这个模式:它给每个摊位配上一台“智能电子秤”,秤里不仅存着价目表(权重),还自带算账能力(乘加运算)。顾客报出采购清单(输入向量),所有摊位同时称重、同时报价(并行乘加),最后汇总成一张总账单(ADC量化)。菜不用来回搬,顾客几乎瞬间就能结账走人。 这篇文章就从“为什么菜要来回搬”讲起,带你一步步拆解SRAM存内计算这只“智能电子秤”的构造:SRAM单元如何当“秤”、位线如何“报价”、ADC如何“记账”、精度怎么“校准”、单元怎么“改造”,以及什么样的市场适合用它来管账。

岗位关联

理解SRAM存内计算,是看懂AI芯片“存算一体”技术路线的基础课。它帮你穿透“内存墙”瓶颈的本质,掌握架构设计、算法加速与芯片选型时绕不开的核心判断框架——对做AI系统或芯片方向的从业者来说,都是重要的底层认知。

目录
  1. 可视化演示
  2. 存内计算背景
  3. SRAM单元结构
  4. 位线乘加原理
  5. 模拟量化设计
  6. 精度限制分析
  7. 单元改造策略
  8. 对比与应用
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示SRAM存内计算位线电流叠加原理、ADC量化转换过程及模拟与数字方案性能对比分析。

本节配有交互动效(进入视口后自动加载,约 3KB)。

位线计算原理 字线激活(WL):选中行开启SRAM单元,权重值输出到位线 位线叠加(BL):多列电流在位线上自然求和,实现乘加运算 BL_current = Σ(WL_i × Cell_weight_i), analog MAC in memory

存内计算背景

回到那个农贸市场:每个摊位都有自己的价目表,但算总价这件事,永远要等顾客把菜搬到市场中央的结算台才能完成。整个上午,结算台前排着长队,搬菜的路上人挤人,不少菜叶在半路被挤坏——这就是“数据搬运”的浪费。在计算机里,同样的事情每天都在发生:CPU(中央处理器)和内存(仓库)分居两地,指令和数据的搬运,远比计算本身更耗时、更耗电。这道著名的“内存墙”,正是冯诺依曼架构的经典瓶颈。

存内计算的思路很直接:既然搬运这么贵,不如让“仓库”自己会算。SRAM存内计算把乘加运算直接搬进存储阵列,让存储单元在“被读取”的同时完成计算。市场里不再需要中央结算台,每个摊位都是一台智能秤。这样,原本要把输入数据从内存搬到ALU、算完再搬回去的路径,被一条条并行计算、原位累加的“报价线”取代了。

在传统架构里,一次完整操作的能量消耗中,数据搬运往往占据大头。可以用一个占比公式来理解这件事的严重程度:

存内计算的“省”,省的就是从摊位移到结算台那一路运输。当每个摊位都能立地报价时,市场不再拥挤,顾客也不用来回奔波——这就是存算一体架构最核心的价值。

搬运能耗占比=EmoveEmove+Ecompute\displaystyle \text{搬运能耗占比} = \frac{E_{\text{move}}}{E_{\text{move}} + E_{\text{compute}}}
这个式子告诉我们:当“搬菜”的能耗远大于“算账”的能耗时,占比趋近于100%,CPU再快也无济于事。
  1. E_move(搬运能耗)数据在内存和计算单元之间传输消耗的能量。现实中搬运1比特数据的能耗,可能是一次浮点运算的数十倍。
    Emove\displaystyle E_{\text{move}}
  2. E_compute(计算能耗)算术单元内部完成一次乘加运算(MAC)消耗的能量,是“纯算账”的成本。
    Ecompute\displaystyle E_{\text{compute}}
  3. 分母求和总能耗是搬运与计算之和,代表一次完整操作的总体开销,两者缺一不可。
    Emove+Ecompute\displaystyle E_{\text{move}} + E_{\text{compute}}
  4. 占比趋近1当分子远大于分母,说明几乎全部能量都消耗在“路上”,这正是存内计算要消除的浪费。
    EmoveEmove+Ecompute\displaystyle \frac{E_{\text{move}}}{E_{\text{move}} + E_{\text{compute}}}

SRAM单元结构

智能秤想要普及,先得有一台结实可靠的秤。在SRAM存内计算中,这杆“秤”就是一个个SRAM存储单元。最常见的SRAM单元由6个晶体管构成,称为6T单元:四个晶体管组成两个交叉耦合的反相器,像两个互相拉住的搭档,只要不断电,就能把信息牢牢锁存住——存1就保持高电平,存0就保持低电平。另外两个晶体管是“门卫”,负责在需要时打开通道,让外部读到存储的信息。

当我们要“问价”(读取)时,先把位线(BL)预充到高电平“待命”,然后打开字线(WL)这个“门卫”。如果单元存的是0,位线就会通过单元放电;如果存的是1,位线则基本保持高电平。读取速度取决于位线电容的放电快慢,可以写成:

这杆“秤”的稳定性并非天生完美。读操作时,位线放电可能短暂扰动存储节点的电压,如果扰动太强,存1可能被翻成0,就像顾客手太重把秤压坏了——这被称为“读破坏”。SRAM单元的设计,就是在确保读取稳定的前提下,让秤尽可能轻巧、便宜。

tread=CBL×VDDIcell\displaystyle t_{\text{read}} = \frac{C_{\text{BL}} \times V_{\text{DD}}}{I_{\text{cell}}}
读取时间可以理解为“顾客问价后,智能秤报数需要等多久”。位线电容越大、电流越小,读数就越慢。
  1. C_BL(位线电容)一列所有单元共享的金属线电容,像连接所有摊位的报价管道,管道越粗,充满或放空越慢。
    CBL\displaystyle C_{\text{BL}}
  2. V_DD(电源电压)位线预充后的初始电压,相当于报价管道初始的“满水水位”。
    VDD\displaystyle V_{\text{DD}}
  3. I_cell(单元放电电流)单元导通时释放的电流大小,由存储数据和晶体管尺寸决定,是数据表达的物理载体。
    Icell\displaystyle I_{\text{cell}}
  4. t_read(读取时间)把管道从满水位放到可识别阈值的总时间,它决定了阵列读操作的速度上限。
    tread=CBL×VDDIcell\displaystyle t_{\text{read}} = \frac{C_{\text{BL}} \times V_{\text{DD}}}{I_{\text{cell}}}

位线乘加原理

现在,市场上所有的“智能秤”被排成一个整齐的矩阵:每一行代表一种菜品(输入维度),每一列代表一个顾客订单(输出维度)。存储单元里存放的是权重——也就是这张订单上“要不要这道菜”(0或1)。当顾客报出采购清单时,输入信号通过字线同时广播给整行摊位;每个摊位的秤根据“订单上是否有这道菜”决定是否报价,报价高低则由顾客要的量决定。

这个过程在电路层面非常优雅:输入信号以电压或脉冲宽度的形式加载在字线上,SRAM单元存储的权重1或0决定晶体管导通还是关断。导通时,单元在位线上产生电流,电流大小正比于输入电压和权重的乘积——乘法就这么“免费”完成了。同一列上所有单元的电流自然汇聚到位线上,这一列的总电流就是所有乘积之和,也就是一次完整的乘加运算:

整个商店的“报价体系”只靠一道物理过程——位线放电——就完成了。市场里的顾客不需要挨个摊位讨价还价,只要站在市场门口报一遍需求,所有摊位同时响应,一列位线上汇聚的电流就是一张订单的汇总报价单。这种“读写即计算、阵列即算盘”的方式,正是存内计算的核心魔法。

IBL,j=∑i=1NIcell,i,j=∑i=1Nxi×wi,j×I0\displaystyle I_{\text{BL},j} = \sum_{i=1}^{N} I_{\text{cell},i,j} = \sum_{i=1}^{N} x_i \times w_{i,j} \times I_0
位线电流等于这一列所有“智能秤”报价的总和:每个秤报价 = 菜品需求量 × 订单是否需要这道菜 × 单位电流。
  1. I_cell,i,j(单元电流)第i行第j列的单元在位线上产生的电流,它是模拟乘法的直接产物。
    Icell,i,j=xi×wi,j×I0\displaystyle I_{\text{cell},i,j} = x_i \times w_{i,j} \times I_0
  2. x_i(输入值)第i行的输入信号,通过字线电压或脉冲宽度调制电流大小,相当于顾客报出的需求量。
    xi\displaystyle x_i
  3. w_i,j(权重值)存储在SRAM单元中的1比特权重,决定该单元是否导通、是否参与本列累加。
    wi,j\displaystyle w_{i,j}
  4. Σ求和(位线累加)同一列所有单元电流在物理线上的自然叠加,一次放电同时完成N路乘加,这就是并行计算的来源。
    IBL,j=∑i=1NIcell,i,j\displaystyle I_{\text{BL},j} = \sum_{i=1}^{N} I_{\text{cell},i,j}

模拟量化设计

聪明的读者已经发现:位线上汇聚的是电流,是连续变化的模拟量,而不是干净的0和1数字。就像智能秤报出的是“大约三斤二两”,而不是精确的“3.2斤”——音量够大,但带有模糊性。为了让后续的数字电路能够处理,必须把模拟电流转换成数字信号,这个任务由ADC(模数转换器)完成。

ADC的工作,就像把各家摊位报出的模拟量整理成账本上的数字条目。首先是模拟乘法:输入电压/脉冲宽度与权重导通共同调制的电流,天然完成了乘法,这是模拟计算的特权。但模拟量不能无限精细地累加:位线电压范围有限,ADC需要在设定的满量程内,把连续的电流值映射到有限的离散码值上。码值越多,账记得越细,但ADC的面积和功耗也越大。

量化过程会引入不可避免的量化噪声,其上限由ADC位宽决定。理想情况下,一个b位ADC的信噪比可以表示为:

量化位宽的选择,本质上是“账本记得多细”与“记账成本多高”之间的权衡。4比特ADC已经能支撑常见神经网络推理任务,8比特则更稳但面积功耗更大。市场管理者必须精打细算:秤够用就好,不必每台都配账房先生级别的精密仪表。

SNRADC=6.02b+1.76 dB\displaystyle \text{SNR}_{\text{ADC}} = 6.02b + 1.76 \ \text{dB}
这个公式说明:ADC每增加1位,信噪比大约提升6dB,账本精度翻一番,但硬件开销也在同步上涨。
  1. b(量化位宽)ADC输出的二进制位数。位宽越大,模拟量被切分的阶梯越细,量化噪声越小。
    b\displaystyle b
  2. 6.02b(线性增益项)每增加1位,量化信噪比提升约6.02dB,这是一个等比数列式的精度改善。
    6.02b\displaystyle 6.02b
  3. 1.76 dB(理想校正项)理想正弦输入信号量化下的固定偏移量,来源于均匀量化的统计特性。
    1.76 dB\displaystyle 1.76 \ \text{dB}
  4. SNR_ADC(量化信噪比)信号功率与量化噪声功率之比,是衡量ADC输出“账本清晰度”的核心指标。
    SNRADC=6.02b+1.76 dB\displaystyle \text{SNR}_{\text{ADC}} = 6.02b + 1.76 \ \text{dB}

精度限制分析

再好的智能秤,用久了弹簧也会疲劳,地面轻微震动也会让读数抖动。SRAM存内计算的模拟计算路径同样面临各种误差来源。首先是工艺误差:芯片制造过程中,晶体管的阈值电压、尺寸都会出现小范围波动,导致每个单元在存储同样的1时,产生的电流却不完全一样——就像每个秤的弹簧硬度略有差异,称同一斤土豆,读数却可能差出几十克。

其次是噪声与串扰:位线是长长的金属线,相邻位线之间通过寄生电容互相干扰;电源电压的波动、晶体管的热噪声也会叠加到累加结果上。这些误差不像ADC量化那样有规律可循,它们是随机、动态的。把所有误差因素纳入考量,实际得到的位线累加结果可以写成:

针对这些精度问题,业界发展出多种“校准”手段:在阵列中放置参考单元,实时测量电流偏差并补偿;对多次采样结果取平均以抑制随机噪声;或者把高位权重和低位权重分开计算,用混合精度方式减少量化损失。这些方法就像定期给市场里的秤统一校零、增配防震底座,让读数尽可能贴近真实值。

yj=∑i=1N(wi,j+Δwi,j)×(xi+Δxi)+nj\displaystyle y_j = \sum_{i=1}^{N} (w_{i,j} + \Delta w_{i,j}) \times (x_i + \Delta x_i) + n_j
这个式子展示了“秤”的多重误差源:权重偏差、输入偏差和随机噪声叠加在一起,最终让读数偏离真实值。
  1. Δw_i,j(权重偏差)工艺偏差导致SRAM单元导通电流偏离理想权重,相当于每个秤的“弹簧硬度”存在个体差异。
    Δwi,j\displaystyle \Delta w_{i,j}
  2. Δx_i(输入偏差)DAC输出或字线电压的波动导致输入信号不精确,相当于顾客报的需求量本身带了些水分。
    Δxi\displaystyle \Delta x_i
  3. n_j(随机噪声)位线上的热噪声、电源噪声和耦合噪声的叠加,相当于地面震动、电子干扰等不可控因素。
    nj\displaystyle n_j
  4. 整体累加误差项随着乘积展开自然累加,最终全部汇入位线电流,成为ADC输入端“读数抖动”的来源。
    yj=∑i=1N(wi,j+Δwi,j)×(xi+Δxi)+nj\displaystyle y_j = \sum_{i=1}^{N} (w_{i,j} + \Delta w_{i,j}) \times (x_i + \Delta x_i) + n_j

单元改造策略

前文提到,6T SRAM在读取时可能扰动存储节点,影响稳定性。在存内计算阵列中,这一矛盾被放大了:成百上千个单元同时被字线打开,位线放电电流比普通存储读取大得多,读破坏风险显著上升。就像市场高峰时段,所有顾客同时用力按秤台,普通的秤很容易失灵——于是,我们需要一台“加强版”摊秤。

经典的改造方案是把6T单元升级为8T单元:在原有6个晶体管的基础上,增加两个晶体管构成独立的读端口(读字线RWL和读位线RBL)。存储数据不再直接暴露在读位线上,而是通过一个专门的读缓冲隔离。这样一来,读操作不会影响存储节点的电压,读破坏问题被彻底规避。代价是单元面积增加:

面积增加带来直接的存储密度损失:原来能放100个摊位的市场,改造成扩大版柜台后只能放75个。但收益也很明确:读写端口分离让阵列的读操作更快、更稳,支持更大的阵列规模。在精度和容量的两难之间,8T方案成了许多SRAM存内计算芯片的主流选择。

A8TA6T=6+26≈1.33\displaystyle \frac{A_{\text{8T}}}{A_{\text{6T}}} = \frac{6 + 2}{6} \approx 1.33
8T单元的“柜台”比6T单元大约三分之一,换来的是读写彻底分离、阵列可以做得更大更稳。
  1. A_6T(6T单元面积)标准6管SRAM单元占用的硅片面积,作为面积对比的基准。
    A6T\displaystyle A_{\text{6T}}
  2. 分子 +28T单元在6T基础上增加2个用于独立读端口的晶体管,这是面积增加的来源。
    A8T=A6T+2×A晶体管\displaystyle A_{\text{8T}} = A_{\text{6T}} + 2 \times A_{\text{晶体管}}
  3. 面积比 1.338T单元面积约为6T单元的4/3,单元面积增加约33%,这是读写分离必须付出的物理代价。
    A8TA6T≈1.33\displaystyle \frac{A_{\text{8T}}}{A_{\text{6T}}} \approx 1.33
  4. 存储密度反比单元面积增大,同样面积的芯片能容纳的单元数量减少,存储密度随之下降。
    存储密度∝1Acell\displaystyle \text{存储密度} \propto \frac{1}{A_{\text{cell}}}

对比与应用

不是所有市场都需要把每个摊位改装成智能秤。开在社区里的小菜店,顾客少、菜品单一,传统结算台就够用了;只有在人流量大、订单密集的大型市场,智能秤阵列才能发挥价值。存内计算方案的选择,同样需要因场景制宜。

首先看数字方案与模拟CIM的对比:传统数字计算每次乘加都需要独立的数字乘法器和加法器,N次乘加需要N份电路;模拟CIM用一次位线放电就完成了N路累加,能效优势随阵列规模增大而凸显。但模拟计算的容错能力差,需要ADC、校正电路等额外开销。再看SRAM CIM与RRAM CIM的对比:SRAM基于成熟CMOS工艺,速度快、易集成,但单元是易失的,掉电数据即失,且单比特存储密度偏低;RRAM单元面积小、可多比特存储、非易失,但工艺尚不成熟,一致性和耐久性仍有短板。

从能效角度看,模拟CIM的优势可以用一个比例关系概括:

正因如此,SRAM存内计算目前最活跃的落地场景集中在边缘AI:语音唤醒词检测、低功耗图像分类、传感器数据处理等任务,模型规模适中、对能效敏感、可以容忍一定精度损失。在这些“热闹且忙碌的小型市场”里,智能秤阵列正取代中央结算台,成为新一代低功耗AI芯片的核心算力引擎。

EdigitalEanalog≈O(N)\displaystyle \frac{E_{\text{digital}}}{E_{\text{analog}}} \approx O(N)
当位线同时累加N行数据时,模拟CIM的能效优势与N成正比——阵列越大,优势越明显。
  1. E_digital(数字能耗)数字电路完成N次乘加运算的能耗,近似与N成正比增长。
    Edigital=N×EMAC\displaystyle E_{\text{digital}} = N \times E_{\text{MAC}}
  2. E_analog(模拟能耗)模拟CIM完成同样N次乘加,通过一次位线放电加ADC转换完成,能耗近似恒定。
    Eanalog≈EBL+EADC\displaystyle E_{\text{analog}} \approx E_{\text{BL}} + E_{\text{ADC}}
  3. O(N) 能效比能效优势随阵列规模线性增长,N越大,一次放电产生的计算量越多。
    EdigitalEanalog≈O(N)\displaystyle \frac{E_{\text{digital}}}{E_{\text{analog}}} \approx O(N)
  4. 适用边界N并非越大越好,阵列过大会导致位线RC延迟增大、电流累加误差累积,优势开始回落。
    N最优∼64∼256\displaystyle N_{\text{最优}} \sim 64 \sim 256

AI 应用场景

边缘语音唤醒芯片

阶段:推理部署 / 硬件架构设计

解决的问题:传统语音唤醒方案需要把音频特征搬进DSP或NPU计算,每次唤醒都伴随大量数据搬运,功耗高、响应慢。SRAM CIM把语音分类模型的权重矩阵直接存在SRAM阵列中,麦克风采集的特征向量通过字线输入,位线一次放电即完成矩阵向量乘,大幅降低唤醒功耗。

具体案例:某款智能音箱的语音唤醒芯片,集成 256×64 的SRAM CIM阵列,存储一个轻量级关键词检测网络。待机时SRAM保持权重不掉电,检测到语音帧后,特征直接输入阵列计算,唤醒功耗从传统方案的毫瓦级降至微瓦级,响应延迟缩短约40%。

智能摄像头图像分类

阶段:端侧推理 / 模型压缩与部署

解决的问题:安防摄像头需要实时对画面做物体分类,图像数据从传感器搬到主控芯片的过程消耗大量带宽和能量。利用SRAM CIM计算第一层卷积,图像块直接映射为输入向量,卷积核权重存储在SRAM阵列中,在读出过程中完成卷积乘加,减少中间数据的搬移。

具体案例:某智能门铃采用28nm SRAM CIM芯片,运行一个4比特化的MobileNet小模型。CIM阵列承担前两层卷积计算,相比纯数字方案能效提升约7倍,电池续航从3个月延长到8个月。

可穿戴设备健康监测

阶段:传感器数据处理 / 低功耗推理

解决的问题:可穿戴设备持续监测心电、血氧信号,需要频繁对时间序列片段做分类。传统MCU算力有限且功耗预算极低。SRAM CIM方案可以将每个时间窗口的特征向量直接与存储的心律失常模板权重做匹配,位线累加得到分类得分,实现全流程低功耗。

具体案例:一款医疗级手环原型,集成SRAM CIM协处理器,对32×32的心电特征块做二分类推理,单次推理能耗仅1.2μJ,相比MCU方案下降一个数量级。

Python 演示

python69 行
"""SRAM存内计算仿真: 模拟权重矩阵"存储"在SRAM阵列中,输入向量通过字线驱动, 位线上电流累加实现矩阵向量乘."""import numpy as np  class SRAM_CIM:    """SRAM存内计算阵列仿真"""     def __init__(self, weights, weight_bit=1, adc_bit=4):        self.weights = np.array(weights).astype(float)        self.M, self.N = self.weights.shape        self.adc_bit = adc_bit        self.adc_max = 2 ** adc_bit - 1        # SRAM单元存储权重, 1表示导通, 0表示关断        self.w_bits = (self.weights > 0).astype(int)     def bitline_mac(self, x):        """位线模拟乘加: 单元电流 = 输入电压 * 权重导通"""        x = np.array(x).astype(float)        assert x.shape[0] == self.M        # 列方向累加: 每根位线上的电流总和        i_bl = self.w_bits * x[:, np.newaxis]        y_analog = i_bl.sum(axis=0)        return y_analog     def adc_quantize(self, y_analog, full_scale=None):        """ADC量化: 把模拟累加值映射到有限数字码"""        if full_scale is None:            full_scale = y_analog.max() if y_analog.max() > 0 else 1.0        codes = np.round(y_analog / full_scale * self.adc_max).astype(int)        return codes     def forward(self, x):        """完整前向: 模拟乘加 + ADC量化"""        y_analog = self.bitline_mac(x)        codes = self.adc_quantize(y_analog)        y_digital = codes / self.adc_max * y_analog.max()        return y_analog, codes, y_digital  def main():    # 4x4 权重矩阵 (1bit权重)    weights = [        [1, 0, 1, 1],        [0, 1, 1, 0],        [1, 1, 0, 1],        [0, 1, 0, 1],    ]    x = [1.0, 0.6, 0.4, 0.8]     cim = SRAM_CIM(weights, adc_bit=4)    y_analog, codes, y_digital = cim.forward(x)    y_ideal = np.dot(x, np.array(weights))     print("输入 x:", x)    print("权重矩阵:")    for row in weights:        print("  ", row)    print("位线电流(模拟):", y_analog)    print("ADC码值:", codes)    print("反量化输出:", y_digital)    print("理想乘加:", y_ideal)    print("量化误差:", y_ideal - y_digital)  if __name__ == "__main__":    main()
目的:用Python模拟SRAM存内计算的核心流程——权重矩阵存储在阵列中,输入向量驱动字线,位线电流累加完成矩阵向量乘,再由ADC量化输出。
  1. self.w_bits = (self.weights > 0).astype(int)把权重矩阵映射为SRAM单元的导通/关断状态,这是“存储即计算”的起点。
  2. i_bl = self.w_bits * x[:, np.newaxis]模拟每个单元的电流:权重为1的单元导通,电流大小等于对应输入值。
  3. y_analog = i_bl.sum(axis=0)沿列方向求和,这一行代码等价于物理上位线电流的自然累加。
  4. codes = np.round(y_analog / full_scale * self.adc_max).astype(int)ADC量化:把连续的模拟电流映射到有限数字码,可调整位宽权衡精度。
  5. y_digital = codes / self.adc_max * y_analog.max()反量化,将数字码还原为物理尺度,便于与理想结果对比。

常见误区

误区“存内计算就是让内存变成CPU,性能提升10倍,以后不需要传统数字芯片了,所有AI任务都应该用它。”

正解存内计算擅长的是规则化的矩阵乘加类负载,比如神经网络推理中的卷积和全连接层。但AI系统里还有大量不规则分支、动态控制、通用逻辑处理等任务,数字处理器的通用性和灵活性仍然不可替代。存算一体芯片通常是作为加速器与CPU/GPU协同工作,而不是全面取代数字计算。用“菜市场”来类比:智能秤阵列擅长快速结算大宗订单,但复杂的退换货、跨摊位调货还得靠市场办公室(数字处理器)。

为何常见:宣传材料往往强调“消除数据搬运”的极致能效,容易让人误以为这是万能架构,忽略了其适用边界。

误区“只要ADC位宽足够高,存内计算的结果就和数字计算完全一致,误差只是量化时产生的,加大ADC位数就能解决所有精度问题。”

正解模拟域存在大量数字电路中不存在的物理误差源:晶体管工艺偏差导致单元间电流不一致、电源噪声和热噪声叠加到位线、位线间的寄生电容串扰等。这些误差在累加过程中不断累积,ADC只是把这堆“带着噪声的模拟量”离散化,并不能还原出干净的数字结果。即使ADC位宽无限大,模拟误差依然存在。模拟计算本质上是“统计结果”,精度天然低于确定性数字计算。

为何常见:人们习惯把“模数转换”看作唯一的信息损失点,忽略了模拟电路本身的非理想特性,“数字化=精确化”的直觉在这里误导了很多人。

误区“存内计算把计算和存储融为一体,肯定是在不增加面积的前提下白赚了计算能力,存储密度和普通SRAM一样。”

正解SRAM存内计算需要对存储单元做大量改动:6T单元要改成8T甚至更多晶体管的单元以支持稳定的读计算;还要在阵列外围增加ADC、DAC、参考单元、累加控制逻辑等大量模拟电路。这些开销都会显著增加整体面积、降低存储密度。实际存算芯片的面积很大一部分被外围模拟电路占据,存储密度通常明显低于纯存储芯片。

为何常见:“融合”这个词容易让人产生“1+1=1“的错觉,实际上存内计算是”存储单元 + 计算电路”的物理叠加,面积必然有额外代价。

误区“SRAM存内计算就是普通读存储,位线上输出的电压就是权重本身,只是顺便加了几个数而已。”

正解存内计算的“读”和普通存储的“读”有本质区别。普通读只选中一行、读一个单元;存内计算则同时打开多行字线,位线上的电流是多行单元的模拟累加结果,并不是某一行存储的权重。而且位线信号还要经过ADC量化后才是最终的数字输出。整个过程完成的是“加权累加”而非“数据读取”,两者不能混为一谈。

为何常见:初学者容易把存内计算理解成“还是读数据,只是读取速度快”,忽略了多行同时激活这一并行计算的核心机制。

误区“SRAM存内计算和RRAM存内计算都是存算一体,方案应该差不多,选哪个都行。”

正解两者差异巨大。SRAM基于成熟的CMOS工艺,速度快、寿命长、易集成,但单元面积大、存储密度低且掉电易失;RRAM是非易失器件,单元面积小、能存多比特权重、密度高,但工艺成熟度低,器件一致性差,写入寿命有限。实际选型时要根据应用是追求速度还是密度、对掉电保持有无要求来定,两者各有利弊。

为何常见:“存算一体”这个大帽子让人忽视了底层存储介质的天壤之别——就像“都是市场”,菜市场和海鲜市场的经营方式完全不同。

面试题

Q1. SRAM存内计算主要解决传统架构中的什么问题?

单选题 · easy

  • A.数据搬运开销巨大← 正确答案
  • B.处理器频率不太够
  • C.存储器容量不足
  • D.网络带宽的瓶颈

答案:A。SRAM存内计算把乘加运算直接搬进存储阵列,消除数据在内存和计算单元之间来回搬运的能耗与延迟。处理器频率、存储容量和网络带宽都不是核心矛盾,“内存墙”才是,故选A。

Q2. 6T SRAM单元中的数据是以什么形式存储的?

单选题 · easy

  • A.电容电荷储存信息
  • B.电阻阻值存储信息
  • C.交叉耦合反相器锁存← 正确答案
  • D.晶体管阈值电压编码

答案:C。6T SRAM利用两个交叉耦合反相器形成双稳态锁存,只要供电就能稳定保持0或1。电容电荷是DRAM的存储方式,电阻阻值是非易失存储器的特征,阈值电压则是闪存的编码思路。

Q3. 在SRAM存内计算阵列中,位线上累加的物理量是什么?

单选题 · mid

  • A.位线模拟电流累加← 正确答案
  • B.数字脉冲计数器
  • C.时钟周期统计信息
  • D.逻辑高电平计数

答案:A。存内计算中,多个行单元同时被字线激活,各单元导通产生的电流自然汇聚到同一根位线上,形成模拟电流累加。位线本身是模拟信号通道,不进行数字计数或统计。

Q4. SRAM CIM阵列中完成“乘法”的方式通常是?

单选题 · mid

  • A.查表映射得到乘积
  • B.权重导通调制输入电流← 正确答案
  • C.移位寄存器串行累加
  • D.计数器多次采样求和

答案:B。模拟乘法通过输入信号(电压/脉冲宽度)调制单元电流,同时权重控制晶体管导通与关断,二者共同决定电流大小,自然完成“输入×权重”的乘法。这是模拟计算的精髓,无需独立数字乘法器。

Q5. 位线输出端的ADC在存内计算芯片中的作用是什么?

单选题 · mid

  • A.把模拟累加结果转成数字← 正确答案
  • B.提高阵列工作的频率
  • C.增加权重的存储位数
  • D.减少能耗与面积开销

答案:A。位线累加得到的是模拟电流/电压信号,必须经过ADC量化成数字码才能进入后续数字处理流程。ADC不负责提频、存权或省面积,它本身就是面积和功耗的大头。

Q6. 将6T SRAM单元改为8T SRAM单元的主要目的是什么?

单选题 · mid

  • A.提升存储单元的容量
  • B.缩小单元的物理面积
  • C.降低整体功耗开销
  • D.独立读端口避免干扰← 正确答案

答案:D。8T单元增加两个晶体管构成独立读端口,使读路径与存储节点隔离,避免读操作扰动存储数据发生“读翻转”。该方案面积增大而非减小,主要目的也不是省电,而是提高阵列读稳定性。

Q7. 以下哪个是SRAM存内计算相比传统冯诺依曼架构的优势?

单选题 · easy

  • A.并行乘加且免数据搬运← 正确答案
  • B.存储容量得到提升
  • C.数字计算精度更高
  • D.无需额外数模转换

答案:A。存内计算最大优势是一列位线同时完成多路乘加,且数据无需搬出存储阵列。存储容量因单元改造反而下降,模拟计算精度低于数字方案,且必须依赖ADC做数模转换。

Q8. SRAM存内计算精度的主要限制因素包括哪些?

多选题 · mid

  • A.工艺偏差导致的单元失配← 正确答案
  • B.位线噪声与串扰干扰← 正确答案
  • C.ADC量化引入的量化噪声← 正确答案
  • D.数字逻辑延迟与流水线冲刷

答案:ABC。工艺偏差让各单元电流不一致,位线间的寄生耦合和电源噪声带来动态干扰,ADC量化是固有的信息损失,这三者共同限制精度。数字逻辑延迟是数字电路中的时序概念,不直接影响模拟累加结果的幅度精度。

Q9. 关于SRAM CIM与RRAM CIM的对比,下列说法正确的有?

多选题 · mid

  • A.RRAM面积小且可多比特← 正确答案
  • B.SRAM速度快工艺成熟← 正确答案
  • C.RRAM比SRAM更耐用
  • D.SRAM存储密度更高

答案:AB。RRAM单元面积小、支持多比特存储,但工艺不成熟且耐久性差;SRAM基于成熟CMOS工艺、速度快,但单元面积大、密度低且易失。C选项说反了耐久性,D选项说反了密度。

Q10. 关于ADC位宽对SRAM存内计算设计的影响,正确的说法有?

多选题 · hard

  • A.ADC位宽越大量化噪声越小← 正确答案
  • B.ADC位宽增大会增大面积功耗← 正确答案
  • C.ADC位宽仅影响速度不影响面积
  • D.位宽选择需权衡精度与硬件开销← 正确答案

答案:ABD。ADC位宽越大,量化阶梯越细,量化噪声越小,但面积和功耗也显著上升,因此位宽的选择必须权衡精度和硬件开销。C选项错误,ADC位宽既影响速度也影响面积。这正呼应了“秤记多细的账,就要付出多少记账成本”的道理。