Vivado HLSで作ったAXI4-Lite IPの組込み

FPGA

Vivado HLSで作成したIPコアで気になるのは、次の点です。

  • 本当にHLSで指定した動作周波数で配置配線ができるのか?(本当にタイミング収束するのか?)

なぜこのような点が気になるかというと、従来のASICやFPGAの論理合成ツールでは、実際の配置配線でタイミングが収束しないことが多かったからです(論理合成の時点では配線遅延が確定していないため仕方ありませんが)。Vivado HLSの場合はどうでしょうか。Vivadoに組み込んで確認しました。

Vivado HLSで作成したIP

実験用に作成したのは、簡単な32ビット浮動小数点の乗算器です。ターゲット周波数は200MHzとしました。

  • インターフェース:AXI4-Lite
  • ターゲット周波数:200MHz
  • デバイス:xc7z020clg484-1

Cコードは次のとおりです。

void float_top(float a, float b, float *c)
{
  *c =  a * b;
}

また、Directiveは次のとおりです。Interfaceにs_axiliteを指定しています。

set_directive_interface -mode s_axilite "float_top" a
set_directive_interface -mode s_axilite "float_top" b
set_directive_interface -mode s_axilite "float_top" c
set_directive_interface -mode s_axilite "float_top"
set_directive_pipeline "float_top"

高位合成の結果は、200MHz(5ns)の要求を満たしています。

Clock Target Estimated Uncertainty
ap_clk  5.00  4.35  0.63

Vivadoへの組込み

Vivado HLSのExport RTLでIP Catalog用のデータを生成し、Vivadoに組み込みます。ターゲットボードはZedBoardを使用しました。

IP Catalogの設定

Vivadoで新しいProjectを作成し、Create Block Designで新しいDesignを作成します。次に、DiagramのIP SettingsアイコンをクリックしてProject Settingsウィンドウを開き、Repository ManagerにVivado HLSで生成したIPのパスを追加します。

Block DesignのIP Settings

Block DesignのIP Settings

システムの作成

Block Designでprocessing_system7をインスタンス化し、M_AXI_GP0にVivado HLSで生成したIPコアfloat_topを接続します。この時、M_AXI_GP0のプロトコルはAXI3なので、float_topのAXI4-Liteとは直接接続することができません。このため、中間にaxi_protocol_converterを挿入します。

AXIの接続

AXIの接続

クロックの設定

AXIのクロックは、processing_system7のFCLK_CLK0出力を使用しました。周波数は、Vivado HLSの設定に合わせて200MHzとしました。

クロック設定

クロック設定

合成と配置配線

通常の開発フローに従って、SynthesisとImplementationを実行します。

結果

Implementationのレポートを確認すると、問題なく200MHzで配置配線を完了しました。SetupのWNSは0.298nsでした。

Timing Summary

Timing Summary

まとめ

Vivado HLSで指定したクロック周期は、実際にVivadoの配置配線でタイミング違反無しで収束しました(今回のデザインが非常に簡単なものだったからというのも関係しているかも知れませんが)。

タイトルとURLをコピーしました