説明
デフォルトでは次のようになります。
- 関数は、RTL では個別の階層ブロックとして残るか、上位レベルの関数に分解 (インライン展開) されます。
- 同じ階層レベルにある関数のすべてのインスタンスは、同じ RTL インプリメンテーション (ブロック) を使用します。
syn.directive.function_instantiate
コマンドは、関数のインスタンスに固有の RTL インプリメンテーションを作成し、各インスタンスが特定の引数または変数に最適化できるようにします。
デフォルトでは、次のコードの場合、3 つのインスタンスすべてに対して func_sub
関数の RTL インプリメンテーションが 1 つ作成されるか、func_sub
が小さい関数の場合は、func
関数にインライン展開されます。
ヒント: デフォルトでは、Vitis HLS ツールは自動的に小さな関数をインライン展開します。これは、関数のインスタンシエーションでも同様です。
set_directive_inline off
オプションを使用すると、この自動インライン展開が実行されないようにできます。char func_sub(char inval, char incr)
{
return inval + incr;
}
void func(char inval1, char inval2, char inval3,
char *outval1, char *outval2, char * outval3)
{
*outval1 = func_sub(inval1, 1);
*outval2 = func_sub(inval2, 2);
*outval3 = func_sub(inval3, 3);
}
下の例に示す方法でこの指示子を使用すると、3 つのバージョンの関数 func_sub
が作成され、変数 incr
に対してそれぞれが個別に最適化されます。
構文
syn.directive.function_instantiate=<location> <variable>
-
<location>
: 関数の固有のインスタンスを作成する場所をfunction[/region label]
の形式で指定します。 -
<variable>
は、さまざまな関数のインスタンシエーションで定数として指定する関数引数を指定します。
オプション
このコマンドにはオプションはありません。
例
先ほどの例は、次の Tcl (または関数 func_sub
に配置されたプラグマ) により、関数 func_sub
の各インスタンスが入力 incr
に対して個別に最適化されるようにしています。
syn.directive.inline off=func_sub
syn.directive.function_instantiate=func_sub incr