私は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で?
ディスプレイは常に
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
Verilog/SystemVerilogには、よく整理されたイベントキューが含まれています。タイムスタンプごとのすべてのステートメントは、このキューに従って実行されます。以下は、いくつかの異なる表示システムタスクです。
$ displayはACTIVE regionで実行されるため、非ブロック割り当て(これはINACTIVE領域で実行されます)、$ displayでは表示されません。これにより、1つの出力行が表示されます。
$ writeもACTIVE領域で実行されますが、改行への明示的な呼び出し別の行を挿入するには、文字(\ 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 リンクを参照してください。