Altifigence Academy

31 / 37 · Khái niệm

Pipeline nhân-cộng và căn chỉnh dữ liệu

Chia phép tính bằng các ranh giới thanh ghi; bảo đảm dữ liệu, valid và toán hạng phụ thuộc cùng một giao dịch.

Từ biểu thức tính toán đến hai tầng

Kiến thức cần có: số học signed, phép gán nonblockingNonblocking Phép gán <= trong RTL tuần tự. Đánh giá vế phải rồi lên lịch cập nhật, cho các thanh ghi cùng cạnh tính từ trạng thái cũ. Tìm hiểu thêm, điều kiện 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 và tín hiệu valid.

Giả sử mỗi giao dịch đầu vào chứa a,b signed 8 bit và c signed 16 bit, với kết quả theo biểu thức sau. Đây là phép nhân-cộng xử lý độc lập từng giao dịch, không phải bộ tích lũy.

y=a×b+cy=a\times b+c

Tích chính xác của hai số 8 bit cần 16 bit. Khi cộng c vào, nếu tính trong 16 bit rồi mới mở rộng, không thể khôi phục các bit cao đã mất. Phải mở rộng dấu cả hai toán hạng lên 17 bit trước khi cộng.

Tầng 1 lưu cả tích và c; tầng 2 cộng hai giá trị thuộc cùng giao dịch. Nếu không trì hoãn c, tích của giao dịch trước sẽ bị trộn với c của giao dịch hiện tại.

SystemVerilog
module multiply_add_pipeline (
    input  logic               clk, rst, in_valid,
    input  logic signed [7:0]  a, b,
    input  logic signed [15:0] c,
    output logic               out_valid,
    output logic signed [16:0] y
);
    logic v1;
    logic signed [15:0] p1, c1;
    logic signed [16:0] p_ext, c_ext;
    assign p_ext = {p1[15], p1};
    assign c_ext = {c1[15], c1};

    always_ff @(posedge clk) begin
        if (rst) begin
            v1        <= 1'b0;
            out_valid <= 1'b0;
        end else begin
            v1        <= in_valid;
            out_valid <= v1;
            if (in_valid) begin
                p1 <= a * b;
                c1 <= c;
            end
            if (v1) y <= p_ext + c_ext;
        end
    end
endmodule

Giao diện này có thể nhận đầu vào mỗi cạnh và giả sử bên nhận luôn có thể nhận đầu ra. Không so sánh y khi out_valid=0. Ngay cả khi không 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 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, khởi tạo valid vẫn phân biệt được dữ liệu không dùng.

Phân biệt “hai tầng” với thời điểm quan sát

Bảng dưới ghi trạng thái thanh ghi ngay sau cạnh nhận đầu vào tương ứng. A và B là hai giao dịch khác nhau.

CạnhĐầu vào được nhậnTầng 1Thanh ghi đầu ra
E0ATích và c của Ainvalid
E1BTích và c của BKết quả A, valid
E2Không cóinvalidKết quả B, valid
E3Không cóinvalidinvalid

Kết quả A sẵn sàng ngay sau E1. Mạch tiếp theo dùng cùng đồng hồ lấy mẫu nó tại E2. Do đó, từ nhận đầu vào E0 đến nhận đầu ra E2 là hai chu kỳ. Không trộn thời điểm thanh ghi đầu ra cập nhật với thời điểm mạch tiếp theo nhận dữ liệu khi giải thích độ trễ.

Mỗi cột ghi lại quan sát tại một 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. Đầu vào là giá trị ngay trước cạnh, còn trạng thái có tên chứa after là giá trị ngay sau cập nhật. Cách căn cột thể hiện thứ tự lấy mẫu, không mô tả độ trễ lan truyềnĐộ trễ lan truyền Thời gian từ khi đầu vào đổi đến khi đầu ra ổn định ở giá trị đúng. Tương đương logic và đặc tính thời gian là hai vấn đề riêng. Tìm hiểu thêm vật lý. Các giao dịch là A=(2,3,10), B=(4,5,100). Tầng 1 lưu cả tích và c, rồi ở cạnh tiếp theo cộng các giá trị cũ của tầng đó. Dấu gạch đánh dấu khoảng invalid.

Tích và c phải thuộc cùng một giao dịch
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
edge2345E0 → E1 → E2 → E3
accepted234.A → B → -
product1 after234.6 → 20 → -
c1 after234.10 → 100 → -
y after2345- → 16 → 120 → -
out_valid after01.0

Chia pipeline nhanh hơn bao nhiêu?

Xét mô hình đơn giản có độ trễ nhân 3.2ns, độ trễ cộng 1.1ns và phần thời gian phụ do thanh ghi 0.2ns. Các số này chỉ là giả định để tính toán.

Tone≥3.2+1.1+0.2=4.5 nsT_{\mathrm{one}}\ge3.2+1.1+0.2=4.5\ \mathrm{ns}
Tpipe≥max⁡(3.2,1.1)+0.2=3.4 nsT_{\mathrm{pipe}}\ge\max(3.2,1.1)+0.2=3.4\ \mathrm{ns}

Giới hạn trên của tần số cực đại thay đổi từ khoảng 222MHz lên 294MHz. Hai tầng không bảo đảm thông lượng tăng gấp đôi. Tầng chậm nhất và chi phí thanh ghi quyết định chu kỳ. Kết quả thực tế phụ thuộc tổng hợp, bố trí và các ràng buộc.

Kiểm chứng theo từng giao dịch

Khi nhận đầu vào, đưa a×b+c từ mô hình số nguyên tham chiếu vào hàng đợi. Tại cạnh nhận đầu ra valid, lấy giá trị dự kiến ở đầu ra để so sánh. Chèn cả các khoảng in_valid=0 để kiểm tra bubble di chuyển cùng dữ liệu. Mẫu thử thay đổi mạnh riêng c giữa các giao dịch rất hiệu quả để phát hiện thiếu tầng trì hoãn.

Đọc thêm: MIT OpenCourseWare — Các thước đo hiệu năng

Tự thử

Áp dụng hai giao dịch liên tiếp A=(a=3,b=-4,c=10), B=(a=2,b=5,c=100). Hãy tính thứ tự đầu ra đúng và kết quả sai có thể xảy ra với A nếu không trì hoãn c mà cộng c của đầu vào hiện tại.

Đọc giải thích

Kết quả đúng là -12+10=-2 cho A và 10+100=110 cho B. Nếu tích của A đang ở tầng 2 nhưng c hiện tại là 100 của B, kết quả sẽ là 88. Dù valid được trì hoãn đúng, vẫn không ngăn được lỗi này nếu các toán hạng dữ liệu căn chỉnh sai.

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.