web-dev-qa-db-ja.com

Verilogでの表示の使用

私はVerilogを使い始めたばかりで、シーケンシャル言語ではないことを理解しています。だから、私はいくつかの実行後にモジュールに結果を表示する方法があるのか​​と尋ねたかったのですが、表示は常にinitialブロック内にある必要があるため、デバッグ目的で表示を使用する方法はありません。これは私の問題をよりよく説明するサンプルコードです-

module A(a,b,c);
    input a,b;
    output c;

    assign c=a&b;

    initial
      $display("%b",c);
endmodule

module testbench11;
   reg a,b;
   wire c;

   A a1(a,b,c);

   initial
      $monitor(,$time,"a=%b,b=%b,c=%b",a,b,c);

   initial
      begin
         #0 a=1'b0;b=1'b0;         
         #3 a=1'b0;b=1'b0; 
         #3 a=1'b0;b=1'b0; 
      end
endmodule

ですから、必要な出力が得られているかどうかを確認するために、各インスタンスの後にcの結果を表示したいと思います。この場合、最後に結果を表示するように見えるかもしれませんが、Cでdisplayを使用するのと同じように、デバッグの目的でprintfを使用したかった複雑な問題がいくつかありました。それはverilogで?

5
user4685154

ディスプレイは常にinitialブロック内にある必要があるため、デバッグ目的でディスプレイを使用する方法はありません。

これをどこから入手したかはわかりませんが、assignはブロック内で使用する必要があるという点でintialまたはalwaysとほぼ同じです。

これを使用してモジュール内でデバッグするには:

module A(a,b,c);
  input  a,b;
  output c;

  assign c = a&b;

  always @*
    $display("%b",c);
endmodule

モジュールコードをきれいに保ちながら、トップレベルから表示およびチェックするのが最善です。テストベンチでdisplayを使用するには、次のようにします。

モジュール内と同じ形式:

always @* begin
  $display("%b",c);
end

または、各刺激ステップの後に表示していることを確認するには:

initial begin
  #0 a=1'b0;b=1'b0;         
  #1 $display("%b",c);

  #3 a=1'b0;b=1'b0; 
  #1 $display("%b",c);

  #3 a=1'b0;b=1'b0; 
  #1 $display("%b",c);
end 
5
Morgan

Verilog/SystemVerilogには、よく整理されたイベントキューが含まれています。タイムスタンプごとのすべてのステートメントは、このキューに従って実行されます。以下は、いくつかの異なる表示システムタスクです。

  • $ displayACTIVE regionで実行されるため、非ブロック割り当て(これはINACTIVE領域で実行されます)、$ displayでは表示されません。これにより、1つの出力行が表示されます。

  • $ writeACTIVE領域で実行されますが、改行への明示的な呼び出し別の行を挿入するには、文字(\ n)が必要です。このシステムタスクは通常、forループを使用して多次元配列を表示するときに使用されます。これは(\ n)文字を除いて表示に似ています。

  • $ strobeは、MONITOR/POSTPONED領域で、つまり、タイムスタンプの終わり。したがって、更新された値は$ strobeで示されます。

  • $ monitorは、その表示パラメーターのいずれかが変更されるたびに表示されます。シミュレーションごとに1つの$ monitorのみが使用されます。モニターは、名前が示すように、信号を継続的に監視し、any信号値が変化した場合に実行します。

あなたのコードについて、さまざまなポイントで表示するために、次のコードの変更を行うことができます。

    initial
    #5 $display("%b",c);  // display after some arbitrary time.

    initial
    begin
    repeat(5)
    begin 
     wait(c);
     $display("%b",c);  // display after   change in c 5 times.
    end
    end

    initial
    begin
    forever
    begin 
     #1;
     $display("%b",c);  // display c at every timestamp
    end
    end

    always @(c)
    $display("%b",c);  // display after any change in c

    always @(a,b,c)
    $display("%b",c);  // display after any change in a or b or c

変更のたびに表示するには、$ monitorが役立ちます。 $ displayは上記のように使用できますが、コードが乱雑になります。コードにはone$ monitorのみが必要であることを覚えておいてください。 $ displayにはそのような制限はありません。

これらはメソッドのほんの一部であり、他の多くが利用可能です。詳細は this および this リンクを参照してください。

3
sharvil111