合成を実行すると、クロックで指定されたタイミング制約、ターゲット デバイスで指定された遅延、ユーザーが指定した指示子に基づいて、Vitis HLS でコードのさまざまな演算子をインプリメントするのに使用するハードウェア インプリメンテーションが決定されます。たとえば、乗算をインプリメントする場合、Vitis HLS で組み合わせ乗算器が使用されることもあれば、パイプライン乗算器が使用されることもあります。
合成中に演算子にマップされるインプリメンテーションは、演算子と同様に、ALLOCATION プラグマまたは指示子を指定して制限できます。乗算演算子の総数を制限する代わりに、組み合わせ乗算器コアの数を制限して、残りの乗算がパイプライン乗算器を使用して実行されるようにすることもできます (逆も可能)。
BIND_OP または BIND_STORAGE プラグマまたは指示子を使用すると、特定の演算またはストレージ タイプにどのインプリメンテーションを使用するかを明示的に指定できます。次のコマンドは、Vitis HLS に変数 c
にファブリック ロジックの 2 段パイプライン乗算器を使用するよう指示します。変数 d
にどのインプリメンテーションを使用するかは、Vitis HLS で決定されます。
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;
}
次の例は、BIND_OP プラグマを使用して、変数 temp
の加算を dsp
インプリメンテーションを使用してインプリメントすることを指定します。これにより、最終的なデザインでこの演算が DSP モジュール プリミティブを使用してインプリメントされるようになります。デフォルトでは、加算は LUT を使用してインプリメントされます。
void apint_arith(dinA_t inA, dinB_t inB,
dout1_t *out1
) {
dout2_t temp;
#pragma HLS BIND_OP variable=temp op=add impl=dsp
temp = inB + inA;
*out1 = temp;
}
演算またはストレージ タイプに指定可能なインプリメンテーションの詳細は、BIND_OP または BIND_STORAGE プラグマまたは指示子を参照してください。
次の例は、BIND_OP プラグマを使用して、out1
の乗算を 3 段パイプライン乗算器を使用してインプリメントすることを指定します。
void foo(...) {
#pragma HLS BIND_OP variable=out1 op=mul latency=3
// Basic arithmetic operations
*out1 = inA * inB;
*out2 = inB + inA;
*out3 = inC / inA;
*out4 = inD % inA;
}
複数の同じ演算子が指定されている場合、各演算子で制御される変数が 1 つになるようにコードを変更する必要があります。たとえば次のコードで、最初の乗算 (inA * inB
) のみをパイプライン乗算器を使用してインプリメントするとします。
*out1 = inA * inB * inC;
この場合、このコードを次のように変更し、Result_tmp
変数にプラグマを指定する必要があります。
#pragma HLS BIND_OP variable=Result_tmp op=mul latency=3
Result_tmp = inA * inB;
*out1 = Result_tmp * inC;