Thứ Ba, 5 tháng 3, 2019

[Perl][Thiết kế lõi IP bằng script] Bài 3 - Phân tích tổng quan một ví dụ minh họa

Bài viết này là phần tiếp theo của chuỗi bài hướng dẫn cơ bản về cách tạo ra một lõi IP bằng Perl script. Nội dung bài viết này tập trung phân tích tổng quan một lõi IP cụ thể trước khi xác định xem lõi IP này sẽ được tạo ra bằng script như thế nào. Các bạn cần đọc bài 1bài 2 trước khi đọc bài viết này.

1) Mô tả ví dụ
Ví dụ minh họa được thực hiện cho thiết kế có yêu cầu chức năng như hình 1. Thiết kế này tên router hoạt động trong một hệ thống đồng bộ theo xung clock clk. Nó gồm hai thành phần chính là:
  1. server: nhận các gói dữ liệu 8 bit (src_data_*) từ các source và địa chỉ của destination (src_addr_*) lưu vào trong một FIFO. Sau đó, dữ liệu và địa chỉ này đưa đến khối arbiter.
  2. arbiter: phân xử các yêu cầu truyền dữ liệu từ các khối server. Sau đó, arbiter giải mã địa chỉ để chọn destination và truyền dữ liệu nối tiếp từng bit đến destination thông qua tín hiệu abt_data.
Hình 1: Sơ đồ khối của thiết kế router
Giải thích chức năng các tín hiệu:
  1. Nhóm tín hiệu giao tiếp giữa khối router và bộ tạo clock/reset
    1. clk: clock đồng bộ
    2. rst_n: reset tích cực mức thấp
  2. Nhóm tín hiệu giao tiếp giữa router và các source
    1. src_req_*source tích cực tín hiệu này để yêu cầu truyền một gói dữ liệu cho destination
    2. src_data_*[7:0]: gói dữ liệu 8 bit truyền từ source
    3. src_addr_*[M-1:0]: địa chỉ của destination. Mỗi destination có một giá trị địa chỉ cố định. Độ rộng của tín hiệu địa chỉ quy định số destination router sẽ quản lý.
    4. sv_ack_*: server của router tích cực tín hiệu này để báo đã nhận được gói dữ liệu và địa chỉ từ source.
  3. Nhóm tín hiệu giao tiếp giữa router và các destination
    1. abt_data: đường truyền dữ liệu nối tiếp từng bit
    2. abt_req_*: tín hiệu báo có dữ liệu cần truyền từ router, tích cực mức cao.
    3. dest_ack_*: tín hiệu báo destination sẵn sàng nhận dữ liệu từ router.
Giản đồ định thời (timing) giao tiếp giữa source router như sau:
Hình 2: Mô tả cơ chế bắt tay giữa source và router
Việc truyền dữ liệu từ source cho router trải qua 4 bước:
  1. source tích cực src_req_* để gửi dữ liệu và địa chỉ cần truyền
  2. router tích cực sv_ack_* để báo sẵn sàng nhận dữ liệu và địa chỉ
  3. source thôi tích cực src_req_* ngay khi phát hiện sv_ack_* = 1
  4. router thôi tích cực sv_ack_* ngay khi phát hiện src_req_* = 0
Ở đây, sv_ack_* có thể tích cực bất cứ khi nào router sẵn sàng nhận dữ liệu từ source. Giản đồ định thời (timing) giao tiếp giữa router và destination như sau:
Hình 3: Mô tả cơ chế bắt tay truyền dữ liệu nối tiếp giữa router và destination
Quá trình truyền dữ liệu từ router đến destination qua 3 bước:
  1. router tích cực abt_req_* và bắt đầu gửi bit dữ liệu đầu tiên qua tín hiệu abt_data_*.
  2. destination tích cực tín hiệu dest_ack_* khi nó sẵn sàng nhận dữ liệu. 8 bit dữ liệu sẽ nhận liên tiếp bởi destination.
  3. router destination cùng thôi tích cực abt_req_* và dest_ack_*
Trong thiết kế này, các thành phần thay đổi gồm:
  1. Số lượng source, làm cho số lượng server thay đổi
  2. Số lượng destination, làm cho độ rộng bit địa chỉ và số lượng nhóm tín hiệu giao tiếp với destination (abt_req_* và dest_ack_*) thay đổi
Khi phân tích chi tiết, một số thành phần logic bên trong router cũng sẽ thay đổi tùy vào sự thay đổi của hai thông số trên.
Đến đây, các bạn có thể áp dụng các bước đã trình bày ở bài 1 để thử phân tích xem chúng ta sẽ thực hiện bước "phân tích TOOL" như thế nào? Việc phân tích chi tiết sẽ được trình bày trong nhưng bài sau.
2) Phân tích kết nối giữa khối server và arbiter
Phần này làm rõ chi tiết kết nối giữa khối server và arbiter trong thiết kế router. Một số lưu ý:
  • src_id có giá trị từ 0 đến N với N là số lượng source kết nối với router.
  • dest_id có giá trị từ 0 đến M với M là số lượng destination kết nối với router.
  • ADDR_WIDTH là số lượng bit địa chỉ src_addr. M = 2^ADDR_WIDTH, ví dụ ADDR_WIDTH = 2 thì M = 4, tức là có 4 khối arbiter giao tiếp với 4 destination.
  • SEL_WIDTH = M = số lượng arbiter = số destination
  • Port là tên chân tín hiệu của khối thiết kế
  • Connection là tên của tín hiệu sẽ kết nối đến port.
Hình 4: Các port và kết nối của các port khối server. (a) tổng quan (b) một ví dụ chi tiết cho khối server 0
3) Phân tích tổng quan khối server
Khối server gồm các FIFO lưu lại dữ liệu và địa chỉ từ source. Sau đó, server giải mã địa chỉ để chọn khối arbiter của destination tương ứng và đưa dữ liệu đến cho arbiter. Các thành phần chính của server gồm:
  1. FIFO control: Thành phần điều khiển các FIFO
  2. Data FIFO: FIFO lưu dữ liệu của source lấy từ src_data[7:0]
  3. Address FIFO: FIFO lưu địa chỉ của source lấy từ src_addr[ADDR_WIDTH-1:0]
  4. Address decoder: giải mã địa chỉ để tích cực bit tín hiệu sv_sel chọn arbiter
Hình 5: Sơ đồ khối của server
4) Phân tích tổng quan khối arbiter
Khối arbiter có chức năng chính là nhận dữ liệu từ các khối server và truyền chúng đến destination do nó quản lý. Khối này gồm các thành phần cơ bản:
  1. Data decoder: Bộ giải mã chọn dữ liệu cần truyền. Dữ liệu này được đưa đến từ khác khối server.
  2. ACK decoder: Bộ giải mã tích cực bit tín hiệu abt_ack tương ứng sau khi truyền xong 1 gói dữ liệu.
  3. Data shifter: điều khiển giao thức bắt tay với destination để truyền gói dữ liệu đến destination.
Hình 6: Sơ đồ khối arbiter
Kết nối của khối arbiter thể hiện trong hình minh họa sau.
Hình 7: Kết nối của khối arbiter
5) Nhận xét
Đến đây, quá trình phần tích tổng quan cấu trúc lõi IP kết thúc. Đây là một phần trong bước Phân tích cấu trúc lõi IP trong "6.2) Phân tích TOOL" đã mô tả trong bài 1.
Kết nối giữa các khối server và arbiter có nhiều thành phần không cố định (màu đỏ). Các thành phần này sẽ thay đổi khi số lượng source và destination thay đổi. Bên cạnh đó, chúng sẽ ảnh hưởng đến thiết kế bên trong mỗi khối và làm cho RTL code thay đổi.

Lịch sử cập nhật:
2019.03.10 - Sửa hình 1, 2 và 3. Thêm nội dung phân tích cho khối server và arbiter.
2019.03.18 - Sửa hình vẽ khối arbiter. Thêm hình 7.

1 bình luận: