Altifigence Academy

15 / 37 · Konsep

Penugasan nonblocking dan pembaruan keadaan serentak

Pisahkan nilai lama dan berikutnya untuk menafsirkan RTL pipeline serta pencacah dengan tepat.

Evaluasi sisi kanan dari keadaan sebelumnya

Pada blok sekuensial berbasis clock, <= mengevaluasi sisi kanan lalu menerapkan hasil pada tahap pembaruan nonblockingNonblocking Penugasan <= pada RTL sekuensial: sisi kanan dievaluasi lalu pembaruan dijadwalkan, sehingga register pada tepi sama menghitung dari keadaan lama.. Beberapa registerRegister Rangkaian penyimpan beberapa bit keadaan. Register sinkron mata kuliah ini menangkap masukan yang ditentukan pada tepi clock. Selengkapnya dapat diperbarui pada tepi sama tanpa nilai baru merambat mengikuti urutan baris.

SystemVerilog
always_ff @(posedge clk) begin
  if (rst) begin
    a <= 8'd0;
    b <= 8'd0;
  end else begin
    a <= d;
    b <= a;
  end
end
ak+1=dk,bk+1=aka_{k+1}=d_k,\qquad b_{k+1}=a_k

Dari a=b=0 dengan masukan 5,9,2, pasangan setelah tepi adalah (5,0),(9,5),(2,9). Menafsirkan baris kedua membaca a baru berarti menghilangkan satu tahap pipelinePipeline Struktur yang membagi perhitungan menjadi tahap berregister untuk memproses beberapa masukan bertumpang tindih. Data, valid, dan kontrol harus selaras. Selengkapnya.

Setiap kolom mengamati tepi naikTepi naik Saat clock berubah 0 ke 1, berbeda dari tingkat yang mencakup seluruh interval CLK=1. Selengkapnya. Masukan adalah sebelum tepi dan after adalah keadaan setelah pembaruan; penjajaran bukan tundaan propagasiTundaan propagasi Waktu sejak masukan berubah hingga keluaran stabil pada nilai benar. Kesetaraan logika berbeda dari karakteristik waktu. Selengkapnya fisik. Dari a=b=0, a menyimpan d baru sementara b menyimpan a lama, sehingga kedua baris berselisih satu tahap.

a dan b membaca keadaan lama yang sama
Lihat data gelombang
Data gelombang: setiap karakter mewakili satu interval; titik mempertahankan keadaan sebelumnya; p adalah satu siklus clock.
SinyalGelombangNilai bus
edge234E0 → E1 → E2
d2345 → 9 → 2
a sesudah2345 → 9 → 2
b sesudah2340 → 5 → 9

Mengapa penggantian dengan blocking berbahaya

Dengan a=d; b=a; dalam blok sama, b dapat memakai a yang telah berubah. Penjadwalan terhadap blok sekuensial lain juga dapat menimbulkan race. Gunakan blocking untuk perhitungan kombinasional dan nonblocking untuk keadaan sebagai aturan dasar; pengecualian membutuhkan pemahaman makna kejadian.

Hindari beberapa penugasan pada register sama

Jika beberapa penugasan nonblocking q dijalankan dalam satu prosedur, penugasan terakhir yang dijalankan dapat menentukan hasil. Gunakan if / else if / else atau variabel next-state eksplisit, bukan beberapa if independen yang menyembunyikan prioritas. Hindari beberapa blok menggerakkan register sama.

Dalam peninjauan RTL, tulis satu persamaan keadaan berikutnya per register. Dua persamaan atau kondisi tidak terdefinisi menjadi tanda untuk meninjau ulang prioritas.

Coba sendiri

Dari a=1,b=4, satu blok clock menjalankan a<=b; b<=a;. Tentukan keadaan setelah satu dan dua tepi.

Baca penjelasan

Setelah satu tepi, (a,b)=(4,1); setelah dua, (1,4). Penugasan membaca keadaan lama sama sehingga nilai bertukar. Dengan a=b; b=a;, keduanya dapat menjadi b lama; fungsinya berbeda.

Pilihan berlaku di peramban ini. Ubah kapan saja di bagian bawah halaman.