インテルのみ表示可能 — GUID: iga1401397404082
Ixiasoft
インテルのみ表示可能 — GUID: iga1401397404082
Ixiasoft
31.3.2. DMAの記述子
記述子リストを外部メモリーに保存すると、FPGAのリソースに空きができます。ただし、外部の記述子リストを使用すると、記述子プロセッサーがリストの読み出しと更新を行う際のオーバーヘッドが増加します。SG-DMAコアには内部FIFOがあり、メモリーから読み出された記述子を格納します。これにより、コアでは記述子の読み出し、実行、およびライトバックの操作を並行して実行できるため、記述子へのアクセスと処理のオーバーヘッドを隠すことができます。
記述子は初期化し、32ビット境界にアライメントする必要があります。リストの最後の記述子では、OWNED_BY_HWビットを0に設定する必要があります。コアはクリアされているOWNED_BY_HWビットに依存し処理を停止します。
DMA記述子の構造に関しては、DMAの記述子のセクションを参照してください。
記述子の処理
次の手順は、DMA記述子を処理する方法を説明しています。
- ソフトウェアで記述子のリンクリストを構築します。記述子のリンクリストを構築して更新する方法に関しては、記述子リストの構築と更新のセクションを参照してください。
- ソフトウェアで最初の記述子のアドレスをnext_descriptor_pointerレジスターに書き込み、controlレジスターのRUNビットを1に設定して転送を開始します。レジスターの詳細に関しては、ソフトウェアのプログラミング・モデルのセクションを参照してください。
RUNビットのアサートに続く次のクロックサイクルで、コアはstatusレジスターのBUSYビットを1に設定し、記述子の処理が実行中であることを示します。
- 記述子プロセッサー・ブロックは、最初の記述子のアドレスをnext_descriptor_pointerレジスターから読み出し、取得した記述子をコマンドFIFOにプッシュします。コマンドFIFOは、コマンドをDMAの読み出しブロックと書き込みブロックの両方に供給します。最初の記述子が読み出されるとすぐに、ブロックは次の記述子を読み出し、それをコマンドFIFOにプッシュします。1つの記述子が常に事前に読み出されるため、スループットが最大化します。
- コアはデータ転送を実行します。
- Memory-to-Memoryのコンフィグレーションでは、DMA読み出しブロックでコマンドFIFOから送信元のアドレスを受信し、データの読み出しを開始します。その際は、指定されているバイト数が転送されるまでストリームポートのFIFOを埋めていきます。FIFOがフルになると、FIFOにデータを受け入れる十分なスペースができるまで、DMA読み出しブロックは停止します。 DMA書き込みブロックは、コマンドFIFOから送信先のアドレスを取得し、書き込みを開始して指定されているバイト数を転送します。データFIFOが空になると、書き込むデータがFIFOに含まれるまで書き込みブロックは停止します。
- Memory-to-Streamのコンフィグレーションでは、DMA読み出しブロックで送信元のアドレスから読み出し、指定されているバイト数が転送されるまで、もしくはEnd of Packetに到達するまでデータをコアのストリーミング・ポートに転送します。このブロックは、転送サイズが不明な転送にはEnd of Packetインジケーターを使用します。End of Packetインジケーターを使用しないデータ転送の場合は、転送サイズをデータ幅の倍数にする必要があります。これに従わない場合、ブロックに追加のロジックが必要になり、システムのパフォーマンスに影響をおよぼす可能性があります。
- Stream-to-Memoryのコンフィグレーションでは、DMA書き込みブロックでコアのストリーミング・ポートから読み出し、送信先のアドレスに書き込みます。このブロックは、指定されているバイト数が転送されるまで読み出しを続けます。
- 記述子プロセッサー・ブロックは、DMAの読み出しまたは書き込みブロックからステータスを受信し、記述子のDESC_CONTROL、DESC_STATUS、ACTUAL_BYTES_TRANSFERREDフィールドを更新します。DESC_CONTROLフィールドのOWNED_BY_HWビットは、PARKビットが1に設定されていない限りクリアされます。
コアで記述子の処理を開始している場合は、OWNED_BY_HWビットが1に設定されている記述子をソフトウェアで更新しないでください。ソフトウェアでの記述子の更新は、OWNED_BY_HWビットがクリアされている場合にのみ安全です。
SG-DMAコアは、エラー条件が発生してSTOP_DMA_ERビットが1に設定されるまで、もしくはOWNED_BY_HWビットがクリアされている記述子が発生するまで記述子の処理を続けます。
記述子リストの構築と更新
インテルでは、記述子リストを構築および更新する次の方法を推奨しています。
- 記述子リストを構築し、ハードウェア所有でない記述子 (OWNED_BY_HW = 0) でリストを終了します。リストは任意の長さにすることができます。
- 割り込みのIE_CHAIN_COMPLETEDを設定します。
- 最初のリストの最初の記述子のアドレスをnext_descriptor_pointerレジスターに書き込み、RUNビットを1に設定して転送を開始します。
- コアが最初のリストを処理している間に、記述子の2番目のリストを構築します。
- SGDMAコントローラー・コアが最初のリストの処理を完了すると、割り込みが生成されます。next_descriptor_pointerレジスターを2番目のリストの最初の記述子のアドレスで更新します。RUNビットとstatusレジスターをクリアします。RUNビットを1に戻して転送を再開します。
- 新しい記述子を追加する場合はかならず、コアが処理していないリストにそれらを追加します。例えば、コアが最初のリストを処理している場合は、新しい記述子を2番目のリストやその他のリストに追加します。
この方法により、コアが記述子を処理している際に記述子が更新されないことを保証します。この方法では割り込みへの応答が必要なため、データ移動の停止が不可能なシステムでは、レイテンシーが大きい割り込みによって問題が発生する可能性があります。