DDR3メモリ基板の不具合を発見
あるお客様からの依頼で、DDR3を搭載した基板のデバッグをすることになりました。
いわゆるコンサルティングのご依頼です。
DDR3メモリを搭載した基板のキャリブレーションが終了しない(init_doneが立ち上がらない)とのことなのですが、確かに動きません。MIGの設定で数か所間違いはあったものの、直しても動きません。
クロック速度を下げても、データバス幅を狭くしても動かきません。オシロで見た感じでは波形の反射とかでもなさそうです。
普通ならここであきらめるしかないのですが、特電は違います。
MITOUJTAGがあります。
MITOUJTAGを使うと、FPGAの動作状態にかかわらず、JTAGを使って端子だけを操作するという強力なデバッグができるからです。
しかも、MITOUJTAG Proには、C言語のスクリプトを使って波形を作り出す機能があり、DDR3メモリの波形パターンを作るライブラリも用意されています。
FPGAを論理合成して動かす普通のやり方だと、規定された標準的な信号パターン以外は出せません。たとえば、DQSの配置が間違っていたり、配置できないピンにつないでいたりすると、どうしようもありません。
ところが、C言語でソフトウェア的にI/Oの端子を動かすのであれば、どのようなパターンでもFPGAから出力できます。
そこで、まずはツール自体の動作をテストするために、確実に動作する特電のKintex-7ボードを使ってMITOUJTAGのスクリプトを試してみました。
DDR3メモリのテストのやり方は、
- データバスを1本1本Hにした書き込みを行ってデータバスのオープン/ショートを発見する
- その後、アドレスバスを1本ずつHにした書き込みを行って、アドレスバスのオープンショートを発見する
というものです。
実際には下の図のようなパターンを作り出します。波形の赤いところは出力している信号、緑は入力している信号です。
このとき、コンソールには
と表示されます。
次に、お客様の基板でやってみると、データバスのうち何本かで読みだしたデータが常にLになっていて、断線してることがわかりました。
DQ7が切れていたので8bitに縮退させても動かなったのです。
そこで、中間のDQ[39:8]だけを使って32bitに縮退させたデザインをMIGで作って動かしてみると、問題なくDDR3 SDRAMが起動することが確かめられました。
FPGAを普通に動作させて、動作中の状態をバウンダリスキャンで見てみると、ちゃんとinit_doneの信号が上がるのがわかります。ちゃんと1600MT/sで動作しています。
どうやら基板のパターンの不具合のようでした。
エンドユーザさんに聞いたところによると、この問題でもう数か月止まってしまっているとのことでした。MITOUJTAG ProのJTAGスクリプト機能とDDR3ライブラリを使うことで、長い間かかっていた問題が、わずか1日で解決できました。