Altifigence Academy

30 / 37 · Konsep

Ready/valid dan buffer elastis satu tempat

Rancang transfer tanpa kehilangan/duplikasi dan masukan/keluaran bersamaan pada jalur yang dapat berhenti.

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.

transferk=validk∧readyk\mathrm{transfer}_k=\mathrm{valid}_k\land\mathrm{ready}_k

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.

Ready/valid · penantian dan transfer berurutan
Lihat data gelombang
Data gelombang: setiap karakter mewakili satu interval; titik mempertahankan keadaan sebelumnya; p adalah satu siklus clock.
SinyalGelombangNilai bus
clkp.....
valid01...0
ready10.1..
transfer0..1.0
datax3..4xA → 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.

in_ready=¬out_valid∨out_ready\mathrm{in\_ready}=\neg\mathrm{out\_valid}\lor\mathrm{out\_ready}
SystemVerilog
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
endmodule

Dari 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 tepiout_readyin_validTindakan pada tepi
Kosong0 atau 11Simpan masukan, valid=1
Penuh00 atau 1Tahan data dan valid
Penuh10Transfer lalu kosongkan
Penuh11Transfer 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.

0≤Naccepted−Ndelivered≤10\le N_{\mathrm{accepted}}-N_{\mathrm{delivered}}\le1

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.

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