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;
}
これだと、波形は次の様になります
先の処理が終ってから答えが出て、しかる後に次の計算に入っています
これだと、結局答えが出るまでの間何もしていない事になり
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()を呼び出すとそこまでの処理がパイプライン的に処理されます
a0*b0に対するdoneが出る前にa1*b1の処理を受け付けています
doneも3つの処理の結果が連続で出てきている