FC2カウンター FPGAの部屋 Vivado HLS 2014.4 の高位合成テスト3(foo2 を Vivado HLS で高位合成)
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Vivado HLS 2014.4 の高位合成テスト3(foo2 を Vivado HLS で高位合成)

Vivado HLS 2014.4 の高位合成テスト2(foo1のHDLコード)”の続き。

foo1 は1クロックで終了する組み合わせ回路として高位合成されたので、特にシミュレーションの必要を感じなかった。
今回は、”Vivado HLS 2014.4 の勉強1(高位合成の理解)”のもう1つのfoo() の高位合成をやってみる。今回のfoo() をfoo2 とする。foo2 は、入力の引数と出力の引数が配列になっているので、BlockRAM のインターフェースになっているはずだ。

もう一度、”Vivado Design Suite ユーザー ガイド 高位合成 UG902 (v2014.1) 2014 年 4 月 2 日”の8ページの入力と出力に配列を使用した foo() を引用する。

void foo(int in[3], char a, char b, char c, int out[3]) {
    int x,y;
    for(int i = 0; i < 3; i++) {
        x = in[i];
        y = a*x + b + c;
        out[i] = y;
    }
}


・さて、ZYBOのZynq7010を使用したVivado HLS 2014.4 の foo2 プロジェクトを作製した。(Vivado HLSのプロジェクトの作り方など詳しく”Vivado HLS 2014.4 の高位合成テスト1(Vivado HLSで高位合成)”に書いたので、今回は省略し、結果だけ書く)

・foo2.cpp を作って、Cコードを書いた。
Vivado_HLS_Study_21_150108.png

・Project メニューから Project Settings を選択して、Synthesis タブをクリックし、Top Function を foo に設定した。
Vivado_HLS_Study_22_150108.png

・C Synthesis を行った。
Vivado_HLS_Study_23_150108.png

・C Synthesis Report その2。
Vivado_HLS_Study_24_150108.png

Latency は 16 クロックで 、Interval は 17 クロックだ。ユーザーズガイドに書いてある Latency = 10 、Interval = 11 よりもだいぶ伸びている。
リソースでは、DSP48E を2つ使用している。

・C Synthesis Report その3。
Vivado_HLS_Study_25_150108.png

・C Synthesis Report その4。
Vivado_HLS_Study_26_150108.png

ap_ctrl_hs インターフェースが生成されているが、今度は配列に計算値を書き出すため、ap_return は無い。その代わり、in と out のBlock RAM のインターフェースが生成されている。

・Analysis 画面を示す。
Vivado_HLS_Study_28_150108.png

Loop 1 があって、展開すると6~12 の処理が Loop 1 内にあるようだ。
下位ブロックは緑で示されるようだが、foo2 には下位ブロックは無いので、これは存在しない。

・紫色のブロックを右クリックすると Goto Source, Goto Verilog, Goto VHDL メニューが現れて、Goto Source を選択すると Cソースの対応する行に飛んでくれる。
Vivado_HLS_Study_29_150109.png

・Resource Profile タブと Resource タブをクリックした。
Vivado_HLS_Study_30_150109.png

Resource Profile には使用されたリソースが表示されている。
Resource タブでは、実際のインスタンスがどのステートでどのような演算を行っているかを表示しているようだ。
例えば、C0ステートに + の演算を行う tmp1_fu_96 は演算を行った後は定数になる b + c を行っているのがわかる。

もう一度、”Vivado Design Suite ユーザー ガイド 高位合成 UG902 (v2014.1) 2014 年 4 月 2 日”の9ページの”図 1‐2 : 抽出と IO ポー ト シーケンスの制御”を下に引用する。
Vivado_HLS_Study_20_150107.png

Vivao HLS の結果と見比べてみると、Vivado HLS の実際の高位合成結果では、乗算が3クロックかかっているのがわかる。図 1‐2 では、乗算と加算が一緒に1クロックで処理されることになっている。

書きた方が正確ではなかったので、もう一度書く。
図1-2の回路では、BlockRAMの出力を一度FFを通して乗算と加算をしているが、Vivado HLSの結果だと、in_r(p0) と foo_mul_32s_8s_32_3_u0 が1クロック分重なっているので、BlockRAMの出力にFFは入っていないんじゃないか?と思われる。
foo_mul_32s_8s_32_3_u0 の乗算には3クロックかかっているが、Vivado HLS結果と図1-2の乗算のレイテンシの差は1クロックだと思われる。
もう1クロックの差はどこで出るかだが、それは、Vivado HLS結果のC5ステートであると思われる。write のみ独立しているので、C4ステートまでの演算結果をC4ステートの終わりでFFにラッチしてからBlockRAMにWrite しているようだ。図1-2は、どうかというと、C2ステートの最後で、BlockRAMに出力アドレスとCE、WEを与えて、組み合わせ回路の演算結果を直接BlockRAMの入力として与えている。つまり図1-2では、write にかかるクロックは 0 クロックである。
  1. 2015年01月09日 05:26 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/3038-ca8dcefa
この記事にトラックバックする(FC2ブログユーザー)