ひでみのアイデア帳

くだらないことなんだけど、忘れないために・・・

Vivado 2016.3のその後・・・

Vivado 2016.3は久々にずいぶんとアドベンチャーをしたが大雑把にまとめてみると、

  • プロジェクトをバージョンアップするとプロジェクトが壊れる
  • プロジェクトをExportすると壊れたtclファイルが生成される
  • プロジェクトをインプリすると壊れたBitファイルが生成される

と、これらに含まえる散々な不具合に目に会ってきた。

っうか、今月はこればかりで遊んでたぞ(苦笑)。

でも、出会った不具合はたいてい約15分ぐらいで解決できるものばかりだった。

プロジェクトが壊れても、

  • BDファイル見れば直せるレベルだし、
  • tclファイルもIPコア名が抜けているとかなので直せるレベルだし、
  • Bitファイルが壊れたのはMultiの設定をした瞬間だったので、「スレッドダメかい!」

で、解決できるものばかりだった。

しかも、全てがプロジェクトをバージョンアップしたもので発生していて、新規作成のプロジェクトだったら発生していなかったので不具合をあまり気にも止めていなかった。

しかし、とうとう新規プロジェクトでも不具合が発生した。

これを解決するには1時間以上かかってしまったのだ。

信号をインプリメントできないエラー

インプリメントで信号がインプリメントできないというエラーに遭遇した。

実はログを取っていなかったので詳細なログで話せないのだが、要するに「A信号を引けません!」というエラー。

実は自分の設計スタイルが原因でVivadoの不具合にぶつかってしまった。

ひでみの開発スタイル

普段、次の手順で開発を進めていく。

  1. 大雑把にモジュール分割を設計する
    • 中身は詳細に出来上がってなくても良い
    • 機能分割さえできていればいい
  2. 詳細なI/Fを決定する
    • 中身がなくてもI/Fだけは詳細に決める
    • 開発中でも変更が少ないI/Fにする
  3. モジュールごとにトップ階層を作成する
    • 中身がなくてもI/Fが決まっていればトップ階層は作成できる
  4. IPパッケージ化する
    • 中身がなくてもIPパッケージはできる
  5. IP Intergatorで結線する
    • 中身がなくても絵が描ければ、エクセルとかパワポでブロック図、描かなくてもいいでしょ
    • これならエクセル上級者でなくてもブロック図、描けるでしょ
    • この時点で仕様書の初稿ができる
  6. 各IPパッケージを並行して開発する
    • Zynqの開発であれば、モジュール(Verilog)、高位合成(HLS)、OS(カーネル・ドライバ)、アプリ(Linuxアプリ)は並行作業
  7. Synthesis、Impliment、実機テストをガンガン回す
    • ほぼ、アジャイル手法でブン回す

このようなスタイルで新規設計の場合、中身がないトップ・モジュールばかり作成する。

で、どんなエラー?

外枠ができたところで中身を作成していくことになるんだが、Vivado 2016.3ではIP毎に分割してSynthesisやImplimentを実行していく。

例えば、AというIPの出力とBというIPの入力が繋がっているとしよう。

AとBのIPは別々にSynthesisとImpliment(の途中までと言えば良いのかな?)が行われる。 詳細に調べてないのでImplimentの部分は自信がないが・・・

ここでImplimentするとBのIPの信号が引けないとエラーがでることがある。

B単体で確認すると中ではちゃんと信号名も間違えてないし、生成されている。 もちろん、Bは単体でImplimentしても問題ない。 しかし、AとくっつけるとBの中身の信号が引けないと出力される。

よくよく、追いかけてみると実はAの出力の大元の信号が無かったのだ。

エラーが出たBの信号は一番、末端で原因は一番最上流のAの大元信号が無いためにImplimentでは論理削除されなかったようだ。 しかも、このエラーはIPを跨いだ場合にだけ発生する。

このエラー、隣同士のIPで発生していればまだ見つけやすいのだが何個もIPを連結していると、エラーが発生するのは最上流を原因に最末端でエラーが発生するので遡るのに凄く時間がかかってしまう。 Verdiとかあれば別だけどね・・・。