Memahami Blok Always Verilog: Sintaks & Daftar Sensitivitas
Sebuah blok always adalah salah satu blok prosedural dalam Verilog. Pernyataan di dalam blok always dieksekusi secara berurutan.
Sintaks
always @ (event) [statement] always @ (event) begin [multiple statements] end
Blok always dieksekusi pada suatu peristiwa tertentu. Peristiwa tersebut didefinisikan oleh daftar sensitivitas.
Apa itu daftar sensitivitas?
Sebuah sensitivity list adalah ekspresi yang menentukan kapan blok always harus dieksekusi dan ditentukan setelah operator @ dalam kurung ( ). Daftar ini mungkin berisi satu atau sekelompok sinyal yang perubahan nilainya akan mengeksekusi blok always.
Dalam kode yang ditunjukkan di bawah ini, semua pernyataan di dalam blok always dieksekusi setiap kali nilai sinyal a atau b berubah.
// Eksekusi blok always setiap kali nilai "a" atau "b" berubah always @ (a or b) begin [statements] end
Blok always digunakan untuk apa?
Sebuah blok always dapat digunakan untuk mewujudkan elemen kombinasi atau sekuensial. Elemen sekuensial seperti flip flop menjadi aktif ketika diberikan clock dan reset. Demikian pula, blok kombinasi menjadi aktif ketika salah satu nilai inputnya berubah. Blok hardware semuanya bekerja secara bersamaan independen satu sama lain. Koneksi di antaranya yang menentukan alur data. Untuk memodelkan perilaku ini, blok always dibuat sebagai proses berkelanjutan yang terpicu dan melakukan beberapa tindakan ketika sinyal dalam daftar sensitivitas menjadi aktif.
Dalam contoh berikut, semua pernyataan di dalam blok always dieksekusi pada setiap tepi positif sinyal clk.
// Eksekusi blok always pada tepi positif sinyal "clk" always @ (posedge clk) begin [statements] end
Apa yang terjadi jika tidak ada daftar sensitivitas?
Blok always berulang terus-menerus selama simulasi. Daftar sensitivitas membawa rasa timing tertentu yaitu setiap kali sinyal dalam daftar sensitivitas berubah, blok always terpicu. Jika tidak ada pernyataan kontrol timing di dalam blok always, simulasi akan terhenti karena loop tak terbatas nol-delay !
Contoh
Contoh yang ditunjukkan di bawah ini adalah blok always yang mencoba membalik nilai sinyal clk. Pernyataan dieksekusi setelah setiap 0 unit waktu. Oleh karena itu, ia berjalan selamanya karena ketiadaan keterlambatan dalam pernyataan.
// blok always dimulai pada waktu 0 unit // Tapi kapan seharusnya diulang ? // Tidak ada kontrol waktu, dan hence itu akan tinggal dan // diulang pada waktu 0 unit saja. Ini berlanjut // dalam loop dan simulasi akan terhenti ! always clk = ~clk;
Meski daftar sensitivitas kosong, harus ada bentuk keterlambatan lain. Waktu simulasi dimajukan oleh pernyataan keterlambatan dalam konstruk always seperti yang ditunjukkan di bawah ini. Sekarang, pembalik jam dilakukan setelah setiap 10 unit waktu.
always #10 clk = ~clk;
Catatan: Keterlambatan eksplisit tidak dapat disintesis menjadi gerbang logika !
Oleh karena itu kode desain Verilog nyata selalu memerlukan daftar sensitivitas.
Contoh Desain Elemen Sekuensial
Kode yang ditunjukkan di bawah ini mendefinisikan modul bernama tff yang menerima input data, clock, dan reset aktif-rendah. Output akan terbalik setiap kali d ditemukan 1 pada tepi positif jam. Di sini, blok always terpicu baik pada tepi positif clk atau tepi negatif rstn.
Apa yang terjadi pada tepi positif jam?
Berikut adalah peristiwa yang terjadi pada tepi positif jam dan diulang untuk semua tepi positif jam.
Blok if pertama memeriksa nilai reset aktif-rendah rstn
Jika rstn nol, maka output q harus direset ke nilai default 0
Jika rstn satu, maka itu berarti reset tidak diterapkan dan harus mengikuti perilaku default
Jika langkah sebelumnya salah:
Periksa nilai d dan jika ditemukan satu, maka balik nilai q
Jika d adalah 0, maka pertahankan nilai q
module tff (input d, clk, rstn, output reg q); always @ (posedge clk or negedge rstn) begin if (!rstn) q <= 0; else if (d) q <= ~q; else q <= q; end endmodule
Apa yang terjadi pada tepi negatif reset?
Berikut adalah peristiwa yang terjadi pada tepi negatif rstn dan terjadi pada semua kejadian semacam itu.
Blok if pertama memeriksa nilai reset aktif-rendah rstn. Pada tepi negatif sinyal, nilainya adalah 0.
Jika nilai rstn adalah 0, maka itu berarti reset diterapkan dan output harus direset ke nilai default 0
Kasus di mana nilai rstn adalah 1 tidak dipertimbangkan karena peristiwa saat ini adalah tepi negatif dari rstn
Contoh Desain Elemen Kombinasi
Sebuah blok always juga dapat digunakan dalam desain blok kombinasi. Misalnya sirkuit digital berikut mewakili kombinasi tiga gerbang logika berbeda yang memberikan output tertentu pada sinyal o.
Kode yang ditunjukkan di bawah ini adalah module dengan empat port input dan satu port output bernama o. Blok always terpicu setiap kali salah satu sinyal dalam daftar sensitivitas berubah nilai. Sinyal output dideklarasikan sebagai tipe reg dalam daftar port modul karena digunakan dalam blok prosedural. Semua sinyal yang digunakan dalam blok prosedural harus dideklarasikan sebagai tipe reg.
module combo ( input a, input b, input c, input d, output reg o); always @ (a or b or c or d) begin o <= ~((a & b) | (c^d)); end endmodule
Lihat bahwa sinyal o menjadi 1 setiap kali ekspresi kombinasi di RHS menjadi benar. Demikian pula o menjadi 0 ketika RHS salah.
Simulation Output
Klik di sini untuk slideshow dengan contoh simulasi !