インテルのみ表示可能 — GUID: iti1511996061154
Ixiasoft
3.1.5. 値渡しインターフェイス
CPUをターゲットとするコードの記述に慣れているソフトウェア開発者にとっては、配列内の各要素を値で渡すことは、直感的ではないかもしれません。これは、一般的に、多くの関数呼び出しや大きなパラメーターをもたらすからです。しかし、FPGAをターゲットとするコードでは、配列要素を値渡しすることでFPGA上のハードウェアをより小さくよりシンプルなものにすることができます。
ベクトル加算のコンポーネント例を次のようにコーディングして、ベクトルの配列要素を値渡しします。struct を使用するのは、配列全体 (データ要素8個) を値渡しする必要があるためです。
struct int_v8 { int data[8]; }; component int_v8 vector_add( int_v8 a, int_v8 b) { int_v8 c; #pragma unroll 8 for (int i = 0; i < 8; ++i) { c.data[i] = a.data[i] + b.data[i]; } return c; }
このコンポーネントでは、ベクトル a とベクトル b の8要素のみを受け取って処理し、ベクトル c の8要素を返します。例の1024要素を計算するには、コンポーネントのコールが128回 (1024/8) 必要です。前述の例ではコンポーネントのループがパイプライン処理されましたが、この例ではコンポーネント・コールがパイプライン処理されます。
次の図で示すGraph ViewerのFunction Viewは、この例をコンパイルしたときに生成されるものです。
図 5. 値渡しインターフェイスでの vector_add コンポーネントのGraph Viewer Function View
このコンポーネントのレイテンシーは1です。また、ループ開始間隔 (II) は1です。
このコンポーネントのコンパイルは、 インテル® Quartus® Primeのコンパイルフローを使用して インテル® Arria® 10バイスをターゲットとする場合、その結果は次のQoR メトリックになります。
値渡しインターフェイスでの vector_add コンポーネントのQoRメトリックで示されているとおり、少量のALMが使用され、コンポーネントのfMAX は高く、レイテンシーおよびII値は最適です。この場合、IIはコンポーネントの呼び出し間隔と同じです。コンポーネントの新しい呼び出しの起動は、クロックサイクルごとに行われます。開始間隔が1の場合、128回のコンポーネント・コールが128サイクルで実行されるため、合計レイテンシーは128になります。
QoR メトリック | ポインター | Avalon® MMマスター | Avalon® MMスレーブ | Avalon® ST | 値渡し |
---|---|---|---|---|---|
ALM | 15593.5 | 643 | 490.5 | 314.5 | 130 |
DSP | 0 | 0 | 0 | 0 | 0 |
RAM | 30 | 0 | 48 | 0 | 0 |
fMAX (MHz)2 | 298.6 | 472.37 | 498.26 | 389.71 | 581.06 |
レイテンシー (サイクル) | 24071 | 142 | 139 | 134 | 128 |
開始間隔 (II) (サイクル) | ~508 | 1 | 1 | 1 | 1 |
1QoRメトリックの計算に使用されたコンパイルフローでは、インテル Quartus Prime プロ・エディションのバージョン17.1を使用しています。 |
2fmax の測定値は1シードから計算しています。 |