本节摘要:IMPLY(实质蕴涵)门让忆阻器"边存边算",一度被视为存内逻辑的明星。本节拆解它的操作序列与真值表,算清 NAND 门要用多少步,并给出社区对它的两条批评与一条平反——最后划出它真正适用的边界。
IMPLY 门的电路简朴到过分:一个忆阻器存一个逻辑位(HRS 为逻辑 0,LRS 为逻辑 1),串一个电阻 R_G 到地。计算 p→q(p 蕴涵 q,等价于 ¬p∨q)只需两步:p 器件加电压 V_cond,q 器件加电压 V_set,两电压之和的分配恰好使"仅当 p 为 1 时 q 上的有效电压低于阈值"——q 的最终状态就是 ¬p∨q 的结果,同时结果就存回 q 里。运算与存储在同一个物理动作里完成,这确实是冯诺依曼机器做不到的优雅。
但优雅要经受账本检验。下表是 IMPLY 与布尔基的组合成本:
| 目标门 | IMPLY 操作序列 | 步数 | 需要的额外器件 |
|---|---|---|---|
| p→q | 两电压同加 | 1 步 | 0 |
| NOT p | 与固定 0 做 IMPLY | 1 步 | 1 个清零器件 |
| NAND(p,q) | NOT·IMPLY·IMPLY·NOT 链 | 6 步 | 2 个暂存器件 |
| AND(p,q) | NOT(NAND) | 7 步 | 2 个暂存器件 |
| XOR(p,q) | IMPLY 链展开 | 10 步以上 | 3 个暂存器件 |
注意 NAND 是数字逻辑的普适基——任何布尔函数都由它搭出。IMPLY 单步便宜,搭出通用逻辑却要 6~10 步、每步一次全器件读写、还要为暂存器件分配阵列面积。单位门成本的反转是全部争议的核心。
批评一:串行依赖杀死并行性。 IMPLY 链的每一步都依赖上一步的结果存在特定器件里,逻辑深度直接变成时间串行度。大型布尔网络映射到 IMPLY 阵列后,关键路径长度 = 门数的常数倍,吞吐量被钉死。对比同面积 CMOS 逻辑的流水线并行,差距以数量级计。
批评二:写 endurance 成为新的"计算预算"。 IMPLY 的每一步都是真实的电学写操作——逻辑跑得越多,器件损耗越快。一个跑 10⁹ 次运算的例程会给参与器件带来 10¹⁰ 量级的写入,已在 RRAM endurance 的边缘徘徊。CMOS 逻辑从不为"计算次数"付材料账,这是范式级的成本结构差异。
平反:它不该对标 CPU,该对标"状态就在那"的场景。 IMPLY 的甜蜜点不是通用计算,而是数据已经以忆阻状态存在、且只需少量本地判决的地方:阵列内坏块标记的就地更新、存算结果的阈值化判决(比较器逻辑)、BCI/无时钟异步电路的状态转移。在这些场景,IMPLY 省掉的是"把一个比特搬出去再搬回来"的整条路径,6~10 步的代价依然远小于搬运。用错对标对象的批评与用错对标对象的宣传一样多——这句是本节真正想留下的判断。
IMPLY 之外,存内逻辑还有第二条路线:基于电流求和的多数逻辑门(MAJ)。三个(或奇数个)忆阻器并联,列电流代表"1"的个数,配合读出阈值即可实现多数表决——MAJ 与 NOT 组合同样是普适基。两条路线的性格对比:
| 维度 | IMPLY | MAJ 多数逻辑 |
|---|---|---|
| 单门步数 | 1 步(但组合爆炸) | 1 步求和 + 1 步读出判决 |
| 并行性 | 差(串行链) | 好(整列同时求和) |
| 与存算架构的关系 | 独立范式 | 就是存算矩阵乘的特例 |
| 工程进展 | 原型演示为主 | 已嵌入若干存算芯片的激活/池化 |
MAJ 的胜出原因一眼可见:它不再假装自己是"新逻辑门",而是诚实地当存算架构的一个特例。这个收缩反而换来了落地。存内逻辑十年史的最短总结:越是想替代 CPU 的路线越是停在论文,越是甘当协处理器的路线越是进了芯片。
补一段原理细节,让"两步算蕴涵"不悬空。IMPLY 利用的是忆阻器 SET 操作的阈值特性:设 V_SET 是把高阻态写低所需的阈值电压。第一步给 p 器件加一个低于阈值的条件电压 V_cond(它只起"垫高电位"作用,不改写 p);同时给 q 器件加 V_set(高于阈值)。q 两端的实际电压是两者之差:若 p 为高阻(逻辑 0),压降几乎全落在 p 上,q 分到足额的 V_set,被写成低阻(逻辑 1);若 p 为低阻(逻辑 1),p 像一根导线把电位垫高,q 两端分到的电压不足阈值,q 保持原状。于是 q 的终态恰为"p 为 0 时置 1,p 为 1 时保持"——正是 ¬p∨q 的定义。整个门的"放大器"其实就是 p 器件自己的电阻状态,这是它在器件物理上最漂亮的地方:存储状态本身就是逻辑的驱动条件。也正因为驱动条件依赖 p 的实际阻值(而非理想 0/1),p 的阻值漂移会直接改变判决裕度——变异性问题在这里从"数据可靠性"升级成了"逻辑正确性",这是批评一之外更深的一层隐忧。
背景:一个忆阻阵列存着 1 Mb 传感器数据的压缩位图,需要就地统计"每行是否全零"并标记。操作:按行做 1024 输入的 MAJ(或 NOR 判决),每行一次列求和 + 一次标记写,1 K 行共约 2048 次器件操作;若搬出去做:读出 1 Mb(约 1 ms 带宽开销)→ CPU 计算(微秒级)→ 写回标记(再搬运一次)。解读:就地方案的器件操作虽多但全程纳秒级,总耗时约百微秒且免两次搬运;搬运方案的三段协议栈开销压倒计算本身。变式:若判定逻辑需要复杂的多级条件(比如"连续三行全零才标记"),IMPLY/MAJ 链深度暴涨,答案反转——搬出去。判定公式:就地逻辑的深度预算约为 3~5 级,超过就搬。
⚠️ 常见坑:把 IMPLY 论文里的"步数"当成时间单位。文献常写"NAND 仅需 6 步",但每步包含写脉冲、建立时间与读回校验,实际耗时是步数乘以数百纳秒;与 CMOS 门皮秒级延迟对比时,这个换算经常被悄悄略过。
💡 关键直觉:存内逻辑的正确问题不是"器件能不能做逻辑"(能),而是"哪些逻辑值得就地做"(浅层的、数据已就位的、判决型的)。把"能"与"值得"分开,这一节的所有矛盾就都解开了。