FC2カウンター FPGAの部屋 2019年12月28日
FC2ブログ

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

FPGAの部屋

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

Vivado HLS の GUI コマンド実行履歴を TCL 実行スクリプトにする

今のところ、私はほとんどVivado HLS をGUI で操作しているが、TCL スクリプトで動作させることもできる。
GUI でやった履歴を TCL スクリプトにする機能が Vivado HLS にはある。
それは、 solution? -> script.tcl だ。
RTL_kernel_6_191228.png

script.tcl は solution? ディレクトリの下にある。
RTL_kernel_7_191228.png

lap_filter_axis_dma.cpp を合成して、Export RTL した時の TCL スクリプトを貼っておく。

############################################################
## This file is generated automatically by Vivado HLS.
## Please DO NOT edit it.
## Copyright (C) 1986-2019 Xilinx, Inc. All Rights Reserved.
############################################################
open_project lap_filter_axis_dma
set_top lap_filter_axis_dma
add_files lap_filter_axis_dma/lap_filter_axis_dma.cpp
open_solution "solution1"
set_part {xczu3cg-sbva484-1-e}
create_clock -period 10 -name default
config_export -format ip_catalog -rtl verilog -vivado_optimization_level 0 -vivado_phys_opt none -vivado_report_level 0 -xo /home/masaaki/Vivado_HLS/Ultra96/test/lap_filter_axis_dma.xo
config_interface   -m_axi_addr64 -m_axi_offset off -register_io off -trim_dangling_port=0
config_sdx -target xocc
config_compile -name_max_length 80 -pipeline_loops 64
config_schedule -enable_dsp_full_reg
#source "./lap_filter_axis_dma/solution1/directives.tcl"
#csim_design
csynth_design
#cosim_design
export_design -rtl verilog -format ip_catalog -xo /home/masaaki/Vivado_HLS/Ultra96/test/lap_filter_axis_dma.xo


この TCL スクリプトを実行する時は、
vivado_hls -f script.tcl
とする。
  1. 2019年12月28日 17:09 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

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