Menu
CoddyTech

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
end

Ketiga 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
end

Kedua penugasan terjadi pada saat yang sama, menggunakan nilai sebelum tepi clock.

Ringkasan

AturanPenjelasan
Gunakan <= untuk logika sekuensialalways @(posedge clk)
Gunakan = untuk logika kombinasionalalways @(*)
Non-blocking dijalankan secara paralelSemua penugasan terjadi sekaligus
Nilai diperbarui pada akhir langkah waktuTidak langsung
challenge icon

Tantangan

Lengkapi Penugasan Nonblocking

Tambahkan penugasan nonblocking yang belum ada agar shift register 2-bit ini berfungsi.

Cara kerjanya:

  • Pada setiap tepi clock, q1 mendapatkan d
  • q2 mendapatkan nilai lama dari q1

Yang harus kamu lakukan:

  1. Tetapkan d ke q1 (nonblocking)
  2. Tetapkan q1 ke q2 (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
endmodule
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Dasar-Dasar

Latihan sendiri: Compiler Verilog online