はじめに
久しぶりに Altera 社の Quartus を使ってた時、身に覚えの無い「Error (10517): VHDL type mismatch error at xxxx.vhd(nn): boolean type does not match integer literal」(xxxx.vhdはIPのトップ階層のVHDLのファイル名でnnは行番号)に出くわしました。
その対処方法が判りにくかったので、防備録としてメモっておきます。
トラブルが発生した環境
- Altera 社 Quartus Prime Verion 15.1.0 Build 185 10/21/2015 SJ Lite Edition
- Qsys を使って各種IPを接続している
- 使っているIPのうち、Top階層のHDL が VHDL かつ generic に boolean 型のパラメータ変数がある IP がある
- Quartus Prime の Setting > IP Settings > IP generation HDL preference: が Verilog になっている
トラブルの原因
Quartus Prime の Setting > IP Settings > IP generation HDL preference: が Verilog になっていると、Analyze時に Qsysで作ったHDLのトップ階層のHDLが Verilog-HDL に変換されてプロジェクト内(db/ip/xxxx/xxxx.v xxxx には Qsys で作ったシステムの名前)に取り込まれるようです。その際、インスタンスしたIPのboolean型のパラメータ変数に(true/false)ではなく(1/0)を設定してしまいます。で、IPのトップ階層がVHDLだと、当然 boolean型のパラメータに 1 or 0 を設定していることになり、VHDLの文法エラーになるわけです。
対処方法
対処方法は、次のいずれかです
- Quartus Prime の Setting > IP Settings > IP generation HDL preference: を VHDL にする
- IPのTop階層のVHDLを、Verilogに書き換える
- IPのboolean型のパラメータをInteger型にする
正直、IPを書き換えるのは手間だし、そもそも他者の作ったIPだとどうしようも無いので、多分 1 が一番楽。
参考
似たようなトラブルが報告されています
-
Error: VHDL type mismatch error at .vhd: boolean type does not match integer literal
2013年2月に報告されていて、「This issue will be fixed in a future release of Quartus® II software.」なんて書いてますが。 -
Error (10517): VHDL type mismatch error at altera_epcq_controller_core.vhd(17): boolean type does not match integer literal
これも多分同じ原因かな。解決策として「Use the Verilog language for Qsys generation.」とありますが、私が試してみたところ、Qsys の generation HDL を Verilog にしても VHDL にしても結果は変わりませんでした。こちらには「This problem is fixed in version 15.0 of the Quartus II software.」とありますが。
もしかして、Setting > IP Settings > IP generation HDL preference: を VHDL にするのが解決策ってことなんだろうか? だとしたらちょっとスジ違いな解決策ですね。そもそも Verilog-HDL に変換する際に Boolean 型のパラメータをちゃんと true/false にするのがスジじゃないかな~。