2
2

More than 5 years have passed since last update.

フィボナッチを求める回路をVivado-HLSとMessagePack-RPCでFPGAに実装してみた(シミュレーション編)

Last updated at Posted at 2015-12-03

はじめに

Vivado-HLSはXilinx社が提供している高位合成ツールです。
Vivado 2015.4から Vivado-HLS が無償提供されると言うことで、さっそく試してみました。

用意するもの

ブロック図

akgeo2.jpg

ソースコード

フィボナッチを求めるCのソースコードです。

fib.c
long long fib(int n)
{
  long long curr = 0;
  long long next = 1;
  int i;
  for(i = 0; i < n; i++) {
    long long prev = curr;
    curr = next;
    next += prev;
  }
  return curr;
}

手順

リポジトリと各submodule をダウンロード

shell% git clone git://github.com/ikwzm/msgpack-vhdl-examples.git
shell% cd msgpack-vhdl-examples
shell% git submodule init
shell% git submodule update

fib.cを高位合成

スクリプトを用意しています。vivado_hls が実行出来る環境でスクリプトを走らせてください。

Vivado% cd examples/fibonacci/sim/vivado/vivado_hls
Vivado% vivado_hls -f run_hls.tcl
================================================================
  Vivado(TM) HLS - High-Level Synthesis from C, C++ and SystemC
  Version 2015.4
  Build 1412921 on Wed Nov 18 09:58:55 AM 2015
  Copyright (C) 2015 Xilinx Inc. All rights reserved.
================================================================
@I [HLS-10] Running 'E:/Xilinx/VIVADO~1/2015.4/bin/unwrapped/win64.o/vivado_hl
exe'
            for user 'xxxxx' on host 'xxxxx' (Windows NT_amd64 version 6.1)
 Tue Dec 01 17:27:40 +0900 2015
            in directory 'H:/work/msgpack-vhdl-examples/examples/fibonacci/sim
ivado/vivado_hls'
@I [HLS-10] Opening and resetting project 'H:/work/msgpack-vhdl-examples/examp
s/fibonacci/sim/vivado/vivado_hls/fib_prj'.
@I [HLS-10] Adding design file '../../../src/main/vivado_hls/fib.c' to the pro
ct
@I [HLS-10] Opening and resetting solution 'H:/work/msgpack-vhdl-examples/exam
es/fibonacci/sim/vivado/vivado_hls/fib_prj/solution1'.
@I [HLS-10] Cleaning up the solution database.
@I [HLS-10] Setting target device to 'xc7z010clg400-1'
@I [SYN-201] Setting up clock 'default' with a period of 10ns.
@I [HLS-10] Analyzing design file '../../../src/main/vivado_hls/fib.c' ...
@I [HLS-10] Validating synthesis directives ...
@I [HLS-10] Starting code transformations ...
@I [HLS-10] Checking synthesizability ...
@I [HLS-111] Elapsed time: 18.988 seconds; current memory usage: 70.7 MB.
@I [HLS-10] Starting hardware synthesis ...
@I [HLS-10] Synthesizing 'fib' ...
@I [HLS-10] ----------------------------------------------------------------
@I [HLS-10] -- Scheduling module 'fib'
@I [HLS-10] ----------------------------------------------------------------
@I [SCHED-11] Starting scheduling ...
@I [SCHED-11] Finished scheduling.
@I [HLS-111] Elapsed time: 0.11 seconds; current memory usage: 71.6 MB.
@I [HLS-10] ----------------------------------------------------------------
@I [HLS-10] -- Exploring micro-architecture for module 'fib'
@I [HLS-10] ----------------------------------------------------------------
@I [BIND-100] Starting micro-architecture generation ...
@I [BIND-101] Performing variable lifetime analysis.
@I [BIND-101] Exploring resource sharing.
@I [BIND-101] Binding ...
@I [BIND-100] Finished micro-architecture generation.
@I [HLS-111] Elapsed time: 0.218 seconds; current memory usage: 71.6 MB.
@I [HLS-10] ----------------------------------------------------------------
@I [HLS-10] -- Generating RTL for module 'fib'
@I [HLS-10] ----------------------------------------------------------------
@I [RTGEN-500] Setting interface mode on port 'fib/n' to 'ap_none'.
@I [RTGEN-500] Setting interface mode on function 'fib' to 'ap_ctrl_hs'.
@I [RTGEN-100] Finished creating RTL model for 'fib'.
@I [HLS-111] Elapsed time: 0.359 seconds; current memory usage: 71.6 MB.
@I [HLS-10] Finished generating all RTL models.
@I [WSYSC-301] Generating RTL SystemC for 'fib'.
@I [WVHDL-304] Generating RTL VHDL for 'fib'.
@I [WVLOG-307] Generating RTL Verilog for 'fib'.
@I [HLS-112] Total elapsed time: 21.609 seconds; peak memory usage: 71.6 MB.
Vivado%

これで examples/fibonacci/sim/vivado/vivado_hls/fib_prj/solution1/syn/vhdl/fib.vhd が生成されます。

テストシナリオの作成

すでに作成済みのテストシナリオ(examples/fibonacci/src/test/scenarios/test_1.snr)を用意しています。このテストシナリオを使う場合は、以下の手順は飛ばしてください。

AXI4_Stream_Master_PlayerおよびAXI4_Stream_Slave_Player用のテストシナリオを作ります。

shell% cd examples/fibonacci/src/test/scenarios
shell% ruby test_1.rb

test_1.rb はテストシナリオ(YAML形式)を生成するためのrubyスクリプトです。

Vivado プロジェクトの作成

Vivado プロジェクトを作成するためのTclファイル(create_project.tcl)を用意しています。
Vivadoを起動して次のメニューからTclファイルを実行してください。

Vivado > Tools > Run Tcl Script... > examples/fibonacci/sim/vivado/vivado_hls/create_project.tcl

シミュレーションを実行

前節で作った Vivado プロジェクトを開き、次のようにシミュレーションを実行してください。

Vivado > Flow > Run Simulation > Run Behavioral Simulation

結果

参考までにn=42の時のシミュレーション波形を示します。
fibonacci_vivado_hls_wave.jpg

クロックの周波数は100MHzです。
fib(42)を実行するのに、MessagePack-RPCのシリアライズとデシリアライズを含めないFIB単体では430nsec((42+1)×10nsec)かかっていることがわかります。ちなみにフィボナッチを求める回路をVHDLで記述した場合も同様に430nsecかかっているので、性能的には VHDL で記述した時と同じです。

シミュレーション時のログは次の通りです。
fibonacci_vivado_hls_log.jpg

参考

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2