Altifigence Academy

61 / 63 · Konsep

Pipeline yang dapat berhenti dan backpressure

Hitung ready tiap tahap untuk mencegah kehilangan, duplikasi, dan perhitungan ulang saat berhenti atau bergerak bersamaan.

Jika penerima tidak selalu dapat menerima

Prasyarat: buffer ready/validHandshake Kontrak yang mengesahkan transfer ketika valid pengirim dan ready penerima sama-sama 1 pada tepi sama. Termasuk aturan mempertahankan data saat menunggu. Selengkapnya satu tempat dan penyelarasan pipelinePipeline Struktur yang membagi perhitungan menjadi tahap berregister untuk memproses beberapa masukan bertumpang tindih. Data, valid, dan kontrol harus selaras. Selengkapnya.

Menambahkan out_ready saja pada pipeline tetap tidak cukup. Jika tahap terakhir penuh dan berhenti, tahap sebelumnya tidak boleh ditimpa. BackpressureBackpressure Penerima memberi tahu pengirim bahwa sementara tidak dapat menerima, sehingga aliran berhenti. Data belum ditransfer harus dipertahankan selama berhenti. Selengkapnya harus diteruskan menuju masukan.

Setiap tahap menyimpan satu data dan satu valid. Tahap kedua dapat menerima jika kosong atau dapat mengirim isinya sekarang; aturan sama berlaku pada tahap pertama.

r2=¬v2∨out_ready,r1=¬v1∨r2r_2=\neg v_2\lor\mathrm{out\_ready},\qquad r_1=\neg v_1\lor r_2

in_ready=r1. Walaupun r2=0, tahap pertama yang kosong dapat menerima satu data. Dengan demikian, ruang yang tersedia tetap dimanfaatkan saat keluaran berhenti.

Perbarui hanya tahap yang diizinkan maju

Contoh menghitung y=2(x+1) untuk x unsignedUnsigned Interpretasi pola bit sebagai bilangan bulat nonnegatif. Rentang n bit adalah 0 hingga 2^n−1 dan dapat berbeda dari interpretasi signed pola yang sama. Selengkapnya delapan bit. Tahap pertama menyimpan x+1 pada sembilan bit; tahap kedua menggeser kiri pada sepuluh bit. Maksimum x=255 menghasilkan tepat 512.

SystemVerilog
module stallable_pipeline (
    input  logic       clk, 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 [9:0] out_data
);
    logic v1, v2, r1, r2;
    logic [8:0] d1;
    logic [9:0] d2;
    assign r2 = !v2 || out_ready;
    assign r1 = !v1 || r2;
    assign in_ready  = r1;
    assign out_valid = v2;
    assign out_data  = d2;

    always_ff @(posedge clk) begin
        if (rst) begin
            v1 <= 1'b0;
            v2 <= 1'b0;
        end else begin
            if (r2) begin
                v2 <= v1;
                if (v1) d2 <= {d1, 1'b0};
            end
            if (r1) begin
                v1 <= in_valid;
                if (in_valid) d1 <= {1'b0, in_data} + 9'd1;
            end
        end
    end
endmodule

Dengan nonblockingNonblocking Penugasan <= pada RTL sekuensial: sisi kanan dievaluasi lalu pembaruan dijadwalkan, sehingga register pada tepi sama menghitung dari keadaan lama. Selengkapnya, tahap kedua membaca d1 lama, bukan yang dihitung pada tepi sama. r1=0 menahan v1,d1; r2=0 menahan v2,d2. Menahan valid tetapi terus mengubah data adalah salah.

Menelusuri dua tahap penuh

Misalkan A di keluaran v2, nilai perantara B di v1, dan C menunggu pada masukan.

out_readyin_readyTindakan pada tepi
00A,B ditahan; C tidak diterima
00A,B ditahan; C tidak diterima
11A ditransfer, B maju, C diterima

Pengirim menahan C dan in_valid hingga diterima. Jika C dianggap terkirim pada tepi berhenti pertama lalu beralih ke data berikutnya, C hilang.

Kolom menunjukkan nilai sebelum tepi naikTepi naik Saat clock berubah 0 ke 1, berbeda dari tingkat yang mencakup seluruh interval CLK=1. Selengkapnya. Awalnya A di tahap terakhir, B pertama, dan C menunggu. Setelah A ditransfer dan C diterima di E2, keluaran menjadi B sebelum E3.

Backpressure ketika kedua tahap penuh
Lihat data gelombang
Data gelombang: setiap karakter mewakili satu interval; titik mempertahankan keadaan sebelumnya; p adalah satu siklus clock.
SinyalGelombangNilai bus
edge2345E0 → E1 → E2 → E3
out_ready0.1.
out_valid1...
out_data2..3A → B
in_valid1...
in_ready0.1.
in_data2..3C → D

Verifikasi konservasi

Sejak reset, Nin adalah jumlah penerimaan dan Nout jumlah transfer. Tidak ada transfer dihitung pada tepi reset.

Nin−Nout=v1+v2,0≤Nin−Nout≤2N_{\mathrm{in}}-N_{\mathrm{out}}=v_1+v_2,\qquad 0\le N_{\mathrm{in}}-N_{\mathrm{out}}\le2

Count benar dapat menyembunyikan A keluar dua kali dan B hilang; periksa nilai serta urutan dengan queue acuan. Ubah in_valid dan out_ready secara independen, termasuk penghentian panjang, aliran kontinu, serta pengosongan reset.

ready juga jalur timing

Rantai tahap memperpanjang jalur balik r2→r1. Menunda ready dengan register dapat memerlukan tempat tambahan bagi masukan yang sudah dijanjikan selama penundaan. Menambahkan flip-flop tanpa mempertimbangkan penyimpanan dan protokol bukan optimisasi timing yang aman.

Coba sendiri

Dengan v1=0,v2=1,out_ready=0, apakah in_valid=1 dapat diterima? Bagaimana masukan berikutnya jika out_ready tetap 0?

Baca penjelasan

Awalnya r2=0 tetapi r1=1: satu masukan dapat mengisi tahap pertama. Setelah tepi v1=v2=1 membuat r1=r2=0, sehingga tidak dapat menerima tambahan. Perbedaan ini memanfaatkan kedua tempat.

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