Vivado HLSで高位合成言語での開発を行うにあたり、これまでどうしてもGUIを使う必要があった。 マウスの操作が必要になりどうしても面倒なので、Vivado HLSでの高位言語合成を一気通貫でやってくれるスクリプトを作成した。
といっても、これまでGUIでやっていたことのログを引っ張ってきて、tclとして保存しているだけである。また各種設定のためのスクリプトもまだ少なく、効率が良いとは言えないので、まだ調整が必要かと思う。
Vivado-HLSの合成フロー
結局Vivado HLSの合成フローは以下にまとめられる。
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の足回りを一つに統一するための記述を行っている。これはデザイン毎に用意する。
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 ); ...
まだテンプレートとしては貧弱なので、少しずつ改良していこう。