Altifigence Academy

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.

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 ii:

Hi=wr_en∧(wr_addr=rd_addri)H_i=\mathrm{wr\_en}\land(\mathrm{wr\_addr}=\mathrm{rd\_addr}_i)

Jika rd_eni=1\mathrm{rd\_en}_i=1, responsnya:

Ri+={wr_data,Hi=1M−[rd_addri],Hi=0R_i^{+}=\begin{cases} \mathrm{wr\_data}, & H_i=1\\ M^{-}[\mathrm{rd\_addr}_i], & H_i=0 \end{cases}

M−M^{-} adalah penyimpanan sebelum tepi. Setiap HiH_i 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.

SystemVerilog
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
endmodule

Bypass 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.

Kedua port memilih secara independen meskipun penulisannya sama
Lihat data gelombang
Data gelombang: setiap karakter mewakili satu interval; titik mempertahankan keadaan sebelumnya; p adalah satu siklus clock.
SinyalGelombangNilai bus
edge234E0 → E1 → E2
wr_en1.0
wr_data23420 → 30 → 99
rd_addr02..2
rd_addr123.5 → 2
out0 sesudah23.20 → 30
out1 sesudah23.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.

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