物理设计

时钟门控(clock gating)

想象一栋大办公楼,规矩是:每一盏灯都得整齐划一地一明一灭,一整天、每个房间都如此,连空房间也不例外。不管有没有人用这个房间,这一明一灭都在耗电。时钟门控就是物业经理走过走廊,把没人在的整片区域的总开关给关掉。在芯片里,触发器就是房间,时钟就是那永不停歇的明灭:每来一个时钟沿,触发器就重新读一遍自己的输入,而这一次重新读取就会拨动晶体管、给导线充电又放电。如果某块逻辑这一拍根本没在干正经事,你就根本不希望它的时钟送到。于是你插入一个小小的门控单元,当一个使能信号说「空闲」时,它就拦住时钟,不让它到达那一组触发器。这些触发器的输出被冻住,下游什么都不翻转,这些触发器及其扇出本会烧掉的动态功耗,干脆就没花出去。

为什么停下翻转能省这么多?动态功耗,也就是真正把信号来回切换所花的能量,遵循 P = alpha * C * V^2 * f,其中 C 是你要充放电的电容,V 是供电电压,f 是时钟频率,alpha 是活动因子,也就是一个节点真正翻转的那部分周期所占的比例。时钟网络是整颗芯片上最繁忙、alpha 最高的信号,因为按定义它每一拍都要翻转,所以它和它驱动的那些触发器主导了动态功耗。把空闲区域的时钟掐掉,那里的 alpha 就趋向于零,而由于这一项对活动因子(以及对 f 和 C)都是线性的,省下来的功耗既大又直接。要注意,这只对付动态功耗;即便晶体管不在切换、也会涓涓流过的漏电流,它一点都管不着,那个得改用电源门控(power gating)来对付。

实际工作中你很少自己手搭那个与门,因为天真地「把时钟和使能做与运算」很可能产生毛刺,或者在使能恰好在错误时刻变化时把时钟脉冲削短。取而代之的是,综合工具会插入一个专门设计的集成时钟门控单元(ICG),通常是基于锁存器的结构,它在时钟的无效相位上采样使能,从而让门控后的输出始终是一个干净、全宽的脉冲或一个干净、稳定的电平。只要你允许,工具会自动完成这件事:写成「仅当使能为真时才更新这个寄存器」的 RTL 会被识别并转换成门控时钟,而在物理设计阶段,时钟树综合(clock-tree synthesis)这一步会通过这些 ICG 单元来平衡并缓冲时钟,让被使能的路径仍然准时到达。

P_dynamic = alpha * C * V^2 * f (gating an idle block drives its alpha toward 0)

动态功耗与活动因子 alpha 成正比;时钟是芯片上 alpha 最高的网络,所以在逻辑空闲处把它压住,是最直接的一根动态功耗杠杆。

一条实战经验加一条提醒:为了省功耗,尽量把工具能给你的细粒度门控都打开,但要盯住可测性和时序——门控时钟需要测试模式的旁路(一个 scan/test_enable 信号强行把门打开),这样 ATPG 才仍能翻转这些触发器;而使能信号本身必须满足相对于门控单元的建立时间(setup),否则就会出现时钟毛刺。

又称
clock gategated clockclock-gating cellICG门控时钟閘控時脈