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

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

FPGAの部屋

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

hls4mlをやってみた3(シミュレーション)

hls4mlをやってみた2(KERAS_3layer ネットワークの構成)”の続き。

前回は、Vivado HLS を使用して機械学習をハードウェア化するフレームワークのhls4ml を使用してVivado HLS のIP として生成した KERAS_3layer ネットワークがどのようななネットワークか知らないので調査した。今回は、そのVivado HLS プロジェクトの myproject_prj の C シミュレーションとC/RTL 協調シミュレーションの結果を見ていこう。

最初にテストベンチの myproject_test.cpp を引用する。

//
//    rfnoc-hls-neuralnet: Vivado HLS code for neural-net building blocks
//
//    Copyright (C) 2017 EJ Kreinar
//
//    This program is free software: you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation, either version 3 of the License, or
//    (at your option) any later version.
//
//    This program is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//    GNU General Public License for more details.
//
//    You should have received a copy of the GNU General Public License
//    along with this program.  If not, see <http://www.gnu.org/licenses/>.
//
#include <fstream>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include "firmware/parameters.h"
#include "firmware/myproject.h"
#include "nnet_helpers.h"


int main(int argc, char **argv)
{
  //hls-fpga-machine-learning insert data
  input_t input_1[N_INPUT_1_1] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  result_t layer9_out[N_LAYER_8] = {0,0,0,0,0};

  //hls-fpga-machine-learning insert top-level-function
  unsigned short size_in1,size_out1;
  myproject(input_1,layer9_out,size_in1,size_out1);

  //hls-fpga-machine-learning insert output
  for(int i = 0; i < N_LAYER_8; i++) {
    std::cout << layer9_out[i] << " ";
  }
  std::cout << std::endl;

  return 0;
}


入力配列(input_1)に値を代入して、1度だけ myproject() を読んでいる。
このテストベンチでのシミュレーション結果を示す。

INFO: [SIM 2] *************** CSIM start ***************
INFO: [SIM 4] CSIM will launch GCC as the compiler.
   Compiling ../../../../myproject_test.cpp in debug mode
   Compiling ../../../../firmware/myproject.cpp in debug mode
   Generating csim.exe
0.0292969 0.761719 0.0566406 0.142578 0.0361328 
INFO: [SIM 1] CSim done with 0 errors.
INFO: [SIM 3] *************** CSIM finish ***************


layer9_out[] に値が出力されいてる。

次に、C/RTL 協調シミュレーションの結果を示す。
hls4ml_14_190701.png

Latency は 15 クロックだが、Interval が NA になってしまっている。これは、myproject() のコールが 1 回のためだと思う。
それでは、テストベンチの myproject_test.cpp を myproject() を 2 回呼ぶように書き換えた。新しい myproject_test.cpp を示す。

//
//    rfnoc-hls-neuralnet: Vivado HLS code for neural-net building blocks
//
//    Copyright (C) 2017 EJ Kreinar
//
//    This program is free software: you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation, either version 3 of the License, or
//    (at your option) any later version.
//
//    This program is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//    GNU General Public License for more details.
//
//    You should have received a copy of the GNU General Public License
//    along with this program.  If not, see <http://www.gnu.org/licenses/>.
//
#include <fstream>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include "firmware/parameters.h"
#include "firmware/myproject.h"
#include "nnet_helpers.h"


int main(int argc, char **argv)
{
  //hls-fpga-machine-learning insert data
  input_t input_1[N_INPUT_1_1] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  input_t input_2[N_INPUT_1_1] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
  result_t layer9_out[N_LAYER_8] = {0,0,0,0,0};
  result_t layer9_out2[N_LAYER_8] = {0,0,0,0,0};

  //hls-fpga-machine-learning insert top-level-function
  unsigned short size_in1,size_out1;
  myproject(input_1,layer9_out,size_in1,size_out1);
  myproject(input_2,layer9_out2,size_in1,size_out1);

  //hls-fpga-machine-learning insert output
  for(int i = 0; i < N_LAYER_8; i++) {
    std::cout << layer9_out[i] << " ";
  }
  std::cout << std::endl;

  for(int i = 0; i < N_LAYER_8; i++) {
    std::cout << layer9_out2[i] << " ";
  }
  std::cout << std::endl;

  return 0;
}


このテストベンチで C シミュレーションを行った。結果を示す。

INFO: [SIM 2] *************** CSIM start ***************
INFO: [SIM 4] CSIM will launch GCC as the compiler.
   Compiling ../../../../myproject_test.cpp in debug mode
   Generating csim.exe
0.0292969 0.761719 0.0566406 0.142578 0.0361328 
0 0.399414 0.0439453 0.571289 0.015625 
INFO: [SIM 1] CSim done with 0 errors.
INFO: [SIM 3] *************** CSIM finish ***************


結果が 2 つになった。

C/RTL 協調シミュレーションの結果を示す。
hls4ml_15_190701.png

Interval が 1 になった。
C/RTL 協調シミュレーションの波形を確認しよう。
hls4ml_16_190701.png

波形を少し拡大してみよう。
hls4ml_17_190701.png

input_1_V_ap_vld が 1 になったクロックから layer9_out_V_ap_vld が 1 になるまでは、 75 ns で クロックが 5 ns なので、15 クロックかかっている。そして、次の結果が 1 クロック後に出いているので、Latency は 15 クロック、Interval が 1 クロックということがC/RTL 協調シミュレーションの波形からも確認することができた。
  1. 2019年07月02日 04:58 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0