デジタル IC バックエンド研究ノート: 等価性チェックと ECO

1. 正式な検証ツール

        一部の回路を移植する場合、通常、新しい回路に対してシミュレーション検証を行う必要はなく、回路の機能が元の回路と一致するかどうかをEDAツールを直接使用して解析できるため、検証工数を大幅に削減できます。時間を短縮し、回路の効率を向上させます。

        現在、等価性検査(Equivalence Check)は、2つの回路の論理機能の整合性を比較する形式検証の主流となっています。一致する点を取得し、それらの点間のロジックを比較することによって等価性チェックを行います。データ構造を生成し、同じ入力特性曲線条件下で出力数値特性曲線と比較します。それらが異なる場合は、比較されている 2 つの回路が等価ではないことを意味します。ツールを使用する具体的なプロセスを次の図に示します。まず、完全かつ正確な元の設計、関連するプロセス ライブラリ、検証可能な設計をツールに提供する必要があり、次に、検査プロセスに制約を与えてパラメータを設定し、比較範囲と比較範囲を決定する必要があります。一致点が一致しない場合は、診断が必要です。通常、RTL コードとレイアウトの後に抽出されたネットリストの論理機能が一貫しているかどうか、スキャン チェーンを追加する前後のネットリストの論理機能が通常の動作モードで一貫しているかどうか、およびスキャン チェーンの論理機能が一貫しているかどうかを比較するために使用されます。 ECO 補正前後のネットリストは一致していますか。

        ECO フェーズでは、RTL は完全な合成プロセスを実行しません。バグが見つかった場合、または設計プロセスの最後に新しい調整を追加する必要がある場合は、まず RTL への機能変更を確認し、次にその変更が期待どおりであることをテストする必要があります。その後、変更はネットリスト上で直接行われます。変更されたネットリストが RTL と一致していることをどのように確認できますか? 変更されたネットリストのゲートレベルのシミュレーションを実行し、変更が目的の目標を達成したかどうかを確認できます。ただし、ゲートレベルのシミュレーションは保証を提供できず、変更された RTL と変更されたネットリストが同等であることを 100% 確信することはできません。

         以下に、等価性チェックツールをいくつか示します。

メーカー ツール名
ケイデンス コンフォーマル
シノプシス 形式
メンター フォーマルプロ
マグマ クォーツフォーム

2. ネットリストエコ

        ECO は重要な設計段階です。ECO ステージでは、RTL コードを再合成することはできませんが、ネットリストは直接変更できます。RTL コードの変更と再合成は、チップ設計の最終段階 (テープアウト) 近くでコストがかかる可能性があります。軽微な変更のみが必要な場合は、テープアウト前に ECO によって修正できます。ECOのプロセスは以下の通りです。

  • RTL コードのエラーを修正し、チップが期待どおりに機能することを確認します。
  • ECO を使用すると、バグ修正はネットリスト上で直接実行されます。バグを修正するために論理ゲートを追加または変更できますが、ECO フェーズで実行できることには制限があります。通常、いくつかのフリップフロップといくつかの論理ゲートを追加できます。数百のフリップフロップと数百の論理ゲートが関係する場合は、それらをすべて再合成する方が良いため、ECO よりも簡単です。ECO では、コントロール ユニット (ステート マシン) の変更はデータ パスの変更よりも簡単です。
  • 次に、変更された RTL コードと変更されたネットリストの間で等価性チェックが実行され、これら 2 つが機能的に同等であることが確認されます。

        ECO はネットリストに対して直接実行されるため、ネットリストの変更された関数は直接解析には不便です。2 つの代表的な ECO 方法については、以下で説明します。

        方法 1: ロジック コーンを変更する

        この方法は、既存の論理ゲートを追加および再配置することによって、論理関数を変更し、更新された RTL 関数と一致させるという目的を達成します。これには、フリップフロップを駆動するロジック コーンの確認、既存のノードの確認、ロジック コーンの変更などが含まれます。これには試行錯誤が必要ですが、論理ゲートを最小限に追加するだけで変更できます。このアプローチは、変更された領域付近の空き論理ゲートの数が少ない場合には、より効率的である必要があります。ECO Compiler や Conformal LEC などのツールは、デザインの ECO を支援します。

        方法 2: 新しいロジックでオーバーライドする

        この方法を使用する場合、論理ゲートを使用する追加の論理回路のセットを設計する必要があり、その出力はセレクターを介して既存のフリップフロップに接続されます。与えられた条件が満たされる場合、必要な値がセレクターを通じて選択され、その他の条件の下では、セレクターを通じて古い値が選択されます。この方法はより直感的ですが、より多くの論理ゲートを使用する必要があります。以下では方法 2 の例を使用して分析していきます。

       説明例

        ステート マシンは FIFO からデータを読み取り、dataout および dataout_valid を通じて受信エージェント回路にそれを渡します。受信側エージェント回路は、target_rdy を通じてデータ転送フェーズの完了を示します。つまり、dataout_valid と target_rdy の両方が有効な場合、データ転送動作は終了します。コントローラーは、target_rdy が有効になるまで、データ転送フェーズ中に常に dataout と dataout_valid を駆動します。ステート マシンは、データ FIFO から end_of_pkt フラグを読み取るまで、データ転送フェーズに留まります。dataout_last 信号は、最後のデータ転送が完了した後にアサートされます。これは 2 つのエージェント間のデータ送信の一般的なプロトコルであり、2 つのエージェントはそれぞれ dataout_valid と target_rdy を通じてフロー制御を実行できます。

        間違い

        ステート マシンの設計にエラーがあり、パケット送信の終了前 (end_of_pkt 信号の前) に FIFO が一時的に空になる可能性があることが考慮されていません。データ FIFO が空に読み取られたときにパケットが完了していない場合、ステート マシンは空の FIFO を読み取り、エラーが発生します。

        ECO補正

        BURST_DATA 状態の場合は、別の状態 WAIT_NONEMPTY にジャンプし、FIFO が空ではない状態になるまで待ちます。コメント化されたコードは、追加する必要がある新しい状態とロジックを示します。ここでは、新しい状態を作成し、一部の出力を変更する必要があります。サンプルコードは次のとおりです。

reg [2:0] xmitstate, xmitstate_nxt;
reg fifo_rden;
reg [15:0] dataout, dataout_nxt;
reg dataout_valid, dataout_valid_nxt;
reg dataout_last, dataout_last_nxt;

parameter IDLE = 3'b000,
          DATA_AVAIL = 3'b001,
          FIRST_DATA = 3'b010,
          BURST_DATA = 3'b011,
          LAST_DATA = 3'b100;

//新加的状态
//parameter WAIT_NONEMPTY = 3'b101; 

always@(posedge clk, negedge rstb) begin
    if(!rstb) begin
        xmitstate <= IDLE;
        dataout <= 0;
        dataout_valid <= 0;
        dataout_last <= 0;
    end
    else begin
        xmitstate <= xmitstate_nxt;
        dataout <= dataout_nxt;
        dataout_valid <= dataout_valid_nxt;
        dataout_last <= dataout_last_nxt;
    end
end

always@(*) begin
    xmitstate_nxt = xmitstate;
    fifo_nxt = 1'b0;
    dataout_nxt = dataout;
    dataout_valid_nxt = 1'b0;
    dataout_last_nxt = 1'b0;
    
    case(xmistate)
        IDLE: begin
            if(start_xmit)
                xmitstate_nxt = DATA_AVAIL;
        end
        DATA_AVAIL: begin
            if(!fifo_empty) begin
                xmitstate = FIRST_DATA;
                fifo_rden = 1'b1;
            end
        end
        FIRST_DATA: begin
            data_out_nxt = fifo_rddata;
            dataout_valid_nxt = 1'b1;
            if(end_of_pkt) begin
                xmitstate_nxt = LAST_DATA;
                dataout_last_nxt = 1'b1;
            end
            else begin
                xmitstate_nxt = BURST_DATA;
                fifo_rden = 1'b1;
            end
        end
        BURST_DATA: begin
            if(target_rdy) begin
                data_out_nxt = fifo_rddata;
                dataout_valid_nxt = 1'b1;
                if(end_of_pkt) begin
                    xmitstate_nxt = LAST_DATA;
                    dataout_last_nxt = 1'b1;
                end
              //else if(fifo_empty)
              //    xmitstate_nxt = WAIT_NONEMPTY;
                else 
                    fifo_rden = 1'b1;
            end
            else begin
                dataout_nxt = data_out;
                dataout_valid_nxt = 1'b1;
            end
        end
        LAST_DATA: begin
            if(target_rdy)
                xmitstate_nxt = IDLE;
            else begin
                dataout_nxt = dataout;
                dataout_valid_nxt = 1'b1;
                dataout_last_nxt = 1'b1;
            end
        end
        /*新加的状态
        WAIT_NONEMPTY: begin
            if(target_rdy) begin
                if(!fifo_empty) begin
                    xmitstate_nxt = FIRST_DATA;
                    fifo_rden = 1'b1;
                end
                else 
                    xmitstate_nxt = DATA_AVAIL;
            end
            else 
                dataout_valid_nxt = 1'b1; 
                dataout_nxt = dataout;             
        end
        */
    endcase 
end

        エコ

        エラー修正時に新たに追加された RTL コードについては、xmistate_nxt[2:0]、dataout_valid_nxt、fifo_rden を変更する必要があります。次に、おそらく 3 つのロジックの中で最も難しい xmistate_nxt[2:0] ロジックに取り組む必要があります。

        最初の適用条件

if((xmitstate == BURST_DATA) && target_rdy && !end_of_pkt && fifo_empty)
    xmitstate_nxt = WAIT_NONEMPTY

即

if((xmitstate == 3'b011) && target_rdy && !end_of_pkt && fifo_empty)
    xmitstate_nxt = 3'b101

        2 番目のカバレッジ条件

if((xmitstate == WAIT_NONEMPTY) && target_rdy && !fifo_empty)
    xmitstate_nxt = FIRST_DATA;

即

if((xmitstate == 3'b101) && target_rdy && !fifo_empty)
    xmitstate_nxt = 3'b010;

        3つ目の適用条件 

if((xmitstate == WAIT_NONEMPTY) && target_rdy && fifo_empty)
    xmitstate_nxt = DATA_AVAIL;

即

if((xmitstate == 3'b101) && target_rdy && fifo_empty)
    xmitstate_nxt = 3'b001;

        以下の図は、xmitstate[2] の ECO を示しています。他の 2 ビットの ECO 方法も同様です。もちろん、実際の ECO では、セル ライブラリで選択できる論理ゲートに応じて、論理回路をさらに最適化することができます。ECO 時には、xmitstate[2] フリップフロップに最初に入る入力が遮断され、OR ゲートと AND ゲートで構成されるセレクターに接続され、セレクターを制御することで、新たに追加された論理分岐または論理分岐を選択することができます。元のロジック分岐。上記 3 つのカバレッジ条件はすべて同時に満たすことはできません。2 番目と 3 番目のカバレッジ条件では、xmitstate[2] が両方とも 0 であり、(xmitstate) を使用することで 2 つを同時にカバーできることがわかります。 == 3'b101) && target_rdy. この結果、ECO には 2 つのカバレッジ条件 A と B だけが表示されます。

        エコの説明

       図の点 A と B には、2 つのカバレッジ条件があります。最初のオーバーライド条件 (ポイント A) が true の場合、xmitstate[2] の入力が 1 になるようにします。Aが1のとき、ORゲートOR−Aの出力は1となり、このとき第2のカバレッジ条件は偽、つまりB点は1となり、ANDゲートAND−Bの出力も1となる。2 番目または 3 番目の条件が true の場合、xmitstate[2] の入力が 0 になるようにします。この場合、B点は0となり、AND-Bの出力も0となります。これは、2 番目と 3 番目のカバレッジ条件で予想されることです。

        要約すると、最初のカバレッジ条件では 1 を取得でき、2 番目と 3 番目の条件では 0 を取得できました。これらの条件はロジック コーンの先頭にあるため、これらの条件で得られる論理値は元の条件に依存しません。どのオーバーライド条件も真ではない場合、ポイント B は 1、ポイント A は 0 となり、ポイント C (元の値) がフリップフロップの入力に渡されます。

 上記の内容は、「Verilog Advanced Digital System Design Technology and Example Analysis」および「SOC Design Method and Implementation」から引用しています。

おすすめ

転載: blog.csdn.net/weixin_45791458/article/details/131488271