重要:
hls::axis
(および ap_axiu
/ap_axis
) は、AXI4-Stream プロトコルが最上位関数のインターフェイスでのみサポートされているため、内部関数または変数には使用できません。内部関数または変数については、HLS ストリーム ライブラリ で説明されているとおり hls::stream
オブジェクトを使用する必要があります。AXI4-Stream インターフェイスは、入力引数、配列またはポインター出力引数に使用できます。AXI4-Stream インターフェイスはデータをシーケンシャル ストリーミングで送信するので、読み込みと書き出しの両方を実行する引数に使用できません。データのレイアウトに関しては、AXI4-Stream のデータ型は次のバイトに揃えられます。たとえばデータ型のサイズが 12 ビットの場合、16 ビットに拡張されます。符号付きまたは符号なしのどちらのインターフェイスが選択されているかによって、拡張ビットは符号拡張またはゼロ拡張になります。
ストリーム データ型がユーザー定義の構造体の場合、デフォルト プロシージャーでは、構造体を集約したまま、その構造体を最大のデータ要素のサイズに最も近いバイトに揃えます。この規則の唯一の例外は、構造体に hls::stream
オブジェクトが含まれる場合です。この特殊なケースでは、構造体は分割され、構造体の各メンバー要素に対して AXI ストリームが作成されます。
ヒント: サポートされる最大ポート幅は、集約された構造体や形状変更された配列の場合でも 4096 ビットです。
次のコード例に、構造体のタイプによって、どのようにパックおよびアライメントされるかを示します。次の例に示すように構造体に char 型のみが含まれる場合は、1 バイトのアライメントでパックされ、構造体の合計サイズは 2 ビットになります。
struct A {
char foo;
char bar;
};
次の例に示すように構造体に異なるデータ型の要素が含まれる場合は、最大のデータ要素のサイズに揃えられ、パックされます。要素 bar
は 3 バイトにパディングされ、構造体の合計サイズは 8 バイトになります。
struct A {
int foo;
char bar;
};
重要:
AXI4-Stream インターフェイス (axis) に含まれる構造体はデフォルトで集約され、ストリーム自体の集約は解除できません。構造体のメンバー要素に別々のストリームが必要な場合は、個別の要素として手動でコード化する必要があります。その結果、各要素に別々の axis インタフェースが作成されます。例は、GitHub の Vitis-HLS-Introductory-Examples/Interface/Aggregation_Disaggregation/disaggregation_of_axis_port を参照してください。