Verilog ブロック ステートメント
ブロック ステートメントと呼ばれる、構文的に単一のステートメントと同等の一連のステートメントをグループ化する方法があります。 .ブロック ステートメントには、順次と並列の 2 種類があります。
順次
ステートメントは begin
を使用してラップされます と end
キーワードであり、指定された順序で順次実行されます。遅延値は、前のステートメントの実行時間に対して相対的に処理されます。ブロック内のすべてのステートメントが実行された後、制御は別の場所に渡されます。
module design0;
bit [31:0] data;
// "initial" block starts at time 0
initial begin
// After 10 time units, data becomes 0xfe
#10 data = 8'hfe;
$display ("[Time=%0t] data=0x%0h", $time, data);
// After 20 time units, data becomes 0x11
#20 data = 8'h11;
$display ("[Time=%0t] data=0x%0h", $time, data);
end
endmodule
上記の例では、begin-end
の最初のステートメント ブロックは 10 時間単位で実行され、2 番目のステートメントは相対的な性質により 30 時間単位で実行されます。前のステートメントの実行後、20 時間単位です。
ncsim> run [Time=10] data=0xfe [Time=30] data=0x11 ncsim: *W,RNQUIE: Simulation is complete.
パラレル
パラレル ブロックはステートメントを同時に実行でき、遅延制御を使用して割り当ての時間順序を提供できます。ステートメントは fork
内にラップすることで並列に起動されます と join
initial begin
#10 data = 8'hfe;
fork
#20 data = 8'h11;
#10 data = 8'h00;
join
end
上記の例では、fork-join
ブロックは、10 時間単位でステートメントを実行した後に起動されます。このブロック内のステートメントは並列に実行され、開始される最初のステートメントは、データに 8'h00 の値が割り当てられるステートメントになります。これは、fork-join の開始後の遅延が 10 時間単位であるためです。さらに 10 時間単位後、最初のステートメントが起動され、データは値 8'h11 を取得します。
initial begin
#10 data = 8'hfe;
fork
#10 data = 8'h11;
begin
#20 data = 8'h00;
#30 data = 8'haa;
end
join
end
begin-end
があります 上の例のブロックであり、begin-end ブロック内のすべてのステートメントは順次実行されますが、ブロック自体は他のステートメントと並行して起動されます。したがって、データは 20 時間単位で 8'h11、30 時間単位で 8'h00、60 時間単位で 8'haa になります。
ブロックの命名
: name_of_block
を追加することで、順次ブロックと並列ブロックの両方に名前を付けることができます キーワード begin
の後 および fork
.そうすることで、ブロックは disable
で参照できます。
begin : name_seq
[statements]
end
fork : name_fork
[statements]
join
Verilog