言うことを聞かないVivado HLSを手なずける

Permalink: 2015-01-19 23:30:00+09:00 by tu1978 in tags: 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 ...
more…

Vivado HLSについて:話がうますぎると思ったら、その直感は多分正しい

Permalink: 2015-01-13 00:02:00+09:00 by tu1978 in tags: 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…