每当问到“怎么降低动态功耗”,一般的答案就是插门控时钟。那为什么插门控时钟就能降低动态功耗呢?门控时钟一定能插得进去吗?对逻辑等价性检查(LEC)有什么影响?
先来看看门控时钟的原理。
有下面的一段代码,当然data_en满足时才采数据。对应的门级电路如下图。
代码语言:javascript复制module top
(
input wire clk,
input wire rst_n,
input wire data_en,
input wire data_in,
output reg data_out
) ;
always@(posedge clk, negedge rst_n)
if(!rst_n)
data_out <= 1'b0;
else if(data_en)
data_out <= data_in;
endmodule // noclkgate
插入门控时钟,就是把数据通路的条件不满足时的时钟停掉,去除不必要的采样。比如用一个与门来处理一下时钟,如下图。
为了让门控时钟的高低电平不变,也不产生毛刺,有一些办法。一个方法是把data_en用clk下降沿的DFF打一拍,然后再与。另一个方法是用latch来实现,如下图。
一般的工艺库里都一个stdcell把inv latch and打包在一起,叫做Integrated Clock Gate(ICG)单元。
为了方便,我们常常在RTL直接例化库里的ICG,来做全局的门控时钟。也可以ICG包在一个module里,方便换不同的工艺。
代码语言:javascript复制module top
(
input wire clk,
input wire rst_n,
input wire data_en,
input wire data_in,
output reg data_out
) ;
wire gclk;
TLATNTSCAW7T icg_0 ( .CK(clk), .E(data_en), .SE(1'b0), .ECK(gclk) );
always@(posedge gclk, negedge rst_n)
if(!rst_n)
data_out <= 1'b0;
else
data_out <= data_in;
endmodule // noclkgate
是不是所有的DFF都可以插入门控时钟呢?
不是的。只有带使能的DFF,就是数据保持不变的时刻才可以停时钟。例如信号打拍的DFF需要每个时钟都采样,每个时钟都在工作。 除了latch型门控时钟外,还有一种自异或型门控时钟。就是根据数据有没变化判断要不要采样。数据翻转率小的DFF适合用这种门控时钟。
插入门控时钟后,对逻辑等价性检查有什么影响?
在做逻辑等价性检查时,也需要对门控时钟进行设置,比如Cadence的LEC需要set flatten model -gated_clock,Synopsys的formality则需要set verification_clock_gate_edge_analysis true 。在做LEC时,需要把ICG的上的enable合成到数据通路上去。而一般的Latch则不需要,与DFF一样,Latch也是需要作为Keypoint进行逻辑锥对比的。