今まで、Vitis のアクセラレーション・プラットフォームのC/C++ カーネルを実装してきたが、RTL カーネルもやってみようと思う。RTL カーネルの作成条件について見ていこう。
なお、C/C++ カーネルを作っていると、性能やクリティカルパスなどの情報が無いかもしくは、分かりにくい。そこで、Vivado HLS でC/C++ コードを合成して RTLカーネルを作成して、それをVitis で使っても良いのでは?と思っている。
Vitis Unified Software Development Platform Documentation の
Vitis Application Acceleration Development Flow Documentation の
Developing Applications の
RTL 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カーネルインターフェイスとポートの要件ポートまたはインターフェース

結局、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 のチェックボックスをチェックする。

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 に変更する。

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

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

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