製品情報>Kintex-7 PCIe Express光ボード「Cosmo-K」>開発日記>2017年9月

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

このパターンのみを送るようにしたところ、エラーが出まくりです。

Ddr3err

DDR3の3回目のアクセス時に、他のビット線やアドレス線からのクロストークでbit25に影響が出てしまうようです。

sun

そこで、少しデザインを変えて論理合成しなおしてみたところ、

Async_bd

エラーが出なくなりました。

8時間ほどかけて15TBを転送しましていますが、ノーエラーです。

15tb

微妙な何かで、DDR3のキャリブレーションの問題が起きているのかもしれません。

 

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

2017.09.24

一昨日から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が成功

2017.09.22

特電のKintex-7ボード「Cosmo-K」の上のDDR3メモリに、PCI ExpressからDMAで転送することに成功しました。

下の写真のようにパソコンのPCI Expressスロットにさして、PCIe経由でボード上のメモリに乱数を読んだり書いたりしています。

Cosmokdma

Vivadoのブロックデザインはこんな感じです。

Cosmokdmapcieddr3

DDR3のアクセスはMIGを使っています。

ボード上には1Gバイトのメモリが乗っているので、最大、1GBまでDMA転送できるのですが、10M~100Mバイト程度の転送のときが一番速いようでした。

パソコンのキャッシュの問題なのか、OSのメモリ管理の問題なのかはわかりません。

Throughput

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

Dma100g

ボードが非常に熱くなるので、扇風機が必須です。

扇風機を止めるとチップ温度が80℃以上になって、エラーが出ることがあるようです。ただ、そのエラーがPCIのものなのかDDR3のものなのかはわかっていません。

 

これで、大容量メモリを活かした高速データ取り込みシステムが作れそうですね。

いろいろとわからないことはありますが、Cosmo-Kで、PCI ExpressとDDR3メモリがつながりました。もう少し安定して動作するようになってきたらソースを公開します。

 

 


© 2017 TokushuDenshiKairo Inc. All rights reserved