« Kintex-7でDDR3メモリにPCIe DMAが成功 | トップページ | Kintex-7のDDR3メモリエラー »

2017.09.24

Kintex-7のPCIe DMAとDDR3の安定動作

一昨日からKintex-7のPCIe DMAとDDR3メモリを読み書きのテストをしています。

やっていることは下の図のように、ホストPCで生成した1GBの乱数データを、PCI Express経由でKintex-7に送って、ボード上のDDR3メモリに書いて、読んで、照合するという単純なものです。

Xdmaddr3

しかし、読み書きデータを照合してみると、数十GBでエラーが出てしまいます。

もしかして、このボードは、PCI ExpressとDDR3を同時に使うと不安定になるのか・・・と絶望的な気分にもなりましたが、実はそうではありませんでした。

結論から言うと、原因は、

  • VivadoのJTAG経由で温度を見ていると失敗しやすい
  • 論理合成でタイミングエラーが出ている
  • 複数のクロックドメインを渡っている

ということでした。

まず、温度を見るためにVivadoのXADCモニタを使うのをやめました。それだけでも随分安定したのですが、それでもまだ数十GBで止まってしまうようでした。

そこで、ひとまずDDR3を使わずに内蔵BlockRAMを使ってテストすることにしました。温度モニタ用のXADCの回路はFPGAの中に入れて、PCI Express経由で読み取れるようにしました。

XC7K160Tの中に入れられるブロックメモリは最大で1MByte程度なので、1MByteの読み書きトランザクションをたくさん発行してテストを行ったところ、1.7TBほど読み書きしてもエラーは一つも発生しませんでした。5TBというのは、いままでの実験の結果からしても驚異的な成績でした。

Xdmabram

このことから、PCI Expressには問題がなさそうです。

考えらえる原因は、クロックなどに起因しているエラーの可能性が濃厚でした。そこで、まず全てのタイミングエラーを解決し、MIGのクロック源を水晶ではなくPCI Expressコアが出す125MHzクロックを使うことにしました。

Cdc2

こうすれば複数の周波数のクロックドメインがあっても、その位相関係は数パターンに限定されるはずです。これならタイミング的にもよい回路が合成できるはずです。

単一のクロック源ですべてを動くようにしたところ、5TBのデータを読み書き(3時間程度かかる)しても一つもエラーが発生しませんでした。

5tb

このときはFPGAの温度も気にしていたので扇風機で風を当てながら62℃前後で動かしていましたが、そのあとで扇風機を止めて83℃前後にしても、やはり、エラーは発生しませんでした。

5tbhightemp

温度は関係ないようです。

sun

次に、MIGのクロック源を水晶にすると、PCI ExpressとMIGは全く別のクロックで動くことになります。

Cdc1

先ほどの場合と周波数は同じですが、異なるクロック源なので、クロックドメイン境界であらゆる位相差が登場するはずです。

この場合、やはりエラーが出てしまいました。

Memerr

上の図では約3.4TB程度でエラーが発生したようです。

sun

昨日から悩んでいた「数十GBでエラーが出てしまう原因」は、基板の問題ではなく、複数のクロックドメインを渡る問題(clock domain crossing)である可能性が濃厚です。

AXI Interconnectでどのようなタイミング制約を書けばCDCを解決できるのかはわかりませんが、もしかしたら確率的にエラーが起きることは避けられず、可能性はゼロにはできない問題なのかもしれません。

最後に、出来上がったBlock Designとリソース使用率を示します。

Xdmaddr3bd

Util

Kintex-7用の標準的なPCI Experss-AXI-DDR3のサンプルとして近いうちにリリースできると思います。

|

« Kintex-7でDDR3メモリにPCIe DMAが成功 | トップページ | Kintex-7のDDR3メモリエラー »

コメント

コメントを書く



(ウェブ上には掲載しません)




« Kintex-7でDDR3メモリにPCIe DMAが成功 | トップページ | Kintex-7のDDR3メモリエラー »