2017.09.24

Kintex-7のDDR3メモリエラー

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のキャリブレーションの問題が起きているのかもしれません。

 

| | コメント (0)

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のサンプルとして近いうちにリリースできると思います。

| | コメント (0)

2017.09.22

Kintex-7でDDR3メモリにPCIe DMAが成功

特電の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メモリがつながりました。もう少し安定して動作するようになってきたらソースを公開します。

Kintex-7の汎用PCI Express評価ボード「Cosmo-K」のページはこちらです。

http://www.tokudenkairo.co.jp/cosmok/

どうぞよろしくお願いします。

| | コメント (0)

2017.09.20

Vivadoのプロジェクトをテキストベースで生成する方法

FPGAで計測アプリを作るときに、お客様によってフィルタを入れたり、トリガの構成が異なったりという細かな違いはよくあることでしょう。

そういう顧客ニーズによって少しずつ構成が変わるようなデザインをVivadoで作りたい・・と思い、「Vivadoのプロジェクトを自動生成する方法」をアルバイトの学生さんに編み出してもらいました。

まず、top_script.cmdというバッチファイルと、project_generator.tclというTCLファイルを用意します。

top_script.cmdの中身は

C:\Xilinx\Vivado\2016.4\bin\vivado -mode batch -nojournal -nolog -notrace -source ./project_generator.tcl

です。これはVivadoをバッチモードで起動して、TCLファイルを読みだしているだけです。

起動してみると、

Vpgen1

このようなメッセージが出て、何やらVivadoのプロジェクトができています。

Vpgen2

起動してみると、こんなBlock Designができていました。

Vpgen3

project_generator.tclの中では、まず、プロジェクト用のディレクトリと、プロジェクトファイルを生成しています。

file mkdir bd_gen_test00
cd ./bd_gen_test00
create_project bd_gen_test00 . -part xc7z010clg400-1
set_property target_language VHDL [current_project]
create_bd_design "design_1"
create_bd_cell -type hier hier_0

次にRTLのソースファイルをデザインに追加します。

add_files ../../src/moduleA.vhd
add_files ../../src/moduleB.v
create_bd_cell -type module -reference moduleA moduleA_0
create_bd_cell -type module -reference moduleB moduleB_0

RTLモジュールBを階層の中へ移動

move_bd_cells [get_bd_cells hier_0] [get_bd_cells moduleB_0]

RTLモジュールBの中のピンC_iとモジュールAのAA_oを接続

connect_bd_net [get_bd_pins moduleA_0/AA_o] [get_bd_pins hier_0/moduleB_0/C_i]

レポジトリのディレクトリを指定

set_property  ip_repo_paths  ../../ip_repo [current_project]

IPカタログを更新

update_ip_catalog

自分のIPを追加

startgroup
create_bd_cell -type ip -vlnv xilinx.com:user:myip_AXI_S_master:1.0 myip_AXI_S_master_0
create_bd_cell -type ip -vlnv xilinx.com:user:myip_AXI_S_slave:1.0 myip_AXI_S_slave_0

追加したIPを階層の中へ移動

move_bd_cells [get_bd_cells hier_0] [get_bd_cells myip_AXI_S_slave_0]

モジュール間の配線を行う

connect_bd_intf_net [get_bd_intf_pins myip_AXI_S_master_0/M00_AXIS] [get_bd_intf_pins hier_0/myip_AXI_S_slave_0/S00_AXIS]

外部接続ピンを作成し、接続

create_bd_port -dir I -type rst m00_axis_aresetn
connect_bd_net [get_bd_pins /myip_AXI_S_master_0/m00_axis_aresetn] [get_bd_ports m00_axis_aresetn]
create_bd_port -dir I -type clk m00_axis_aclk
connect_bd_net [get_bd_pins /myip_AXI_S_master_0/m00_axis_aclk] [get_bd_ports m00_axis_aclk]
connect_bd_net [get_bd_pins myip_AXI_S_master_0/m00_axis_aresetn] [get_bd_pins hier_0/myip_AXI_S_slave_0/s00_axis_aresetn]
connect_bd_net [get_bd_pins hier_0/myip_AXI_S_slave_0/s00_axis_aclk] [get_bd_pins myip_AXI_S_master_0/m00_axis_aclk]
endgroup

レイアウトを再生成

regenerate_bd_layout

トップのラッパファイルを作成

make_wrapper -files [get_files ./bd_gen_test00.srcs/sources_1/bd/design_1/design_1.bd] -top
add_files -norecurse ./bd_gen_test00.srcs/sources_1/bd/design_1/hdl/design_1_wrapper.vhd

要するに、人が手作業でBlockDesignを作るときのやり方をtclファイルにして、それを実行させているのです。Tckコマンドの与え方は、VivadoでTcl Consoleを見ているとわかります。

やり方がわかってくれば、Tclのコマンドをテキストエディタでコピペして作ることができるようになって、こんなデザインでも自動的に作れるようになります。

Vpgen4

| | コメント (0)

2017.09.19

Artix-7は、2.5Vでないと基本的にLVDSは使えない

ずっと作っていた1GspsのADC基板を出図して、木曜日に発送してもらえることになりました。6層基板で金フラッシュ仕上げですから、本当に超特急ですね。

さて、アルバイトさんに基板のFPGAのピン配置に合わせてテスト的な信号を出すデザインを作ってもらっていたら、重大な事が発覚しました。

「LVDSの端子から、LVDSが出せない・・(;´Д`)」

いつもKintex-7ばかり使っているので、Artix-7の使い方を忘れていました。

Artix-7にはHRポートしかないから、基本的にLVDSというIOSTANDARDが使えないのです。

入力だけなら・・と思ってみても、DIFF_TERMが使えないので、100Ωの抵抗を外付けする必要があります。

(Vivadoには2.5Vと申告して論理合成させておいて実際に1.8Vで使うという裏技もありますが、それは最後の手段)

Artix-7のI/Oは2.5VにしないとLVDSは出せない

大事なことだからもう一度言います。

Artix-7のI/Oは2.5VにしないとLVDSは出せない

(;ω;)

結局、基板はどうしたかというと、システム全体のV18という電源ネットに2.5Vを加えることにしました。VCCAUXは絶対最大定格2.0Vなので、2.5Vを加えるわけにはいきませんから、VCCAUXを切り離すことにしました。

そして、下の図のような配線でVCCAUXだけをつないで、基板実装後に1.8VのLDOを手づけすることにしました。

Change

基板屋さん的にも間に合ったようで、納期の変更なく作ってくれるようでした。

また、アルバイトさんが実験してくれた感じでは、1.8Vの電源電圧でもLVDS_25を使えば何らかの信号は出るとのことでした。

| | コメント (0)

2017.09.18

祝日なのに

朝から町会のお祭りの片づけをして、夕方商品の発送をするために会社に行くと、祝日なのにアルバイトさんたちが来て、仕事をしてくれていました。ありがとう(◎´∀`)ノ

どうやら祝日であることが周知されていなかったようです。

さて、アルバイトさんがVivadoのBlockDesignを、テキストベースで自動生成する方法を確立してくれたようです。

今日は祝日だから佐川急便が来ないので、特電の製品箱を6個ほど担いで、東京駅の駅ナカにある佐川急便サービスセンターに行って、出荷してきました。

東京駅の佐川急便は年中無休で祝日も開いているのでありがたいです。でも、締め時間が18:00のようで、ぎりぎりセーフでした。

おそらく火曜日にはお客様のところに到着するでしょう。

それから、長年設計していた1GspsのADCボードがようやく完成しました。

Top

Bot

GndMid1_2

Mid2Vcc

VCC層の分割がすごいことになりました。

明日には出図します。

| | コメント (0)

2017.09.15

1GspsのADC基板の設計がひととおり完了

半年以上かけてきたこの基板の設計がようやく90%できました。

Np1094_6

Np1094_7

今日やったことは、

  • クロックの配線
  • 可変ゲインアンプのコントロール配線
  • 本体基板からFPGAをシリアル通信でコントロールする配線
  • LED、テストポイント
  • PDとTESTにプルダウン
  • サブ側のほうのFPGAにもLEDをつける
  • 電源コネクタを付ける
  • ±2.5V電源のところの配線を見直し
  • DRCの見直し
  • 電源がよけられている箇所を発見
  • REFDESのつけなおし
  • シルク調整

まだ残っている事項としては、露出PADの部分の確認と等長配線があります。

来週の火曜日に出図して、木曜日に基板出来上がり。急いで実装して再来週の月曜日発送、火曜日(26日)到着で、3日でデバッグして29日に客先納品・・・できるでしょうか

sun

それから、Cosmo-Kを使った10Gイーサから出したデータを、10GNICとDPDKを使ったLinuxで受信したレートが9.2Gbpsであることが計算できました。ほぼ帯域を使い切ることができました。

ほかには、VivadoのBlockDesignをテキストファイルから生成する実験などをしていました。

| | コメント (0)

2017.09.14

物理学会を聞いてきた

物理学会の講演聞きに宇都宮へ行ってきました。

1日目と3日目を聞きにいきに行ったのですが、FPGAを使っている研究のほとんどがXILINX派でした。Intelは1件だけしか見つかりませんでした。

それぞれFPGAをいろいろな使い方をされていて、非常い興味深いのですが、「ハードウェア作ったけど動かない」とか「高周波特性が出ない」という発表も目立ちました。

まぁ、私から見れば原因や解決法は一発でわかるのですが、部外者なので黙っていました。

私が作ったFPGAボードがATLAS実験のスライドで写真入りで紹介されていて、しかも「特殊電子回路株式会社との共同開発」って社名も書いてくれていたのがあって、超感激です。とりあえず今までのところエラーが起きていないとのことで安心しました。

| | コメント (0)

«ブログを更新するのが滞りがちなので・・