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.
Bài học miễn phí. Đăng ký để lưu tiến độ học tập.
Đị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ồ.
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ên | Hoạt động |
|---|---|---|
| 0x0 | CONFIG | Đọc/ghi, áp dụng byte strobe |
| 0x4 | STATUS | Chỉ đọc, trả giá trị tại lúc nhận yêu cầu |
| 0x8 | COMMAND | Đọc trả 0; ghi bit 0 của byte 0 tạo start pulse |
| Khác | Chưa định nghĩa | Phả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
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
endmoduleKhi 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.
- CONFIG cũ: 11 | 22 | 33 | 44
- Dữ liệu ghi: AA | BB | CC | DD
- strobe 0101: Giữ | Thay | Giữ | Thay
- 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
- Đị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.
- 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.
- Đ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.