Artix-7を使用したシステムでは、DDR3メモリの最高書き込み速度はどのくらいまでいけるのでしょうか?
奥にあるのはデータロガーなどを作りたい場合、毎秒100MHzでサンプリングしたデータを8バイト分並列に書き込めるのか、それとも8chなら100MHzは超えられないのかという深淵なテーマです。
もちろんDDR3メモリは800MHzで動作させることはできますが、オーバーヘッドがあるので当然ながら800Mバイト/秒での書き込みはできないでしょう。
逆に、800Mバイト/秒での書き込みを実現するにはDDR3メモリのクロックはどのくらいあればよいのでしょうか。
この問題を特電Artix-7ボード(スピードグレード3)を使って検証してみました。このボードはArtix-7とDDR3メモリのほか、USB3.0からもDDR3にアクセスできるので、このような検証には便利です。

作ったシステムのBlock Designを下の図に示します。
オレンジ色の部分が今回の検証に使われているデータのパスで、右から順にMIG、AXI Interconnect、AXIソース(自作IP)が並んでいます。

MIGの設定ではクロック(DDR3メモリのクロック)を1875psにして533MHzのクロックを与えます。DDRなのでデータレートは1066Mになります。

ただし、MIGに与える入力クロックは400MHzにします。(この設定は毎回書き換わってしまう)

AXIソースというのは自作のIPコアで、任意のアドレスから、任意の長さの書き込みまたは読み出しトランザクションを発生させるコアです。最高速度でデータを出してくれます。
実際の波形を下の図に示します。
1回のトランザクションは256バースト(2048バイト)ですが2.05μ秒で完了しているので990Mバイト/sほど出ている計算になります。

AXIのインタコネクトやMIGのいたるところにFIFOが入っているので、瞬間最大風速的な速度は徐々に落ちていくと思われますが、最初の12トランザクションの平均速度は965Mバイト/秒でした。
DDRメモリにもレイテンシがあるし、AXIにもいろいろなハンドシェイクがあるので、数十サイクル分のオーバーヘッドはありそうです。一応、トランザクションが終わってLASTを送ってからBVALIDが返ってきたのを待って、次のトランザクションを始めているので、こういったオーバーヘッドは加味されていると思います。

瞬間的には960Mバイト/秒出ることはわかりましたが、あくまでも最初の12個のトランクザクションです。数百Mバイトの長いデータを書き込んだ場合はどうなるでしょうか?
FPGAの中に入れるロジアナは、BlockRAMの容量に制限されるのでミリ秒単位での計測はできません。
そこで、MITOUJTAGというツールを使って、JTAGバウンダリスキャンでFPGAの端子を見てみました。バウンダリスキャンを使えばFPGAやDDR3の端子の動きが見えるようになるので、長時間の計測が可能になります。
下の図は2秒周期で256Mバイト書き込みを行った際のDDR3メモリ関連ピンの動きです。
書き込みを行っている間は明らかに他の部分と異なり、特にWEとODTが激しく動いているのがわかります。WEはリフレッシュにも使いますが、ODTは書き込み時にしか使いません。

1回1回の書き込みの塊を詳細に見てみると、256Mバイトの書き込みに299ミリ秒を要していました。

つまり、256Mバイトという長いデータを書き込んだ時間から測って、256×1048576÷0.299≒897Mバイト/秒ということになりました。
結論としてはDDR3を1066Mで動かせば、毎秒800Mバイト以上でデータを書き込むことは可能です。
メモリバスとAXIバスの総合的な帯域は84%程度のようですからDDR3 1000Mでもいけるかもしれませんね。数字の端数が出ない分、計算がすっきりするかもしれません。
最近のコメント