4

Icarus verilogを使用して、かなり複雑な設計をシミュレートしています。まれに、シミュレーションが「スタック」することがあります。つまり、時計が動かなくなり、信号が変化していないように見えます。これは、デザインのどこかに組み合わせロジックループがあるためだと思います。もちろん問題は、どこにあるのかわからないことです。

これをデバッグする体系的な方法はありますか?私はコードをじっと見つめているだけですが、進歩を遂げることができません。私が試すことができることについての提案は大歓迎です。

4

3 に答える 3

3

シミュレーションを実行するときは、VCDファイルをダンプします。無限ループがある場合は、ファイルに新しい時間が書き込まれることなく、VCDファイルのサイズが大きくなり続けることがわかります。時間は#行の先頭に表示されます。時間の経過なしに、どの信号が変化しているかを判断できます。

于 2012-05-10T13:26:07.157 に答える
3

したがって、IcarusVerilogにはこの特定のコンパイルフラグ「-pfileline=1」があることがわかります。このフラグをオンにしてvvpを実行すると、実行されている内容に関する多くのデバッグ情報が出力されます。

于 2012-05-12T02:30:40.547 に答える
1

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

于 2012-05-10T13:56:35.413 に答える