30 / 37 · Konsep
Ready/valid dan buffer elastis satu tempat
Rancang transfer tanpa kehilangan/duplikasi dan masukan/keluaran bersamaan pada jalur yang dapat berhenti.
Pelajaran dapat dibaca gratis. Daftar untuk menyimpan progres.
Transfer terjadi jika valid dan ready sama-sama 1 pada tepi
Pengirim mengaktifkan valid ketika menyediakan data sah; penerima mengaktifkan ready ketika mampu menerima. Keputusan transfer dibuat dengan menyampel keduanya pada tepi clock.
Selama valid=1,ready=0, pengirim harus mempertahankan valid dan data. Menunggu ready sebelum mengaktifkan valid dapat menimbulkan deadlock menurut aturan pasangan. Semua sinyal di sini berada dalam domain clock sama: ready/validHandshake Kontrak yang mengesahkan transfer ketika valid pengirim dan ready penerima sama-sama 1 pada tepi sama. Termasuk aturan mempertahankan data saat menunggu. tidak menyelesaikan CDC.
Kirim data yang menunggu tepat sekali
Kolom mewakili siklus sampling 0–5, dengan nilai tepat sebelum tepi naikTepi naik Saat clock berubah 0 ke 1, berbeda dari tingkat yang mencakup seluruh interval CLK=1. Selengkapnya. A menunggu pada siklus 1 dan 2, valid=1,ready=0: data dan valid bertahan. A diterima pada tepi 3, B pada tepi 4. Gambar menjelaskan kontrak, bukan tundaan setupSetup Waktu minimum data harus stabil sebelum tepi tangkap. Jika dilanggar, hasil tersimpan tidak dijamin. Selengkapnya/hold.
Lihat data gelombang
| Sinyal | Gelombang | Nilai bus |
|---|---|---|
| clk | p..... | |
| valid | 01...0 | |
| ready | 10.1.. | |
| transfer | 0..1.0 | |
| data | x3..4x | A → B |
valid tinggi beberapa siklus tidak berarti hanya satu transfer. Setiap tepi dengan ready juga tinggi merupakan transfer tersendiri.
Bangun buffer satu tempat
Ada tempat jika buffer kosong atau isi sekarang dapat keluar pada tepi ini.
module elastic_buffer (
input logic clk,
input logic rst,
input logic in_valid,
output logic in_ready,
input logic [7:0] in_data,
output logic out_valid,
input logic out_ready,
output logic [7:0] out_data
);
assign in_ready = !out_valid || out_ready;
always_ff @(posedge clk) begin
if (rst) begin
out_valid <= 1'b0;
end else if (in_ready) begin
out_valid <= in_valid;
if (in_valid) out_data <= in_data;
end
end
endmoduleDari keadaan kosong, menerima masukan memperbarui out_valid dan out_data setelah tepi. Tanpa bypass kombinasional, data baru itu tidak dihitung sebagai transfer keluar pada tepi sama. Jangan hitung transfer selama reset. Saat out_valid=0, out_data tidak bermakna sehingga registerRegister Rangkaian penyimpan beberapa bit keadaan. Register sinkron mata kuliah ini menangkap masukan yang ditentukan pada tepi clock. Selengkapnya data sendiri tidak wajib di-resetReset Kontrol yang mengembalikan keadaan ke nilai awal tertentu. Sifat sinkron/asinkron dan prioritas terhadap kontrol lain harus ditetapkan. Selengkapnya.
Mengganti isi buffer penuh
| Keadaan sebelum tepi | out_ready | in_valid | Tindakan pada tepi |
|---|---|---|---|
| Kosong | 0 atau 1 | 1 | Simpan masukan, valid=1 |
| Penuh | 0 | 0 atau 1 | Tahan data dan valid |
| Penuh | 1 | 0 | Transfer lalu kosongkan |
| Penuh | 1 | 1 | Transfer data lama dan simpan data baru |
Baris terakhir memungkinkan satu elemen per siklus setelah terisi. Latensi tidak otomatis membagi throughputThroughput Jumlah pekerjaan diterima atau selesai per satuan waktu. Pipeline dapat meningkatkannya tanpa mengurangi latensi satu pekerjaan. Selengkapnya menjadi setengah.
Model untuk memverifikasi urutan
Gunakan queue maksimal satu elemen. Tentukan transfer keluar dan penerimaan dari nilai lama pada tepi; bandingkan keluaran dengan elemen depan dahulu, lalu tambahkan masukan. Dequeue dan enqueue dapat bersamaan, sehingga urutannya harus jelas.
Invarian ini berlaku dalam interval pencatatan yang dimulai ulang oleh reset. Periksa juga kestabilan selama stall, urutan, dan tanpa duplikasi. Count saja tidak membuktikan nilai data.
Rantai ready kombinasional panjang memperpanjang jalur timing balik. Periksa juga tidak adanya loop kombinasional antarbuffer.
Bacaan lanjutan: AMD UG934 — READY/VALID Handshake
Coba sendiri
Buffer berisi A dan masukan B menunggu dengan in_valid=1. out_ready=0 pada tepi pertama lalu 1 berikutnya. Bagaimana A dan B diproses, dan sampai kapan pengirim menahan B?
Baca penjelasan
Pada tepi pertama in_ready=0: A bertahan dan B belum diterima. Pengirim menahan B dan in_valid=1. Tepi berikutnya in_ready=1: A ditransfer dan B disimpan bersamaan. Sesudahnya B muncul di keluaran tetapi belum ditransfer; transfer B terjadi pada tepi berikut yang memiliki out_valid=out_ready=1.