Vivado 2016.3は久々にずいぶんとアドベンチャーをしたが大雑把にまとめてみると、
と、これらに含まえる散々な不具合に目に会ってきた。
っうか、今月はこればかりで遊んでたぞ(苦笑)。
でも、出会った不具合はたいてい約15分ぐらいで解決できるものばかりだった。
プロジェクトが壊れても、
で、解決できるものばかりだった。
しかも、全てがプロジェクトをバージョンアップしたもので発生していて、新規作成のプロジェクトだったら発生していなかったので不具合をあまり気にも止めていなかった。
しかし、とうとう新規プロジェクトでも不具合が発生した。
これを解決するには1時間以上かかってしまったのだ。
インプリメントで信号がインプリメントできないというエラーに遭遇した。
実はログを取っていなかったので詳細なログで話せないのだが、要するに「A信号を引けません!」というエラー。
実は自分の設計スタイルが原因でVivadoの不具合にぶつかってしまった。
普段、次の手順で開発を進めていく。
このようなスタイルで新規設計の場合、中身がないトップ・モジュールばかり作成する。
外枠ができたところで中身を作成していくことになるんだが、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とかあれば別だけどね・・・。