web-dev-qa-db-ja.com

永遠にそして常にステートメントの使用

次の両方のコードはクロックを生成します。クロック生成以外に無限ループが使用されているかどうかを知る必要がありますか?私は時計の生成で永遠に出くわしただけです。それがこの目的だけに役立つのなら、それは役に立たないのではないでしょうか?

initial begin
clk = 0;
forever begin
#5 clk = ~clk;
end
end

initial begin
clk = 0 ;
always begin 
# 5 clk = ~clk;
end
end
8
chitranna

はい、foreverループは、設計検証、業界標準の方法論、UVM、およびその前身(VMMなど)のテストベンチで広く使用されています。これらは、SystemVerilogクラスのタスクを広範囲に使用するドライバーやモニターなどの検証コンポーネントで使用されます。

1
toolic

2番目のコードスニペットは実際には構文エラーです。 foreveralwaysの違いは、alwaysが「モジュールアイテム」として存在できることです。これは、Verilog仕様が内部に直接記述できるコンストラクトに付ける名前です。他の構成に含まれていないモジュール。 initialもモジュールアイテムです。 alwaysブロックは繰り返されますが、initialブロックはシミュレーションの開始時に1回実行されます。

foreverは、手続き型コンテキストでのみ使用できる手続き型ステートメントです。したがって、initial foreverまたはalways foreverを書くことは合法ですが、foreverだけではありません。

foreverが非常に重要になる状況は、手続き型コンテキストであるタスク内であるため、alwaysの使用は許可されていません。 (関数も手続き型コンテキストですが、遅延が含まれていない可能性があるため、foreverが役立つ可能性は低くなります。

8
Andy

//違いを表示します;;;;;;; //エラーと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
0
user3755130