Thứ Tư, 15 tháng 8, 2018

[BUS][Bài 2] Các loại burst của giao thức AMBA - AXI

Tiếp theo bài 1, bài này sẽ mô tả chi tiết các loại burst trong transaction của AXI với sơ đồ timing cụ thể. Mục tiêu là làm rõ đặc điểm "(3) Hỗ trợ các transaction theo cơ chế burst và chỉ cần phát địa chỉ đầu tiên của burst".

1) Cơ chế bắt tay hai chiều (two-way) của AXI 

Giao thức AXI hoạt động dựa trên cơ chế bắt tay hai chiều (two-way handshake) sử dụng một tín hiệu VALID và một tín hiệu READY. 
Nguồn phát (source) sẽ sử dụng tín hiệu VALID để báo hiệu một địa chỉ, thông tin điều khiển hoặc dữ liệu đã hợp lệ trên kênh truyền. VALID giống như tín hiệu yêu cầu (request) một đích (destination) nhận thông tin. 
Đích (destination) sẽ sử dụng tín hiệu READY để thông báo cho nguồn biết nó đã chấp nhận thông tin từ source. READY giống như tín hiệu ACK xác nhận yêu cầu (request) từ nguồn. 
Nguồn và đích có thể là master hoặc slave. Ví dụ, trong một transaction đọc, trên kênh AR, phía master là nguồn phát địa chỉ và thông tin điều khiển, phía slave là đích. Vì vậy, phía master sẽ điều khiển tín hiệu VALID, phía slave sẽ điều khiển tín hiệu READY. Đối với kênh R thì ngược lại, slave là nguồn phát dữ liệu đọc, còn master là đích nên slave sẽ điều khiển VALID còn master điều khiển READY. 
Mỗi kênh sẽ có một cặp VALID/READY gọi là cặp tín hiệu bắt tay để hoạt động theo cơ chế này. Cụ thể: 
  • Kênh AR sẽ có tín hiệu ARVALID (master) và tín hiệu ARREADY (slave) 
  • Kênh R sẽ có tín hiệu RVALID (slave) và tín hiệu RREADY (master) 
  • Kênh AW sẽ có tín hiệu AWVALID (master) và tín hiệu AWREADY (slave) 
  • Kênh W sẽ có tín hiệu WVALID (master) và tín hiệu WREADY (slave) 
  • Kênh B sẽ có tín hiệu BVALID (slave) và tín hiệu BREADY (master) 
*Chú ý: trong bài viết, VALID được hiểu là ARVALID, AWVALID, RVALID hoặc WVALID. READY được hiểu là ARREADY, AWREADY, RREADY hoặc WREADY.
Nguyên tắc chung: 
  • Nguồn phải tích cực tín hiệu VALID bất cứ khi nào có thông tin hợp lệ cần truyền mà không được quan tâm READY đã tích cực hay chưa. VALID phải được duy trì cho đến khi READY tích cực.
  • Đích chỉ tích cực READY khi nó đã sẵn sàng nhận dữ liệu và READY có thể tích cực trước, trong hoặc sau khi VALID đã tích cực.
Hình 1: Cơ chế bắt tay hai chiều của giao thức AXI

Hình 1 minh họa cơ chế bắt tay hai chiều của AXI: 
  • Tại T0: nguồn tích cực VALID báo có thông tin hợp lệ trên kênh truyền (kênh AR, AW, R hoặc kênh W). 
  • Từ T0 đến T2: VALID phải được duy trì mức tích cực vì đích không sẵn sàng (READY = 0) để nhận thông tin lúc này. 
  • Tại T2: Đích tích cực READY báo hiệu đã sẵn sàng nhận thông tin. 
  • Tại T3: Khi VALID và READY cùng tích cực, đích nhận thông tin và nguồn cũng biết điều này. Nếu nguồn tiếp tục có thông tin hợp cần truyền nó sẽ duy trì VALID = 1 sau T3. Nếu nguồn không có thông tin mới cần truyền nó sẽ thôi tích cực VALID như hình 6
  • Sau T3: Đích vẫn duy trì tín hiệu READY để báo hiệu nó đã sẵn sàng nhận thêm thông tin mới như hình 6. Nếu đích đang bận xử lý nhiệm vụ khác, chưa thể nhận thêm thông tin mới, nó sẽ thôi tích cực READY.
*Chú ý: Ở đây, "Thông tin" là địa chỉ, thông tin control hoặc dữ liệu tùy vào kênh.
Nguồn không được phép chờ READY tích cực rồi mới tích cực VALID. nó phải chủ động tích cực VALID bất cứ khi nào phát thông tin hợp lệ lên kênh truyền. Điều này giống như việc bạn phải chủ động báo cáo cho sếp khi đã hoàn thành công việc chứ không chờ sếp hỏi mới báo cáo.
Đích có thể chờ cho VALID tích cực rồi mới tích cực READY. Điều này giống như việc khi sếp đã nhận báo cáo của bạn nhưng kiểm tra báo cáo lúc nào là việc của sếp. Sếp kiểm tra xong sẽ phản hồi lại cho bạn. Tuy nhiên cách làm này sẽ làm giảm hiệu năng hệ thống. Vì vậy, nếu có thể, đích luôn tích cực READY bất cứ khi nào nó có khả năng nhận thông tin mới từ nguồn. Điều này giống như việc, sếp sẽ chủ động nói với bạn "anh đang chờ đọc báo cáo của em" khi sếp rảnh và bạn biết được nếu báo cáo được nộp lúc đó thì báo cáo sẽ được sếp đọc ngay.
Với cơ chế bắt tay hai chiều, mỗi kênh có thể hoàn thành transfer của nó một cách độc lập để tiếp tục thực hiện transfer tiếp theo mà không cần chờ kênh khác.
Hình 2: Cơ chế bắt tay hai chiều VALID/READY cho phép các transfer trên một kênh có thể hoàn thành độc lập với kênh khác
Hình 2, trên kênh AR, transfer địa chỉ và control của transaction B được phát ngay sau khi transfer địa chỉ và control của transaction A hoàn thành bất chấp các transfer dữ liệu và response của transaction A vẫn chưa hoàn thành trên kênh R.
2) Cơ chế burst transaction
Phần này sẽ tập trung giải thích đặc tính "(3) Hỗ trợ các transaction theo cơ chế burst và chỉ cần phát địa chỉ đầu tiên của burst" của giao thức AXI. AXI là giao thức dựa trên cơ chế burst, mỗi transaction điều khiển một burst nên transaction còn được gọi đầy đủ là burst transaction. Đặc tính của burst được quy định bởi thông tin điều khiển truyền trên kênh AR/AW.
Để khởi động một transaction, phía master sẽ phát địa chỉ và thông tin điều khiển của transaction trên kênh AR hoặc AW. Trong đó:
  • Địa chỉ được phát là địa chỉ của byte đầu tiên trong một transaction.
  • Thông tin điều khiển gồm thông tin quy định thuộc tính của burst và các thuộc tính khác của transasion.
Trong giao thức AXI, phía master không phát các địa chỉ trung gian của các beat trong một burst mà chỉ phát địa chỉ byte đầu tiên trong một transaction, đây chính là địa chỉ của transfer dữ liệu đầu tiên. Phía slave dựa trên thông tin điều khiển để xác định địa chỉ của các beat từ địa chỉ đầu tiên này. Điều này giúp tăng performance của hệ thống bus nhưng làm mạch logic xử lý giao tiếp AXI tại phía slave phức tạp hơn vì phải tự tính toán các địa chỉ beat.
So sánh với giao thức bus APB (Advanced Peripheral Bus), một địa chỉ cụ thể chỉ ứng với một dữ liệu được đọc hoặc ghi. Điều này làm cho mạch logic xử lý giao tiếp APB đơn giản, chỉ cần giải mã địa chỉ có sẵn để sử dụng, nhưng hiệu năng bus là không cao.
Để giải thích cơ chế burst transaction, chúng ta tập trung vào các tín hiệu địa chỉ và điều khiển tại mỗi kênh như sau:
  • Kênh AR/AW
    • AxADDR (ARADDR/AWADDR) Địa chỉ của transfer dữ liệu đầu tiên của transaction.
    • AxLEN (ARLEN/AWLEN) Độ dài burst. Thông tin điều khiển này xác định số transfer dữ liệu trong burst, là số beat trong burst.
    • AxSIZE (ARSIZE/AWSIZE) Kích thước burst. Thông tin điều khiển này xác định kích thước chung của mỗi transfer dữ liệu trong burst.
    • AxBURST (ARBURST/AWBURST) Loại burst. Thông tin điều khiển này xác định phương pháp, cơ chế tính địa chỉ cho mỗi transfer dữ liệu (mỗi beat) trong burst.
    • AxVALID (ARVALID/AWVALID) Tín hiệu VALID của kênh địa chỉ.
    • AxREADY (ARREADY/AWREADY) Tín hiệu READY của kênh địa chỉ.
  • Kênh R
    • RDATA Dữ liệu đọc
    • RLAST Tín hiệu báo transfer dữ liệu (beat) cuối cùng trong một burst đọc.
    • RRESP Tín hiệu báo trạng thái của các transfer đọc.
    • RVALID Tín hiệu VALID của kênh R
    • RREADY Tín hiệu READY của kênh R
  • Kênh W
    • WDATA Dữ liệu ghi
    • WLAST Tín hiệu báo transfer dữ liệu (beat) cuối cùng trong một burst ghi.
    • WVALID Tín hiệu VALID của kênh W
    • WREADY Tín hiệu READY của kênh W
  • Kênh B
    • BRESP Tín hiệu báo trạng thái của transaction ghi.
    • BVALID Tín hiệu VALID của kênh B
    • BREADY Tín hiệu READY của kênh B
Hình 3: Nhóm tín hiệu dùng cho việc giải thích burst transaction đọc
Hình 4: Nhóm tín hiệu dùng để giải thích cho burst transaction ghi

*Chú ý: Ở đây, tác giả không liệt kê toàn bộ các tín hiệu của mỗi kênh mà chỉ tập trung giải thích cơ chế burst transaction. Chi tiết về các tín hiệu giao tiếp của mỗi kênh được mô tả trong tài liệu chuẩn.

Độ dài một burst (số beat) được quy định bởi AxLEN và tính như sau:
Độ dài burst (số beat) = AxLEN + 1
Số byte tối đa của một transfer dữ liệu (một beat) được quy định bởi AxSIZE. Kích thước này không được lớn hơn độ rộng bus dữ liệu (độ rộng RDATA/WDATA). Ví dụ, bus dữ liệu có độ rộng 32 byte thì AxSIZE[2:0] phải nhỏ hơn hoặc bằng 5.
Hình 5: Bảng giá trị của AxSIZE (ARSIZE/AWSIZE)
Loại burst được xác định bởi AxBURST. AXI hỗ trợ 3 loại burst là:
  • FIXED: Địa chỉ của mỗi transfer dữ liệu trong transaction là như nhau.
  • INCR: Địa chỉ của một transfer dữ liệu trong burst bằng địa chỉ của transfer trước đó tăng thêm một giá trị được quy định bởi AxSIZE. Ví dụ, AxSIZE[2:0] = 2, số byte của một transfer là 4 thì địa chỉ của transfer hiện tại bằng địa chỉ transfer trước tăng 4.
  • WRAP: Địa chỉ của một transfer dữ liệu trong burst bằng địa chỉ của transfer trước đó tăng thêm một giá trị được quy định bởi AxSIZE nhưng chỉ các bit địa chỉ LSB được tăng. Số lượng bit LSB được tăng phụ thuộc vào AxLEN và AxSIZE. Ví dụ, khi AxLEN = 7, số transfer dữ liệu là 8, nếu AxSIZE = 2 (4 byte) thì số bit LSB được tăng là 5. Nghĩa là địa chỉ của transfer hiện tại sẽ bằng địa chỉ của transfer trước với 5 bit LSB [4:0] được cộng thêm 4. Chú ý, các bit địa chỉ [*:5] sẽ không đổi.
    • Địa chỉ bắt đầu phải aligned theo AxSIZE
    • AxLEN phải bằng 1, 3, 7, 15 ứng với độ dài burst là 2, 4, 8 và 16 beat.
Hình 6: Bảng giá trị của AxBURST (ARBURST/AWBURST)

Loại response được xác định bằng giá trị trên RRESP và BRESP. AXI hỗ trợ 4 loại response:
Hình 7: Bảng giá trị của RRESP/BRESP

3) Kiểu burst FIXED
3.1) Ví dụ
Hình 8: Transaction đọc với kiểu FIXED burst
Hình 8 là một ví dụ về transaction đọc với kiểu burst FIXED. Thông số của transaction này như sau:
  • Địa chỉ bắt đầu: 0x1238
  • Độ dài burst là 8 với ARLEN[7:0] = 0x07
  • Kích thước mỗi beat là 4 byte với ARSIZE[2:0] = 0b010
  • Loại burst là FIXED với ARBURST[1:0] = 0b00
Giải thích waveform hình 8:
  • Kênh AR:
    • T0: Phía master tích cực tín hiệu ARVALID = 1 để báo hiệu cần thực hiện một transaction đọc. Địa chỉ đầu tiên của transaction (ARADDR) và các thông tin về burst (ARLEN, ARSIZE, ARBURST) phải được cung cấp ổn định trong suốt quá trình ARVALID tích cực.
    • T0 đến T1: Phía slave chưa sẵn sàng đáp ứng yêu cầu của phía master nên giữ ARREADY = 0.
    • T1: Phía slave sẵn sàng nhận thông tin về transaction của phía master nên tích cực AREADY = 1.
    • T2: Phía slave nhận thông tin về transaction đọc của phía master. Phía slave thôi tích cực AREADY vì không sẵn sàng nhận thêm yêu cầu mới (phía slave có thể giữ ARREADY = 1 nếu vẫn có thể tiếp tục nhận thêm yêu cầu transaction mới). Phía master thôi tích cực ARVALID vì không có thêm yêu cầu mới tiếp theo (phía master có thể tiếp tục giữ ARVALID = 1 nếu vẫn muốn phát tiếp yêu cầu transaction mới).
  • Kênh R:
    • Nếu phía slave có thể đáp ứng transaction đọc, nó sẽ tích cực RVALID = 1 kèm theo dữ liệu RDATA và trạng thái của transfer đọc RRESP. Thời gian từ T6 đến T7 là khoảng thời gian phía slave chưa có dữ liệu đọc để gửi.
    • Từ T8 đến T9, phía slave gửi một RRESP là SLVERR để báo hiệu transfer đọc này bị lỗi.
    • Từ T10 đến T11, phía slave gửi transfer đọc cuối cùng nên tích cực thêm tín hiệu RLAST = 1.
    • Phía master sẽ tích cực tín hiệu RREADY bất cứ khi nào nó sẵn sàng nhận transfer đọc. Trên waveform, phía master sẽ nhận các transfer đọc tại các thời điểm T3, T4, T5, T6, T8, T9, T10 và T11.
Do đây là kiểu burst FIXED nên địa chỉ của các dữ liệu D0 đến D7 đều giống nhau và bằng địa chỉ bắt đầu 0x1238.
Hình 9. Transaction ghi với kiểu burst FIXED
Hình 9 là một minh họa về waveform của transaction ghi với kiểu burst là FIXED. Khác với transaction đọc, response của transaction ghi chỉ được gửi 1 lần sau khi đã kết thúc burst trên kênh B.
3.2) Ứng dụng
Kiểu burst FIXED sử dụng để truy cập nhiều lần vào cùng một địa chỉ. Nó có thể dùng để truy xuất FIFO/LIFO. Mỗi transfer đọc/ghi sẽ tác động làm tăng giá trị con trỏ đọc/ghi của FIFO/LIFO.
Hình 10: Minh họa về sự sử dụng kiểu burst FIXED để truy xuất FIFO
Hình 10 minh họa về việc sử dụng kiểu FIXED burst truy xuất FIFO. Ở đây, địa chỉ của kênh AR/AW sẽ được lưu lại trong thanh ghi và dùng để giải mã tín hiệu đọc/ghi. Tín hiệu đọc ghi được tạo ra khi VALID và READY trên kênh R/W cùng tích cực. Khi tín hiệu đọc/ghi tích cực thì dữ liệu sẽ được đọc ra/ghi vào FIFO và giá trị con trỏ đọc/ghi sẽ được tăng lên.
4) Kiểu burst INCR
4.1) Ví dụ
Hình 11: Transaction đọc kiểu burst INCR
Hình 12: Transaction ghi kiểu burst INCR
4.2) Ứng dụng
Kiểu burst INCR được dùng phổ biến truy cập đến các vùng địa chỉ liên tiếp nhau như bộ nhớ hoặc các nhóm thanh ghi có địa chỉ liên tục.
Hình 13: Một bộ nhớ có địa chỉ liên tục có thể truy xuất dễ dàng bởi burst INCR

5) Kiểu burst WRAP
5.1) Ví dụ
Hình 14: Transaction đọc với kiểu burst WRAP
Hình 15: Transaction ghi với kiểu burst WRAP
5.2) Ứng dụng
Kiểu burst WRAP sử dụng để truy xuất cache line. Trong hệ thống tốc độ cao CPU không truy xuất trực tiếp bộ nhớ chính (main memory) vì tốc độ đọc/ghi chậm mà sử dụng bộ nhớ trung gian là cache. Nếu trong quá trình hoạt động, cache không chứa giá trị mà CPU cần, gọi là bị "miss", thì nó sẽ bắt đầu tìm giá trị bị "miss" từ bộ nhớ chính.
Dữ liệu được lấy từ bộ nhớ chính theo từng block có kích thước cố định gọi là một "cache line" hoặc "cache block". Mỗi cache line gồm nhiều ô nhớ có địa chỉ liên tục. Có hai cách lấy một cache line là:
  • Early restart: lấy theo thứ tự cache line từ địa chỉ đầu tiên đến địa chỉ cuối cùng của block đến khi gặp giá trị bị "miss" thì gửi giá trị này đến CPU để CPU tiếp tục xử lý. Để làm điều này, CPU dùng kiểu truy xuất INCR.
  • Critical word first: lấy bắt đầu từ giá trị bị miss, giá trị này gọi là "critical word", để có thể gửi nó đến CPU sớm, sau đó tiếp tục lấy những giá trị còn lại trong block (cache line). Để làm được điều này, CPU dùng kiểu truy xuất WRAP.
Hình 16: Minh họa ứng dụng của kiểu burst WRAP trong truy xuất cache line

Tóm lại, bài này tập trung phân tích hoạt động trao đổi dữ liệu của AXI dựa trên cơ chế burst và làm rõ các ứng dụng của từng kiểu burst.

Lịch sử cập nhật:
1) 2019.11.07 - Sửa "Kênh R: ARVALID=1" thành RVALID=1 (theo comment của bạn vanloctc)

7 bình luận:

  1. Bài viết rất hay.
    Cảm ơn tác giả nhiều.

    Trả lờiXóa
  2. Có 2 hình bị lỗi rồi ad.Phiền ad fix lại ạ.Mình cảm ơn nhiều

    Trả lờiXóa
    Trả lời
    1. Bạn có thể chỉ rõ hình số mấy được ko? Vì Page check vẫn thấy bình thường.

      Xóa
  3. "Kênh R:
    Nếu phía slave có thể đáp ứng transaction đọc, nó sẽ tích cực ARVALID = 1" --> ARVALID = RVALID,ad xem có nhầm lẫn không nhé.

    Trả lờiXóa
  4. "Ví dụ, bus dữ liệu có độ rộng 32 bit thì AxSIZE[2:0] phải nhỏ hơn hoặc bằng 5."-> Hình như đoạn này là 32 bytes

    Trả lờiXóa