Bài này tập trung làm rõ đặc điểm "(2) Hỗ trợ việc trao đổi dữ liệu unaligned và hỗ trợ write strobe" của giao thức AXI đã liệt kê trong bài "Tổng quan về giao thức AMBA - AXI". Trước khi đọc bài này, các bạn nên tham khảo về các loại burst trong giao thức AXI.
1) Write strobe
Write strobe là một thuật ngữ chỉ khả năng có thể điều khiển (chọn) byte dữ liệu hợp lệ trong một transfer dữ liệu khi ghi. Đối với AXI, tín hiệu điều khiển write strobe là WSTRB trên kênh W. Mỗi bit WSTRB điều khiển một byte lane. Trong giao thức AXI một byte lane là một byte (8 bit). Số bit của tín hiệu WSTRB được tính như sau:
Số bit tín hiệu WSTRB = độ rộng bus dữ liệu WDATA/8
Ví dụ, nếu độ rộng bus dữ liệu là 64 bit (8 byte) thì độ rộng WSTRB là 8.
Hình 1: Mối liên hệ giữa WDATA và WSTRB với độ rộng bus dữ liệu là 64 bit |
Tổng quát, WSTRB[n] sẽ quản lý WDATA[(n*8)+7:(n*8)] với n = 0, 1, 2, 3, 4, ... Phía master sẽ dùng WSTRB để báo cho phía slave biết byte nào trong bus WDATA là hợp lệ. Quy định:
- Byte hợp lệ là byte có WSTRB tương ứng bằng 1. Phía slave phải nhận và xử lý byte hợp lệ.
- Byte không hợp lệ (không được transfer) là byte có WSTRB tương ứng bằng 0. Phía slave không được phép sử dụng giá trị các byte này.
Hình 2 minh họa hoạt động của write strobe trên bus dữ liệu 64 bit, phía master thực hiện các transfer với kích thước bằng với độ rộng bus dữ liệu (AWSIZE = 3). Phía master dùng WSTRB để xác nhận các byte hợp lệ trên bus WDATA.
Phía master có thể tắt một transfer write bằng cách lái tất cả các bit WSTRB bằng 0. Chú ý, transfer bị tắt vẫn được xác nhận bằng một cặp WVALID = WREADY = 1 nhưng slave sẽ không sử dụng dữ liệu này. "Tắt một transfer" không có nghĩa là ngừng các transfer tiếp theo trong burst. Trong giao thức AXI, tất cả các transfer trong một burst phải được thực hiện và transaction phải được hoàn thành đúng theo trình tự mà giao thức đã quy định (tham khảo). AXI không hỗ trợ "ngắt burst sớm" (early termination).
Hình 2: Write strobe trên bus dữ liệu 64 bit |
Phân tích trên đây đã giải thích về write strobe, một phần của đặc điểm "(2) Hỗ trợ việc trao đổi dữ liệu unaligned và hỗ trợ write strobe".
Tuy mỗi bit WSTRB quản lý một byte của WDATA nhưng nó không hoạt động độc lập mà có liên hệ với các thuộc tính khác của burst. Các thuộc tính liên hệ trực tiếp đến WSTRB gồm:
- AWADDR: Địa chỉ bắt đầu (Start address)
- AWBURST: Kiểu burst
- AWSIZE: Kích thước tối đa của một transfer trong burst
Điều này sẽ được phân tích ở những phần sau trong bài này.
2) Aligned và Unaligned
Địa chỉ aligned là những địa chỉ tuân theo giới hạn biên được quy định bởi AxSIZE.Hình 3: Cách xác định các địa chỉ aligned |
Xét hình 3, khi AxSIZE = 0, kích thước mỗi transfer là 1 byte, tất cả các giá trị địa chỉ đều gọi là aligned theo byte. Khi AxSIZE > 0, địa chỉ aligned là địa chỉ có các bit LSB bằng 0 tương ứng với giá trị của AxSIZE. Ví dụ nếu AxSIZE = 3, kích thước mỗi transfer là 8 byte thì địa chỉ aligned là những địa chỉ có AxADDR[2:0] = 0, ví dụ như 0x0000, 0x0008, 0x0010, ...
Địa chỉ unaligned là những địa chỉ không tuân theo giới hạn biên được quy định bởi AxSIZE. Không tồn tại giá trị địa chỉ unaligned cho trường hợp AxSIZE = 0, kích thước mỗi transfer là 1 byte. Khi AxSIZE > 0, địa chỉ unaligned sẽ có các bit LSB khác 0 tương ứng với giá trị của AxSIZE. Ví dụ nếu AxSIZE = 3, kích thước mỗi transfer là 8 byte thì địa chỉ unaligned là những địa chỉ có AxADDR[2:0] khác 0, ví dụ như 0x0001, 0x0002, 0x0003, ...
Hình 4: Ví dụ về địa chỉ aligned và unaligned |
AXI chỉ phát một địa chỉ bắt đầu cho mỗi transfer và nó cho phép địa chỉ này có thể là địa chỉ unaligned.
Đối với kiểu burst FIXED, khi phía master phát một địa chỉ unaligned thì địa chỉ này sẽ áp dụng cho tất cả các transfer trong burst.
Đối với kiểu burst INCR, địa chỉ unaligned sẽ chỉ áp dụng cho transfer đầu tiên của burst, địa chỉ của những transfer khác trong burst là địa chỉ aligned. Xét ví dụ hình 5:
Đối với kiểu burst FIXED, khi phía master phát một địa chỉ unaligned thì địa chỉ này sẽ áp dụng cho tất cả các transfer trong burst.
Hình 5: Địa chỉ unaligned trong kiểu burst FIXED, độ rộng bus dữ liệu là 32 bit, mỗi hàng là 1 transfer, ô màu xám là dữ liệu không được transfer |
- Với địa chỉ unaligned 0x01 thì byte ở vị trí địa chỉ 0x00 sẽ không được phía master transfer, phía slave sẽ không được phép sử dụng byte này.
- Với địa chỉ unaligned 0x07 thì các byte ở vị trí địa chỉ 0x04, 0x05 và 0x06 sẽ không được phía master transfer.
Hình 6: Minh họa về aligned và unaligned cho bus dữ liệu 32 bit, kiểu burst INCR, mỗi hàng là một transfer, những ô màu xám là các byte dữ liệu không được transfer (không hợp lệ) |
Hình 7 là một minh họa khác về aligned và unaligned cho kiểu INCR với bus dữ liệu 64 bit nhưng kích thước transfer chỉ là 32 bit.
Đối với kiểu WRAP, chỉ các địa chỉ aligned được phép sử dụng.
Hình 7: Minh họa về aligned và unaligned cho bus dữ liệu 64 bit, kiểu burst INCR, mỗi hàng là một transfer, những ô màu xám là các byte dữ liệu không được transfer (không hợp lệ) |
Hình 8: Minh họa về aligned cho bus dữ liệu 64 bit, kiểu burst WRAP, mỗi hàng là một transfer, những ô màu xám là các byte dữ liệu không được transfer (không hợp lệ) |
3) Sự ràng buộc giữa WSTRB và thuộc tính của burst
Như đã nói ở phần 1 của bài này, WSTRB không hoạt động độc lập, WSTRB phải được lái các giá trị phù hợp với kiểu burst, địa chỉ bắt đầu và kích thước transfer. Nguyên tắc chung là WSTRB không được phép tích cực (bằng 1) tại các byte không được transfer (byte không hợp lệ).
Hình 9 minh họa giá trị WSTRB trong kiểu burst FIXED và địa chỉ unaligned, WSTRB[0] luôn bằng 0 vì byte 0x00 là byte không được transfer.
Hình 10 và hình 11 minh họa giá trị WSTRB trong kiểu burst INCR với địa chỉ aligned và unaligned, WSTRB tại các vùng dữ liệu không sử dụng luôn bằng 0.
Kiểu burst WRAP cũng áp dụng nguyên tắc tương tự nên tác giả không minh họa thêm. Như vậy, kiểu burst, địa chỉ bắt đầu và kích thước transfer quyết định byte nào trên bus dữ liệu là hợp lệ (được transfer) nhưng thông tin này và giá trị WSTRB phải phù hợp với nhau.
Hình 9 minh họa giá trị WSTRB trong kiểu burst FIXED và địa chỉ unaligned, WSTRB[0] luôn bằng 0 vì byte 0x00 là byte không được transfer.
Hình 9: WSTRB trong kiểu burst FIXED và địa chỉ unaligned, bus dữ liệu là 32 bit và kích thước transfer là 32 bit |
Hình 10: WSTRB trong kiểu burst INCR và địa chỉ aligned, bus dữ liệu là 64 bit và kích thước transfer là 32 bit |
Hình 11: WSTRB trong kiểu burst INCR và địa chỉ unaligned, bus dữ liệu là 64 bit và kích thước transfer là 32 bit |
4) Nhận xét
Trong một hệ thống, nếu phía master luôn phát các dữ liệu hợp lệ có kích thước bằng độ rộng bus dữ liệu WDATA thì có thể lái toàn bộ tín hiệu WSTRB = 1 hoặc không cần tạo ra WSTRB nhưng phía slave phải gán cố định tất cả các tín hiệu WSTRB = 1.
Hình 12: Kết nối trong trường hợp phía master luôn phát dữ liệu hợp lệ có kích thước bằng độ rộng bus dữ liệu |
Việc sử dụng địa chỉ unaligned có thể được thay thế bằng một địa chỉ aligned kết hợp với điều khiển WSTRB. Byte nào không muốn transfer thì WSTRB của nó sẽ được gán giá trị 0. Xét lại hình 9, thay vì phát một địa chỉ unaligned lad 0x01, phía master có thể phát một địa chỉ aligned 0x00 nhưng luôn lái WSTRB[0] = 0 cho mỗi transfer dữ liệu.
Transaction đọc cũng có thể sử dụng địa chỉ unaligned nhưng điều này là không cần thiết. Thông thường phía slave sẽ trả đầy đủ các byte dữ liệu trên RDATA cho mỗi transfer đọc, việc sử dụng byte nào là tùy phía master.
Tham khảo:
1. ARM, AMBA® AXI™ and ACE™ Protocol Specification, 2011
Nhận xét này đã bị tác giả xóa.
Trả lờiXóa