Altifigence Academy

30 / 37 · Khái niệm

Ready/valid và bộ đệm đàn hồi một ô

Thiết kế điều kiện truyền không mất hay trùng dữ liệu và vào/ra đồng thời trong đường dữ liệu có thể dừng.

Truyền khi valid và ready cùng bằng 1 tại một cạnh

Bên gửi đặt valid=1 khi đưa ra dữ liệu hợp lệ; bên nhận đặt ready=1 khi có thể nhận. Việc truyền được quyết định bằng cách lấy mẫu đồng thời hai tín hiệu tại cạnh đồng hồ.

transferk=validk∧readyk\mathrm{transfer}_k=\mathrm{valid}_k\land\mathrm{ready}_k

Bên gửi phải giữ valid và dữ liệu trong khi valid=1, ready=0. Nếu hoàn toàn không phát valid cho đến khi ready lên, tùy quy tắc của phía bên kia có thể xảy ra deadlock. Ở đây giả sử mọi tín hiệu thuộc cùng miền đồng hồ. Bản thân ready/validBắt tay Hợp đồng xác nhận truyền khi valid của bên gửi và ready của bên nhận cùng bằng 1 tại một cạnh. Hợp đồng cũng bao gồm quy tắc giữ dữ liệu trong lúc chờ. không giải quyết CDC.

Dữ liệu đang chờ chỉ được truyền một lần

Các cột dưới đây lần lượt biểu diễn chu kỳ lấy mẫu 0–5. Hãy đọc tín hiệu theo giá trị ngay trước cạnh lênCạnh lên Khoảnh khắc clock chuyển 0 sang 1, khác với mức cao chỉ cả khoảng CLK=1. Tìm hiểu thêm tương ứng. Trong chu kỳ 1 và 2 khi A chờ, valid=1, ready=0 nên dữ liệu và valid được giữ nguyên. A được nhận ở cạnh 3, B ở cạnh 4. Việc căn đồng hồ và các đường tín hiệu là sơ đồ giải thích hợp đồng, không mô hình hóa độ trễ setupsetup Thời gian tối thiểu dữ liệu đầu vào phải ổn định trước cạnh clock lấy mẫu. Vi phạm thì không thể bảo đảm kết quả lưu. Tìm hiểu thêm/hold.

Ready/valid · Chờ và truyền liên tiếp
Xem dữ liệu dạng sóng
Dữ liệu dạng sóng: mỗi ký tự là một khoảng; dấu chấm giữ trạng thái trước; p là một chu kỳ đồng hồ.
Tín hiệuDạng sóngGiá trị bus
clkp.....
valid01...0
ready10.1..
transfer0..1.0
datax3..4xA → B

valid giữ ở 1 qua nhiều chu kỳ không có nghĩa chỉ truyền một lần. Mỗi cạnh mà ready cũng bằng 1 đều tạo một lần truyền riêng.

Tạo bộ đệm chứa một phần tử

Nếu bộ đệm rỗng hoặc có thể gửi dữ liệu hiện tại tại cạnh này, nó có chỗ để nhận dữ liệu mới.

in_ready=¬out_valid∨out_ready\mathrm{in\_ready}=\neg\mathrm{out\_valid}\lor\mathrm{out\_ready}
SystemVerilog
module elastic_buffer (
    input  logic       clk,
    input  logic       rst,
    input  logic       in_valid,
    output logic       in_ready,
    input  logic [7:0] in_data,
    output logic       out_valid,
    input  logic       out_ready,
    output logic [7:0] out_data
);
    assign in_ready = !out_valid || out_ready;

    always_ff @(posedge clk) begin
        if (rst) begin
            out_valid <= 1'b0;
        end else if (in_ready) begin
            out_valid <= in_valid;
            if (in_valid) out_data <= in_data;
        end
    end
endmodule

Khi nhận đầu vào lúc rỗng, out_valid và out_data được cập nhật sau cạnh. Không có bypass tổ hợp, nên không tính giá trị mới đó là đã truyền ở đầu ra tại cùng cạnh. Không đếm truyền trong reset; out_data không có ý nghĩa khi out_valid=0. Vì vậy, không nhất thiết phải resetReset Điều khiển đưa trạng thái về giá trị đầu đã định. Phải quy định đồng bộ hay bất đồng bộ và ưu tiên so với các điều khiển khác. Tìm hiểu thêm chính 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 dữ liệu.

Có thể thay phần tử ngay khi đang đầy

Trạng thái ngay trước cạnhout_readyin_validViệc xảy ra tại cạnh
Rỗng0 hoặc 11Lưu đầu vào và đặt valid=1
Đầy00 hoặc 1Giữ dữ liệu hiện tại và valid
Đầy10Truyền đầu ra rồi làm rỗng
Đầy11Đồng thời truyền đầu ra cũ và lưu đầu vào mới

Nhờ hàng cuối, sau khi được lấp đầy, bộ đệm có thể xử lý một phần tử mỗi chu kỳ. Có độ trễ không có nghĩa thông lượngThông lượng Số tác vụ được nhận hoặc hoàn tất trong một đơn vị thời gian. Pipeline có thể tăng thông lượng mà không giảm độ trễ của một tác vụ. Tìm hiểu thêm cũng giảm một nửa.

Mô hình kiểm chứng thứ tự dữ liệu

Dùng hàng đợi có độ dài tối đa 1 làm mô hình tham chiếu. Quyết định truyền đầu ra và nhận đầu vào từ giá trị trước cạnh; nếu có truyền đầu ra, so sánh với phần tử đầu hàng đợi rồi mới thêm đầu vào mới vào cuối. Vì dequeue và enqueue có thể cùng xảy ra tại một cạnh, cần quy định rõ thứ tự xử lý.

0≤Naccepted−Ndelivered≤10\le N_{\mathrm{accepted}}-N_{\mathrm{delivered}}\le1

Bất biến trên đúng trong khoảng theo dõi được bắt đầu lại từ reset. Ngoài ra, kiểm tra dữ liệu ổn định khi stall, thứ tự truyền được bảo toàn và không truyền một dữ liệu hai lần. Chỉ bất biến số lượng chưa kiểm chứng được tính đúng đắn của giá trị dữ liệu.

Nối tổ hợp ready qua nhiều bộ đệm có thể tạo đường timing ngược dài. Khi kết nối các khối, cũng cần kiểm tra không có vòng lặp tổ hợp.

Đọc thêm: AMD UG934 — Bắt tay READY/VALID

Tự thử

Bộ đệm đang đầy với dữ liệu A và đầu vào mới B có in_valid=1. Giả sử out_ready=0 ở cạnh đầu, rồi out_ready=1 ở cạnh tiếp theo. A và B được xử lý ra sao tại từng cạnh, và bên gửi phải giữ B đến khi nào?

Đọc giải thích

Ở cạnh đầu, in_ready=0 nên A được giữ lại và B chưa được nhận. Bên gửi giữ B cùng in_valid=1. Ở cạnh tiếp theo, in_ready=1 nên mạch đồng thời truyền A và lưu B. Sau cạnh đó, đầu ra bộ đệm là B; B chưa được truyền đi. Lần truyền đầu ra của B xảy ra ở một cạnh sau mà out_valid và out_ready cùng bằng 1.

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.