1

Verilog を介してチップのテストをいくつか実行していますが、少し頭を悩ませている問題に遭遇しました。コードのカバレッジをテストして、すべてのパラメーターのランダム化されたテストなどですべての状態が発生することを確認しています。

次のタイプの 2 つの値を評価する場合:

case(state_vector)

    STATE1:
        ...

    STATE2:
        if(!var1 && var2)
             state_vector = STATE1;
        else
             state_vector = STATE2;

    STATE3:
        ...

ここでの問題は、カバレッジ分析を行う際に、else ステートメントの後のステートメントに決して到達しないことです。つまり、if ステートメントは常に true と評価されます。

当初、var1 と var2 の値はそれぞれ 0 と 1 であると想定していました。レポートを完成させる前に再確認したところ、この仮定が間違っていることに気付きました。波形解析では、シミュレーション全体で var1 が常に 1 であり、var2 が常に 0 であることが示されています。

ここで、値が希望どおりに変化することを確認するためにテストしますが、Verilog でこれがどのように発生するかについて興味があります。基本的に、if ステートメントが無限小単位の時間に対して true と評価されるため、状態に陥っています。

この問題をよりよく評価する方法についてのアイデアはありますか? 現在の状態を確認しようとしているときに、別の関数が state_vector を変更していないことを確認したいと思います。

4

1 に答える 1

2

手っ取り早く汚い方法は$display("%t %m got here",$time);、問題のコードに散らばって、begin-end ブロックのラベルがあることを確認することです。

begin : meaningful_label
  $display("%t %m got here",$time);
  ... code ...
  $display("%t %m got here too",$time);
end

表示ステートメントが呼び出されると、別のstate_vector場所に割り当てられます。それ以外の場合は、何かがコードの刺激を妨げています。

さらにデバッグするには:

  • メッセージを表示しない:
    • より高いレベルに表示メッセージを追加します。
  • メッセージの表示:
    • 一部の波形ビューアーには、アクティブなドライバー トレースがあります。ビューアにこの機能がない場合は、他のすべての割り当てステートメントの周りにメッセージを追加し、条件が真になるタイムスタンプを監視します。
于 2013-06-05T00:02:24.757 に答える