web-dev-qa-db-ja.com

RTLでクロックゲーティングを使用するにはどうすればよいですか?

私はいくつかのラッチと私のデザインのロジックをクロックゲーティングしています。合成や配置配線の経験はあまりありません。 RTLでクロックゲーティングを実装する適切な方法は何ですか?

例1:

always_comb begin
    gated_clk  = clk & latch_update_en;
end

always_latch begin
    if(gated_clk) begin
         latch_data <= new_data;
    end
end

例2:RTLクロックゲーティングのグッドプラクティスについて調査しているときに、RTLの例に出くわしました。その例では、上記のコードを次のように実装しました。

clock_gator cg_cell (.clk(clk), .en(latch_update_en), .scan_en(scan_en_in), .gated_clk(gated_clk));

always_latch begin
    if(gated_clk) begin
         latch_data <= new_data;
    end
end

カスタムクロックゲーティングセルを使用する目的は何ですか? clkがalways_combブロックで別のイネーブル信号とともに直接「and」されている場合、ツールは合成に苦労しますか?特殊なクロックゲーティングセルを使用することは、ゲートクロック信号を生成するための標準的なアプローチであると感じています。私はこれが事実である理由を理解しようとしています。

10
newbie

RTLでクロックゲーティングを実装する適切な方法は何ですか?

クロックゲーティング信号は、ラッチが閉じているときにのみトグルする必要があります。そうしないと、グリッチや準安定性の問題が発生する可能性があります。アクティブハイラッチの場合、ゲーティング信号はクロックの立ち下がりエッジでトグルする必要があります。アクティブローラッチの立ち上がりエッジ。

通常、ゲーティング信号のノイズを防ぐために、エッジセンシティブフロップでlatch_update_enを保持します。

always_ff @(negedge clk)
  latch_update_en <= next_latch_update_en;

always_comb
    gated_clk = (* clock_gating = "clk" *) clk & latch_update_en;

always_latch
    if(gated_clk)
         latch_data <= new_data;

リマインダー:ラッチのみが設計されている場合:エッジトリガーフロップはマスター/スレーブラッチのみです

always_latch 
    if (clk)
      sync_latch_update_en <= next_latch_update_en;
always_latch 
    if (!clk)
      latch_update_en <= sync_latch_update_en;

Clkがalways_combブロックで別のイネーブル信号とともに直接「and」されている場合、ツールは合成に苦労しますか?

ほとんどの合成には、クロッキングを直接ANDすることに問題があります。ゲーティングの使用方法は必ずしも直感的ではありません。シンセサイザーのライブラリには、多くの場合、選択可能な多くのANDゲートがあり、それぞれに異なるスルー、スキュー、および入力の組み合わせでのロードがあります。機能的には同じですが、A & BB & Aとは異なる時間結果を取得します。

シンセサイザーのライブラリから明示的なセルをインスタンス化すると、動作を認識して予測する可能性が狭くなります。事前定義されたクロックゲーティングセルには、シンセサイザーが使用する属性もあります。属性には、クロックツリーのバランスをとるためのタイミング情報(負荷と寄生を管理するためのデザインのバッファ配置)が含まれます。

一部のシンセサイザーは、セルを明示的にインスタンス化する必要がなく、RTLでの属性タグの設定(例:// synthesis attributesまたは(* attributes *))をサポートしています。これがどのように行われるかについての標準はありませんので、ユーザーマニュアルを参照してください。

カスタムクロックゲーティングセルを使用する目的は何ですか?

カスタムセルは、合成ライブラリ内の定義済みセルであり、タイミング情報、負荷分散、およびその他の属性がわかっています。この情報により、シンセサイザーは、クロックツリーのバッファー遅延をどこでどのように追加または調整するかを認識します。これにより、ゲートされていないフロップがゲートされたフロップの前にクロックエッジを認識しないようになります。

                 _____       _____
IN -------------|D   Q|-----|D   Q|--- OUT
                |     |     |     |
       |\ |\    |     |     |     |
     +-| >| >---|>    |   +-|>    |
     | |/ |/    |_____|   | |_____|
     |  ___               |
CLK -+-|   \              |
       | &  )-------------+   BALANCED CLOCK : correct data sampled
GATE --|___/

ガイダンスがないと、ゲートフロップのクロックが遅れる可能性があります。スキューにより、間違ったデータがサンプリングされます。

                 _____       _____
IN -------------|D   Q|-----|D   Q|--- OUT
                |     |     |     |
                |     |     |     |
     +----------|>    |   +-|>    |
     |          |_____|   | |_____|
     |  ___               |
CLK -+-|   \    |\ |\     |
       | &  )---| >| >----+   UNBALANCED CLOCK : wrong data sampled
GATE --|___/    |/ |/
12
Greg

読む Yu-Yun Daiの論文:クロックゲート回路の検証と合成 これは次のように述べています:

クロックゲーティング回路のシーケンシャル等価性チェック(SEC)が必要です

さらに、 https://github.com/YosysHQ/yosys-bigsim/blob/master/openmsp430/rtl/omsp_clock_gate.v を試してください。ここで、コードは次のように貼り付けられます。

//----------------------------------------------------------------------------
// Copyright (C) 2009 , Olivier Girard
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//     * Redistributions of source code must retain the above copyright
//       notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above copyright
//       notice, this list of conditions and the following disclaimer in the
//       documentation and/or other materials provided with the distribution.
//     * Neither the name of the authors nor the names of its contributors
//       may be used to endorse or promote products derived from this software
//       without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
// OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
// THE POSSIBILITY OF SUCH DAMAGE
//
//----------------------------------------------------------------------------
//
// *File Name: omsp_clock_gate.v
// 
// *Module Description:
//                       Generic clock gate cell for the openMSP430
//
// *Author(s):
//              - Olivier Girard,    [email protected]
//
//----------------------------------------------------------------------------
// $Rev: 103 $
// $LastChangedBy: olivier.girard $
// $LastChangedDate: 2011-03-05 15:44:48 +0100 (Sat, 05 Mar 2011) $
//----------------------------------------------------------------------------

module  omsp_clock_gate (

// OUTPUTs
    gclk,                      // Gated clock

// INPUTs
    clk,                       // Clock
    enable,                    // Clock enable
    scan_enable                // Scan enable (active during scan shifting)
);

// OUTPUTs
//=========
output         gclk;           // Gated clock

// INPUTs
//=========
input          clk;            // Clock
input          enable;         // Clock enable
input          scan_enable;    // Scan enable (active during scan shifting)


//=============================================================================
// CLOCK GATE: LATCH + AND
//=============================================================================

// Enable clock gate during scan shift
// (the gate itself is checked with the scan capture cycle)
wire    enable_in =   (enable | scan_enable);

// LATCH the enable signal
reg     enable_latch;
always @(clk or enable_in)
  if (~clk)
    enable_latch <= enable_in;

// AND gate
assign  gclk      =  (clk & enable_latch);


endmodule // omsp_clock_gate
0
kevin998x