Xilinx ISE のメッセージフィルタ の履歴(No.2)
更新メッセージフィルタ†
ISE で論理合成する時、 ちょっと大きな回路だと無数の警告が表示されてしまうために、 本当に必要な警告を見落としてしまうことが多いです。
それを解決するために提供されているのがメッセージフィルタという機能。
特定の警告を表示されないように指定できます。
使い方は、Design Summary のページから Erros and Warning で該当メッセージを右クリックし、"Filter All Instance of This Message" あるいは "Filter This Instance Only" を選びます。
上記2つの項目のどちらもメニューのアクセラレータキーが "F" になっていて、 キーボードで選択できないなど、手抜き加減が見えますが、、、
それ以外にも以下のように、 かなり使い物にならないできばえであるのが残念なところです。
メッセージエディタが使いにくすぎる†
この機能はGUIが貧弱すぎて、まともに使うのがつらいです。
多くのフィルタを追加してある状況では "Edit Message Filters..." から フィルタの一覧を表示するだけでも数十秒以上待たされますし、
フィルタを無効化したり、削除したりするのに複数のフィルタを一度に 選んで消すことができないため、何十回もクリックを繰り返す羽目になります?! (ISE 12.2)
あまりにひどい。
青文字で表示されるメッセージにフィルタをかけるには†
青文字で表示されるメッセージは右クリックすると発生行に飛んでしまいます。
仕方がないので、カーソルで選択して、 キーボードのコンテキストメニューキーでメニューを表示してフィルタを掛けます。
これも、バグに近い仕様ですね。(ISE 12.2)
メッセージフィルタの設定ファイル†
メッセージフィルタの設定は、以下のファイルに XML 形式で書かれています。
- ISE 11.X まではプロジェクトファイルと同じフォルダにある filter.filter
- ISE 12.1 からは iseconfig の下の filter.filter
フィルタの設定を消したければ、メッセージエディタを使わずに これをテキストエディタで開いて編集するのが良さそうです。
慎重にやらないとファイルを壊してしまうことになりますが。
メッセージフィルタの設定項目†
例として、PicoBlaze を使うだけで数十個表示される
Xst:616 - Invalid property "XC_PROPS INIT": Did not attach to data_srl_0.
というメッセージに対して This Instance Only でフィルタを設定してみると、 設定ファイルには
LANG:xml <filter task="xst" file="Xst" num="616" type="warning"> <arg index="1">XC_PROPS</arg> <arg index="2">INIT</arg> <arg index="3">data_srl_0</arg> </filter>
という項目が表示されました。
フィルタに発生箇所が含まれない場合がある†
上記内容から、フィルタにはファイル名などの情報が含まれていない場合があり、その場合にはたまたま変数名がかぶってしまうと、別の部分にかけたフィルタが予期しない部位の警告を無効化してしまう可能性がある ことが分かります。
メッセージに発生位置が表示されていない警告をフィルタする場合には このことに注意しないと、予期しないエラーに悩まされる可能性があります。
条件を緩和してみる†
同じことを All Instances of This Message としてやると、
LANG:xml <filter task="xst" file="Xst" num="616" type="warning"></filter>
となりました。
そこで、上記フィルタを編集して
LANG:xml <filter task="xst" file="Xst" num="616" type="warning"> <arg index="1">XC_PROPS</arg> <arg index="2">INIT</arg> </filter>
としてみたところ、変数名に依らず、以下の形のメッセージを全てフィルタすることができました。
Xst:616 - Invalid property "XC_PROPS INIT": Did not attach to ????
数十のメッセージを消すのに数十のフィルタを追加してしまうと 手抜きのGUIのせいで大変なことになってしまいますから、 このように条件の緩いフィルタ1つで多くのメッセージを 抑制できると便利ですね。
ファイル名が表示されたメッセージでは行が変わるとフィルタが効かない†
Xst:2591 - "kcpsm3/kcpsm3.v" line 402: attribute on instance <INIT> overrides generic/parameter on entity. It is possible that simulator will not take this attribute into account.
に対して作成したフィルタでは、
LANG:xml <filter task="xst" file="Xst" num="2591" type="warning"> <arg index="1">"kcpsm3/kcpsm3.v" line 402:</arg> <arg index="2">attribute on instance</arg> <arg index="3">INIT</arg> <arg index="4">generic/parameter on entity</arg> </filter>
となりました。発生場所が引数の1番目に入っています。
引数には行番号が入ってしまいますので、 ソースコードを編集して行番号がずれてしまうとフィルタが効かなくなってしまう という恐ろしい仕様になっています。
一旦フィルタしたはずのメッセージが、再度表示されるため、 またフィルタをかける、という繰り返しにより、 まったく意味のないフィルタが際限なく増えてしまうことになります。
ファイル名と行番号が別の引数になっていてくれれば、 行番号部分の指定を削ったフィルタにしてやれば事が済むのですが、 これではどうしようもないですね。。。
仕様がよく錬られていないことが仇になっています。
せめて、Rebuild All の際に1回もマッチしなかったフィルタを表示して消せる機能 が欲しいところです。
できれば、削除ではなく自動で行番号を調整し直してくれれば言うことないのですが。
ファイル名と行番号とが別のメッセージもある?†
Xst:2546 - "utility/bmem.v" line 46: reading initialization file "vga/obj/svga16color_screen00.mem".
については、
LANG:xml <filter task="xst" file="Xst" num="2546" type="info"> <arg index="1">utility/bmem.v</arg> <arg index="2">46</arg> <arg index="3">vga/obj/svga16color_screen00.mem</arg> </filter>
となって、ファイル名と行番号とが別になっているので、 行番号部分を除いて条件を緩和して、次のようにしておけば ソースコードを編集してもフィルタが無効になることはないですね。
LANG:xml <filter task="xst" file="Xst" num="2546" type="info"> <arg index="1">utility/bmem.v</arg> <arg index="3">vga/obj/svga16color_screen00.mem</arg> </filter>
条件を緩和したフィルタが勝手に変更されてしまう†
上記のように条件を緩和したフィルタは便利に使えるのですが、 GUIから新しいフィルタを追加すると勝手に書き換えられてしまうようです(泣
LANG:xml <filter task="xst" file="Xst" num="2546" type="info"> <arg index="1">utility/bmem.v</arg> <arg index="2">vga/obj/svga16color_screen00.mem</arg> </filter>
このように飛んでいた番号が連番に戻されてしまいました↑
うーむ、どうしろっていうんだか・・・
ファイル名だけを指定したフィルタは作れないみたい†
<filter> の中の num="2546" を消してしまって、
LANG:xml <filter task="xst" file="Xst" type="info"> <arg index="1">utility/bmem.v</arg> </filter>
とすれば、このファイルの中の全ての info メッセージを抑制できるのかと思ったのですが、 num の指定のない <filter> は単に無視されてしまうようでした。
結論†
現状では、メッセージフィルタを使っても、警告メッセージをまともに見られるようにするのは Xilinx ISE を使っている限り難しいみたいですね。
皆さんどうしているんでしょう????
やはり、C の #pragma のような機能を使って、 ソースコード中の特定の範囲で、特定の警告メッセージを抑制できるようにして欲しいところです。
メッセージフィルタはメッセージフィルタで、 テストコードなどのために一時的に使うのには便利なので、 複数のフィルタをグループ分けして、一気に有効・無効を切り替えたり、 削除したりできるといいですね。
Xilinx さん頑張って!