pragma HLS bind_op - 2023.2 日本語

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

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

説明

ヒント: このプラグマまたは指示子は、DSP のマルチ演算マッチング (MULADD、AMA、ADDMUL、および該当する減算演算) には関係ありません。実際、演算子を DSP に割り当てる際に BIND_OP を使用すると、HLS コンパイラが複数の演算式をマッチングできなくなることがあります。詳細は、DSP マルチ演算マッチング を参照してください。

Vitis HLS では、コードの演算は特定のインプリメンテーションを使用してインプリメントされます。BIND_OP プラグマは、特定の変数に対し、演算 (muladddiv) を RTL でインプリメンテーション (impl) 用に特定のデバイス リソースにマップする必要があることを指定します。BIND_OP プラグマを指定しない場合、Vitis HLS により演算に使用されるリソースが自動的に判断されます。

たとえば、特定の乗算 (mul) を DSP ではなくデバイス ファブリックにインプリメントするよう指定するため、BIND_OP プラグマを使用できます。

latency オプションを使用して、演算のレイテンシを指定することもできます。

重要: latency オプションを使用するには、使用可能な複数段のインプリメンテーションを演算に含める必要があります。HLS ツールでは、基本的な算術演算 (加算、減算、乗算、除算) およびすべての浮動小数点演算に複数段インプリメンテーションが提供されています。

構文

C ソースの配列変数が定義されている関数の本体内に配置します。

#pragma HLS bind_op variable=<variable> op=<type>\
impl=<value> latency=<int>

説明:

variable=<variable>
BIND_OP プラグマを適用する変数を指定します。この場合の変数は、このプラグマのターゲットである演算の結果が割り当てられた変数のことです。
op=<type>
指定したインプリメンテーション リソースにマップする演算を定義します。サポートされる機能演算は、muladdsub などです。
サポートされる浮動小数点演算は、faddfsubfdivfexpflogfmulfrsqrtfrecipfsqrtdadddsubddivdexpdlogdmuldrsqrtdrecip, dsqrthaddhsubhdivhmul、および hsqrt などです。
ヒント: 浮動小数点演算には、単精度 (f)、倍精度 (d)、および半精度 (h) があります。
impl=<value>
指定した演算に使用するインプリメンテーションを定義します。
機能演算にサポートされるインプリメンテーションは、fabricdsp などです。
浮動小数点演算にサポートされるインプリメンテーションは、fabricmeddspfulldspmaxdspprimitivedsp などです。
注記: primitivedsp は、AMD Versal™ デバイスでのみ使用可能です。
latency=<int>
演算のインプリメンテーションのデフォルト レイテンシを定義します。有効なレイテンシは、op および impl の指定によって異なります。デフォルトは -1 で、Vitis HLS によりレイテンシが選択されます。
次の表に、演算、サポートされるインプリメンテーション、レイテンシの組み合わせを示します。
表 1. サポートされる機能演算、インプリメンテーション、レイテンシの組み合わせ
動作 インプリメンテーション 最小レイテンシ 最大レイテンシ
add fabric 0 4
add dsp 0 4
mul fabric 0 4
mul dsp 0 4
sub fabric 0 4
sub dsp 0 0
ヒント: dcmp などの比較演算子は LUT にインプリメントされるため、ファブリック外部にインプリメントしたり、DSP にマップしたりすることはできません。このため、config_op または bind_op コマンドでは設定できません。
表 2. サポートされる浮動小数点演算、インプリメンテーション、レイテンシの組み合わせ
動作 インプリメンテーション 最小レイテンシ 最大レイテンシ
fadd fabric 0 13
fadd fulldsp 0 12
fadd primitivedsp 0 3
fsub fabric 0 13
fsub fulldsp 0 12
fsub primitivedsp 0 3
fdiv fabric 0 29
fexp fabric 0 24
fexp meddsp 0 21
fexp fulldsp 0 30
flog fabric 0 24
flog meddsp 0 23
flog fulldsp 0 29
fmul fabric 0 9
fmul meddsp 0 9
fmul fulldsp 0 9
fmul maxdsp 0 7
fmul primitivedsp 0 4
fsqrt fabric 0 29
frsqrt fabric 0 38
frsqrt fulldsp 0 33
frecip fabric 0 37
frecip fulldsp 0 30
dadd fabric 0 13
dadd fulldsp 0 15
dsub fabric 0 13
dsub fulldsp 0 15
ddiv fabric 0 58
dexp fabric 0 40
dexp meddsp 0 45
dexp fulldsp 0 57
dlog fabric 0 38
dlog meddsp 0 49
dlog fulldsp 0 65
dmul fabric 0 10
dmul meddsp 0 13
dmul fulldsp 0 13
dmul maxdsp 0 14
dsqrt fabric 0 58
drsqrt fulldsp 0 111
drecip fulldsp 0 36
hadd fabric 0 9
hadd meddsp 0 12
hadd fulldsp 0 12
hsub fabric 0 9
hsub meddsp 0 12
hsub fulldsp 0 12
hdiv fabric 0 16
hmul fabric 0 7
hmul fulldsp 0 7
hmul maxdsp 0 9
hsqrt fabric 0 16

次の例は、関数 foo の変数 c の乗算をインプリメントするのに、ファブリック ロジックを使用する 2 段のパイプライン乗算器を指定します。

int foo (int a, int b) {
int c, d;
#pragma HLS BIND_OP variable=c op=mul impl=fabric latency=2
c = a*b;
d = a*c;
return d;
}
ヒント: 変数 d に使用するインプリメンテーションは、HLS ツールにより決定されます。