説明
2 つ以上の M_AXI ポインター引数が、同じメモリ バッファー (DDR または HBM) をポイントしていることを指定します。ポインター間のエイリアス関係は、それらの間の距離やオフセットを設定することで示します。
重要:
syn.directive.alias は、M_AXI インターフェイスにマップされた最上位の関数引数に適用します。
Vitis HLS は、異なるポインターを独立したチャネルと判断し、通常は依存解析を実行しません。ただし、ホストが複数のポインター用に単一のバッファーを割り当てる場合、この関係は syn.directive.alias を使用して伝達できます。この方法で伝達することで依存関係解析が維持されます。さらに、syn.directive.alias を使用すると、バッファー内のポインター間の距離をが定義され、Vitis HLS でデータ依存解析ができるようになります。
syn.directive.alias の要件:
- すべてのポートを
M_AXIインターフェイスに割り当て、異なるバンドルに設定する必要があります (詳細は次の例を参照)。 - 各ポートは
syn.directive.aliasコマンドで一度しか使用できません。 -
syn.directive.aliasに割り当てられたすべてのポートが、同じ深さである必要があります。 - オフセットを指定する場合、各ポートには 1 つのオフセットを設定できます。
-
M_AXIポートのオフセットは、slaveまたはdirectとして指定する必要があります。offset=offはサポートされません。
構文
syn.directive.alias=[OPTIONS] <location> <ports>
-
<location>は、ALIAS プラグマが適用されるfunction[/label]形式の場所を示す文字列です。 -
<ports>はそのポートをエイリアスに指定します。
オプション
-
distance=<integer> - リスト内のポートに渡されるポインター値の差を指定します。
-
offset=<string> - 配列の原点を基準にして、
portsリストで各ポートに渡されるポインターのオフセットを指定します。
例
次の top 関数の場合:
void top(int *arr0, int *arr1, int *arr2, int *arr3, ...) {
#pragma HLS interface M_AXI port=arr0 bundle=hbm0 depth=0x40000000
#pragma HLS interface M_AXI port=arr1 bundle=hbm1 depth=0x40000000
#pragma HLS interface M_AXI port=arr2 bundle=hbm2 depth=0x40000000
#pragma HLS interface M_AXI port=arr3 bundle=hbm3 depth=0x40000000
次のコマンドは、指定された配列ポインターのエイリアスを定義し、その間の
distance を定義します。syn.directive.alias=top arr0,arr1,arr2,arr3 distance=10000000
または、次のコマンドでポインター間の
offset を指定して、同じ設定にします。syn.directive.alias=top arr0,arr1,arr2,arr3 offset=00000000,10000000,20000000,30000000