説明
ヒント: このプラグマまたは指示子は、DSP のマルチ演算マッチング (MULADD、AMA、ADDMUL、および該当する減算演算) には関係ありません。実際、演算子を DSP に割り当てる際に BIND_OP を使用すると、HLS コンパイラが複数の演算式をマッチングできなくなることがあります。詳細は、DSP マルチ演算マッチング を参照してください。
Vitis HLS では、コードの演算は特定のインプリメンテーションを使用してインプリメントされます。set_directive_bind_op
コマンドは、特定の変数に対し、演算 (mul
、add
、sub
) を RTL でのインプリメンテーションで特定のデバイス リソース (impl
) にマップする必要があることを指定します。このコマンドを指定しない場合、Vitis HLS により使用するリソースが自動的に判断されます。
たとえば、特定の乗算 (mul
) を DSP ではなくデバイス ファブリックにインプリメントするよう指定するには、set_directive_bind_op
コマンドを使用できます。
-latency
オプションを使用して、演算のレイテンシを指定することもできます。
重要:
-latency
オプションを使用するには、使用可能な複数段のインプリメンテーションを演算に含める必要があります。HLS ツールでは、基本的な算術演算 (加算、減算、乗算、除算) およびすべての浮動小数点演算に複数段インプリメンテーションが提供されています。構文
set_directive_bind_op [OPTIONS] <location> <variable>
-
<location>
: 変数を含める場所をfunction[/label]
の形式で指定します。 -
<variable>
: 割り当てる変数を指定します。この場合の変数は、この指示子のターゲットである演算の結果が割り当てられた変数のことです。
オプション
-
-op <value>
- 指定したインプリメンテーション リソースにマップする演算を定義します。サポートされる機能演算は、
mul
、add
、sub
などです。 -
-impl <value>
- 指定した演算に使用するインプリメンテーションを定義します。
-
-latency <int>
- 演算のインプリメンテーションのデフォルト レイテンシを定義します。有効なレイテンシは、
op
およびimpl
の指定によって異なります。デフォルトは -1 で、Vitis HLS によりレイテンシが選択されます。
動作 | インプリメンテーション | 最小レイテンシ | 最大レイテンシ |
---|---|---|---|
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
コマンドでは設定できません。動作 | インプリメンテーション | 最小レイテンシ | 最大レイテンシ |
---|---|---|---|
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;
c = a*b;
d = a*c;
return d;
}
set_directive
コマンドは次のとおりです。set_directive_bind_op -op mul -impl fabric -latency 2 "foo" c
ヒント: 変数
<d>
に使用するコアは、HLS ツールにより決定されます。