62 / 63 · Konsep
Antarmuka register dan waktu terjadinya efek samping
Tentukan alamat, penulisan byte, dan penahanan respons agar satu permintaan menghasilkan satu efek.
Pelajaran dapat dibaca gratis. Daftar untuk menyimpan progres.
Mendefinisikan “menulis register”
Prasyarat: dekoder alamatDekoder Rangkaian yang mengaktifkan jalur keluaran sesuai kode biner. Dengan enable, seluruh keluaran dapat menjadi 0 saat dinonaktifkan. Selengkapnya, 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, enable, dan prioritas pembaruan.
Menghubungkan registerRegister Rangkaian penyimpan beberapa bit keadaan. Register sinkron mata kuliah ini menangkap masukan yang ditentukan pada tepi clock. Selengkapnya konfigurasi ke pengontrol luar memerlukan lebih dari alamat benar: tentukan penerimaan, kestabilan respons tertahan, dan penulisan alamat baca-saja. Kita memakai antarmuka satu permintaan/respons sederhana dalam clock sama.
Alamat berupa alamat byte dengan penjajaran 32 bit. Setiap permintaan menghasilkan tepat satu respons, sukses atau kesalahan.
| Alamat | Nama | Perilaku |
|---|---|---|
| 0x0 | CONFIG | Baca/tulis dengan byte strobe |
| 0x4 | STATUS | Baca saja, nilai saat diterima |
| 0x8 | COMMAND | Baca=0; menulis bit 0 byte 0 memicu start |
| Lainnya | Tidak didefinisikan | Kesalahan, tanpa perubahan keadaan |
Terima jika slot respons kosong atau akan kosong
module register_interface (
input logic clk, rst,
input logic req_valid, req_write,
output logic req_ready,
input logic [3:0] req_addr,
input logic [31:0] req_wdata,
input logic [3:0] req_wstrb,
output logic rsp_valid,
input logic rsp_ready,
output logic [31:0] rsp_rdata,
output logic rsp_error,
input logic [31:0] status_value,
output logic [31:0] config_value,
output logic start_pulse
);
assign req_ready = !rsp_valid || rsp_ready;
always_ff @(posedge clk) begin
if (rst) begin
rsp_valid <= 1'b0;
config_value <= 32'd0;
start_pulse <= 1'b0;
end else begin
start_pulse <= 1'b0;
if (req_ready) begin
rsp_valid <= req_valid;
if (req_valid) begin
rsp_rdata <= 32'd0;
rsp_error <= 1'b0;
case (req_addr)
4'h0: begin
if (req_write) begin
for (int i=0; i<4; i++)
if (req_wstrb[i])
config_value[8*i +: 8]
<= req_wdata[8*i +: 8];
end else rsp_rdata <= config_value;
end
4'h4: begin
if (req_write) rsp_error <= 1'b1;
else rsp_rdata <= status_value;
end
4'h8: begin
if (req_write)
start_pulse <= req_wstrb[0] && req_wdata[0];
end
default: rsp_error <= 1'b1;
endcase
end
end
end
end
endmoduleJika respons tertahan, req_ready=0: penulisan config dan pulsa command tidak diulang. Efek permintaan yang diterima mungkin sudah terjadi sementara respons masih menunggu. Mengirim ulang hanya karena respons lambat dapat menggandakan perintah.
Hitung efek byte strobe
Dengan CONFIG=32'h11223344, penulisan dengan req_wdata=32'hAABBCCDD dan req_wstrb=4'b0101 hanya mengubah byte 0 dan 2: 32'h11BB33DD. Periksa penjajaran, posisi bit, dan urutan byte memori secara terpisah. Penulisan dengan wstrb=0000 tetap sukses tanpa mengubah nilai.
Dari MSBMSB Bit berbobot tertinggi. Indeksnya bergantung arah deklarasi vektor, sehingga tidak selalu nomor indeks terbesar. Selengkapnya, urutan byte 3,2,1,0. 0101 memilih byte 2 dan 0: hanya BB serta DD ditulis. Setiap strobe adalah enable satu byte, bukan satu bit.
- CONFIG lama: 11 | 22 | 33 | 44
- Data tulis: AA | BB | CC | DD
- Strobe 0101: Tetap | Ganti | Tetap | Ganti
- CONFIG baru: 11 | BB | 33 | DD
STATUS berasal dari waktu mana?
Respons STATUS menyimpan status_value saat permintaan diterima. Jika status nyata berubah selama menunggu, rsp_rdata tetap. Menghubungkan status kombinasional langsung ke respons rsp_valid=1,rsp_ready=0 melanggar protokol karena isi berubah.
Jika req_valid=req_ready=1 pada dua tepi berurutan, itu dua permintaan berbeda. Setelah diterima, pengirim harus menurunkan valid atau mengganti ke permintaan berikutnya; menahan permintaan sama tidak menjamin hanya satu eksekusi.
Tiga sumbu verifikasi
- Alamat dan izin: alamat valid, alamat tidak sejajar, penulisan ke STATUS, dan alamat yang tidak ada; periksa kesalahan serta efeknya.
- Seleksi data: uji seluruh 16 kombinasi empat strobe dan pastikan byte tidak aktif terjaga.
- Aliran: tahan respons beberapa siklus tanpa perubahan respons/keadaan yang tidak semestinya; periksa jumlah transaksi saat konsumsi dan penerimaan bersamaan.
Coba sendiri
Penulisan ke COMMAND dengan req_wstrb[0]=1 dan req_wdata[0]=1 diterima, lalu rsp_ready=0 tiga siklus. Haruskah start_pulse berulang? Bolehkah penulisan ke STATUS mengubah config_value?
Baca penjelasan
start_pulse=1 hanya satu siklus setelah penerimaan, lalu 0. Menahan respons tidak mengulang perintah. Penulisan ke STATUS menghasilkan kesalahan tanpa mengubah config_value atau keadaan lain. Kedua sisi juga harus menyepakati kebijakan percobaan ulang sebelum respons selesai.