Altifigence Academy

62 / 63 · Khái niệm

Giao diện thanh ghi và thời điểm phát sinh tác dụng

Đặc tả địa chỉ, ghi theo byte và dừng phản hồi; bảo đảm một yêu cầu dẫn đến đúng một lần thay đổi trạng thái.

Định nghĩa thao tác “ghi vào thanh ghi”

Kiến thức cần có: bộ giải mã địa chỉBộ giải mã Mạch kích hoạt đường đầu ra tương ứng mã nhị phân. Nếu có enable, có thể đưa mọi đầu ra về 0 khi vô hiệu hóa. Tìm hiểu thêm, ready/validBắt tay Quy ước xác nhận truyền khi valid phía phát và ready phía nhận cùng bằng 1 tại cùng cạnh, gồm cả quy tắc giữ dữ liệu lúc chờ. Tìm hiểu thêm, enable và ưu tiên cập nhật trạng thái.

Khi kết nối thanh ghiThanh ghi Mạch lưu trạng thái nhiều bit. Thanh ghi đồng bộ trong khóa học lưu đầu vào đã quy định tại cạnh clock. Tìm hiểu thêm cấu hình với bộ điều khiển ngoài, chỉ kiểm tra địa chỉ khớp là chưa đủ. Phải định nghĩa thời điểm nhận yêu cầu, điều kiện giữ khi phản hồi đang chờ và cả trường hợp ghi vào địa chỉ chỉ đọc. Ở đây dùng giao diện đơn giản một yêu cầu–một phản hồi trong cùng miền đồng hồ.

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

Các địa chỉ dưới đây là địa chỉ byte, căn hàng 32 bit. Mỗi yêu cầu tạo đúng một phản hồi thành công hoặc lỗi.

Địa chỉTênHoạt động
0x0CONFIGĐọc/ghi, áp dụng byte strobe
0x4STATUSChỉ đọc, trả giá trị tại lúc nhận yêu cầu
0x8COMMANDĐọc trả 0; ghi bit 0 của byte 0 tạo start pulse
KhácChưa định nghĩaPhản hồi lỗi, không đổi trạng thái

Nhận tại cạnh khi ô phản hồi rỗng hoặc được giải phóng

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

Khi phản hồi bị chặn, req_ready=0 nên ghi config và command pulse không được thực hiện lại. Tác dụng của yêu cầu đã nhận có thể đã xảy ra trong khi chỉ phản hồi còn chờ. Nếu cứ gửi lại yêu cầu vì phản hồi chậm, lệnh có thể được thực thi trùng.

Tính ý nghĩa của byte strobe

Khi CONFIG=32'h11223344, ghi req_wdata=32'hAABBCCDD với req_wstrb=4'b0101 chỉ đổi byte 0 và byte 2. Kết quả là 32'h11BB33DD. Cần kiểm tra riêng căn hàng địa chỉ, vị trí bit và thứ tự byte trong bộ nhớ. Phép ghi có wstrb=0000 tạo phản hồi thành công nhưng không thay đổi giá trị.

Từ MSBMSB Bit có trọng số lớn nhất. Số chỉ mục tùy hướng khai báo vector, nên không luôn là số chỉ mục lớn nhất. Tìm hiểu thêm, thứ tự là byte3,2,1,0. strobe=0101 chọn byte2 và byte0, nên chỉ ghi mới BB và DD. strobe là write enable theo byte, không phải theo từng bit dữ liệu.

Chỉ đổi các byte được byte strobe chọn
  1. CONFIG cũ: 11 | 22 | 33 | 44
  2. Dữ liệu ghi: AA | BB | CC | DD
  3. strobe 0101: Giữ | Thay | Giữ | Thay
  4. CONFIG mới: 11 | BB | 33 | DD

Trạng thái được lấy tại thời điểm nào?

Phản hồi đọc STATUS lưu status_value tại thời điểm nhận yêu cầu. Sau đó, dù status thực tế thay đổi khi phản hồi đang dừng, rsp_rdata vẫn giữ nguyên. Nối thẳng status tổ hợp vào phản hồi trong khi rsp_valid=1, rsp_ready=0 sẽ làm nội dung phản hồi thay đổi và vi phạm giao thức.

Nếu req_valid và req_ready cùng bằng 1 tại hai cạnh liên tiếp, đó là hai yêu cầu riêng biệt. Sau khi được nhận, bên gửi phải hạ valid hoặc cập nhật sang yêu cầu tiếp theo. Không thể giữ nguyên cùng một yêu cầu rồi mong nó chỉ được xử lý một lần.

Ba nhóm kiểm chứng

  1. Địa chỉ và quyền truy cập: kiểm tra lỗi cùng tác dụng lên trạng thái với địa chỉ hợp lệ, địa chỉ không căn hàng, ghi STATUS và địa chỉ chưa định nghĩa.
  2. Chọn dữ liệu: kiểm tra toàn bộ tổ hợp của bốn bit strobe và xác nhận các byte không được chọn được giữ nguyên.
  3. Điều khiển luồng: kiểm tra phản hồi và trạng thái được giữ khi chặn phản hồi nhiều chu kỳ; số giao dịch vẫn khớp khi tiêu thụ phản hồi và nhận yêu cầu tiếp theo tại cùng cạnh.

Tự thử

Sau khi nhận một phép ghi COMMAND có req_wstrb[0]=1 và req_wdata[0]=1, rsp_ready=0 trong 3 chu kỳ. start_pulse có phải lặp lại suốt 3 chu kỳ không? Ghi STATUS có được thay đổi config_value không?

Đọc giải thích

start_pulse chỉ bằng 1 trong một chu kỳ ngay sau khi nhận yêu cầu, sau đó về 0. Dừng phản hồi không phải điều kiện chạy lại lệnh. Ghi STATUS tạo phản hồi lỗi và không đổi trạng thái khác, bao gồm config_value. Hai phía cũng phải thống nhất chính sách thử lại trước khi phản hồi hoàn tất.

Lựa chọn áp dụng cho trình duyệt này. Có thể đổi ở chân trang bất cứ lúc nào.