56 / 63 · Konsep
Register file dua baca, satu tulis, dan bypass
Implementasikan dua baca independen dan satu tulis sinkron, lalu periksa bypass, inisialisasi, serta validitas.
Pelajaran dapat dibaca gratis. Daftar untuk menyimpan progres.
Mengambil dua operand bersamaan
A+B memerlukan dua operand pada siklus sama. Register fileRegister Rangkaian penyimpan beberapa bit keadaan. Register sinkron mata kuliah ini menangkap masukan yang ditentukan pada tepi clock. Selengkapnya dua baca/satu tulis menyediakan dua alamat baca dan satu alamat tulis. Di sini delapan kata 16 bit memiliki dua pembacaan dengan keluaran berregister pada tepi naik: alamat tiga bit, kapasitas 8×16=128 bit. Alamat 0 adalah penyimpanan biasa, tanpa aturan register konstan.
Setiap baca memiliki enable dan valid sendiri. Satu port dapat diam sementara yang lain membaca; keduanya boleh membaca alamat sama. Dua baca simultan pada alamat berbeda memiliki biaya selain sekadar kapasitas. Rangkaian kecil dapat memakai array flip-flopFlip-flop Elemen yang menangkap masukan pada tepi clock tertentu dan menyimpannya hingga tepi berikutnya. Masukan harus memenuhi setup dan hold. Selengkapnya dan dua jaringan seleksi; implementasi RAM dapat menggandakan penyimpanan dan menerapkan penulisan pada setiap salinan untuk menyediakan port baca. Deklarasi RTL saja tidak menentukan sumber daya.
Ketika nilai ditulis juga dibaca
Kontrak mengembalikan data baru jika alamat sama dibaca dan ditulis pada tepi sama. Bypass mengirim wr_data langsung ke masukan register baca tanpa menunggu array berubah. Untuk port :
Jika , responsnya:
adalah penyimpanan sebelum tepi. Setiap membandingkan alamatnya secara independen. Konflik satu port tidak boleh mengganti kedua operand; menghilangkan wr_en juga menyebabkan bypass salah ketika alamat kebetulan sama tanpa penulisan.
module regfile8x16_2r1w (
input logic clk, rst, wr_en,
input logic [2:0] wr_addr,
input logic [15:0] wr_data,
input logic rd_en0, rd_en1,
input logic [2:0] rd_addr0, rd_addr1,
output logic [15:0] rd_data0, rd_data1,
output logic rd_valid0, rd_valid1
);
timeunit 1ns;
timeprecision 1ps;
logic [15:0] mem [0:7];
always_ff @(posedge clk) begin
if (rst) begin
rd_valid0 <= 1'b0;
rd_valid1 <= 1'b0;
end else begin
rd_valid0 <= rd_en0;
rd_valid1 <= rd_en1;
if (wr_en)
mem[wr_addr] <= wr_data;
if (rd_en0)
rd_data0 <= (wr_en && wr_addr == rd_addr0)
? wr_data : mem[rd_addr0];
if (rd_en1)
rd_data1 <= (wr_en && wr_addr == rd_addr1)
? wr_data : mem[rd_addr1];
end
end
endmoduleBypass mengubah seleksi masukan, bukan menghapus tahap register. Alamat dan permintaan diberikan sebelum tepi; respons sesudahnya dan register hilir menangkap pada tepi berikutnya. Mengubah menjadi baca kombinasional mengubah jalur alamat-keluaran serta latensi, bukan sekadar memperpendek kode.
Contoh: konflik hanya satu port
Dengan M[2]=12 dan M[5]=7 sudah ditulis, aktifkan dua baca sebelum E0 pada alamat 2 dan 5, lalu tulis 20 ke 2. Setelah E0, port 0 merespons 20 melalui bypass dan port 1 memberi 7. Jumlah kedua respons valid adalah 27, berbeda dari 19 pada read-first tanpa bypass.
Pada E1, kedua port membaca 2 dan menulis 30 ke 2: kedua keluaran 30. Pada E2, pertahankan wr_addr=2,wr_data=99 tetapi wr_en=0, lalu baca 2: keduanya harus 30. Siklus ini mengungkap bypass yang hanya berdasarkan alamat. Pada E3, rd_en0=0,rd_en1=1 memberi valid0=0,valid1=1.
Setiap kolom mengamati tepi naikTepi naik Saat clock berubah 0 ke 1, berbeda dari tingkat yang mencakup seluruh interval CLK=1. Selengkapnya, masukan sebelum dan keadaan after sesudah; ini bukan tundaan fisikTundaan propagasi Waktu sejak masukan berubah hingga keluaran stabil pada nilai benar. Kesetaraan logika berbeda dari karakteristik waktu. Selengkapnya. M[2]=12,M[5]=7 sudah disimpan, kedua baca selalu aktif, alamat tulis 2. Kolom terakhir wr_en=0 tidak boleh meneruskan 99.
Lihat data gelombang
| Sinyal | Gelombang | Nilai bus |
|---|---|---|
| edge | 234 | E0 → E1 → E2 |
| wr_en | 1.0 | |
| wr_data | 234 | 20 → 30 → 99 |
| rd_addr0 | 2.. | 2 |
| rd_addr1 | 23. | 5 → 2 |
| out0 sesudah | 23. | 20 → 30 |
| out1 sesudah | 23. | 7 → 30 |
Apa yang perlu diinisialisasi?
Reset sinkron active-high mencegah penulisan dan menghapus kedua valid; array dan data keluaran tidak dihapus. Data lama dengan valid=0 normal. Isi tersimpan tetap ada; sistem yang hanya menerima pekerjaan baru setelah reset harus menetapkan urutan inisialisasi terpisah.
Membaca alamat saat pertama ditulis memberi nilai pasti berkat bypass. Tanpa penulisan, alamat belum diinisialisasi tetap tidak terdefinisi. rd_valid menandai respons, bukan initialized per alamat. Verifikator harus memeriksa apakah alamat diketahui sebelum menghitung harapan, dengan perlakuan bypass terpisah.
Uji empat kombinasi enable, alamat sama/berbeda, konflik tidak ada/port0/port1/keduanya, penulisan berurutan, dan prioritas reset. Banyak port tulis di luar cakupan; jika ditambahkan, tentukan dahulu prioritas dua penulisan pada alamat yang sama. Jumlah port, kontrak, dan biaya berubah bersama.
Coba sendiri
M[1]=4,M[4]=9. Kedua baca aktif pada 1 dan 4 sambil menulis 13 ke 4: apa keluarannya? Berikutnya wr_en=0,wr_addr=1,wr_data=99 dan kedua baca ke 1: apa keluarannya? Terakhir, jelaskan valid dan konsumsi jika hanya enable0 menjadi 0.
Baca penjelasan
Respons pertama (4,13), karena hanya port 1 bypass ke 13. Berikutnya (4,4), sebab wr_en=0 melarang 99. Terakhir rd_valid0=0,rd_valid1=1: register data port 0 menahan hasil lama, tetapi tidak boleh dikonsumsi. Alamat 0 dibaca dan ditulis seperti alamat lain.