思いつきメモ HLS
言うことを聞かないVivado HLSを手なずける
前回、Vivado HLSにていろいろと問題に遭遇していることを書いたが、 いくらか前進できた。
まず、Co-simulationとC simulationの結果が一致しないという問題。大体以下のような形のコードになっていた。topが合成したい関数のトップレベル。
static int A[] = {...};
static int B[] = {...};
int g(int* array){
....
use array element
....
}
void f(int* array){
....
g(array);
....
}
void top(){
....
f(A);
f(A);
f(B);
f(B);
....
}
これを、次のように書き換えた。
static int A[] = {...};
static int B[] = {...};
int g(int* array ...
Vivado HLSについて:話がうますぎると思ったら、その直感は多分正しい
現在Vivado HLSを使用して回路合成の実験をしているが、いろいろと問題に遭遇している。
- バージョン2014.2で合成するとCo-simulationが終了しない。
- バージョン2014.4で合成するとCo-simulationは終了するが、C simulationと結果が一致しない。
ひょっとしたら合成側ではなく、シミュレータ側に問題があるかと予想し、 2014.2で合成した結果を2014.4のシミュレータで動かしてみたが、終了しないのは 変わらなかった。
また、2014.2で合成した結果をインプリしてみたが、AXI Stream出力なのに、 TREADYがHighになっていないにも関わらず、TVALIDがHighでTDATAが変化してしまっていたりする 状況が見られた(FIFO fullなのに書き込み側が止まらずに進んでしまっているような状況)。 これは明らかにハンドシェークとしておかしい。
今はC++から合成しているが、自分の意図としては「ここは並列して動いて欲しい」 というところがツールにちゃんと伝わらないことが多いのも不満がある。 RTLでの記述は並列に動作するのが前提だが、Cのような言語は逐次実行が前提なので、 どこまで並列化できるかは、ツールの賢さに完全に依存してしまう。
細かいところでは、配列はBlock RAMとして実装されることがあるが、 その場合自動的に変数は複製してくれないので、Block RAMの2ポート制約の せいで並列性が犠牲になることがある。自動的に同一のBlock RAMを複数 コピーするようにしてくれれば嬉しい(あるいは複製数を指定できるとか)。 仕方ないので ...
more…