低消費電力設計のクロック ゲーティング

背景紹介

チップの消費電力の 40% 以上がクロック ツリーによって消費されます。この結果の理由も直感的です。これらのクロック ツリーはシステム内で最も高いスイッチング周波数を持ち、多くのクロック バッファーを持ち、クロック遅延を最小限に抑えるために通常は高い駆動強度を備えているからです。したがって、クロック ネットワークの電力消費を削減する最も直接的な方法は、クロックが必要ない場合にクロックをオフにすることです。この方法は、おなじみのゲート クロック、クロック ゲーティングです。クロックをゲート制御する回路を設計する場合、どのように設計すればよいでしょうか? 最も直接的な方法は、クロックが必要ないときにクロックをオフにすることです。これは AND 演算です。イネーブルと CLK の「AND」演算を実行するだけです。回路図は次のとおりです。

このように、制御EN信号とクロックCLKを直接ゲート制御して動作を完了させる方法は、ENが0でクロックがオフのときに完了することができます。しかし同時に、それは別の大きな問題、つまり不具合をもたらします。

上の図に示すように、EN は制御されておらず、いつでもジャンプする可能性があるため、純粋に結合された出力 GCLK にはグリッチが発生する可能性があり、クロック信号のグリッチは非常に危険です。

当然、解決策を考え、フリップフロップを使用し、EN を CLK に登録するだけで、出力は CLK に基づきます。実はラッチを使う方法もあり、ENでラッチした出力もCLKを基準にしています。

ラッチゲート

まず 2 番目の方法について説明します。クロック ゲーティングにラッチを使用します。回路は次のとおりです。

波形は次のとおりです。

CLK が High の場合にのみ、GCLK が High を出力し、EN によって引き起こされるグリッチを除去できることがわかります。これは、D ラッチがレベル トリガーであるためで、clk=1 の場合、データは D ラッチを介して Q に流れ、Clk=0 の場合、Q は元の値を変更しません。

バリを除去するという目標は達成されましたが、この回路にはまだ 2 つの欠点があります。 1. 回路内でラッチと AND ゲートが遠く離れており、ラッチに到着するクロックと AND ゲートに到着するクロックの遅延差が大きい場合、依然としてグリッチが発生します。2 回路内でクロック イネーブル信号がラッチに非常に近い場合、ラッチの確立時間に間に合わない可能性があり、ラッチ出力の準安定状態が発生します。

上述的右上图中,B 点的时钟比 A 时钟迟到,并且 Skew > delay,这种情况下,产生了毛刺。 为了消除毛刺,要控制 Clock Skew,使它满足 Skew >Latch delay(也就是锁存器的 clk-q 的 延时)。上述的右下图中,B 点的时钟比 A 时钟早到,并且|Skew| > ENsetup 一 (D->Q),这 种情况下,也产生了毛刺。为了消除毛刺,要控制 Clock Skew,使它满足|Skew|< ENsetup 一(D->Q)。

寄存门控

对于clock gating,我们还有另外的解决办法,就是用寄存器来寄存 EN 信号再与上 CLK 得到 GCLK,电路图如下所示:

时序图如下所示:

由于 DFF 输出会 delay 一个周期,所以除非 CLKB 上升沿提前 CLKA 很多,快半个周期,才 会出现毛刺,而这种情况一般很难发生。但是,这种情况 CLKB 比 CLKA 迟到,是不会出现毛刺的。 当然,如果第一个 D 触发器不能满足 setup 时间,还是有可能产生亚稳态。

提问:SOC 芯片设计中使用最多的是锁存结构的门控时钟,为什么? 原因是:在实际的 SOC 芯片中,要使用大量的门控时钟单元。所以通常会把门控时钟做出一 个标准单元,有工艺厂商提供。那么锁存器结构中线延时带来的问题就不存在了,因为是做成一个单元,线延时是可控和不变的。而且也可以通过挑选锁存器和增加延时,总是能满足 锁存器的建立时间,这样通过工艺厂预先把门控时钟做出标准单元,这些问题都解决了。

那么用寄存器结构也可以达到这种效果,为什么不用寄存器结构呢?那是因为面积!一个 DFF 是由两个 D 锁存器组成的,采样 D 锁存器组成门控时钟单元,可以节省一个锁存器的 面积。当大量的门控时钟插入到 SOC 芯片中时,这个节省的面积就相当可观了

代码(寄存器门控)

module clk_gating(
    input         clk      ,
    input         rst_n    , 
    input         out_en   ,
    input [63:0]  data     ,
    
    output reg out
);
 
reg en1;
wire clk_en;
 
always@(posedge clk or negedge rst_n) begin
    if(!rst_n)begin
        en1 <= 1'b0;
    end
    else begin
        en1 <= out_en;
    end
end
assign clk_en = clk & en1;
always @(posedge clk_en or negedge rst_n) begin
    if(rst_n==1'b0)
        out <= 64'b0;
    else
        out<= data;
end
endmodule

综合出来电路如下,和我们预想的一样。

おすすめ

転載: blog.csdn.net/qq_57502075/article/details/129278380