Icarus verilogを使用して、かなり複雑な設計をシミュレートしています。まれに、シミュレーションが「スタック」することがあります。つまり、時計が動かなくなり、信号が変化していないように見えます。これは、デザインのどこかに組み合わせロジックループがあるためだと思います。もちろん問題は、どこにあるのかわからないことです。
これをデバッグする体系的な方法はありますか?私はコードをじっと見つめているだけですが、進歩を遂げることができません。私が試すことができることについての提案は大歓迎です。
シミュレーションを実行するときは、VCDファイルをダンプします。無限ループがある場合は、ファイルに新しい時間が書き込まれることなく、VCDファイルのサイズが大きくなり続けることがわかります。時間は#行の先頭に表示されます。時間の経過なしに、どの信号が変化しているかを判断できます。
したがって、IcarusVerilogにはこの特定のコンパイルフラグ「-pfileline=1」があることがわかります。このフラグをオンにしてvvpを実行すると、実行されている内容に関する多くのデバッグ情報が出力されます。
IMO、ほとんどの場合、無限ループが発生するのはクロック生成です。特に、可変周波数を生成するように設定している場合。たとえば、次のように時計を設定している場合:
`timescale 1ns / 1ns
 real period;
 reg clk;
 initial begin
     period = 5.0;
     clk = 1'b0;
     forever begin
         #(period/2) clk = !clk;
     end
end
誤って0.0に変更すると、変更するperiodと無限ループが発生する可能性があります。period
さらにトリッキーperiod / 2ですが、タイムスケールの精度から外れる場合があります。たとえば、を0.5に設定period = 1.0し、period / 2時間精度が1nsであるため、これは0にスナップし、無限ループが発生します。これが疑われる場合、私は通常、遅延に入る直前の時間を警戒します(ここでも、精度に注意してください...)。
...
half_period_ns = period_ns / 2.0; 
if( half_period_ns == 0 )
    half_period_ns = 1;
#(half_period_ns) clk = !clk;
...
もう1つの方法は、インタラクティブモードでランダムにCtrl-Cでシミュレーションを実行し、コマンドを入力してシミュレーターにどこにあるかを尋ね(シミュレーター固有ですが、悲しいことに、Incisiveではそうwhereだと思います)、シミュレーションを再開します。これを数回行うと、コードがシミュレーターのすべての時間を費やしていることがわかります。