XILINXのPCIe 7x 1.9コアでクラッシュする
2016年ごろに作ったPCI ExperssのボードのFPGAのデザインが、SuperMicroというメーカーのマザーボードを使った特定のPCでクラッシュするという現象がお客様から報告されました。
この状況を再現するため、特電の倉庫にSuperMicroのマザーを積んだデスクトップPCを取りに行って、CERN CentOS 7という謎ディストリビューションのLinuxをインストールし(インストール中にいろいろダウンロードするので1日以上かかった)たりしていました。
調べてみると、BAR0などのメモリ空間にアクセスしつつ、別のシェルでlspciを実行するとハングアップするという感じでした。
落ちる前にはBARからの読み出しでFFFFFFFFが返って来るので、感触としてはBARにアクセスするトランザクションがcompletionを返す前にコンフィグリクエストが来ると、どちらかのcompletionを忘れてしまうんじゃないかと思える挙動です。
使っているXILINXのIPコアは2016年ごろのpcie 7x 1.9)です。当時のツールはISE14.7かVivado 2016かという選択でしたが、Vivado 2016は使う気にならなかったので、ISEを使っていました。
そのため、ISE 14.7に入っていたpcie 7x 1.9コアを使っていたのですが、pcie 7x 1.9はPCI Expressのトランザクション層のほぼ生のパケットが出てくるので、PCI Expressをしばらく触っていないと信号の意味を忘れてしまいます。ISEなので膨大な量の信号がテキストベースでインタフェースされているので、どこがどうつながっているのかを把握するだけでも一苦労です。
そう考えるとVivadoってすごいですね。配線がどこがどうつながっているか視覚的にわかります。それになんといっても、
・・・
-- Management Interface
cfg_mgmt_di : in std_logic_vector (31 downto 0);
cfg_mgmt_byte_en : in std_logic_vector (3 downto 0);
cfg_mgmt_dwaddr : in std_logic_vector (9 downto 0);
cfg_mgmt_wr_en : in std_logic;
cfg_mgmt_rd_en : in std_logic;
cfg_mgmt_wr_readonly : in std_logic;
-- Error Reporting Interface
cfg_err_ecrc : in std_logic;
cfg_err_ur : in std_logic;
cfg_err_cpl_timeout : in std_logic;
cfg_err_cpl_unexpect : in std_logic;
cfg_err_cpl_abort : in std_logic;
cfg_err_posted : in std_logic;
・・・
みたいな100個以上ある謎の信号を扱わなくていいのですから。
Vivado 2019.2に入っている比較的新しいコア(XDMA 4.1)とVivado 2019.2で作ったサンプルデザインで試したところ、全くハングアップしなくなりました。
なお、XDMA 4.1は中心にpcie 7x 3.3が入っていて、AXIラッパとDMA回路が入ったものです。
pcie 7x 1.9コア が悪いのか、pcie 7xの周辺回路が悪いのかわかりません。pcie 7xの入出力信号を追いかけるのはとても時間がかかる作業となるので原因究明は行いません。まぁ、おそらく未処理のMemRdコンプリーションとCfgRdが重なるとバグるのでしょう。
とにかく、新しいVivadoで再設計するのが最も近道のようです。
| 固定リンク
コメント