毛刺与无效翻转入门:组合逻辑的假信号和总线上的空翻,都在白交电费
更新时间:2026-09-15。本文是「集成电路大类 · 低功耗设计与验证」入门层系统篇第 37 篇。翻转率篇说过动态功耗由 α·½CV²f 决定,但那里有个隐含假设:每次翻转都是一次「有用」的翻转。真实芯片里,相当比例的翻转根本不参与计算结果——它们是信号赛跑产生的毛刺(glitch)和没有有效事务时的无效翻转。这些动作逻辑上看不见、仿真波形稍纵即逝,电费却一分不少。系统地图见低功耗导读。
本文要回答的问题
- 明明输入只变了一次,组合输出为什么会跳好几下?
- 毛刺不改逻辑结果,为什么还耗电、甚至有害?
- 哪种电路最爱长毛刺?为什么流水线能治它?
- 总线上的「空翻」从哪来,operand isolation 是什么?
- 为什么 RTL 仿真里岁月静好,门级功耗分析却全是毛刺?
一、信号赛跑:毛刺是怎么生出来的
组合逻辑的输出应该由「同一时刻的所有输入」决定,但物理上每个输入到达的时间不同。看一个最简单的例子:三输入与门,内部实现成两级 Y = A·B·C,若 C 先走远路、比 A、B 晚到一点点,当 A、B 已为 1、C 正从 1 翻到 0 的短暂窗口里,内部第一级可能先算出一个短暂脉冲再稳定——这就是一个毛刺。

经典重灾区:
- 加法器/比较器进位链:低位进位逐级传播,高位输出在进位到达前可能连续摆动;
- 乘法器阵列:部分积压缩网络路径深度大,输入一变,内部成片假翻转;
- 大扇入译码/优先级电路:地址变化瞬间多个译码输出先轮流误选;
- 输入到达时间极不均衡的任何组合锥。
毛刺的能量来自每一次跳变都在对负载电容充放电。虽然假跳变只持续几十到几百皮秒、寄存器最终只采样稳定值,但 P=αCV²f 不关心你的意图——翻了就收费。在深组合、高翻转的数据通路里,毛刺可占组合动态功耗的 20%~40%。
二、为什么普通仿真看不见它
RTL 仿真和零延时门级仿真里所有门延迟都被当成 0,输入变化瞬间输出就跳成最终值,没有「赛跑窗口」,毛刺根本不会出现。只有标注了真实门延时和线延时(SDF,见 DPA 篇的流程)的门级仿真/时序仿真,才会生出毛刺。这带来两个重要后果:
- 用 RTL 或零延时波形算动态功耗会系统性偏低,尤其低估深组合模块;
- 「功能对了」和「没有多余翻转」是两件事,必须靠带延时的功耗分析才能看见后者。
综合工具的功耗报告通常会分别报告开关功耗与「glitch power」一栏,这一栏数字大,就是在提示路径均衡或流水化的机会。
三、治毛刺:从结构上下手
| 手法 | 原理 | 代价/注意 |
|---|---|---|
| 插入流水线寄存器 | 把深组合切成浅段,每段在时钟沿只把稳定值传给下一段,毛刺被寄存器「挡在门外」 | 增加延迟周期和寄存器;多数数字信号处理/DSP 流水线很值 |
| 均衡到达时间 | 综合/物理工具对关键早到信号加延迟(delay balancing)、重排输入顺序,让锥体输入同时到 | 可能与关键路径优化冲突,需工具权衡 |
| 降低路径深度 | 改写逻辑减少级数(如提前译码、树形进位结构) | 架构级改动 |
| 整块时钟门控/冻结输入 | 无效周期直接不给组合锥喂变化的输入(见下节) | 需要干净的 enable |
| 降低电压 | 所有翻转能量按 V² 降,毛刺也一起省 | 延迟变大、毛刺窗口可能变宽,需时序签核兜底 |
一个直觉对比:32 级组合乘法器一次输入变化可能引发大量级联假翻转;改成两级流水后,每级逻辑浅、寄存器截断假信号,毛刺能耗常能降一大截,还顺带提高了可达到的频率。这就是 DSP/加速器电路几乎全流水的双重理由:性能和功耗一起受益。
四、无效翻转:没有你,信号照样在翻
另一类浪费与延时无关,纯粹是「没事干时数据没停住」:
- 总线上挂着旧数据/三态浮空:主设备没驱动时总线不是确定静态,上一拍旧值的变化、多个驱动切换、外部噪声都会让从设备输入跟着翻。
- 未命中设备也在收地址:粗糙的片选让所有从设备每拍都对地址译码,只有最后一个回应,其余全在做无效动作。
- 垃圾数据穿流水:上游 valid 没了,旧操作数仍一级级往后传,每级加法器/乘法器白算一遍。
- 片选/使能上的毛刺:组合片选在地址切换瞬间误闪一次,整块 SRAM 被误唤醒(见存储器功耗篇)。
治这类问题的核心手法是 operand isolation(操作数隔离)与干净的使能/片选:
// valid 无效时喂常量,下游大电容逻辑零翻转
assign a_g = valid ? a : '0;
assign b_g = valid ? b : '0;
assign y = a_g * b_g;配合总线保持器(bus hold,弱锁存住最后有效值)、未选中即关译码和时钟、寄存后的片选信号,可以让「空闲」在波形上真正变成一条直线。具体代码规范见低功耗 RTL 直觉。
五、一个可算的账:毛刺到底值不值得管
设一个 16 位加法器输出负载折合 2pF,工作在 0.8V,正常情况下每周期有效翻转一次的能量是 ½CV²=0.5×2e-12×0.64=0.64pJ。若输入模式让进位链平均产生 3 次额外假跳变(等效翻转次数变 4 次),则该输出网络的开关能量变成约 2.56pJ——三倍,而且这些假翻转还会沿锥体向后级传播。一个几十万门的数据通路在高活动率下,毛刺能量轻松达到毫瓦量级。
再看流水化的收益:把同一条 16 级链切成两段,每段最长路径变短、输入到达更均衡,假跳变数量往往从几次降到一次以内,代价是增加一组寄存器和一个周期延迟。在吞吐量允许插入流水的 DSP/加速器场景,这笔交易几乎总是划算的,这也是为什么「先流水化再谈门控」是常见的优化次序。
六、系统视角:无效翻转的多米诺效应
毛刺和无效翻转的危害不止于局部电费:
- 传播放大:一个早期锥体的毛刺会驱动后级更大的电容网络,像多米诺一样被放大;越靠近源头冻结,收益越大。
- 噪声与误动作:毛刺若出现在时钟/异步/控制信号上,不只是耗电,可能造成误触发、亚稳态或计数器多计——这也是时钟路径绝不容毛刺的原因(见时钟树功耗)。
- 峰值电流与压降:乘法器输入变化瞬间整片阵列同时假翻转,形成窄而高的电流尖峰,直接贡献动态 IR-drop(见 IR-Drop 篇)。
- 对侧信道安全的含义:数据相关的翻转差异还会泄漏密钥信息,密码核要专门做均衡化,这属于另一个专门领域,此处只点到为止。
七、怎么在报告里看见它
- 综合/功耗报告的 glitch power 行:按模块排序,找占比异常高的组合锥。
- 门级 SDF 仿真 + DPA 时间波形:在输入变化后的几个门延迟窗口里观察「假翻转簇」,与时钟沿后的有效翻转区分开(方法见 DPA)。
- 翻转计数对比:同一节点统计「总翻转次数」与「输出真正改变的次数」,差值就是假翻转。
- 优化前后对比:流水化/均衡路径后重跑同一向量,glitch 功耗的下降应能在曲线上看到台阶。
排查时记住一个经验规律:模块功耗报告里组合逻辑占比远大于时序单元、且该模块是深锥体(加法树、乘法器、大译码)时,先怀疑毛刺而不是去抠时钟门控。
八、RTL 走查:一个乘法器的低翻转改造
用小例子把本片手法落到代码层。原始写法:一个使能信号只挡输出寄存器,乘法器输入 a/b 来自上游总线,valid 无效时总线仍在传别的流量:
// 改造前:valid 无效,乘法器照算,深锥体毛刺照生
assign y = a * b;
always_ff @(posedge clk)
if (valid) r <= y;问题:乘法器对任何输入变化都做完整求值,大量结果在 valid=0 周期算出后被丢弃,但电容已经充放电、毛刺已经沿进位链传播。
改造后(operand isolation,见低功耗 RTL 直觉):
// 改造后:无效周期操作数冻结为常量,乘法器输出不动
logic [15:0] a_g, b_g;
always_ff @(posedge clk) begin
a_g <= valid ? a : '0;
b_g <= valid ? b : '0;
end
assign y = a_g * b_g;
always_ff @(posedge clk)
if (valid) r <= y;进一步若该模块整体有较长空闲期,应在外层直接做模块级时钟门控,连输入寄存器也冻住。三种手段的层级关系:时钟门控冻结时序端 → operand isolation 冻结组合锥输入 → 流水化压低锥内毛刺,先做哪个取决于模块是「常闲」还是「常忙但深组合」。
九、为什么深亚微米以下毛刺更值得管
两个趋势让毛刺在现代设计里占比上升:
- 线延迟主导:先进工艺门延迟变小、相对线延迟变大,同一锥体内到达时间差更难自动均衡,毛刺窗口反而更宽(物理背景见物理设计)。
- 电压更低、裕量更薄:同样一次假翻转在低电压下能量绝对值降了,但它造成的压降噪声占供电比例更高,诱发时序故障的风险上升。
因此毛刺管理在低功耗流程里不是「可选项优化」,而要在架构(流水深度)、综合(路径均衡约束)、物理(有用偏斜)三处都设明确检查点,并在 DPA 报告里跟踪 glitch power 的版本趋势。
- 误区:功能仿真没看到毛刺,所以没有。 零延时仿真天然看不见,必须门级 SDF。
- 误区:毛刺最终被寄存器挡住,无害。 功能上无害,能量和峰值电流上有害;挡在寄存器前的锥体照样充放电。
- 误区:加缓冲能消除毛刺。 随意插延迟往往让到达时间更乱;要靠工具的延迟均衡或结构流水化。
- 误区:所有毛刺都该消。 浅锥体里的零星假翻转,治它的面积/延迟代价可能比电费还贵,按报告数字决定。
再补两个工程细节
- 综合约束的影响是双向的:追求最高频率时工具倾向大驱动、浅逻辑,毛刺往往变少而面积功耗上升;追求功耗时用延迟均衡和中等驱动,毛刺下降但关键路径要重新收敛。不要在不同综合目标下比较 glitch 数字。
- 输入侧冻结比输出侧堵住更有效:在锥体末端加锁存器能挡住毛刺下传,却省不下锥体内已发生的充放电;只有在输入端用使能冻结操作数(operand isolation),才是从源头让整棵锥体保持安静。排查优化是否有效时,看锥体内部网络的翻转计数,而不是只看输出波形。
- 低电平有效的片选/使能尤其危险:地址译码毛刺若恰好在休眠态被解读为「选中」,可能把整块外设误唤醒一次;这类使能信号必须寄存后输出,译码逻辑后面永远加一级触发器。
这一篇在知识体系里的位置
- 上游:翻转率定义 α,功耗从哪来给充电模型,低功耗 RTL 直觉给 operand isolation 写法。
- 本片:区分「有效翻转」与「假翻转/空翻」,补齐 α 质量这一面。
- 下游:观察手段靠门级 DPA;毛刺尖峰的电源后果见 IR-Drop;时钟相关的严格纪律见时钟树功耗。
一句话收口:α 不只问「翻没翻」,还问「这次翻转有没有用」;流水切深锥、使能冻输入、片选防误醒,就能把大量逻辑上不存在、电费却照交的假动作按在波形里。
总结
芯片里大量翻转是不产生结果的假动作:组合毛刺源于输入到达时间差、在进位链和乘法阵列等深锥体中可占组合动态功耗 20%~40%,RTL/零延时仿真看不见,只有 SDF 门级 DPA 能抓到;治理靠流水线截断深锥、延迟均衡和 operand isolation 在输入端冻结操作数,并配合寄存后的干净片选防误唤醒——其中源头冻结比末端堵漏更省电,是否值得管要按 glitch power 数字判断。