Menguasai Pernyataan Blok Verilog: Eksekusi Sekuensial & Parallel
Ada cara untuk mengelompokkan sekumpulan pernyataan yang secara sintaksis setara dengan satu pernyataan dan dikenal sebagai block statements. Terdapat dua jenis block statements: sekuensial dan parallel.
Sekuensial
Pernyataan dibungkus menggunakan kata kunci begin dan end dan akan dieksekusi secara berurutan dalam urutan yang diberikan, satu per satu. Nilai keterlambatan diperlakukan relatif terhadap waktu eksekusi pernyataan sebelumnya. Setelah semua pernyataan dalam blok dieksekusi, kontrol dapat dialihkan ke tempat lain.
module design0; bit [31:0] data; // "initial" block dimulai pada waktu 0 initial begin // Setelah 10 unit waktu, data menjadi 0xfe #10 data = 8'hfe; $display ("[Time=%0t] data=0x%0h", $time, data); // Setelah 20 unit waktu, data menjadi 0x11 #20 data = 8'h11; $display ("[Time=%0t] data=0x%0h", $time, data); end endmodule
Dalam contoh di atas, pernyataan pertama dalam blok begin-end akan dieksekusi pada 10 unit waktu, dan pernyataan kedua pada 30 unit waktu karena sifat relatif. Ini adalah 20 unit waktu setelah eksekusi pernyataan sebelumnya.
Simulation Log
ncsim> run [Time=10] data=0xfe [Time=30] data=0x11 ncsim: *W,RNQUIE: Simulasi selesai.
Parallel
Sebuah blok parallel dapat mengeksekusi pernyataan secara bersamaan dan kontrol keterlambatan dapat digunakan untuk memberikan pengurutan waktu dari penugasan. Pernyataan diluncurkan secara parallel dengan membungkus mereka dalam kata kunci fork dan join.
initial begin #10 data = 8'hfe; fork #20 data = 8'h11; #10 data = 8'h00; join end
Dalam contoh di atas, blok fork-join akan diluncurkan setelah mengeksekusi pernyataan pada 10 unit waktu. Pernyataan di dalam blok ini akan dieksekusi secara paralel dan pernyataan pertama yang akan diluncurkan adalah yang data ditugaskan nilai 8'h00 karena keterlambatannya adalah 10 unit waktu setelah peluncuran fork-join. Setelah 10 unit waktu lagi, pernyataan pertama akan diluncurkan dan data akan mendapatkan nilai 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
Ada blok begin-end dalam contoh di atas, dan semua pernyataan di dalam blok begin-end akan dieksekusi secara berurutan, tetapi blok itu sendiri akan diluncurkan secara paralel bersama dengan pernyataan lain. Jadi, data akan mendapatkan 8'h11 pada 20 unit waktu, 8'h00 pada 30 unit waktu dan 8'haa pada 60 unit waktu.
Penamaan blok
Kedua blok sekuensial dan parallel dapat diberi nama dengan menambahkan : name_of_block setelah kata kunci begin dan fork. Dengan demikian, blok dapat direferensi dalam pernyataan disable.
begin : name_seq [statements] end fork : name_fork [statements] join