2017年9月
Kintex-7のDDR3メモリエラー
2017.09.24
Kintex-7のPCI Express - DDR3 DMAで、急にエラー率が上がってしまいました。
PCI Expressと同期したクロックをMIGに使っているのにわずか150GBくらいでエラーが出てしまいます。
141回、Total 151397 Mバイト転送 結果は一致していません Write 344E14E0: F8 81 FC 28 19 22 69 FF D3 8E 01 04 77 CE D8 02 Read 344E14E0: F8 81 FC 28 19 22 69 FF D3 8E 01 06 77 CE D8 02
138回、Total 148176 Mバイト転送 結果は一致していません Write 20195420: 20 AC 5E 00 EA B7 6F FF 91 CC 88 00 65 7B 1A 42 Read 20195420: 20 AC 5E 00 EA B7 6F FF 91 CC 88 02 65 7B 1A 42
147回、Total 157840 Mバイト転送 結果は一致していません Write 190B9540: 78 79 97 28 C8 A6 FF FF D7 C3 00 04 4F 16 CC 52 Read 190B9540: 78 79 97 28 C8 A6 FF FF D7 C3 00 06 4F 16 CC 52
どうやら、上のようなパターンのときに、3回目のアクセス時にデータバスのbit25が1になってしまうようです。
以下のようなパターンでエラーが出ることがわかりました。
28000000
FF000000
04004000
02000000
このパターンのみを送るようにしたところ、エラーが出まくりです。
DDR3の3回目のアクセス時に、他のビット線やアドレス線からのクロストークでbit25に影響が出てしまうようです。
そこで、少しデザインを変えて論理合成しなおしてみたところ、
エラーが出なくなりました。
8時間ほどかけて15TBを転送しましていますが、ノーエラーです。
微妙な何かで、DDR3のキャリブレーションの問題が起きているのかもしれません。
Kintex-7のPCIe DMAとDDR3の安定動作
2017.09.24
一昨日からKintex-7のPCIe DMAとDDR3メモリを読み書きのテストをしています。
やっていることは下の図のように、ホストPCで生成した1GBの乱数データを、PCI Express経由でKintex-7に送って、ボード上のDDR3メモリに書いて、読んで、照合するという単純なものです。
しかし、読み書きデータを照合してみると、数十GBでエラーが出てしまいます。
結論から言うと、原因は、
- VivadoのJTAG経由で温度を見ていると失敗しやすい
- 論理合成でタイミングエラーが出ている
- 複数のクロックドメインを渡っている
ということでした。
まず、温度を見るためにVivadoのXADCモニタを使うのをやめました。それだけでも随分安定したのですが、それでもまだ数十GBで止まってしまうようでした。
そこで、ひとまずDDR3を使わずに内蔵BlockRAMを使ってテストすることにしました。温度モニタ用のXADCの回路はFPGAの中に入れて、PCI Express経由で読み取れるようにしました。
XC7K160Tの中に入れられるブロックメモリは最大で1MByte程度なので、1MByteの読み書きトランザクションをたくさん発行してテストを行ったところ、1.7TBほど読み書きしてもエラーは一つも発生しませんでした。5TBというのは、いままでの実験の結果からしても驚異的な成績でした。
このことから、PCI Expressには問題がなさそうです。
考えらえる原因は、クロックなどに起因しているエラーの可能性が濃厚でした。そこで、まず全てのタイミングエラーを解決し、MIGのクロック源を水晶ではなくPCI Expressコアが出す125MHzクロックを使うことにしました。
こうすれば複数の周波数のクロックドメインがあっても、その位相関係は数パターンに限定されるはずです。これならタイミング的にもよい回路が合成できるはずです。
単一のクロック源ですべてを動くようにしたところ、5TBのデータを読み書き(3時間程度かかる)しても一つもエラーが発生しませんでした。
このときはFPGAの温度も気にしていたので扇風機で風を当てながら62℃前後で動かしていましたが、そのあとで扇風機を止めて83℃前後にしても、やはり、エラーは発生しませんでした。
温度は関係ないようです。
次に、MIGのクロック源を水晶にすると、PCI ExpressとMIGは全く別のクロックで動くことになります。
先ほどの場合と周波数は同じですが、異なるクロック源なので、クロックドメイン境界であらゆる位相差が登場するはずです。
この場合、やはりエラーが出てしまいました。
上の図では約3.4TB程度でエラーが発生したようです。
昨日から悩んでいた「数十GBでエラーが出てしまう原因」は、基板の問題ではなく、複数のクロックドメインを渡る問題(clock domain crossing)である可能性が濃厚です。
AXI Interconnectでどのようなタイミング制約を書けばCDCを解決できるのかはわかりませんが、もしかしたら確率的にエラーが起きることは避けられず、可能性はゼロにはできない問題なのかもしれません。
最後に、出来上がったBlock Designとリソース使用率を示します。
Kintex-7用の標準的なPCI Experss-AXI-DDR3のサンプルとして近いうちにリリースできると思います。
Kintex-7でDDR3メモリにPCIe DMAが成功
2017.09.22
特電のKintex-7ボード「Cosmo-K」の上のDDR3メモリに、PCI ExpressからDMAで転送することに成功しました。
下の写真のようにパソコンのPCI Expressスロットにさして、PCIe経由でボード上のメモリに乱数を読んだり書いたりしています。
Vivadoのブロックデザインはこんな感じです。
DDR3のアクセスはMIGを使っています。
ボード上には1Gバイトのメモリが乗っているので、最大、1GBまでDMA転送できるのですが、10M~100Mバイト程度の転送のときが一番速いようでした。
パソコンのキャッシュの問題なのか、OSのメモリ管理の問題なのかはわかりません。
Block RAMに転送するときも、DDR3 DRAMに転送するときも、スループットに差はありませんでした。つまり、DRAMの読み書きのオーバーヘッドは無視できるようです。
DMA write2、DMA read2というのは私が作ったデザインで、DMA write、DMA readというのはインターンの学生さんが作ったデザインです。なぜ差が生じるかはわかっていません。
現在、100Gバイト程度転送していますが、特にエラーは起きていません。
どうでもいいことですが、バッチファイルのIF文の使い方の備忘録として、バッチファイルを書いておきます。
SET LOOPCOUNT=0 SET DATASIZE=1073741824 @:loop tkpe2test c %DATASIZE% @if errorlevel 1 goto exit @SET /A LOOPCOUNT=LOOPCOUNT+1 @SET /A TOTAL=(%DATASIZE%/1000000)*%LOOPCOUNT% @echo %LOOPCOUNT% 回 %TOTAL% MBytes @goto loop :exit PAUSE -1
ボードが非常に熱くなるので、扇風機が必須です。
扇風機を止めるとチップ温度が80℃以上になって、エラーが出ることがあるようです。ただ、そのエラーがPCIのものなのかDDR3のものなのかはわかっていません。
これで、大容量メモリを活かした高速データ取り込みシステムが作れそうですね。
いろいろとわからないことはありますが、Cosmo-Kで、PCI ExpressとDDR3メモリがつながりました。もう少し安定して動作するようになってきたらソースを公開します。