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
だと思います)、シミュレーションを再開します。これを数回行うと、コードがシミュレーターのすべての時間を費やしていることがわかります。