7 / 24 · Konsep
Kontrak pewaktuan untuk permintaan dan respons memori
Bedakan pembacaan sinkron, tag yang ditunda, dan benturan pada alamat yang sama.
Pelajaran dapat dibaca gratis. Daftar untuk menyimpan progres.
Memori lebih dari sekadar larik register besar
Antarmuka memori memerlukan kontrak pewaktuan selain kapasitas. Pembacaan asinkron mengubah keluaran kombinasional ketika alamat berubah. Pembacaan sinkron mengambil sampel alamat pada suatu tepi dan mengubah keluaran sesudahnya. Model ini memerlukan jadwal berbeda. Inferensi menjadi sumber daya memori perangkat juga bergantung pada gaya kode dan alat target. Di sini kita menetapkan enam belas entri delapan bit dengan pembacaan sinkron.
Ambil sampel alamat dan tag pada tepi k. Data yang sesuai dan tag yang ditunda muncul setelah tepi tersebut; kesempatan pertama untuk menerimanya adalah tepi k+1. Pembacaan satu siklus tidak berarti respons kombinasional seketika. Valid respons harus mengikuti tundaan yang sama. Menggabungkan nilai yang ditunda dengan tag masukan saat ini merusak korespondensi permintaan berturut-turut.
logic [7:0] mem [0:15];
logic [7:0] rd_data;
logic [3:0] rd_tag;
logic rd_valid;
always_ff @(posedge clk) begin
if (wr_en) mem[wr_addr] <= wr_data;
rd_valid <= req_valid;
if (req_valid) begin
rd_data <= mem[req_addr];
rd_tag <= req_tag;
end
if (rst) rd_valid <= 1'b0;
endUntuk model perilaku ini, pembacaan dan penulisan serentak pada satu alamat mengembalikan nilai lama karena penugasan nonblocking membaca keadaan lama. Primitif memori nyata memiliki mode benturan dan batasan eksplisit; lihat mode baca/tulis AMD UG901 dan verifikasi mode yang diinginkan terhadap target serta hasil sintesis. Mereset valid tidak menginisialisasi larik.
| Tepi | Permintaan yang diterima | Efek |
|---|---|---|
| 2 | addr=3,tag=7 | Tangkap mem[3] lama=42 |
| 3 | addr=4,tag=8 | Terima 42,7 dan tangkap nilai berikutnya |
| 4 | Tidak ada permintaan | Kosongkan valid respons |
Jadwal ini mengasumsikan penerima tidak pernah menunda. Jika penerima menunda pada tepi 3, respons berikutnya dapat menimpa rd_data. Tambahkan penyimpanan respons atau batasi permintaan berdasarkan kapasitas yang tersedia, termasuk respons yang sedang dalam perjalanan. Inisialisasi memori uji secara eksplisit sebelum memeriksa nilai. Verifikasi korespondensi alamat dan tag, bukan hanya data respons; nilai benar yang terikat pada permintaan salah tetap merupakan kegagalan.
Coba sendiri
Dengan mem[3]=42, baca alamat 3 dan tulis 99 ke alamat itu pada tepi yang sama. Nilai apa yang ditempatkan model ini dalam rd_data, dan berapa nilai memori barunya? Apa yang dibutuhkan untuk penundaan keluaran?
Baca penjelasan
rd_data menjadi 42, sedangkan mem[3] menjadi 99. Kedua penugasan membaca keadaan lama. Penundaan memerlukan penyimpanan respons dan kendali penerimaan yang menghitung respons dalam perjalanan. Verifikasi secara terpisah mode benturan memori target sebenarnya.