【Vivado HLS】平均計算を高位合成する(インタフェース合成 ap_ctrl_hs/ap_vld/ap_ovld)

前回は高位合成したモジュールのシミュレーション波形を表示するところまで行いました。

【Vivado HLS】平均計算を高位合成する(C合成~C/RTL協調シミュレーション)

前回表示した波形を分かりやすく並び替えてみました。

Vivado HLS 高位合成 インタフェース合成

この波形はブロックの入出力ポートの動作を表しています。しかし、関数の引数として指定した名前のポートもあれば、自動生成されているポートもあります。このポート生成は、ブロックのI/Fを決定する”インターフェイス合成”により行われます。

インターフェイス合成

インターフェイス合成のレベルは以下のように分類されます。

I/F合成レベル 説明
ブロックレベルI/F ブロック全体に対する制御を行うI/F。動作開始や終了のタイミング、入力可能かを判断するために使用。ブロックで1つ指定する。
ポートレベルI/F 高位合成対象の関数引数のI/F。 引数毎の動作タイミングを制御するために使用。引数毎に指定。

前回は何も指定していなかったため、以下のような指定となっていました。ポインタを出力として使用するとデフォルトでap_ovldになるようです。

I/F合成レベル 引数 プロトコル
ブロックレベルI/F ap_ctrl_hs
ポートレベルI/F data0 ap_none
data1 ap_none
*ave ap_ovld
  • ap_ctrl_hs
    信号 説明
    ap_clk クロック信号
    ap_rst Active Highのap_clk同期リセット
    ap_start 動作開始
    ap_done 処理終了
    ap_idle アイドル状態
    ap_ready データ入力可能かを示す
  • ap_vld/ap_ovld
    ap_vldとap_ovldは引数を入出力のどちらとして使用しているかで指定が変わります。I/F信号としてはどちらも名前は”ap_vld”、意味も”有効データを示す”で同じのようです。

    信号 説明
    ap_vld データ有効期間
  • ap_none
    ap_noneはインタフェースはなく、データのみとなります。
  • それぞれの細かい動作仕様は”UG902:Vivado Design Suite ユーザーガイド((v2016.1)2016年4月6日版)”の”4:高位合成リファレンスガイド-インターフェイス合成リファレンス”に記載があります。ユーザーガイドの最新版は以下からダウンロードできます。

    Xilinx – Vivado HLS(高位合成)

    ここまでを踏まえて先ほどの波形を見てみると、何点か気になる点があります。

  • ap_rst/ap_clkがない。組み合わせ回路で組んでいる状態になっているため。
  • 入力信号にap_vldがない。どのデータが有効か判断がつかない。
  • 上の点を改善してみたいと思います。

    インターフェイス指定をする

    ソリューションの新規作成

    インターフェイス合成ではソースコードの変更はせず、Vivado HLSに対する指定のみを変更します。そのような場合、ソリューションの新規作成を行い、新しいソリューションに対して変更を加えます。これにより、各設定でのコンパイル結果を簡単に比較でき、リソースや性能を決定するときに便利なのです。

    Explorerエリアでプロジェクト名”average”を右クリック。”New Solution”を選択します。

    Vivado HLS 高位合成 solution

    “Solution Wizard”が開くので、適当な名前をつけます。”Options”のチェックをつけて、前回作成したソリューションのコピーとして新規作成します。これでExplorerエリアに新しいソリューションが追加され、アクティブ化されます。

    Vivado HLS 高位合成 solution

    Vivado HLS 高位合成 solution

    ディレクティブ指定

    インターフェイスは、C言語の文法としてはディレクティブで指定します。Vivado HLSはこのディレクティブを解釈して回路へ合成するわけですね。

    ディレクティブ – Wikipedia

    まずdata0のインターフェイスを指定します。Cソースを表示した状態で、デフォルトでは画面右側にある”Directive”タブにてdata0を右クリック。”Insert Directive…”を選択します。

    Vivado HLS 高位合成 インターフェイス合成

    “Vivado HLS Directive Editor”が開きます。今回は以下のように指定しました。画像中に簡単な説明も記載しています。

    Vivado HLS 高位合成 インターフェイス合成

    同様にdata1,aveもディレクティブ指定します。aveのインターフェイスは”ap_ovld”を指定します。指定し終わった”Directive”タブの状態が下画像です。

    Vivado HLS 高位合成 インターフェイス合成 ディレクティブ

    インターフェイス指定後の波形

    下画像がインターフェイス指定を行い、合成を行った結果の波形です。クロック同期で各信号が動作し、入力信号にvalid信号が追加されました。出力信号に対するvalidが3クロックに1回動作していますが、レジスタ導入により1回の入力に対する結果出力までに3クロックかかるようになったということですね。

    Vivado HLS 高位合成 シミュレーション波形

    これで先の問題点が改善できました。ap_startがアサートされっぱなしの理由がよく分かっていませんが、テストベンチ側の問題だと思うのでとりあえず気にしません。

    シェアする

    • このエントリーをはてなブックマークに追加

    フォローする