为了省功耗或暂停某段逻辑,有人会直接用“clk & enable”生成新时钟。逻辑功能仿真可能看起来正常,但enable若在时钟高电平期间变化,就可能产生窄脉冲;普通逻辑网络也无法保证像专用时钟树那样的低偏斜。
把频点、波形或逻辑关系与板上的已知源建立相关性,再决定整改方向。

从现象反推来源
毛刺风险
enable异步变化时,组合门输出可能产生不完整时钟脉冲,使部分触发器采到、部分触发器没有采到。
时钟偏斜
普通LUT/布线资源传播延迟不受专用Clock Network约束,跨区域后可能产生明显skew。
优先Clock Enable
很多FPGA触发器自带CE,停止状态更新时可以保持主时钟不变;若必须门控时钟,使用厂商提供的BUFGCE/专用门控资源。
面试参考回答
我一般不会在RTL里直接写assign gclk = clk & en去生成业务时钟。因为en变化时可能产生窄脉冲,而且普通逻辑布线不具备专用时钟网络的低偏斜特性。大多数场景可以直接用寄存器Clock Enable,让时钟树保持不变,只停止数据状态更新。如果确实要关闭整棵时钟树以降低动态功耗,我会使用器件厂商的专用门控时钟原语,并按工具要求做时序和CDC检查。
追问方向
Clock Enable和真正关闭时钟树在功耗上有什么区别?
门控时钟的enable为什么通常需要在安全相位锁存?
生成时钟使用专用BUFG资源后,约束文件还需要做什么?
认为逻辑仿真没有毛刺,硬件上就一定安全。
用LUT生成大量新时钟,却不给时钟约束。
把时钟门控和CDC问题完全割裂,不考虑新时钟域关系。

扫码关注





























