HLSの記述の勉強

https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/hb/hls/ug-hls.pdf

https://www.altera.com/ja_JP/pdfs/literature/hb/hls/ug-hls_j.pdf

さて、ここで、C言語としての記述の仕方を勉強しておく

と、言うのも、普通にC言語で記述した場合、パイプライン処理が行われない為

期待するほど、高速にはならない、パイプライン処理を行う為には、明示的な作法が必要になる

上のリンクのP13では、C言語の書き方を次の様にした場合の処理結果例が記載されています

#include "HLS/hls.h"

#include <stdio.h>

component int dut(int a, int b)

{

return a*b;

}

int main (void)

{ int x1, x2, x3;

x1 = dut(1, 2);

x2 = dut(3, 4);

x3 = dut(5, 6);

printf("x1 = %d, x2 = %d, x3 = %d\n", x1, x2, x3);

return 0;

}

これだと、波形は次の様になります

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

先の処理が終ってから答えが出て、しかる後に次の計算に入っています

これだと、結局答えが出るまでの間何もしていない事になり

FPGAの良さが半減されてしまいます

この為、intelFPGAのHLSにはパイプライン処理の記述が用意されている様です

次の様に記述するそうです

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

component int dut(int a, int b) {
return a*b;
}

int main (void) {

int x1, x2, x3;
ihs_hls_enqueue(&x1, &dut, 1, 2);
ihs_hls_enqueue(&x2, &dut, 3, 4);
ihs_hls_enqueue(&x3, &dut, 5, 6);

ihs_hls_component_run_all(&dut);

printf("x1 = %d, x2 = %d, x3 = %d\n", x1, x2, x3);

return 0;

ihs_hls_enqueue()関数を使用して、処理をキューに入れてやるようです

詳しい説明が見つかっていないのですが、要はdut()をパイプライン処理して欲しいからねという事をhlsプリコンパイラに伝えてやるようです。

で、ihs_hls_component_run_all()を呼び出すとそこまでの処理がパイプライン的に処理されます

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

a0*b0に対するdoneが出る前にa1*b1の処理を受け付けています

doneも3つの処理の結果が連続で出てきている