intel HLS コンパイラの動作を理解する2

前回のブログではintelHLSでコンパイルするプロセスを勉強しました

プログラムの内容は何もしないので、生成物以外に確認するものはありませんでした。

 

今回は、実際にプログラムがFPGA上ででおの様に動作するかを勉強して行きます

 動作結果がでるプログラムを書いてみます、このプログラムは呼ばれる度にインクリメントした値を返し、配列変数に入れて行きます

このプログラムはintelFPGAのサンプルで格納されていたものをちょこっと改造しただけのものです

#include "HLS/hls.h"

#include "HLS/hls.h"

#include <stdio.h>
using namespace ihc;
component unsigned int count() {

  static unsigned int cnt = 0;

  return cnt++;

}
int main() {

  const int SIZE = 100;

  unsigned int result[SIZE];

  for(unsigned int i=0; i<SIZE; ++i)

 {

 result[i] = count(); 

 }
  bool pass = true;

  for(unsigned int i=0; i < SIZE; ++i)

 {   

  if (result[i] != i)

  {     

   printf("ERROR: Expected %u, found %u\n", i, result[i]);

       pass = false;   

  } 

 }
  if (pass) {

     printf("PASSED\n"); 

 }  else { 

    printf("FAILED\n"); 

 }
  return 0;
}

ビルドして、実行してみます

.build.bat test-fpga

 .¥test-fpga.exe

PASSED

ビルドにそれほど時間がかからないうちはx86のテストは飛ばします

結果にPASSEDと出ているので計算結果は一致した様です

-ghdlオプションを付けているので、シミュレーション結果を見てみます

f:id:info-akiron-com:20180902110330p:plain

何やらカウントアップしています

ひとまずC(++)で書かれたプログラムが動作した様です

もうちょっとみてみます

リソースは次の通りです

f:id:info-akiron-com:20180902111348p:plain

ALUTsが47、FFsが38が消費されています

消費割合が0%なのでこの時点ではなんとも言えないです

もう少し複雑なロジックを試す段で確認してみます

 

QuartusPrimeのロジックもコンパイルしてみます

f:id:info-akiron-com:20180902112255p:plain

ALMsが46なので、HLSの事前の予想に近いと思います

FFsはRegistersに当たるのかと思いますが、この辺は勉強不足なので

比較の仕方が分かりません

今度勉強しておこうと思います