Menu
CoddyTech

Penundaan Penugasan

Termasuk bagian Dasar-Dasar dalam perjalanan Verilog di Coddy. Pelajaran 69 dari 90.

Dalam pelajaran sebelumnya, kita membahas penundaan umum (#10 a = b;) dan penundaan gerbang (and #5 (out, a, b);). Sekarang kita membahas penundaan penugasan, yaitu penundaan yang terjadi di dalam blok prosedural (seperti initial atau always) sebagai bagian dari pernyataan penugasan.

Penundaan penugasan menunggu selama waktu yang ditentukan, lalu melakukan penugasan. Penundaan diletakkan setelah simbol # dan sebelum penugasan.

Sintaks:

variable = #delay expression;

Tidak seperti penundaan umum #10 a = b; (tunda lalu tetapkan), penundaan penetapan a = #10 b; mengambil nilai b pada saat itu, menunggu 10 unit waktu, lalu menetapkannya ke a.

Penundaan Penugasan vs Penundaan Umum

 Penundaan UmumPenundaan Penugasan
Sintaks#10 a = b;a = #10 b;
Kapan nilai dibaca?Pada saat penugasan (setelah penundaan)Segera (sebelum penundaan)
Nilai apa yang ditugaskan?Nilai b pada saat ituNilai b pada waktu 0 (atau waktu pembacaan)
Kapan nilai ditugaskan?Setelah penundaanSetelah penundaan

Contoh: Perbedaannya

initial begin
  b = 1;
  #5 b = 0;
  
  // Penundaan umum
  #10 a1 = b;     // Menunggu 10, lalu membaca b (b=0) → a1=0
  
  // Penundaan penugasan
  a2 = #10 b;     // Membaca b sekarang (b=0), menunggu 10, lalu menetapkan nilainya → a2=0
end

Keduanya memberikan hasil yang sama di sini. Perbedaannya terlihat saat b berubah selama penundaan.

Contoh Perbedaan Utama

To show b changing during the delay, we need two separate initial blocks that run in parallel:

initial begin
  b = 1;
  a1 = #10 b;     // Membaca b=1 pada waktu 0, menetapkan a1=1 pada waktu 10
end

initial begin
  #5 b = 0;       // Mengubah b menjadi 0 pada waktu 5 (selama penundaan)
end
  • Pada waktu 0: a1 membaca b = 1
  • Pada waktu 5: b berubah menjadi 0 (saat a1 masih menunggu)
  • Pada waktu 10: a1 diberi nilai 1 (nilai yang dibaca pada waktu 0), bukan 0

Dengan penundaan umum #10 a2 = b; di blok terpisah, b akan dibaca pada waktu 10 (nilainya 0).

Aturan Penting

AturanPenjelasan
= ditulis sebelum #a = #10 b; bukan a #10 = b;
Nilai langsung dibacaSisi kanan langsung dievaluasi
Penugasan dilakukan setelah penundaanSisi kiri menerima nilai kemudian
Hanya untuk blok proseduralDigunakan dalam initial atau always
challenge icon

Tantangan

Yang harus dilakukan:

Tambahkan penundaan assignment yang hilang agar a mendapatkan nilai b setelah 15 satuan waktu, tetapi langsung membaca b.

Coba sendiri

module assignment_challenge;
  reg a, b;
  
  // Blok terpisah untuk mengubah b selama penundaan
  initial begin
    b = 1;
    // TODO: Tambahkan penundaan penugasan
    // a harus menerima nilai b setelah 15 satuan waktu
    // Baca b sekarang, lalu tetapkan nilainya setelah penundaan

  end
  
  initial begin
    #5 b = 0;      // Mengubah b selama penundaan
    #20 $display("Time %0t: a = %b", $time, a);
    $finish;
  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