FC2カウンター FPGAの部屋 Vitis のRTL カーネル
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Vitis のRTL カーネル

今まで、Vitis のアクセラレーション・プラットフォームのC/C++ カーネルを実装してきたが、RTL カーネルもやってみようと思う。RTL カーネルの作成条件について見ていこう。
なお、C/C++ カーネルを作っていると、性能やクリティカルパスなどの情報が無いかもしくは、分かりにくい。そこで、Vivado HLS でC/C++ コードを合成して RTLカーネルを作成して、それをVitis で使っても良いのでは?と思っている。

Vitis Unified Software Development Platform Documentation
Vitis Application Acceleration Development Flow DocumentationDeveloping ApplicationsRTL Kernels を見ていこう。

Vitisコア開発キットの各ハードウェアカーネルは、Xilinxオブジェクト(.xo)ファイルに個別にコンパイルされるそうだ。 .xo ファイルはVivado HLS 2019.2 で出力することができる。 .xo ファイルは、FPGA実行可能ファイル(xclbin)にリンクするためのアプリケーションプロジェクトに結合できるそうだ。

RTL Kernels の Table 1. RTL Kernel Interface and Port Requirements をChrome で翻訳したものを引用する。

表1. RTLカーネルインターフェイスとポートの要件ポートまたはインターフェース
RTL_kernel_1_191228.png

結局、Vitis のC/C++ カーネルを書く制約とほとんど一緒で、AXI4 Master を 64 ビット・アドレスにすれば良いということみたいだ。
Vivado HLS でAXI4 Master を 64 ビット・アドレスにするには、

config_interface -m_axi_addr64

オプションを入れれば良い。
GUI でやるには、Solution メニューから Solution Settings... を選択する。
左のペインのGeneral で、config_interface が無い場合は、Add... ボタンをクリックして、ある場合はEdit... ボタンをクリックして、
m_axi_addr64 のチェックボックスをチェックする。
RTL_kernel_2_191228.png

Table 2. Address Map、Table 3. Control (0x0)、Table 5. IP Interrupt Enable (0x8)、Table 6. IP Interrupt Status (0xC)はVivado HLS のVerilog HDL 出力のAXI4 Lite のレジスタマップそのままだ。
lap_filter_axis_dma.cpp のAXI4 Lite Slave のマップを示す。

//------------------------Address Info-------------------
// 0x00 : Control signals
//        bit 0  - ap_start (Read/Write/COH)
//        bit 1  - ap_done (Read/COR)
//        bit 2  - ap_idle (Read)
//        bit 3  - ap_ready (Read)
//        bit 7  - auto_restart (Read/Write)
//        others - reserved
// 0x04 : Global Interrupt Enable Register
//        bit 0  - Global Interrupt Enable (Read/Write)
//        others - reserved
// 0x08 : IP Interrupt Enable Register (Read/Write)
//        bit 0  - Channel 0 (ap_done)
//        bit 1  - Channel 1 (ap_ready)
//        others - reserved
// 0x0c : IP Interrupt Status Register (Read/TOW)
//        bit 0  - Channel 0 (ap_done)
//        bit 1  - Channel 1 (ap_ready)
//        others - reserved
// 0x10 : Data signal of inm
//        bit 31~0 - inm[31:0] (Read/Write)
// 0x14 : Data signal of inm
//        bit 31~0 - inm[63:32] (Read/Write)
// 0x18 : reserved
// 0x1c : Data signal of outm
//        bit 31~0 - outm[31:0] (Read/Write)
// 0x20 : Data signal of outm
//        bit 31~0 - outm[63:32] (Read/Write)
// 0x24 : reserved
// 0x28 : Data signal of x_size
//        bit 31~0 - x_size[31:0] (Read/Write)
// 0x2c : reserved
// 0x30 : Data signal of y_size
//        bit 31~0 - y_size[31:0] (Read/Write)
// 0x34 : reserved
// (SC = Self Clear, COR = Clear on Read, TOW = Toggle on Write, COH = Clear on Handshake)


Packaging the RTL Code as Vivado IP はVivado HLS でIP 化するならば問題ないはず。

Creating the Kernel Description XML File では kernel.xml を生成する必要がある。
Vivado HLS で kernel.xml を生成するためには、

config_sdx -target xocc

オプションを入れれば良い。
GUI でやるには、Solution メニューから Solution Settings... を選択する。
左のペインのGeneral で、 config_sdx が無い場合は、Add... ボタンをクリックして、ある場合はEdit... ボタンをクリックして、Parameters の target を選択して、xocc に変更する。
RTL_kernel_3_191228.png

これで、C コードの合成とExport RTL を行うと solution1/impl/kernel ディレクトリの下に、kernel.xml が生成された。
RTL_kernel_4_191228.png

ただし、トップの関数にはVitis のC/C++ カーネルを作成するための制約と同じルールを適用する必要があるようだ。
トップ関数の返り値は void で、関数全体を extern "C" { } で囲う必要がある。
RTL_kernel_8_191228.png

lap_filter_axis_dma.cpp を Vivado HLS 2019.2 で合成し、Export RTL した時の kernel.xml を示す。
RTL_kernel_5_191228.png
  1. 2019年12月28日 16:58 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/4746-210de9e7
この記事にトラックバックする(FC2ブログユーザー)