FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

コマンドラインからVivado HLSを使用するためのスクリプトテンプレート作成

f:id:msyksphinz:20160601001536p:plain

Vivado HLSで高位合成言語での開発を行うにあたり、これまでどうしてもGUIを使う必要があった。 マウスの操作が必要になりどうしても面倒なので、Vivado HLSでの高位言語合成を一気通貫でやってくれるスクリプトを作成した。

といっても、これまでGUIでやっていたことのログを引っ張ってきて、tclとして保存しているだけである。また各種設定のためのスクリプトもまだ少なく、効率が良いとは言えないので、まだ調整が必要かと思う。

github.com

Vivado-HLSの合成フロー

結局Vivado HLSの合成フローは以下にまとめられる。

github.com

open_project $env(HLS_TARGET)
set_top $env(HLS_TARGET)
add_files $env(HLS_TARGET).cpp
add_files -tb test_$env(HLS_TARGET).cpp -cflags "-DC_SIMULATION"
open_solution $env(HLS_SOLUTION)
set_part {xc7z020clg484-1}
create_clock -period 10 -name default
source "./directives.tcl"
csim_design
csynth_design
# cosim_design
export_design -format ip_catalog

プロジェクトをオープンし、ソースコードの読み込み、テストパタンの読み込み、デバイスの設定。C言語レベルでのシミュレーション(csim)、合成(csynth)、コシミュレーション(cosim)、デザインのIPとしてのエキスポート(export)だ。

これらの一連の流れをテンプレートとして用意しておき、トップデザインとソースコード名を指定してフローを流すだけだ。

fpga_designs/vivado_hls/edge_filter$ make
vivado_hls ../common/script.tcl
================================================================
  Vivado(TM) HLS - High-Level Synthesis from C, C++ and SystemC
  Version 2016.2
  Build 1577090 on Thu Jun 02 16:59:10 MDT 2016
  Copyright (C) 1986-2016 Xilinx, Inc. All Rights Reserved.
================================================================
INFO: [HLS 200-10] Running '/opt/Xilinx/Vivado_HLS/2016.2/bin/unwrapped/lnx64.o/vivado_hls'
INFO: [HLS 200-10] For user 'vagrant' on host 'vagrant-ubuntu-trusty-64' (Linux_x86_64 version 3.13.0-93-generic) on Tue Sep 13 16:50:12 UTC 2016
INFO: [HLS 200-10] On os Ubuntu 14.04.5 LTS
INFO: [HLS 200-10] In directory '/home/vagrant/work/fpga_designs/vivado_hls/edge_filter'
INFO: [HLS 200-10] Creating and opening project '/home/vagrant/work/fpga_designs/vivado_hls/edge_filter/edge_filter'.
INFO: [HLS 200-10] Adding design file 'edge_filter.cpp' to the project
INFO: [HLS 200-10] Adding test bench file 'test_edge_filter.cpp' to the project
INFO: [HLS 200-10] Creating and opening solution '/home/vagrant/work/fpga_designs/vivado_hls/edge_filter/edge_filter/normal'.
INFO: [HLS 200-10] Setting target device to 'xc7z020clg484-1'
INFO: [SYN 201-201] Setting up clock 'default' with a period of 10ns.
make[1]: Entering directory `/home/vagrant/work/fpga_designs/vivado_hls/edge_filter/edge_filter/normal/csim/build'
   Compiling ../../../../test_edge_filter.cpp in debug mode
   Compiling ../../../../edge_filter.cpp in debug mode
   Generating csim.exe
make[1]: Leaving directory `/home/vagrant/work/fpga_designs/vivado_hls/edge_filter/edge_filter/normal/csim/build'
...
INFO: [SIM 211-1] CSim done with 0 errors.
INFO: [HLS 200-10] Analyzing design file 'edge_filter.cpp' ...
INFO: [HLS 200-10] Validating synthesis directives ...
INFO: [HLS 200-10] Starting code transformations ...

例として、edge_filter.cppを合成するフローを添付している。makeを叩くと、edge_filter/normal/syn にAXIの足回りを持ったVerilog/VHDLデザインを作成する。

また、最適化のためのディレクティブはdirectives.tclに格納されており、ここではAXIの足回りを一つに統一するための記述を行っている。これはデザイン毎に用意する。

github.com

set_directive_interface -mode s_axilite -bundle slv0 "edge_filter"
set_directive_interface -mode s_axilite -bundle slv0 "edge_filter" image_in
set_directive_interface -mode s_axilite -bundle slv0 "edge_filter" image_out

合成結果は、edge_filter/normal/syn/verilog/edge_filter.vに格納される。

module edge_filter (
        ap_clk,
        ap_rst_n,
        s_axi_slv0_AWVALID,
        s_axi_slv0_AWREADY,
        s_axi_slv0_AWADDR,
        s_axi_slv0_WVALID,
        s_axi_slv0_WREADY,
        s_axi_slv0_WDATA,
        s_axi_slv0_WSTRB,
        s_axi_slv0_ARVALID,
        s_axi_slv0_ARREADY,
        s_axi_slv0_ARADDR,
        s_axi_slv0_RVALID,
        s_axi_slv0_RREADY,
        s_axi_slv0_RDATA,
        s_axi_slv0_RRESP,
        s_axi_slv0_BVALID,
        s_axi_slv0_BREADY,
        s_axi_slv0_BRESP,
        interrupt
);
...

まだテンプレートとしては貧弱なので、少しずつ改良していこう。