Penugasan Non-Blocking
Termasuk bagian Dasar-Dasar dalam perjalanan Verilog di Coddy. Pelajaran 50 dari 90.
Di pelajaran sebelumnya, kita membahas assignment blocking (=), yang dijalankan langkah demi langkah. Sekarang kita akan membahas assignment non-blocking (<=), yang dijalankan sekaligus, secara paralel.
Penugasan non-blocking menggunakan operator <=. Disebut "non-blocking" karena penugasan ini tidak menghalangi eksekusi pernyataan berikutnya. Semua penugasan non-blocking dalam sebuah blok dieksekusi secara bersamaan.
Sintaks:
variable <= expression;Kapan Menggunakan Penugasan Nonblocking
Penugasan nonblocking (<=) digunakan untuk logika sekuensial: rangkaian yang menggunakan clock dan memiliki memori. Output hanya berubah pada tepi clock (biasanya tepi naik).
Contoh logika sekuensial:
- Flip-flop
- Register
- Penghitung
- Mesin keadaan
- Register geser
Contoh Verilog:
initial begin
a <= 5; // Sudah dijadwalkan, tetapi belum dijalankan
b <= a + 2; // Sudah dijadwalkan, menggunakan nilai LAMA dari a
c <= b * 3; // Sudah dijadwalkan, menggunakan nilai LAMA dari b
endKetiga assignment terjadi secara bersamaan menggunakan nilai lama. Di akhir langkah waktu, semua pembaruan terjadi bersama-sama.
Non-blocking dalam Blok always (Logika Sekuensial)
Non-blocking digunakan untuk logika sekuensial: rangkaian yang menggunakan clock dan memiliki memori (flip-flop, register, counter).
always @(posedge clk) begin
q <= d; // q menerima d saat tepi clock
count <= count + 1; // count bertambah saat tepi clock
endKedua penugasan terjadi pada saat yang sama, menggunakan nilai sebelum tepi clock.
Ringkasan
| Aturan | Penjelasan |
|---|---|
Gunakan <= untuk logika sekuensial | always @(posedge clk) |
Gunakan = untuk logika kombinasional | always @(*) |
| Non-blocking dijalankan secara paralel | Semua penugasan terjadi sekaligus |
| Nilai diperbarui pada akhir langkah waktu | Tidak langsung |
Tantangan
Lengkapi Penugasan Nonblocking
Tambahkan penugasan nonblocking yang belum ada agar shift register 2-bit ini berfungsi.
Cara kerjanya:
- Pada setiap tepi clock,
q1mendapatkand q2mendapatkan nilai lama dariq1
Yang harus kamu lakukan:
- Tetapkan
dkeq1(nonblocking) - Tetapkan
q1keq2(nonblocking)
Coba sendiri
module shift_register (
input clk,
input reset,
input d,
output reg q1,
output reg q2
);
always @(posedge clk or posedge reset) begin
if (reset) begin
q1 <= 0;
q2 <= 0;
end else begin
// TODO: Tambahkan logika pergeseran
// Langkah 1: Tetapkan d ke q1 (non-blocking)
// Langkah 2: Tetapkan q1 ke q2 (non-blocking)
end
end
endmodulePelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Dasar-Dasar
1Pengantar
Apa Itu VerilogPerangkat Keras vs Perangkat LunakModul PertamamuKomentarTingkat Abstraksi Desain4Operator Bagian 1
Operator AritmetikaOperator ModuloOperator PerbandinganUlasan, Matematika SederhanaOperator Bitwise7Penugasan dan Gerbang
Penugasan KontinuPenugasan dengan OperatorPrimitif Gerbang BawaanGerbang AND, OR, NOTGerbang XOR, XNORUlasan: Rangkaian Gerbang Logika10Pengambilan Keputusan
Pernyataan IfIf - ElseRangkuman: Komparator SederhanaPernyataan CaseCasex dan CasezRangkuman: Desain ALU5Operator Bagian 2
Operator LogikaOperator ReduksiOperator GeserOperator PenggabunganOperator KondisionalRangkuman, Tantangan Operator3Sistem Bilangan
Representasi BinerBilangan BerukuranBilangan Tanpa UkuranBilangan NegatifNilai Khusus X dan ZRingkasan: Format Bilangan6Modul
Struktur ModulPort Input dan OutputPort InoutInstansiasi ModulPemetaan Port Berdasarkan NamaPemetaan Port Berdasarkan UrutanRangkuman: Bangun Modul9Blok Prosedural
Blok alwaysBlok initialDaftar SensitivitasPenugasan BlockingPenugasan Non-BlockingRangkuman: always vs initial15Pengendali Lampu Lalu Lintas
Menentukan StatusLogika Mesin StatusLatihan sendiri: Compiler Verilog online