インテルのみ表示可能 — GUID: fkr1550767758400
Ixiasoft
4.1. ループでの呼び出しによるハードウェアの再利用
ループは、ハードウェアを再利用する便利な方法です。コンポーネント関数で別の関数をコールすると、コールされた関数はトップレベルのコンポーネントになります。関数を複数回コールすると、ハードウェアが重複します。
例えば、次のコード例では、関数 foo 複数のハードウェアコピーがコンポーネント myComponent 内に作成されます。これは、関数 foo がインライン化されているためです。
int foo(int a) { return 4 + sqrt(a) / } component void myComponent() { ... int x = x += foo(0); x += foo(1); x += foo(2); ... }
関数 foo をループ内に配置すると、 foo のハードウェアの再利用が呼び出しごとにできます。関数は引き続きインライン化されますが、インライン化されるのは1回だけです。
component void myComponent() { ... int x = 0; #pragma unroll 1 for (int i = 0; i < 3; i++) { x += foo(i); } ... }
switch/case ブロックを使用することもできます。ただしこれは、再利用可能な関数の異なる値のうちループ誘導変数 i に関連しないものを渡す場合のみです。
component void myComponent() { ... int x = 0; #pragma unroll 1 for (int i = 0; i < 3; i++) { int val = 0; switch(i) { case 0: val = 3; break; case 1: val = 6; break; case 2: val = 1; break; } x += foo(val); } ... } H
ハードウェアの再利用とインラインの最小化ついては、リソース共有チュートリアルを参照してください。これは、次のウェブサイトで入手可能です。 <quartus_installdir>/hls/examples/tutorials/best_practices/resource_sharing_filter