01signal.com

Vivado で部分再構成を使うための How-To

はじめに

これは Xilinx の Vivado における部分再構成(Partial Reconfiguration)、別名 Dynamic Function eXchange(DFX)についての全 4 回の連載の 2 番目の記事です。この記事では、FPGA デザインで部分再構成を有効にするための手順を詳しく解説します。まだお読みでない方は、これらの手順の背後にある概念を説明している前回の記事をお読みになることをお勧めします。

Xilinx は 2020 年に部分再構成を "Dynamic Function eXchange"(DFX)と改名しました。DFX は Vivado のメニューや情報メモで使われる表現です。とはいえ、本稿では技術用語である部分再構成(Partial Reconfiguration)を使用します。

簡単のため、本稿ではプロジェクトにリコンフィギャラブルパーティション(reconfigurable partition)が 1 つだけあることを前提とします。複数のパーティションへの拡張は比較的簡単です。

本稿で説明する手順は、プロジェクトが部分再構成に対応するから始まります。大まかに分けると、手順は次のとおりです。

フロアプランニングの準備

何よりも、フロアプランニングは頭を使う作業です。FPGA ロジックの領域を無駄にしないことと、スタティックパーティションとリコンフィギャラブルパーティションの両方が、配置配線(place and route)中に大きな障害を抱えないようにすることの間で、微妙なバランスを取る必要があります。

そのため、本稿の大部分はこのテーマに割かれています。

遠い昔、フロアプランニングはタイミングクロージャ(timing closure)を達成するために使われる手法でした。ロジックを合理的に配置するようツールを支援していたのです。FPGA 設計ツールは時代とともに向上したため、フロアプランニングがタイミング制約の達成に役立ったのを最後に見てから、もう何年も経ちます。今日では、タイミング制約を達成するための最善の戦略は、ほとんどの場合ツールに判断させることです。

部分再構成ではフロアプランニングが必須なので、目標は状況を悪化させないことです。これは通常、試行錯誤の問題です。とはいえ、良い結果を得る最も簡単な方法は、フロアプランニングなしでデザインを実装し、ロジックが自然に配置された状態から始めることです。次のステップとして、その初期配置を指針に、部分再構成と整合するように領域を整理してみます。

プラグイン用途(plugin usage)のシナリオでは、プロジェクトの進化に応じてフロアプランニングを更新できます。しかし、リモートアップデート(Remote Update)のシナリオ、つまり部分再構成をリリース済みデザインのバージョン更新手段として使う場合はそうではありません。リモートアップデートでは、すべての部分ビットストリームが初期ビットストリームと一致しなければなりません。したがって、初期ビットストリームがリリースされた時点で、デザインのスタティックロジック部分は凍結されます。これは、フロアプランニングも同じままにしなければならないことを意味します。

したがって、部分再構成を始める前であっても、最初の作業は FPGA 内でスタティックロジックに適切な領域を見つけることです。これに時間をかけすぎる意味はありません。プロジェクトが 2 つに分割された後に進めるための出発点を得るだけです。

誤解しないでください。この最初のステップの目的はフロアプランニング自体ではなく、制約なしで Vivado がロジックをどのように配置するかを確認し、それに基づいてスタティックロジックに割り当てる領域を決めることです。手順は次のとおりです。

部分再構成用のプロジェクト設定

Xilinx の UG909 は、部分再構成の作業手順として次の 2 つを推奨しています。

本稿ではプロジェクトフローを採用します。プロジェクトフローにはいくつかの制限があり、その一部はリコンフィギャラブルモジュール内のソースの種類(特にブロックデザインの使用)に関係します。とはいえ、プロジェクトフローから始めるのが良いでしょう。実装用に生成されるスクリプトは、必要になった場合の非プロジェクトフローの良い土台になるからです。

既存プロジェクトで部分再構成サポートを有効にする手順は次のとおりです。

この時点でプロジェクトの実装を試みると、おそらく次のようなエラーで失敗します。「[DRC HDPR-30] Missing PBLOCK On Reconfigurable Cell: HD.RECONFIGURABLE cell 'pr_block_ins' must have PBLOCK assigned to itself or its descendant cells」。簡単に言えば、フロアプランニングが必要だという意味です。

フロアプランニング

この段階で、プロジェクトはフロアプランニング作業を行うのに必要なだけ設定されています。

この作業を細かいステップに分解する前に、留意すべき点をいくつか挙げておきます。

それでは、ステップに分解します。

フロアプランニングの修正

おそらく部分再構成の中で最も気が進まない部分が、フロアプランニングを適切に仕上げることです。リモートアップデート用途で行っている場合は、この段階が特に重要です。このフロアプランニングはプロジェクトの寿命の間ずっと維持されるからです。

フロアプランニングの修正が必要になる主な理由は 2 つあります。クリティカルワーニングへの対応と、FPGA の利用を最適化するためです。目標は、リソースの無駄を減らしつつ、配置配線の障害を生まないことです。

修正は難しくありません。Pblock の境界をドラッグするだけでよいからです。Pblock に矩形を追加して拡張するのも簡単です。Pblock を右クリックして "Add Pblock Rectangle" を選択します。

クリティカルワーニングは必要な修正を示してくれることが多いですが、それでも、お使いの FPGA のフロアプランニング制限について、Xilinx のユーザーガイド UG909 の該当章(第 6、7 または 8 章)を読んでおいてください。

このセクションの残りでは、7 シリーズ FPGA で起こり得る問題を説明します。UltraScale FPGA のほうがはるかに扱いやすいです。

7 シリーズ FPGA でよくあるエラーは、インタコネクトタイルの列を分割してしまうことです。たとえば次のようなものです。

[Constraints 18-993] The Pblock pblock_pr_block_ins has defined an area that causes the splitting of interconnect tile columns. Dynamic Function eXchange requires that the left and right paired interconnect tile columns cannot be split by a reconfigurable boundary.  This is caused by either the left or right edge of a Pblock boundary, or by the Pblock spanning over logic types not included in the Pblock ranges.  To avoid an unroutable situation, placement will be prohibited from both of these columns. To avoid placement restrictions, modify the Pblock to avoid splitting the two columns.
The column of the split contains interconnect tile INT_L_X48Y299  (SLICE_X79Y299 SLICE_X78Y299).
Please refer to the Xilinx document on Dynamic Function eXchange.
Resolution: Set the Pblock property SNAPPING_MODE to value of ON, or modify the column/X specification of the pblock to avoid this edge.

および

[Constraints 18-996] The split between the left and right columns occurs between a reconfigurable Pblock and Static logic. The static sites are not reconfigurable. The Pblock should be adjusted to remove the column from the Pblock, unless the excluded reconfigurable and static sites are not needed for the design. Note that adjusting the Pblock will prevent prohibits and improve placement of the design, but may reduce the routability if the removed sites were needed to span across the static logic. Failure to modify the Pblock may lead to an unplaceable design if these prohibited sites are required by the design. Resolution: Set the Pblock property SNAPPING_MODE to value of ON, or modify the column/X specification of the pblock to avoid this edge. and

これを修正するには、最初のワーニングで提案されているとおり、Pblock の SNAPPING_MODE プロパティを ROUTING または ON に設定します(おそらく ROUTING では不十分なので ON を選んでください)。これを行うと、XDC ファイルに次のような多数の制約が追加されることになるでしょう。

set_property PROHIBIT true [get_sites SLICE_X79Y349]
set_property PROHIBIT true [get_sites SLICE_X78Y349]
[ ... ]
set_property PROHIBIT true [get_sites SLICE_X79Y191]
set_property PROHIBIT true [get_sites SLICE_X78Y191]
set_property PROHIBIT true [get_sites PMV_X0Y2]
set_property PROHIBIT true [get_sites SLICE_X36Y190]
set_property PROHIBIT true [get_sites SLICE_X37Y190]
[ ... ]
set_property PROHIBIT true [get_sites SLICE_X79Y176]
set_property PROHIBIT true [get_sites SLICE_X78Y176]
set_property PROHIBIT true [get_sites T14]
set_property PROHIBIT true [get_sites R15]
set_property PROHIBIT true [get_sites XADC_X0Y0]
set_property PROHIBIT true [get_sites SLICE_X36Y175]
set_property PROHIBIT true [get_sites SLICE_X37Y175]
[ ... ]

そして、これが延々と続きます。

スライスサイトに対する PROHIBIT 設定は、先ほどのクリティカルワーニングを抑止するためのものです。その他の PROHIBIT は、幾何学的領域には含まれるが、その FPGA の部分再構成では許可されないロジックサイトに対して追加されます。UltraScale FPGA 以降では、PROHIBIT の行は(あるとしても)はるかに少なくなります。

クリティカルワーニングを抑止するだけなら、PROHIBIT の行をすべて削除し、スライスだけを 1 行で指定してもおそらく問題ありません。Vivado が SNAPPING_MODE の変更に応じて追加したスライスの範囲を、次のように 1 行にまとめます。

set_property PROHIBIT true [get_sites -range {SLICE_X79Y0 SLICE_X79Y349}]

このような行は、ファイルを巨大にせずにインタコネクト分割の問題を解決できる可能性があります。

いずれにせよ、次のような行も XDC ファイルに現れることがあります。この行を削除しても問題ないようです。

set_property HD.PLATFORM_WRAPPER true [get_cells pr_block_ins]

XDC ファイルをクリティカルワーニングが消える最小限の行にまで減らすのは、表面的な対処に見えるかもしれません。しかし、代わりに巨大な制約ファイルを残すと、後で混乱の元になります。私の経験では、この種のワーニングが出ないことは、デザインのフロアプランが問題ないという承認として受け取って構いません。

おそらく、XDC をどう変更しても、SNAPPING_MODE を OFF に戻すと再び問題が発生するでしょう。

リコンフィギャラブルモジュールの追加

ここまでの実装は、いくつかの追加制約があるものの、実質的には階層設計と同じことを実現しています。部分ビットストリームは生成されますが、ロードしても同じデザインが維持されるだけなので、ほとんど役に立ちません。

そこで、別のリコンフィギャラブルモジュールに基づく別の部分ビットストリームを作成することが目標になります。これにはチャイルド実装(Child Implementation)の追加が必要です。

以下の説明を読み進める前に、前回の記事、特にペアレント実装とチャイルド実装、Dynamic Function eXchange Wizard の部分をよく頭に入れておいてください。また、前述のとおり、"Partition Definitions" タブには現在定義されているリコンフィギャラブルモジュールとそのソースが含まれています。

Tools メニューから Dynamic Function eXchange Wizard を開き、ようこそウィンドウで Next をクリックします。

Edit Reconfigurable Modules ウィンドウで "+" をクリックします。リコンフィギャラブルモジュールを追加するダイアログが開きます。このダイアログで重要なのは Reconfigurable Module Name だけです。これは、前述のとおり、リコンフィギャラブルロジックを識別するために使われる名前です。

ダイアログでは、このモジュールをパーティション定義の名前に関連付けることも求められますが、いずれにせよ(本稿ではパーティションが 1 つだけという前提なので)候補は 1 つしかありません。

続行するには、少なくとも 1 つの Verilog/VHDL ソースファイルを追加する必要があります。追加のファイルは後で "Partition Definitions" タブから追加できます。このリコンフィギャラブルモジュールのトップレベルモジュール名も入力しておいて損はありません。特に、ソースファイルだけからは役割が分かりにくい場合に有効です。

ウィザードに戻り、もう一度 Next をクリックして Edit Configurations ウィンドウへ進みます。ここで "+" をクリックし、コンフィギュレーション名を入力します。この名前は Design Runs ウィンドウに表示されるだけなので、config_2 などで問題ありません。

コンフィギュレーションのリストに新しい行が現れます。パーティションの列にあるリコンフィギャラブルモジュールを変更し、各コンフィギュレーションが異なるモジュールを持つようにします。

最後のウィンドウは Edit Configuration Runs で、コンフィギュレーションにランを割り当てます。簡単な方法は、このウィンドウにリストされているラン(あれば)をすべて削除し、"automatically create configuration runs" をクリックすることです。これにより、手動で行うであろう作業が自動的に行われます。ペアレントランを作成して "impl_1" と名付け、次にチャイルドランを作成してお好みの名前を付け、それらを "impl_1" の子にします。

ウィザードは各ランにコンフィギュレーションを自動選択しますが、これは簡単に変更できます。重要なのは、ペアレントランにどのコンフィギュレーションを関連付けるかだけです。

ところで、ウィザードでランをすべて削除すると、チャイルドランはすべて消えますが、impl_1 は残ります。

いよいよ:デザインの実装

ビットストリームを生成するには、いつもどおり Vivado で "Generate Bitstreams" をクリックするだけです。前回の記事で述べたように、部分再構成プロジェクトでは、各コンフィギュレーションにつき 2 つまたは 3 つのビットストリームが作成されます。

たとえば UltraScale FPGA の場合、ビットファイルは次のようになります。

すべての実装で同じ数のビットストリームファイルが作成されることに注意してください。つまり、チャイルド実装でも初期ビットストリームファイルが作成されるので、チャイルド実装の初期ビットストリームで FPGA をロードし、そこから続行することが十分可能です。

部分ビットストリームを PCIe または USB 3.x 経由でロードする簡単な方法については、こちらのページを参照してください。

今回の実装では、Pblock やフロアプランニング全般に関する不具合でクリティカルワーニングが出たり、失敗したりすることはないはずです。そうした問題は先に解決済みのはずだからです。それでも発生した場合は、前述のようにフロアプランニングを修正する必要があります。

ときどき、チャイルド実装にしか変更を加えていないのに "Generate Bitstream" をクリックすると、Vivado が「ビットストリーム生成はすでに完了しており最新です。それでも再実行しますか?」と尋ねることがあります。少し混乱しますが、"Yes" をクリックすればチャイルド実装はきちんと実行されます。チャイルド実装の仕組みは Vivado への後付け的な機能であり、そのため実装中のステータス行に "write_bitstream complete. Child running" のような表示が出ます。

結果の確認

部分再構成は配置の話題が多いので、実装後デザインを確認するのは良い考えです。特定の実装を開くには、右クリックメニューの "Open Implemented Design" を選択し、表示されるサブメニューの "Open Implemented Design"(再び)にカーソルを合わせてから、リストから開きたい実装を選択します。リストに実装がない場合は、おそらくすでに開いています。

実装後デザインビューの Netlist ペインで、リコンフィギャラブルロジックの最上位行を右クリックし、"Highlight Leaf cells" を選択してみてください。次にスタティックロジックにも別の色で同じことを行います。

同じ右クリックメニューには "Show Connectivity" もあります。これは接続されたロジック要素間に真っ直ぐな白線を描画します。FPGA 上の実際の配線経路はもちろん異なるので、これらの線がどのフロアプランニング領域を横切るかに意味はありません。それでも、接続を見ることで、フロアプランの全体的な構成が原因でツールが苦労している箇所を発見できることがあります。

一見スタティックロジックに属するセルがリコンフィギャラブル領域の内側に配置されたり、その逆があったりするのは、ごく普通で問題ありません。注意すべきは、どこかに混雑があるように見える場合です。ロジックが全体的に、または特定の領域で詰め込まれすぎているように見えたら、可能であればフロアプランニングの変更が緩和に役立ちます。

もう 1 つ確認したいのは、パーティションピン(partition pins)の位置です。パーティションピンはデバイスビューで白い水平バーとして表示されます(画像をクリックすると拡大します)。

Partition pins in Vivado's device view

前回の記事で述べたように、パーティションピンはリコンフィギャラブルパーティション内のどこにでも置かれ得ます。しかし、パーティションピンがパーティションの端から離れた場所にある場合は、ペアレント実装中に配線処理がタイミング面で苦労したことを示している可能性があります。

次の Tcl コマンドで、パーティションピンの座標のテキストリストを取得することもできます(pr_block_ins は実際のリコンフィギャラブルロジックセルの名前に置き換えてください)。

foreach s [get_pins -of [get_cells pr_block_ins]] { set partpin [get_pplocs -quiet -pins [get_pins $s]] ; puts "$s => $partpin"; }

パーティションピンの座標は CLB のグリッドに対応しています(スライスのグリッドではありません)。表示される図では、これらのピンは "Cell pins" と呼ばれます。

セルのピンの中には、パーティションピンが割り当てられないものもあります。これは、リコンフィギャラブルモジュールのポートリスト(および/またはベクタの幅)と、スタティックロジックモジュールによるインスタンシエーションとの間に不一致がある場合に発生します。このような不一致は(Verilog では)完全に合法ですが、結果が望ましくないことがあります。上記の Tcl コマンドを実行すると、到達不能なポートを検出できます。特に意図しない不一致の場合に役立ちます。


以上で Vivado プロジェクトをセットアップする技術的な部分は終わりです。ただし、次回では FPGA デザインの重要な側面について説明します:ロジックの置き換えを確実かつスムーズに行う方法です。

このページは英語から機械翻訳されたものです。不明な点があれば、原文を参照してください。
Copyright © 2021-2026. All rights reserved. (dcc38493)