Monday, December 23, 2019

Giải đáp vài thắc mắc về AXI protocol


Biên dịch và soạn thảo: TrongTran
Ngày: 23/12/2019


Tài liệu tham khảo: https://community.arm.com/

Mình không giải thích lại về chuẩn giao tiếp AXI. Bạn nào chưa biết thì có thể tham khảo các bài viết của anh Quân Nguyễn tại trang này nhé:

http://nguyenquanicd.blogspot.com/2018/08/busbai-1-giao-thuc-amba-axi.html



Trong bài này mình sẽ giải thích một số điểm corner case trong chuẩn AMBA AXI protocol . Đây cũng là những câu hỏi của hầu hết các diễn đàng ARM trên thế giới mà mình thu thập lại trong quá trình đào sâu về AXI protocol.


Câu 1: WVALID và WREADY có thể được assert trước AWVALID và AWREADY tại phía slave không, Như vậy có violate AXI protocol ? 

Câu trả lời là có. Như chúng ta đã biết để tăng performance cho hệ thống, ARM đã phân chia kênh AW, W và B độc lập nhau như vậy trên đường truyền từ master tới slave qua interconnect (BUS system) thì kênh AW có thể qua nhiều register hơn kênh W. Do đó, kênh AW sẽ bị delay và có thể đến slave sau kênh W.

Mình lấy ví dụ:

Master assert kênh AW trước kênh W một chu kì xung clock. Nhưng kênh AW đi qua 4 flip flop còn kênh W đi qua 2 flip flop lúc này kênh W sẽ đến slave trước kênh AW.



Điều này không violate AXI protocol. Tuy nhiên, xét về mặt hệ thống, việc có chấp nhận điều này (WVALID assert trước AWVALID) hay không là phụ thuộc vào slave. Nếu slave không chấp nhận thì người design interconnect phải sữa lại design để đảm bảo delay giữa hai channel thoã mãn điều kiện. Đặc biệt, Nếu tồn tại bộ decoder trong interconnect (Trường hợp 1 master access nhiều hơn 2 slave). thì đòi hỏi kênh AW phải đến input của bộ decoder trước vì bộ decoder cần biết tín hiệu address để write đến đúng slave mong muốn.


Câu 2: Trong 1 chu trình write transaction, Khi nào thì BVALID được assert ? 

Nếu WLAST&WVALID&WREADY = 1, thì slave có thể assert BVALID bất chắp AWVALID và AWREADY đã assert hay chưa (Điều này không violate AXI protocol rule).



Câu 3: Một master gửi các thông tin burst size và burst length thông qua các tín hiệu ARSIZE, AWSIZE, ARLEN và AWLEN. Từ các thông tin đó chúng ta có thể tính được số beat trong 1 burst và biết được beat cuối. Tuy nhiên tại sao master và slave lại có thêm tín hiệu WLATS và RLAST để xác định beat cuối trong 1 burst được transfer ? 

Câu trả lời là giúp cho design trở nên đơn giản hơn.

Việc tính toán là hoàn toàn có thể tuy nhiên sẽ làm cho quá trình design cả master và slave trở nên phức tạp hơn và dễ gây bug.



Câu 4: Sự khác biệt giữa AXI4 và AXI3 ?

AXI4 không còn tín hiệu WID. Điều này có nghĩa là kênh W channel sẽ không hỗ trợ out-of-order và write data interleaving. Dữ liệu gửi ra từ kênh W sẽ có cùng thứ tự với dữ liệu gửi ra từ kênh AW (in-order).

Ví dụ:

AWADDR: ADDR_0 -> ADDR1 -> ADDR2

WDATA: DATA_0 -> DATA_1 -> DATA_2

Ngoài ra, Với AXI4, Tín hiệu ARLEN/AWLEN được mở rộng từ 4 bit width thành 8 bit width. Nghĩa là nó có thể hỗ trợ tối đa 256 beat transfer trong 1 burst. Điều này là cần thiết vì công nghệ ngày càng phát triển đòi hỏi tốc độ gửi nhận dữ liệu nhanh hơn. Việc tăng giới hạn số beat trong 1 burst giúp tăng performance của hệ thống vì giảm số transaction kênh AW/AR đi và tăng dữ liệu gửi qua kênh R/W.

Đồng thời tín hiệu AWLOCK/ARLOCK giảm từ 2 bit width xuống còn 1 bit width. 

AXI3
 AXI4

Mình nói 1 chút về tín hiệu này. Giả sử có 1 master A. Trường hợp ARLOCK = 10. Lúc này tín hiệu này sẽ control interconnect để chỉ cho master A đi qua. Các master khác phải đợi cho đến khi ARLOCK của master A = 00 thì mới có thể access. Ta có ARLOCK = 10 , Vậy kênh W có thể access không ? Câu trả lời là có. Nó chỉ block các master khác chứ không block các kênh cùng 1 master.



Câu 5: Tại sao không loại bỏ RID hoặc BID (tương tự như loại bỏ WID trong AXI4) ?

Đó là các channel từ slave gửi về. Nếu chúng ta bỏ nó vô tình lúc này kênh R và B cũng sẽ không support out-of-order. Mình lấy ví dụ:

Gửi 2 request đến 2 slave khác nhau A và B.

Đầu tiên ta phát tín hiệu AR đến slave A sau đó đến slave B. Lúc này nếu không dùng ID thì ta phải đợi slave A response về rồi mới nhận slave B. trường hợp slave A response nhanh thì sẽ không sao, ngược lại nếu slave B response nhanh hơp thì lúc này slave A phải đợi B response về mới được response. Có hai ảnh hưởng:

  • Ảnh hưởng performance của hệ thống.
  • Phải tạo thêm các constraint giữa các slave. Design sẽ trở nên phức tạp hơn.

Câu 6: Phân biệt out-of-order và write data interleaving ?

Out-of-order:  hỗ trợ cho cả kênh R và kênh W.

Write data interleaving: chỉ hỗ trợ cho W channel.


Giả sử ta có 3 transaction, mỗi transaction có 2 beat. Địa chỉ của transaction A được gửi đầu tiên tới B rồi cuối cùng là C.

A (A0, A1)

B (B0, B1)

C (C0, C1)


Out-of-order:

A0, A1, C0, C1, B0, B1


In-oder: 
A0, A1, B0, B1, C0, C1


Write data interleaving: A0, B0, B1, A1, C1, C0.


Lưu ý với out-of-order thì transaction đầu tiên phải ứng với address đầu tiên. Tức là WDATA đầu tiên phải tương ứng với ADDRESS đầu tiên phát ra từ master.


Trong AXI4 nếu có nhiều hơn 2 masters cùng access đến 1 slave. Khối nào sẽ control việc merge các data từ 2 master để đảm bảo không bị interleaving.

Interconect sẽ được thiết kế để đảm bảo điều này. Nếu 2 master có cùng ID gửi xuống slave. Interconnect sẽ giải quyết vấn đề này bằng cách chèn thêm một số bit ID ở đầu các tín hiệu ID. Nghĩa là các tín hiệu ID được mở rộng thêm bit width.

Ví dụ: mình có 4 master A (ARID = 11), B (ARID = 11), C (ARID = 11), D (ARID = 11) cùng gửi request đến slave E. Khi đó interconnect sẽ cần chèn thêm 2 bit đầu để phân biệt 4 master đó như sau:

A (ARID = 0011), B (ARID = 0111), C (ARID = 1011), D (ARID = 1111)

Write data interleave xảy ra khi hai AXI master tạo ra sequence ghi vào cùng một slave, nhưng dữ liệu ghi không đến mỗi chu kỳ xung clock. Trong trường hợp này, thay vì đợi một sequence hoàn thành trước khi chuỗi khác bắt đầu, chuẩn AXI cho phép gửi xen kẽ các chuỗi dữ liệu lại với nhau để tránh lãng phí các chu kỳ xung clock trong hệ thống bus.


Câu 7: Khi master access đến 1 slave có thể vừa có in-oder vừa có out-of-order được gửi xen kẽ nhau không?

Nêu một master access đến 1 slave duy nhất. Lúc này ta có thể thấy nếu các burst có ID trùng nhau thì chúng sẽ được transfer in-order. Nếu các burst có ID khác nhau chúng được transfer out-of-order với các burst có ID khác.
Ví dụ:
Có 4 gói: A (ARID = 1), B (ARID = 3), C (ARID = 2), D (ARID = 2).
Khi đó:
 A, B, C có thể được gửi out-of-order với nhau.
A, B, D có thể được gửi out-of-order với nhau.
C, D phải được gửi in-order.

Trường hợp 1 master access đến nhiều slave. Ví dụ mình có master A gửi 1 burst đến slave B có ARID = 2. Sau đó master này gửi tiếp 1 burst đến slave C có ARID = 2 trong khi chưa nhận được response từ slave B . điều này là violate vì khi data trả về master sẽ không phân biệt được đâu là data response từ B và đâu là từ C (trường hợp out-of-order).
Câu 8: Sự khác biệt giữa RRESP và BRESP ?
Mình giả sử có 1 write transaction và 1 read transaction. Mỗi transaction có 4 beat.

Với kênh read, mỗi beat sẽ được thông báo bởi 1 giá trị  RRESP. Error xảy ra cho từng beat khác nhau.

Ví dụ ta có

Với kênh write, cả 4 beat được control bởi chỉ 1 giá trị BRSEP.






No comments:

Post a Comment

Cách tính BW và latency trong 1 hệ thống SoC sử dụng chuẩn giao tiếp AXI protocol

Tác giả:  TrongTran Ngày:  31/12/2019 Nếu bạn nào đang làm về verification cho system performance (ST) thì bài này sẽ bổ ích cho bạn. Ngày ...