もう二ヶ月くらい経ってしまいましたが、 Helio の SDRAM アクセスがやったら遅い問題は解決しておりました。
まとめる時間がなく今もないので軽く書き置きしておきます。
まずは Avalon 経由でアクセスしている FIFO 付き SDRAM インターフェイスですが、これに入れているクロック 50MHz がまずかったようです。
これはそのまま SDRAM のクロックとなるようですが、それ以外にも重要だったようで、これを 100MHz にしないとパフォーマンスが出ませんでした。
「いや、スループットが二倍になっても全然足りねーじゃん」と思ったのですが、これを 100MHz にしたところ 2 倍どころか 8 倍くらいになり、かなり納得のいくパフォーマンスになりました。
(ちょっと具体的なデータが今すぐ見られませんが)
以下の helio_ghrd_top モジュールに与えられている二種類のクロックのうち
input wire fpga_clk_50,
input wire fpga_clk_100
fpga_clk_100 のほうを、 export してあるインターフェイス(前回作った memwrite_master) を経由してコントローラに供給しましょう。
memwrite_master m0(.clk(fpga_clk_100),
ただしこれでも理論値には微妙に届きません。
今は一回のストアに 4 ステートほどを経由する必要があり( Avalon MM の先のオービターで更にどれくらいのオーバーヘッドがあるかわかりませんが、少なくとも……)、このままでは理論値には届きません。
可能な限りコントローラの介入を避けられるよう、これ以上はバーストモードを使いましょう。
バーストモードでは最大 255 * 512bit のストアが可能です。
Avalon のインターフェイスには burstcount が出ています。ぱっと見、これを使えば簡単そうなのですが反面データシートの記述とは一致しないため不安があります。
実際やってみるとこれはまたハマりました。
詳しいことはまた後ほどまとめたいと思いますが、やっぱり Avalon のインターフェイスがデータシートと一致していないのが敗因で、バースト転送の開始を示す信号は、 burstlength の変化をトリガーにして暗黙に生成されているようでした。
つまり毎回同じ burstcount だからといって定数を出していると、他の信号を変化させてもたった一度しかストアが行われません。
また転送終了のシグナルも出ていないので、これの捕捉にも癖があり苦戦したように思います。
結果、 1 クロック余計なステートが増えましたが無事バーストアクセスできるようになり、(バースト長にもよりますが)理論値と比較してそれほど遜色のないパフォーマンスがでるようになりましたとさ。
0 件のコメント:
コメントを投稿