次の両方のコードはクロックを生成します。クロック生成以外に無限ループが使用されているかどうかを知る必要がありますか?私は時計の生成で永遠に出くわしただけです。それがこの目的だけに役立つのなら、それは役に立たないのではないでしょうか?
initial begin
clk = 0;
forever begin
#5 clk = ~clk;
end
end
initial begin
clk = 0 ;
always begin
# 5 clk = ~clk;
end
end
はい、forever
ループは、設計検証、業界標準の方法論、UVM、およびその前身(VMMなど)のテストベンチで広く使用されています。これらは、SystemVerilogクラスのタスクを広範囲に使用するドライバーやモニターなどの検証コンポーネントで使用されます。
2番目のコードスニペットは実際には構文エラーです。 forever
とalways
の違いは、always
が「モジュールアイテム」として存在できることです。これは、Verilog仕様が内部に直接記述できるコンストラクトに付ける名前です。他の構成に含まれていないモジュール。 initial
もモジュールアイテムです。 always
ブロックは繰り返されますが、initial
ブロックはシミュレーションの開始時に1回実行されます。
forever
は、手続き型コンテキストでのみ使用できる手続き型ステートメントです。したがって、initial forever
またはalways forever
を書くことは合法ですが、forever
だけではありません。
forever
が非常に重要になる状況は、手続き型コンテキストであるタスク内であるため、always
の使用は許可されていません。 (関数も手続き型コンテキストですが、遅延が含まれていない可能性があるため、forever
が役立つ可能性は低くなります。
//違いを表示します;;;;;;; //エラーとintialブロック//コード内のブロック我々は最初のブロックの中で永遠にブロックを使用することはできませんが、私たちは永遠に使用することができます。
module stimulus(output reg a,b);
initial
begin
a = 1'b1;
b = 1'b0;
always
begin
#5 a = ~a; //error when compiling
#6 b = ~a;
end
end
initial
#25 $stop;
endmodule
// code with no error
module stimulus(output reg a,b);
initial
begin
a = 1'b1;
b = 1'b0;
always
begin
#5 a = ~a; //no error when compiling
#6 b = ~a;
end
end
initial
#25 $stop;
endmodule