はじめに
この記事はVivadoを用いてコマンドプロンプト上にてVerilogファイルのシミュレーションを行おうとした際に、プログラムが停止しなくなった時の対処法についてです。同じ現象を踏んだ人のために備忘録として残しておきます。
xvlogとは
Vivadoのシミュレーションをコマンドライン上で行う際、まず最初にxvlogコマンドを用いて以下のように使用するファイルを分析させておく必要がある。
xvlog --sv [SystemVerilogもしくはVerilogのファイル]
この際依存関係があるファイルがあるならば、それも同時に読み込ませる必要がある。
xvlogが止まらない
しかし、ある日xvlogを実行しようとするとプロセスが止まらなくなってしまった。CPU使用率などを見ると20%程度を保っているため、プロセスが固まっているわけでは無さそう。しかもある特定の一部ファイルを読み込ませたときにのみ停止しなくなり、それ以外の時は正しくファイルが出力されるため、xvlogそのものが壊れたわけでもない。
対処法
結論から言うと、xvlogは既に分析したファイルの情報をある程度キャッシュして持っており、これを参照することで毎回の動作を高速化しているが、このキャッシュデータにミスがあり無限ループが発生していた。
そのため、対処法は単純に該当キャッシュファイルを削除してやればよい。シミュレーションを実行したディレクトリの./xsim.dir/work/work.rlx
というファイルを見てあげると、各moduleの依存関係をcsvのような何かの形式で保存されていることが分かる。そのためこのファイルの中から動作が停止するプロジェクトに該当する行を見つけ出し、その行を削除すればよい(もしくは面倒ならwork.rlxそのものを吹き飛ばすほうが速い)。もしそれでも解決しないなら、同ディレクトリにある.sdb
ファイルおよび一つ上のディレクトリにある.sim
ディレクトリ以下をすべて削除してから再度実行すると治る。
今回の案件ではA.sv
とB.sv
に対して、なぜかA.sv
はB.sv
を、B.sv
はA.sv
を参照するような循環参照が発生していたため、ファイルの解析が無限に停止しなくなっていたものと思われる(実際のmoduleの構成としてはそのようなことはなく、A.sv
がB.sv
に依存しているのみであった)。
終わりに
Vivado初心者が故、このような単純な問題でも解決に時間を要してしまった。僕が探した範囲ではこの問題の解決策を提示しているものを見つけられなかったため、この情報が同じ問題を踏んだ人の参考になれば幸いである。