構造体 - 2023.2 日本語

Vitis 高位合成ユーザー ガイド (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語

内部変数およびグローバル変数などの構造体は、デフォルトで各メンバー要素の個別のオブジェクトに分割されます。作成される要素の数とタイプは、その構造体の内容によって決まります。構造体の配列は、複数の配列 (構造体の各メンバーに別々の配列) としてインプリメントされます。

重要: 最上位関数への引数として使用される構造体は、インターフェイスの構造体 に説明されているように、デフォルトで集約されます。

または、AGGREGATE プラグマまたは指示子を使用して、構造体のすべての要素を 1 つの幅の広いベクターにまとめるともできます。これにより、構造体のすべてのメンバーを同時に読み出しおよび書き込みできます。集約された構造体は、構造体のパディングとアライメント に説明するように、4 バイト境界に要素を揃えるため、必要に応じてパディングされます。構造体のメンバー要素は C/C++ コードに記述されている順序でベクターに配置されます (構造体の最初の要素がベクターの LSB に、最後の要素がベクターの MSB に配置される)。構造体の配列は個別の配列要素に分割され、下位から上位の順のベクターに配置されます。

ヒント: 大きな配列を含む構造体に AGGREGATE プラグマを使用する際には注意が必要です。配列に int 型の要素が 4096 個含まれる場合、ベクター (およびポート) の幅は 4096 * 32 = 131072 ビットになります。この RTL デザインは Vitis HLS で作成できますが、Vivado ツールでのインプリメンテーションでこれを配線できることはほとんどありません。

単一幅のベクターを AGGREGATE 指示子を使用して作成した場合、1 クロック サイクルでより多くのデータにアクセスできるようになります。データが 1 クロック サイクルでアクセスできると、このデータを消費するループを展開してスループットが改善される場合にのみ、Vitis HLS でこれらのループが自動的に展開されます。ループを完全または部分展開すると、1 クロック サイクルでこれらの追加データを消費するのに十分なハードウェアを作成できます。この機能は、syn.unroll.tripcount_threshold コンフィギュレーション コマンドを使用して制御します (展開設定 を参照)。

次の例では、展開するとスループットが改善される場合にのみトリップカウントが 16 未満のループが自動的に展開されます。

syn.unroll.tripcount_threshold=16

構造体に配列が含まれる場合、AGGREGATE 指示子により ARRAY_RESHAPE プラグマと同様の処理が実行され、再形成された配列が構造体内のほかの要素とまとめられます。ただし、構造体は AGGREGATE を使用して最適化した後に分割または再形成することはできません。AGGREGATE、ARRAY_PARTITION、および ARRAY_RESHAPE 指示子は一緒には使用できません。