”
intel HLS コンパイラを試してみる5( ihc_hls_enqueue() と ihc_hls_component_run_all() )”の続き。
前回は、ihc_hls_enqueue() でキューに入れた実行待ち行列を ihc_hls_component_run_all() で実行するとパイプライン実行されるということが分かった。カウンタでは、1クロックごとに 1 カウントアップされている。
それでは、パイプライン実行しないとどうなるのか?をやってみた。
まずは、examples フォルダの下に、counter2 フォルダを作成して、build.bat と counter.cpp をコピーした。
そうして、counter.cpp を下の様に修正した。これは、ihtel HLS の counter.cpp のコードを参照して、変更している。
build test-fpga を実行した。
ModelSim を立ち上げて、F:\intelFPGA_lite\17.1\hls\examples\counter2\test-fpga.prj\verification の vsim.wlf を読み込んだ。

ihc_hls_enqueue() と ihc_hls_component_run_all() を使用したときは、1クロックで1カウントしている。

しかし、ihc_hls_enqueue() と ihc_hls_component_run_all() を使用していない今回は、11クロックで 1 カウントだ。
(2017/11/12:修正 startの 1 へのアサートが1クロックだけなので、11クロックに1クロックしかカウントしないことになっていました。つまりテストベンチの問題のようです。ハードウェアには関係ないようです。@Venginner さん、ご指摘ありがとうございました)
次に、Quartus Prime でコンパイルしてみたところ、パイプライン実行の時と同じリソース使用量だった。何でだろうか?

次に、普通に for() 文で書いたらどうなるのだろうか?
counter3 フォルダも作って、もう一度、build.bat と counter.cpp をコピーした。
component 文を修正して、for() 文に変更した。
#include "HLS/hls.h"
#include <stdio.h>
using namespace ihc;
const int SIZE = 100;
component int count(unsigned int &cnt) {
for(int i=0; i<SIZE; i++)
cnt++;
return(0);
}
int main() {
unsigned int cnt=0;
count(cnt);
if (cnt == 100) {
printf("PASSED\n");
}
else {
printf("FAILED\n");
}
return 0;
}
build test-fpga を実行すると、vsim.wlf が生成されなかった。何度かビルドを繰り返すと生成されるときがあった。
test-fpga はPASSED になっている。

ModelSim で vsim.wlf を見ると、avmm_0_rw_... のポートがあって、Avalon MM の信号が入っている。つまり、cnt を参照呼出しにしたので、メモリにRead/Write するようになったのだろうか?でも cnt は 0 になっている。動作しないようだ。

Quartus Prime を立ち上げた。トップファイルを見ると、やはりAvalon MM の信号が入っている。

コンパイルしてみたが、やはり、リソース使用量が多い。

このソースコードはうまく行かないようだ。
- 2017年11月12日 04:55 |
- intel HLS
-
| トラックバック:0
-
| コメント:0