« Spartan-7のMIGの配線を検証する | トップページ | Spartan-7基板のUSBと電源まわりの設計 »

2019.12.14

Vivado 2018.3でMIGを使うデザインがクラッシュする原因

Vivado 2018.3でMIGを使うデザインがクラッシュするという問題の原因がわかりました。

先行する報告としては、AR# 71898 に「MIG 7 Series - パッチ - 2018.3 での既知の問題」というのがありますが、ここに書いてあるパッチを適用しても改善されません。また、フォーラムの記事でもAR71898を試したが改善しなかったという例が出ています。結局2019.1にアップデートして回避したようなのですが、Vivado 2018.3のMIGにはまだ知られていないバグがあるようです。

 

現象としては、プロジェクトの読み込み時や、Synthesisを開始したときに、何のログも残さず、突然Vivadoごと落ちるというものです。

その原因がついにわかりましたので紹介します。

まずは確実にクラッシュするプロジェクトの作り方です。

① Vivadoで新規プロジェクトを作ります。

デバイスはSpartan-7の50にします。

Migcrash1

② BlockDesignを作成し、MIGを配置します。

Migcrash2

③ 配置した直後は、クロックとリセットしかないMIGなので、ダブルクリックして設定画面を開き、Nextを押し押し最後まで設定します。

Migcrash3

④ 最後までカスタマイズすると、いろいろなポートが出てきます。

⑤ Vivadoで一度セーブします。

Migcrash4

何も特別なことをしていないMIG使用デザインですが、実は、この時点で諸悪の根源であるバグが埋め込まれています。ポートを付けたりして論理合成を開始するとクラッシュするでしょう。運が良ければ動くかもしれませんが。

 

では、原因を究明します。

MIGはユーザが設定した内容をprjというファイルに保存します。

prjは<プロジェクトフォルダ>\<プロジェクト名>
.srcs\sources_1\bd\design_1\ip\design_1_mig_7series_0_0 にありますが、中身はXMLファイルのようで、

Migcrash6

これだけ見るとそんなに悪くはなさそうに見えます。

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Project NoOfControllers="1">
<ModuleName>design_1_mig_7series_0_0</ModuleName>
<dci_inouts_inputs>1</dci_inouts_inputs>
<dci_inputs>1</dci_inputs>
<Debug_En>OFF</Debug_En>
・・・

ところが、バイナリエディタで開いてみると

Migcrash7

<?xml の前に、EF BB BFという3バイトのゴミがくっついていました。

どうやらこのゴミが悪さをしているようで、Synthesizeの開始時やプロジェクトのオープンの際にクラッシュしてしまうようです。バイナリエディタを使って綺麗に取り除くと、クラッシュしなくなります。

この3バイトのゴミは、

  • Vivado 2018.3でのみ発生する (2018.1、2018.2では発生しない。2019.1は未確認)
  • デバイスのファミリによらない。Spartan-7だけでなくKintex-7、ZYNQ、Artix-7でも発生する。MIG 4.2でのみ発生すると考えられる。
  • AR71898のパッチを当てても改善しない
  • この3バイトのゴミの内容は変わることがある
  • パソコンの問題ではない(少なくとも3台のPCで検証した)

という特徴があります。

 

どうやって気が付いたかというと、Vivado 2018.2で作ったプロジェクトをVivado 2018.3にアップグレード際にはこの問題が発生しなかったので、そのBlockDesignをTcl化してDIFFしてみました。TCL化BlockDesignの中ではmig_a.prjを生成する関数があるのですが、要するにprjファイルをベタに埋め込んでputsでファイルに書き込んでいるのですが、そこにゴミが映っていたのです。↓

Migcrash8

このDIFFで見つけることができました。

今は2019.2が流行しているので2018.3を使う機会は少ないかもしれませんが、困っている人がいたら是非prjファイルの先頭をバイナリエディタで見るということを伝えてあげてください。

 

|

« Spartan-7のMIGの配線を検証する | トップページ | Spartan-7基板のUSBと電源まわりの設計 »

コメント

コメントを書く



(ウェブ上には掲載しません)




« Spartan-7のMIGの配線を検証する | トップページ | Spartan-7基板のUSBと電源まわりの設計 »