cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Python を使用した PCIe 問題のデバッグ

kurihara
Xilinx Employee
Xilinx Employee
4 0 616

のブログは、英語版のDebugging PCIe Issues Using Pythonを翻訳したものです。

 

このブログでは、ザイリンクス PCIe デザインのデバッグに Python スクリプトを使用する例を紹介します。このブログに添付されているスクリプトは、コミュニティ メンバーのご協力の元、作成されています。

ここで説明する方法と同じような方法を既に使用している場合、または提供されたスクリプトをさらに改良する場合、当社と共有していただければ、このフォーラムの PCIe コミュニティ メンバーと共有させていただきます。

提供されている手法はすべてのデザインに適用できるようになっています。PCIe のみに適用できるわけではありません。

 

CSV の取得:

Python スクリプトを使用してデバッグ解析をできるようになりました。さらに重要なことは、Vivado ILA で生成される ILA ファイルによってより簡単にできるようになっている点です。これは、*.ila 拡張子を *.zip に変更してから、結果ファイルを解凍すると、CSV ファイルに変換できます。

解凍されたフォルダーには、次のファイルが含まれます。

kurihara_0-1611557396265.png

kurihara_9-1611557070561.png

 

Python からは CSV ファイル解析用のライブラリが提供されており、Vivado ILA で生成されたデバッグ信号データを徹底的に解析するために使用できます。デバッグ信号は、Vivado ハードウェア マネージャーで波形として表示することもできます。特定のインターフェイスのパケット数のカウントや、パケット内のフィールド値の解釈などの解析に Python スクリプトによるアプローチを使用すると、カスタム デバッグがかなりしやすくなります。

Python スクリプトのユース ケース例

提供されている Python スクリプトは、次の図に示す RQ/RC/CQ/CC インタフェース信号を含む ILA データを解析します。このブロック図は、『UltraScale+ Devices Integrated Block for PCI Express v1.1 LogiCORE IP 製品ガイド』 (PG213) からのものです。

kurihara_1-1611557402881.png

kurihara_10-1611557113086.png


スクリプトは、各インターフェイス上の有効なパケットを識別し、各パケットのディスクリプター フィールドを抽出し、各フィールドの値をレポートします。

PCIe デバッグ用の Python コード例:

スクリプトが実行する手順は次のとおりです。

  • CSV ファイルを開きます。
  • 選択した CSV ファイルからデータを抽出します。
    • 必要なデータを含む特定の列/ヘッダーを抽出します。
  • tready、tvalid、および tlast を修飾子として使用して、有効なパケットを識別します。
  • 有効な tdata 値を抽出し、関数を使用して 16 進数から 2 進数へ変換します。
    • この 2 進数への変換は、tdata からビット レベルのデータを抽出するために必要です。
  • 16 進数データを含むディスクリプター フィールドを表示します。

次の func_rq_pkt_analysis() 関数は CSV ファイルを受け取り、提供された tready 値に基づいて解析を実行するインターフェイスを決定します。

kurihara_2-1611557497352.png

kurihara_11-1611557150060.png


次のコードは、.csv ファイル内の各フィールドの列番号を示します。

kurihara_3-1611557505935.png

kurihara_12-1611557175247.png

 

tready、tdata、tvalid、tlast の値のみを抽出し、該当するインデックスの値として辞書に保存します。これは辞書キーとして使用されます。

 

kurihara_13-1611557195040.png


次の手順では、辞書に保存されたデータを解析します。辞書には、tdata、tready、tvalid、tlast が含まれます。

for ループは辞書の各行を確認し、tready と tvalid の両方が 1 の場合に、該当するデータを変数にコピーします。tdata は、CSV ファイルに 16 進数として保存されます。ビット レベルの抽出をしてディスクリプター フィールドを識別するために、16 進数値が 2 進数値に変換されます。

ディスクリプター フィールドは、PG213 で説明されるディスクリプター形式に基づいて抽出されます。次の例は、CC (Completion Completer) インターフェイスのディスクリプターを示しています。

 

kurihara_14-1611557215448.png

 

kurihara_15-1611557248743.png


ディスクリプター フィールドの値を出力するには、bin_to_hex_print() 関数を使用して、2 進数値を 16 進数値に変換し戻します。

この関数は、次のように定義されます。

 

kurihara_0-1611557627878.png

このブログに添付されている waveform.csv ファイルの出力例を次に示します。

 

kurihara_1-1611557642519.png



コード例の制限事項

コード例は、あくまで概念実証コードとして提供されています。提供されているスクリプトは、次のような状況でそのまま使用できます。

  1. パケットは 1 つのデータ ビートで構成されます。つまり、tready/tvalid と tlast がすべて同じクロック サイクルでアサートされます。
    2.ストラドルは使用されません。
    3.該当するインターフェイスの tdata、tready、tvalid、tlast 信号名は、このブログに添付されている .csv ファイルと同じ名前です。

Python を使用した PCIe デバッグのユース ケース

次に示すように、Python スクリプトの例を改良すると、さまざまな状況をデバッグできるようになります。

  1. 各インターフェイスのパケット数をカウントします。
  2. ストラドルをイネーブルにして、ユーザー インターフェイスでパケットを解析します。
  3. 複数のクロック サイクルにまたがるパケットなど、複数のデータ ビート パケットの解析をサポートします。
  4. 分割完了 (split completion) パケットの受信を確認します。
  5. ILA キャプチャ ウィンドウのバッファー サイズが十分であれば、ユーザー ロジックにより CC インターフェイスで正しい完了 (completion) が生成されます。同様に、対応する要求の完了が RC インターフェイスで受信されたことを確認します。