Thứ Năm, 6 tháng 7, 2017

[Asynchronous Design][Thiết kế bất đồng bộ][Bài 2] Giao thức bắt tay bundled-data trong thiết kế mạch bất đồng bộ


1. Mô hình luồng dữ liệu (data flow) trong mạch bất đồng bộ

Như đã đề cập ở bài 1 về việc sử dụng giao thức bắt tay trong thiết kế bất đồng bộ để thay thế cho thiết kế đồng bộ sử dụng xung clock khi sự tổng hợp để cân bằng các kết nối xung clock không đạt kết quả như mong muốn.

Trước khi đi sâu vào các giao thức bắt tay ở những bài tiếp theo, chúng ta quy định việc nhìn mô hình thiết kế bắt tay bất đồng bộ như hình 1.

Hình 1. Mô hình handshake channel

  1. Xem các tín hiệu bắt tay và dữ liệu kết nối giữa hai thanh ghi là một kênh bắt tay (handshake channel) hoặc một liên kết bắt tay (handshake link), được gọi tắt là channel hoặc link. Như vậy, một kênh bắt tay bao gồm cả đường dữ liệu và đường điều khiển bắt tay.
  2. Các dữ liệu lưu trữ trong các thanh ghi là các token được gắn các giá trị dữ liệu, gọi là token dữ liệu hoặc gọi tắt là token. Dữ liệu này có thể được thay đổi khi các token đi qua các mạch tổ hợp.
  3. Xem các mạch tổ hợp, như CL3 hay CL4 trong hình minh họa, không tác động gì đến việc bắt tay giữa các thanh ghi. Một mạch tổ hợp thu vào một token trên mỗi link ngõ vào, thực thi tính toán và phát một token trên mỗi link ngõ ra.
Khi xem xét theo mô hình này, một mạch bất đồng bộ chỉ đơn giản là một cấu trúc dữ liệu tĩnh. Để mô hình này xử lý chính xác thì các token lan truyền trong mạch không bị mất, nó không vượt qua một token khác (nghĩa là phải theo thứ tự xử lý) và các token mới tương tự không được phép xuất hiện ở bất cứ nơi nào khác. Một luật đơn giản để đảm bảo cho các yêu cầu nàylà:

Một thanh ghi có thể lấy và lưu trữ một token mới từ thanh ghi trước nó nếu thanh ghi phía sau nó đã lấy và lưu dữ liệu mà nó đang giữ. Hoạt động của các thanh ghi trước và thanh ghi sau được liên kết với thanh ghi hiện tại bằng các tín hiệu yêu cầu (request - req) và xác nhận (acknowledge - ack).

Việc chuyển dữ liệu giữa các thanh ghi trong mạch sẽ tuân theo quy luật này. Các thanh ghi có thể có giá trị giống nhau nhưng một thanh ghi đã bị lấy đi dữ liệu của mình thì dữ liệu của nó trở thành dữ liệu cũ và có thể bị ghi đè bởi dữ liệu mới. Việc bắt tay liên kết giữa các thanh ghi đảm bảo một token luôn được chuyển giao một cách chính xác. Tóm lại, mục này chỉ nói về mô hình mạch sẽ trình bày ở những bài tiếp theo của nội dung thiết kế bất đồng bộ. Có 2 điểm bạn cần nắm là:

1. Hiểu về kênh bắt tay (handshake channel) và mô hình token
2. Các mạch tổ hợp không biến đổi các điều khiển bắt tay (handshaking) mà chỉ chuyển tiếp chúng

2. Các giao thức dữ liệu đóng gói (bundled-data)

Thuật ngữ dữ liệu đóng gói (bundled-data) được hiểu là có các tín hiệu req và ack riêng biệt đi kèm với các tín hiệu dữ liệu như hình 2. Các tín hiệu này sử dụng mức logic thông thường để biểu diễn thông tin.
Hình 2. Kênh dữ liệu đóng gói gồm một tín hiệu req, một tín hiệu ack và một bus dữ liệu

Hình 3 minh họa giao thức dữ liệu đóng gói 4 pha (4-phase bundled-data). Nó được gọi là 4 pha vì nó có 4 hoạt động khác nhau để truyền dữ liệu:

  1. Sender phát dữ liệu và tích cực tín hiệu req mức cao
  2. Receiver lấy dữ liệu và tích cực tín hiệu ack mức cao để báo đã lấy được dữ liệu của Sender
  3. Sender đáp ứng lại bằng cách kéo req xuống mức thấp và từ lúc này dữ liệu trên bus DATA không còn được đảm bảo tính hợp lệ, nghĩa là đây có thể là dữ liệu ngẫu nhiên và Receiver không được phép lấy
  4. Receiver phát hiện req mức thấp thì cũng kéo ack xuống mức thấp và Sender có thể bắt đầu một quá trình truyền dữ liệu mới
Hình 3. Giao thức dữ liệu đóng gói 4 pha


Giao thức này còn được biết với tên giao thức bắt tay 4 pha hoặc giao thức bắt tay 4 bước. Giao thức này khá quen thuộc và phổ biến nhưng có điểm bất lợi là các tín hiệu chuyển trạng thái quá nhiều làm mất thời gian và tốn năng lượng. Để hoàn thành một lần bắt tay truyền dữ liệu tín hiệu req chuyển trạng thái 2 lần và tín hiệu ack chuyển trạng thái 2 lần. Một giao thức khác hạn chế được điều này là giao thức 2 pha.

Hình 4 minh họa giao thức dữ liệu đóng gói 2 pha (2-phase bundled-data). Ở đây thông tin trên tín hiệu req và ack được mã hóa bằng sự chuyển đổi tín hiệu trên đường dây và không có sự khác biệt giữa việc chuyển từ 0 sang 1 hay 1 sang 0, cả hai sự chuyển đổi này đều gọi là sự kiện tín hiệu (signal event). Hoạt động của giao thức 2 pha gồm:

  1. Sender phát dữ liệu và gửi một sự kiện tín hiệu, là sự chuyển mức logic từ 0 sang 1 hoặc 1 sang 0, xuất hiện trên req.
  2. Receiver nhận dữ liệu và đáp ứng lại bằng 1 sự kiện chuyển tín hiệu, sự chuyển mức từ 0 sang 1 hoặc 1 sang 0, trên tín hiệu ack. Lúc này, Sender có thể tiếp tục phát dữ liệu mới.

Hình 4. Giao thức dữ liệu đóng gói 2 pha
Có thể nhận thấy, giao thức 2 pha cho tốc độ chuyển dữ liệu giữa Sender và Receiver nhanh hơn, tận dụng được triệt để mỗi lần chuyển trạng thái (mức logic) của hai tín hiệu điều khiển req và ack. Xét về số lần chuyển trạng thái trên req và ack, giao thức 2 pha có số lần chuyển trạng thái ít hơn một nửa so với giao thức 4 pha khi truyền cùng một số lượng dữ liệu như nhau. Tuy nhiên, việc thực hiện mạch giao thức 2 pha trên thực tế phức tạp hơn giao thức 4 pha.

Thuật ngữ bundled-data đôi khi còn được gọi bằng cái tên khác là single-rail. Giao thức bắt tay 4 pha (4-phase handshaking) hay báo hiệu 4 pha (4-phase signaling) còn được gọi là Return-to-Zero Signaling (RTZ signaling) hoặc báo hiệu mức (level signaling). Giao thức bắt tay 2 pha còn được gọi là Non-return-to-zero signaling hoặc báo hiệu chuyển tiếp (transition signaling).

Trong các giao thức đã trình bày Sender là bộ khởi động việc truyền dữ liệu trên một kênh và được gọi là kênh đẩy (push channel). Receiver là thành phần có thể yêu cầu dữ liệu mới từ Sender, mà không phải thụ động chờ Sender nữa, gọi là bộ kéo (pull channel).  Trong trường hợp này, Receiver sẽ tích cực tín hiệu req để yêu cầu nhận dữ liệu khi cần, Sender sẽ tích cực tín hiệu ack để báo cho Receiver khi có dữ liệu hợp lệ.

Hình 5. Kênh đẩy và kênh kéo
Ngoài ra, có một số biến thể khác của dạng giao thức đã trình bày như sau:

  1. Kênh không có dữ liệu: Loại này chỉ sử dụng các tín hiệu bắt tay nên có thể dùng cho việc đồng bộ
  2. Kênh có truyền thông tin dữ liệu theo cả hai chiều: loại này thường dùng cho giao tiếp bộ nhớ chỉ đọc (read-only memory). Với bộ nhớ này, địa chỉ được đóng gói (bundled) với req để gửi đến bộ nhớ, còn dữ liệu được đóng gói với ack được phát ra từ bộ nhớ.


Note: Tôi dịch chủ yếu từ tài liệu "Asynchronous Circuit Design A Tutorial" của tác giả Jens Sparsø nhưng có thể thêm các nhận xét hoặc minh họa theo cách hiểu của riêng mình. Mong các bạn chia sẻ và góp ý và thảo luận dưới bài viết.

0 bình luận:

Đăng nhận xét