インテル®高位合成 (HLS) コンパイラー プロ・エディション: ベスト・プラクティス・ガイド

ID 683152
日付 12/16/2019
Public
ドキュメント目次

3.1.4. Avalon® Streaming インターフェイス

Avalon® Streaming (Avalon ST) インターフェイスでは、データの単方向フローをサポートします。また、通常使用されるのは、高帯域幅および低レイテンシー・データを駆動するコンポーネントです。

ベクトル加算コンポーネント例のコーディングは、 Avalon® STインターフェイスを使用し、次のように行います。
struct int_v8 {
  int data[8];
};
component void vector_add(
    ihc::stream_in<int_v8>&  a,
    ihc::stream_in<int_v8>&  b,
    ihc::stream_out<int_v8>& c,
    int N) {
  for (int j = 0; j < (N/8); ++j) {
    int_v8 av = a.read(); 
    int_v8 bv = b.read(); 
    int_v8 cv; 
    #pragma unroll 8
    for (int i = 0; i < 8; ++i) {
      cv.data[i] = av.data[i] + bv.data[i];
    }
    c.write(cv);
  }
}

Avalon® STインターフェイスには、データバス、およびハンドシェイクのためのready信号とbusy信号があります。struct は、8つの整数をパックするように生成され、一度に8演算を並列処理して、他のインターフェイスの例と比較できます。同様に、ループカウントは8で除算されます。

次の図で示すGraph ViewerのFunction Viewは、この例をコンパイルしたときに生成されるものです。
図 4.  Avalon® STインターフェイスでの vector_add コンポーネントのGraph Viewer Function View


他のバージョンのコンポーネント・サンプルとの主な違いは、メモリーがないことです。

ストリーミング・インターフェイスは、アップストリーム・ソースおよびダウンストリーム出力からストール可能です。インターフェイスがストール可能なため、ループの開始間隔 (II) の値は約1 (正確に1ではない ) です。コンポーネントで、アップストリームからのバブル (データフロー内のギャップ)またはダウンストリームからのstall信号の受け取りがない場合 、コンポーネントでは望ましいII = 1を達成します。

ストリーム・インターフェイスがストールしないことが分かっている場合は、このコンポーネントをさらに最適化することができます。このためには、 usesReady および usesValid ストリーム・パラメーターを活用します。

このコンポーネントのコンパイルは、 インテル® Quartus® Primeのコンパイルフローを使用して インテル® Arria® 10 デバイスをターゲットとする場合、その結果は次のQoRメトリックになります。
表 5.   Avalon® STインターフェイスでのQoRメトリックの比較1
QoR メトリック ポインター Avalon® MMマスター Avalon® MMスレーブ Avalon® ST
ALM 15593.5 643 490.5 314.5
DSP 0 0 0 0
RAM 30 0 48 0
fMAX (MHz)2 298.6 472.37 498.26 389.71
レイテンシー (サイクル) 24071 142 139 134
開始間隔 (II) (サイクル) ~508 1 1 1
1QoRメトリックの計算に使用されたコンパイルフローでは、インテル Quartus Prime プロ・エディションのバージョン17.1を使用しています。
2fmax の測定値は1シードから計算しています。
vector_add コンポーネントを Avalon® STインターフェイスに移動すると、ALM使用量、RAM使用量、およびコンポーネント・レイテンシーがさらに改善されます。コンポーネントIIが最適な状態になるのは、インターフェイスからのストールがない場合です。