Altifigence Academy

62 / 63 · Konsep

Antarmuka register dan waktu terjadinya efek samping

Tentukan alamat, penulisan byte, dan penahanan respons agar satu permintaan menghasilkan satu efek.

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.

accept=req_valid∧req_ready\mathrm{accept}=\mathrm{req\_valid}\land\mathrm{req\_ready}

Alamat berupa alamat byte dengan penjajaran 32 bit. Setiap permintaan menghasilkan tepat satu respons, sukses atau kesalahan.

AlamatNamaPerilaku
0x0CONFIGBaca/tulis dengan byte strobe
0x4STATUSBaca saja, nilai saat diterima
0x8COMMANDBaca=0; menulis bit 0 byte 0 memicu start
LainnyaTidak didefinisikanKesalahan, tanpa perubahan keadaan

Terima jika slot respons kosong atau akan kosong

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

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

Ubah hanya byte yang dipilih byte strobe
  1. CONFIG lama: 11 | 22 | 33 | 44
  2. Data tulis: AA | BB | CC | DD
  3. Strobe 0101: Tetap | Ganti | Tetap | Ganti
  4. 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

  1. Alamat dan izin: alamat valid, alamat tidak sejajar, penulisan ke STATUS, dan alamat yang tidak ada; periksa kesalahan serta efeknya.
  2. Seleksi data: uji seluruh 16 kombinasi empat strobe dan pastikan byte tidak aktif terjaga.
  3. 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.

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