1. 项目概述存内计算分类的深度拆解最近和几位做芯片设计的朋友聊天大家不约而同地提到了一个词存内计算。这玩意儿听起来挺高大上但仔细一聊发现很多人对它的理解还停留在“把计算放到内存里”这个模糊的概念上。实际上存内计算内部的门道很深尤其是数字存内计算和模拟存内计算这两条技术路线它们的原理、实现方式和应用场景可以说是天差地别。我干了十几年硬件和系统架构从早期的冯·诺依曼瓶颈开始就一直在关注计算范式的演进。今天我就想从一个一线工程师的视角把“数字存内计算”和“模拟存内计算”这两个核心分类掰开揉碎了讲清楚。这不仅仅是两个技术名词的区别它背后关乎着我们未来芯片的性能、能效甚至整个计算架构的走向。无论你是做AI加速的、搞存储的还是对底层硬件感兴趣的学生理解这个分类都能帮你更清晰地看清技术地图少走很多弯路。简单来说存内计算就是为了解决“内存墙”问题——也就是处理器和内存之间数据传输速度跟不上计算速度的瓶颈。它的核心思想是让数据在原地内存单元内部或附近就完成计算而不是像传统架构那样在CPU和内存之间来回搬运数据。而根据计算过程中信息处理方式的不同存内计算主要分成了“数字”和“模拟”两大阵营。数字存内计算你可以把它理解为在内存阵列里“嵌入”了一个个微型的数字逻辑电路比如与门、或门、加法器用“0”和“1”的布尔逻辑进行计算。而模拟存内计算则是利用存储器件的物理特性比如电阻、电流、电压的连续变化直接对模拟信号进行运算更像是在做“物理模拟”。接下来我会从设计思路、核心原理、实现技术、优劣对比到应用场景一步步带你深入这两个世界的内部。2. 核心思路与范式分野为何要分“数字”与“模拟”要理解数字和模拟存内计算的区别我们得先回到问题的原点冯·诺依曼瓶颈。在传统计算机里CPU是“大脑”内存是“笔记本”计算时需要不断从“笔记本”内存里读取数据到“大脑”CPU处理然后再写回“笔记本”。这个过程耗电、耗时成了性能提升的最大障碍。存内计算的想法很直接能不能让“笔记本”自己就具备一些简单的“思考”计算能力2.1 数字存内计算逻辑电路的“微型化”与“分布式”数字存内计算的思路本质上是将我们熟悉的数字电路设计思想从处理器核心区域“搬迁”并“嵌入”到内存阵列中。它不改变信息的基本形态——数据仍然以离散的“0”和“1”比特形式存在和参与运算。其核心是在每个内存单元如SRAM的一个比特单元旁边或者在一行/一列内存单元共享的区域增加额外的晶体管构成基本的数字逻辑门如与非门NAND、或非门NOR、异或门XOR以及全加器等。为什么选择这条路最大的优势在于兼容性和确定性。数字系统的行为是精确的输出结果非“0”即“1”抗噪声能力强设计方法和验证流程成熟基于布尔代数、RTL设计、标准单元库、静态时序分析等。这意味着数字存内计算模块可以相对平滑地集成到现有的数字芯片设计流程中。它的目标通常是加速那些高度规则、可并行化的位级操作比如二进制神经网络BNN中的XNOR同或和Popcount人口计数操作、数据库的位图索引查询、加密算法中的位运算等。你可以把它想象成在内存这个“大仓库”的每个货架旁都安装了一个小型、专用的“分拣机器人”逻辑电路货物数据不用出仓库就能完成初步分拣。设计上的关键考量面积开销增加逻辑电路必然会占用额外的芯片面积这会直接降低存储密度。因此数字存内计算电路必须设计得极其精简。常见的做法是复用一部分存储阵列本身的晶体管来实现逻辑功能或者采用极简的动态逻辑。布线挑战如何在密集的内存阵列中高效地布设计算单元之间的互连线以及将计算结果路由出去是一个巨大的挑战。不合理的布线会导致延迟增加和功耗上升。计算粒度是一次操作一个比特还是一行/一列多个比特这需要在计算效率、电路复杂度和灵活性之间权衡。2.2 模拟存内计算物理定律的“直接映射”模拟存内计算则走上了一条截然不同的道路。它放弃了“0”和“1”的离散世界转而拥抱连续的物理世界。其核心是利用某些存储器件的电学特性如阻值可以连续变化这一事实将计算“映射”到物理定律上。最经典的例子就是基于忆阻器Memristor或其它非易失性存储器的“乘累加”运算。它的工作原理可以用一个简单的类比来理解想象一个交叉开关阵列。每一行和每一列的交叉点是一个可调电阻代表一个存储单元存储一个权重值比如W_ij。当我们从某一行输入一个电压V_i代表输入数据根据欧姆定律I V / R流过每个交叉点的电流就是V_i * G_ij其中电导G_ij 1 / R_ij与权重相关。然后根据基尔霍夫电流定律每一列导线上的总电流是所有流入该列的电流之和即I_j Σ (V_i * G_ij)。看这个总电流I_j天然就是输入向量V_i和权重矩阵G_ij的向量-矩阵乘法结果一次操作就完成了大量并行的乘加运算。为什么这条路线备受关注因为它提供了革命性的能效和算力密度潜力。上述的乘累加运算在模拟域是“一步到位”的无论矩阵规模多大理论上完成一次运算的能量消耗和所需时间几乎是常数级别的主要取决于模拟-数字转换器的速度和精度。这非常适合人工智能尤其是深度学习推理中占主导地位的卷积和全连接层计算能带来几个数量级的能效提升。设计上的核心挑战非理想性与噪声现实世界的器件不完美。电阻值会有波动导线有寄生电阻电容晶体管有漏电这些都会引入计算误差。模拟信号对噪声极其敏感。模数转换瓶颈最终计算结果模拟电流或电压需要被高精度地转换回数字信号供后续处理。高精度、高速度的模数转换器本身功耗大、面积大可能成为新的瓶颈。器件一致性需要确保成千上万个存储单元的物理特性如阻值变化范围、线性度高度一致这对材料和工艺提出了极高要求。注意选择数字还是模拟不是一个单纯的技术优劣问题而是一个设计哲学和适用场景的取舍。数字路线求“稳”追求精确、可控、易集成模拟路线求“快”追求极致能效和算力密度但需要解决可靠性和精度问题。这有点像选择用算盘数字、离散还是计算尺模拟、连续来解题。3. 技术实现路径与核心器件剖析理解了核心思路我们来看看这两条路具体是怎么走通的以及它们依赖哪些关键的硬件器件。3.1 数字存内计算的主流实现方案数字存内计算通常基于易失性存储器实现因为其速度快与逻辑工艺兼容性好。3.1.1 基于SRAM的数字存内计算这是目前最成熟、最接近商业化的路径。SRAM单元本身由6个晶体管6T构成结构稳定。实现计算的主要方法有位线计算利用对SRAM阵列中一对位线BL和BLB的预充电和放电操作通过精心设计访问时序和外围感应放大器使其在读取数据的过程中直接完成布尔逻辑运算如AND, OR, MAJORITY。例如同时激活两个字线WL位线上的电压竞争结果就对应了这两个存储比特的“与”或“或”操作。在存内/近存逻辑在SRAM阵列的周边直接放置用标准CMOS工艺制造的逻辑计算单元。例如为每一列SRAM配备一个多输入的多路选择器和加法器树用于实现多位加法或乘累加。虽然计算单元在物理上可能不在存储单元内部但由于极其贴近且专属于该内存块数据传输能耗极低通常也被归为存内计算范畴。实操心得在基于SRAM的设计中时序设计是灵魂。你需要精确控制字线开启时间、位线预充电电压、感应放大器的使能时刻。一个微小的时序偏差就可能导致读取错误或计算错误。我们通常在仿真中会进行蒙特卡洛分析考虑晶体管工艺角PVT变化对时序的极端影响。另外由于增加了计算功能SRAM单元的稳定性Static Noise Margin需要重新评估避免计算操作干扰到原有存储的数据。3.1.2 基于DRAM的数字存内计算DRAM密度高、成本低但其计算设计更复杂因为DRAM利用电容存储电荷需要刷新且访问机制与SRAM不同。行缓冲器计算DRAM在读取时会将一整行数据缓存到行缓冲器Sense Amplifier中。数字存内计算可以利用这个行缓冲器作为临时计算场所。例如通过修改行缓冲器中的锁存器电路使其能执行按位逻辑操作然后再将结果写回阵列或送出。计算型DRAM像三星的HBM-PIM、SK海力士的GDDR6-AiM等都是在DRAM芯片内部封装了额外的处理核心通常是简单的AI加速器或可编程逻辑实现近存计算。这可以看作是一种更宏观尺度的“数字存内计算”。3.2 模拟存内计算的核心器件与阵列模拟存内计算的实现严重依赖于具有非易失性且电导可连续调节特性的器件。3.2.1 忆阻器与RRAM忆阻器是理论上最理想的器件之一。其电阻值可以通过施加电脉冲在高低阻态之间连续、可逆地调节。将成千上万个忆阻器排列成交叉阵列就构成了一个天然的模拟计算核心。输入电压施加在字线产生的电流在比特线求和完美实现向量-矩阵乘法。RRAM是忆阻器的一种重要实现形式。3.2.2 相变存储器相变存储器利用硫族化合物材料在晶态低阻和非晶态高阻之间的可逆相变来存储数据。其阻值也可以是多级的因此也能用于模拟存内计算。其成熟度相对较高但功耗和电阻值波动是需要克服的问题。3.2.3 闪存与NOR Flash即使是传统的浮栅型闪存通过精细控制栅极电压编程也能实现多级存储MLC, TLC从而表征模拟权重。一些研究利用NOR Flash阵列的电流求和特性来进行模拟计算。其优势是工艺极其成熟但写入速度慢、功耗高、耐久性有限。核心电路模块数模转换器负责将输入的数字信号如激活值转换为精确的模拟电压或脉冲宽度施加到阵列的字线上。模拟计算阵列即由忆阻器、PCM等器件组成的交叉开关阵列执行核心的乘累加运算。读出电路与模数转换器这是模拟存内计算的性能瓶颈和功耗大户。读出电路通常是跨阻放大器将比特线上的求和电流转换为电压然后由高速高精度的ADC转换为数字结果。如何设计低功耗、小面积、中等精度如6-8位的ADC是关键。注意模拟存内计算对器件特性的线性度和对称性要求极高。理想情况下电导的变化应与编程脉冲数成线性关系且正负方向的调节特性对称。现实中器件往往存在非线性、不对称性这需要通过电路技术如脉冲编码方案或算法技术如训练时补偿来进行校准和补偿。4. 应用场景与选型指南数字和模拟存内计算各有自己的“主场”理解这一点能帮助我们在实际项目中做出正确选择。4.1 数字存内计算的优势场景数字方案更适合需要高精度、强可靠性、复杂控制流的任务。精确数据库操作位图索引查询、数据过滤WHERE子句、集合运算交集、并集。这些操作本质上是位级的布尔逻辑与数字存内计算的天生优势匹配。二进制神经网络BNN的权重和激活值都是1/-1用1/0表示其核心运算XNOR-Popcount可以直接用最基础的数字逻辑门高效实现精度无损。加密与安全计算AES等加密算法涉及大量的位操作移位、异或数字存内计算能提供确定性的、可验证的计算结果。纠错码编解码如LDPC码的解码涉及大量的校验节点和变量节点间的消息传递本质上是逻辑运算适合用分布式数字逻辑加速。选型考量如果你的应用对计算结果的绝对正确性要求极高算法以逻辑操作为主且对功耗的要求不是极端苛刻那么基于SRAM的数字存内计算是更稳妥、更易集成的选择。它更像是一个“增强版的内存”对软件和编程模型的改动相对较小。4.2 模拟存内计算的优势场景模拟方案在计算能效比和大规模并行乘加上具有压倒性优势。深度学习推理这是模拟存内计算的“杀手级应用”。CNN、Transformer中的卷积层、全连接层本质就是大规模的向量-矩阵乘法。模拟阵列一次操作即可完成能效极高。尤其适合边缘AI设备如手机、摄像头、可穿戴设备中的神经网络推理。科学计算与信号处理一些偏微分方程求解、数字信号滤波如FIR滤波器也涉及大量乘累加运算可以从模拟计算中受益。图计算与推荐系统稀疏矩阵运算可以通过设计特定的阵列映射方式在模拟阵列上高效执行。选型考量如果你的核心负载是计算密集型的矩阵乘法并且可以容忍一定的计算误差例如神经网络本身具有容错性同时对功耗和延迟有极致要求如电池供电的终端设备那么模拟存内计算是值得深入探索的方向。它更像一个“颠覆性的专用协处理器”。混合计算架构的展望 在实际系统中两者并非互斥。一个前瞻性的架构可能是用数字存内计算单元处理控制逻辑、数据搬运和需要高精度的操作用模拟存内计算阵列作为核心的“算力引擎”专攻大规模的乘累加运算。两者通过片内网络高效协同共同构成一个完整的存算一体系统。5. 设计挑战与工程实践中的“坑”无论选择哪条路从论文到芯片中间都充满了工程挑战。这里分享一些实践中容易遇到的问题。5.1 数字存内计算的实践难点面积与密度的权衡这是最直接的矛盾。每增加一个计算逻辑就挤占存储晶体管的空间。我们的策略通常是做“计算友好型SRAM”设计即重新设计SRAM单元和外围电路使其在面积增加最小化的前提下支持几种最常用的计算模式。不能无限制地增加功能。计算模式下的可靠性在计算模式下存储阵列的电压环境与普通读写时不同可能导致单元稳定性下降甚至发生数据扰动。必须在设计阶段进行充分的仿真验证确保在计算过程中其他未被选中的单元数据保持完好。测试与验证复杂度激增传统的存储器测试主要关注存储功能。现在还需要测试各种计算模式下的功能正确性、时序和功耗。这需要开发全新的测试向量生成方法和DFT可测试性设计结构。踩坑实录我们曾设计过一个支持位宽搜索的SRAM存内计算模块。在仿真中一切正常但流片回来后发现在某些工艺角下计算结果的延迟会超出预期导致系统时序违例。排查后发现是因为我们在计算路径上使用了一个动态逻辑门其放电速度对温度和电压非常敏感。教训是在存内计算这种对时序极其敏感的设计中应优先使用静态CMOS逻辑动态逻辑必须慎用并留足时序余量。5.2 模拟存内计算的实践难点器件非理想性的系统级补偿单个忆阻器的电导漂移、非线性可能看起来不大但当成千上万个误差累积起来计算结果可能完全不可用。我们必须在系统层面引入校准机制。常见做法有离线训练补偿在训练神经网络时就引入器件非理想性的模型让网络权重学会适应这些缺陷。在线实时校准在芯片中集成一些参考单元和测量电路定期测量器件的实际电导值并以此修正输入电压或读取的电流值。模数转换器的设计困境需要高精度如8位来保证计算质量但又要求低功耗和小面积。通常的折衷方案是采用逐次逼近型ADC或流水线型ADC并针对存内计算阵列的输出特性电流信号、动态范围进行定制化设计。有时也会采用时间域ADC将电流转换为脉冲宽度来降低功耗。编程与验证的漫长周期模拟存内计算芯片的编程将训练好的权重映射到器件电导值是一个缓慢且精细的过程需要逐个脉冲地调节。芯片功能的验证也远比数字芯片复杂需要搭建复杂的混合信号测试平台。踩坑实录早期测试一个模拟存内计算原型芯片时我们发现同一个神经网络模型在不同时间点加载进去推理准确率会有较大波动。经过艰苦的排查问题根源不是计算阵列本身而是为ADC提供参考电压的带隙基准源。该基准源的温度系数较差导致ADC的转换基准随着芯片温度变化而漂移从而引入了系统误差。教训是在模拟系统中任何一个看似次要的模块如基准源、偏置电路都可能成为系统的“阿喀琉斯之踵”。必须对模拟信号链路上的每一个环节进行严格的特性分析和测试。6. 开发流程与工具链初探对于想涉足这一领域的工程师了解大致的开发流程和工具现状是必要的。6.1 数字存内计算开发流程数字存内计算的开发与传统的数字ASIC流程衔接较好。架构探索与算法映射使用高级建模工具如MATLAB, Python或专用的存内计算框架分析目标算法确定哪些部分可以映射到存内计算以及需要支持哪些计算原语如加法、比较、逻辑运算。RTL设计与仿真使用硬件描述语言Verilog/VHDL对存内计算模块进行行为级和RTL级描述。这里的关键是设计好存储阵列、计算逻辑、控制状态机之间的接口和时序。需要使用仿真工具如VCS, ModelSim进行充分的功能验证。逻辑综合与物理设计使用综合工具如Design Compiler将RTL代码映射到标准单元库并进行时序优化。然后进入后端物理设计流程布局布线使用Innovus, ICC2等工具这里要特别关注存储阵列区域与计算逻辑区域的布局规划以及电源网络的稳定性。签核与流片完成时序签核、功耗签核、物理验证等生成GDSII文件交付流片。工具链现状主流EDA厂商Synopsys, Cadence的工具链基本可以支持但缺少针对存内计算架构优化的专用IP和库。需要设计者自己定义存储编译器Memory Compiler来生成带计算功能的SRAM/DRAM宏单元。6.2 模拟存内计算开发流程模拟存内计算的开发更接近于混合信号芯片设计挑战更大。器件建模与阵列级仿真首先需要建立存储器件如忆阻器的精确SPICE模型。然后使用电路仿真工具如HSPICE, Spectre搭建整个交叉开关阵列的电路网表进行仿真评估其计算功能和非理想效应。系统级建模与协同仿真使用MATLAB/Python或Verilog-A/AMS等工具建立包含器件阵列、DAC、ADC、数字控制器的系统级模型。进行算法-硬件协同仿真评估整个系统的精度、能效和吞吐量。全定制电路设计这是最核心也是最难的部分。需要使用全定制设计方法手工绘制晶体管级的电路图如DAC, ADC, 读出放大器、偏置电路并进行深入的仿真和优化。对模拟设计工程师的经验要求极高。混合信号集成与验证将设计好的模拟计算阵列、数据转换电路与数字控制逻辑集成在一起。进行混合信号仿真验证信号在模数交界处的正确性。物理设计阶段需要特别处理模拟部分的特殊布线要求如匹配、屏蔽。测试与校准软件开发需要开发配套的FPGA测试板卡和上位机软件用于芯片测试、权重编程和在线校准。工具链现状目前几乎没有成熟的、端到端的商用工具链。学术界和工业界的研究团队大多依靠自研的仿真框架和设计流程。Cadence的Virtuoso平台是进行全定制模拟电路设计的主流工具。系统级建模则严重依赖自研脚本和模型。无论是数字还是模拟路线存内计算的设计都要求团队具备跨领域的知识数字电路、模拟电路、存储器设计、架构算法甚至器件物理。这是一个真正意义上的“交叉学科”工程挑战。从我个人的经验来看从小模块开始验证充分仿真流片前做好最坏情况分析是控制风险的不二法门。这个领域目前还在快速演进中新的器件、新的电路架构、新的工具不断涌现保持学习和对第一性原理的思考至关重要。