门控时钟和逻辑等价性检查

2021-11-02 09:43:39 浏览数 (2)

每当问到“怎么降低动态功耗”,一般的答案就是插门控时钟。那为什么插门控时钟就能降低动态功耗呢?门控时钟一定能插得进去吗?对逻辑等价性检查(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进行逻辑锥对比的。

0 人点赞