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.
Pelajaran dapat dibaca gratis. Daftar untuk menyimpan progres.
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.
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.
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
endmoduleDengan 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_ready | in_ready | Tindakan pada tepi |
|---|---|---|
| 0 | 0 | A,B ditahan; C tidak diterima |
| 0 | 0 | A,B ditahan; C tidak diterima |
| 1 | 1 | A 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.
Lihat data gelombang
| Sinyal | Gelombang | Nilai bus |
|---|---|---|
| edge | 2345 | E0 → E1 → E2 → E3 |
| out_ready | 0.1. | |
| out_valid | 1... | |
| out_data | 2..3 | A → B |
| in_valid | 1... | |
| in_ready | 0.1. | |
| in_data | 2..3 | C → D |
Verifikasi konservasi
Sejak reset, Nin adalah jumlah penerimaan dan Nout jumlah transfer. Tidak ada transfer dihitung pada tepi reset.
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.