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

関数がHDLに変換され動作する事を確認しました

前回の確認ではカウントアップした変数のアウトプットのみを確認しました

今回は、インプットも確認してみようと思います

そこでこんな感じのプログラムを書いてみました


#include "HLS/hls.h"
#include <stdio.h>

using namespace ihc;

component unsigned int count(unsigned int a, unsigned int b) {
unsigned int cnt;
cnt = a * b;
return cnt;
}

int main() {
const int SIZE = 100;
unsigned int result[SIZE];
for(unsigned int i=0; i<SIZE; ++i) {
result[i] = count(i, i+1);
}

bool pass = true;
for(unsigned int i=0; i < SIZE; ++i) {
if (result[i] != (i*(i+1))) {
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.exe 

 シミュレーションの結果も出ました

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

ちゃんと掛け算が出来ている様です

 

ここでふと疑問になったのが、C言語でmain関数部に書かれる引数を用意する部分は

どうやって記述されるのだろうか?という事でした。

延々と自分が記述したテストパターンを繰り返し保存するプログラムが出来ても

使えない訳ですので、counterと言う名前のコンポーネントが独立して使える事を確認しようと思います。

 

生成されたQuartusPrimeのプロジェクトをコンパイルしてみます

quartus_compileと言うトップモジュールの下にcount_instと言うインスタンスができています

シミュレーションではtbの下にcount_instと言うインスタンスができています

ここが等価になっています

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

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

quartus_compileからcount_instまではワイヤー(レジスタ)が直結しています

と言うことは、外部からの入力がなければ何もしない=外部からの入力により動的に動作する様に作られている

トップレベルエンティティの外からデータを与えられる様になっていますね

ここから後2つの事を調べたいと思っています

1つは、データのINPUTからOUTPUTまでの効率をもう少し上げたいと思います

もう一つは、作成されたIPが実際のFPGA上で動作する事です