Căn bản về giải thuật tính Prefix song song

Thứ năm, 09 tháng 05, 2024

Trong thiết kế, nhiều khi chúng ta gặp những biểu thức cộng dồn dưới dạng:

𝑌0 = 𝐴0

𝑌1 = 𝐴0 + 𝐴1

𝑌2 = 𝐴0 + 𝐴1 + 𝐴2

𝑌3 = 𝐴0 + 𝐴1 + 𝐴2 + 𝐴3

Bài viết này sẽ sử dụng ký hiệu trong đại số Bool. Điều này có nghĩa là A | B (A hay B) sẽ được viết thành 𝐴+𝐵, A & B (A và B) sẽ được viết thành 𝐴𝐵 hay 𝐴⋅𝐵, và ~A (nghịch A) sẽ trở thành 𝐴―.

Những tổng cộng dồn này (𝑌0,𝑌1,𝑌2,𝑌3) được gọi là prefix (gọi tắt của từ prefix sum). Những prefix này có thể được tính một cách song song trong log N bước sử dụng một cấu trúc gọi là cây prefix. Kỹ thuật này nói chung được gọi là giải thuật tính prefix song song (parallel-prefix algorithm).

Kỹ thuật tính prefix song song cũng đã được đề cập trong bài prefix adder. Bài này sẽ mô tả về ứng dụng của kỹ thuật này trong các bài toán đơn giản hơn.

Tính OR cộng dồn

Cho một mảng 8 bit [𝐴7,𝐴6,…,𝐴0], bài toán đầu tiên của chúng ta là tạo ra một mạch để tính một mảng OR cộng dồn cũng 8 bit [𝑌7,𝑌6,…,𝑌0] sao cho:

𝑌0=𝐴0𝑌1=𝐴0+𝐴1𝑌2=𝐴0+𝐴1+𝐴2  ⋮𝑌6=𝐴0+𝐴1+⋯+𝐴6𝑌7=𝐴0+𝐴1+⋯+𝐴6+𝐴7

Nói nôm na cho dễ hiểu là mạch này sẽ tìm ra bit bằng 1 đầu tiên từ bên phải và trả về 1 cho những bit bên trái bit đó.

Chúng ta sẽ vẽ các mạch trong bài này từ trên xuống dưới thay vì từ trái sang phải.

Mã theo dạng 11111000 hay 11100000 được gọi là mã nhiệt kế (thermometer code).

Đầu tiên, ta gọi:

𝐴𝑗:𝑖=𝐴𝑗+𝐴𝑗−1+𝐴𝑗−2+⋯+𝐴𝑖+1+𝐴𝑖

Ví dụ, 𝐴5:2=𝐴5+𝐴4+𝐴3+𝐴2. Theo định nghĩa này thì ta có 𝑌0=𝐴0:0, 𝑌1=𝐴1:0, 𝑌2=𝐴2:0, và vân vân.

Giả sử rằng ta chỉ cần tính 𝑌7. Để tính 𝑌7=𝐴7:0 trong log N bước là một chuyện khá là đơn giản. Ta sẽ tính OR theo từng cặp trong bước 1 (tứ kết):

𝐴7:6=𝐴7+𝐴6𝐴5:4=𝐴5+𝐴4𝐴3:2=𝐴3+𝐴2𝐴1:0=𝐴1+𝐴0

Sau đó ta ghép 2 cặp liền kề với nhau trong bước 2 (bán kết):

𝐴7:4=𝐴7:6+𝐴5:4𝐴3:0=𝐴3:2+𝐴1:0

Và trong bước 3, ta tính OR của cặp còn lại (chung kết):

𝑌7=𝐴7:0=𝐴7:4+𝐴3:0

Các bước tính toán trên có thể được biểu diễn dưới dạng cây:

Ta có thể thấy là mỗi khi ta gộp 𝐴𝑘:𝑗 và 𝐴𝑗−1:𝑖 lại với nhau thì ta sẽ có 𝐴𝑘:𝑖.

Vấn đề bây giờ của chúng ta là tính tất cả 𝑌7,𝑌6,…,𝑌0 cùng một lúc trong log N bước (mà sử dụng ít cổng logic nhất có thể). Chúng ta làm điều này bằng cách chỉnh sửa cái cây dùng để tính 𝑌7. Ta bắt đầu với 𝑌6=𝐴6:0. Sử dụng các dữ kiện đã sử dụng cho 𝑌7, ta có thể thấy:

𝑌6=𝐴6:0=𝐴6+𝐴5:4+𝐴3:0

Như vậy, chúng ta chỉ cần gộp 𝐴6 và 𝐴5:4 thành 𝐴6:4, sau đó gộp nó với 𝐴3:0 để tạo thành 𝐴6:0.

Làm điều tương tự với 𝑌5,𝑌4,…,𝑌0, ta có cây như sau:

Cây này được gọi là cây prefix (theo dạng Sklansky). Thông thường, chúng ta sẽ thay các cổng OR bằng cách ô đen để tiết kiệm không gian, đồng thời cũng giúp biểu đồ dễ đọc hơn.

Có nhiều dạng cây prefix khác nhau như Kogge-Stone hay Brent-Kung, mỗi loại đều có ưu điểm và nhược điểm riêng. Ví dụ cây Sklansky có ít tầng logic nhất, nhưng lại chia nhánh (fanout) nhiều, sẽ làm tăng delay cho mỗi tầng.

Số tầng trong cây prefix là log N, với N là chiều dài của mảng [𝐴𝑁−1,𝐴𝑁−2,…,𝐴0]. Cho nên, một cây prefix rộng 32 bit chỉ cần 5 tầng:

Cây prefix có thể được mô tả bằng cấu trúc đệ quy. Xin tham khảo bài prefix adder để xem cách code cấu trúc này như thế nào.

Tính AND cộng dồn

Tương tự với bài toán OR cộng dồn, ta cũng có bài toán AND cộng dồn.

𝑌0=𝐴0𝑌1=𝐴0𝐴1𝑌2=𝐴0𝐴1𝐴2  ⋮𝑌7=𝐴0𝐴1𝐴2⋯𝐴7

Thay vì tìm bit 1 đầu tiên, mạch AND cộng dồn sẽ tìm bit 0 đầu tiên, và trả về 0 cho các bit bên trái bit đó:

Chúng ta có thể áp dụng cây prefix ở trên cho bài toán này. Ta chỉ cần thay các ô đen trong cây prefix thành các cổng AND. Đây là ví dụ cho một mạch AND cộng dồn rộng 8 bit.

Mạch OR và AND cộng dồn có thể được ứng dụng trong việc thiết kế rất nhiều mạch khác. Chức năng của mạch OR cộng dồn là tìm ra bit bằng 1 đầu tiên, còn của mạch AND cộng dồn là tìm ra bit bằng 0 đầu tiên. Sau đây sẽ là hai ứng dụng của các mạch nêu trên.

Thật ra nếu chúng ta lật cả ngõ vào và ngõ ra từ 1 thành 0, từ 0 thành 1, thì mạch AND cộng dồn sẽ trở thành mạch OR cộng dồn và ngược lại (định lý De Morgan).

Mạch mã hóa ưu tiên

Mạch mã hóa ưu tiên (priority encoder) là mạch sẽ trả về vị trí của bit bằng 1 cao nhất. Tuy nhiên, trong bài này, ta sẽ không mã hóa nó theo dạng nhị phân, mà trả về vị trí bit đó theo dạng one-hot. Ví dụ, nếu ngõ vào của mạch là 00100101 thì mạch sẽ trả về giá trị 00100000 bởi vì bit thứ 5 là bit bằng 1 cao nhất.

Ngay từ khi đọc mô tả của mạch thì chúng ta có thể thấy ngay là ta có thể sử dụng mạch OR cộng dồn (tìm bit bằng 1 cao nhất). Điểm khác biệt duy nhất là ta phải tìm bit bằng 1 đầu tiên từ trái sang (thay vì từ phải sang). Để tìm từ trái sang thì chúng ta chỉ cần lật cây prefix từ trái sang phải:

Cây prefix này sẽ trả về mã nhiệt kế theo dạng 00111111. Bước tiếp theo là biến đổi mã nhiệt kế này thành dạng one-hot 00100000. Ta sẽ sử dụng mạch lọc cạnh lên để phát hiện ra chuỗi 2 bit 01 đứng liền kề:

Tổng hợp lại, ta có thiết kế mạch mã hóa ưu tiên như sau:

Code và testbench cho thiết kế này có thể được tìm thấy ở pe_onehot.sv và pe_onehot_tb.sv.

Mạch bù hai

Mạch bù hai (two’s complementer) là mạch trả về số âm của ngõ vào dưới dạng bù hai (two’s complement). Ví dụ, bù hai của 00010100 (20 trong thập phân) là 11101100 (-20 trong thập phân). Thoạt nhìn thì mạch này chẳng có liên quan gì tới mạch OR hay AND cộng dồn. Tuy nhiên, hãy quan sát các ví dụ sau đây trong hình:

Như vậy, ta có thể lấy số bù hai bằng thuật toán sau:

  1. Tìm bit bằng 1 đầu tiên từ phải sang.
  2. Lật (flip) tất cả các bit ở bên trái bit đó (bỏ qua bit tìm được ở trên).

A ha, chúng ta có thể dùng mạch OR cộng dồn để giải quyết bước 1. Kết quả của bước 1 là một mã nhiệt kế X. Để thực hiện bước 2, ta cần lật các bit ở bên trái nhưng bỏ qua vị trí bit tìm được. Như vậy, ta cần dịch (shift) mã nhiệt kế này sang trái 1 bit Z = X << 1, và sau đó áp dụng cổng XOR với ngõ vào A để cho ra kết quả cuối cùng Y = A ^ Z.

Cổng XOR sẽ lật A[i] khi Z[i] = 1, giữ nguyên A[i] khi Z[i] = 0.

Tổng hợp lại các bước trên, ta có mạch bù hai như sau:

Ta có thể bỏ qua các cổng cho X[7] bởi vì sau khi dịch bit thì X[7] sẽ biến mất.

Code và testbench cho thiết kế này có thể được tìm thấy ở twocomp.sv và twocomp_tb.sv.

Bài tập

Phương pháp trên còn được áp dụng cho nhiều bài toán khác:

  • Mạch so sánh nhỏ hơn: dùng XOR để so sánh bằng từng bit (A[i] == B[i] khi A[i] ^ B[i] == 0), sau đó dùng mạch OR cộng dồn để tìm ra bit không bằng nhau đầu tiên. Tham khảo bài bộ so sánh đệ quy để biết cách sử dụng dữ kiện này như thế nào.
  • Mạch đếm (counter): bạn hãy làm một vài ví dụ trên giấy để tìm ra quy luật lật bit. Cụ thể là chúng ta sẽ lật các bit từ phải sang cho đến khi ta tìm được bit bằng 0 đầu tiên. Sau đó hãy sử dụng kỹ thuật được mô tả trong mạch bù hai.

Nếu các bạn mong muốn áp dụng những kiến thức vừa đọc được, hãy thử giải những bài tập trên. Cám ơn các bạn đã theo dõi.

Link bài viết gốc: https://github.com/minhcly95/ChipDesignArticles/blob/main/PrefixBasics/PrefixBasics.md

Tham khảo

  1. CMOS VLSI Design: A Circuits and Systems Perspective (4th edition) – Neil H. E. Weste, David M. Harris
  2. MIT lecture note: http://courses.csail.mit.edu/18.337/2004/book/Lecture_03-Parallel_Prefix.pdf

——————————————————

Tìm hiểu lộ trình cho người mới bắt đầu để hiểu thêm về công việc, ngành nghề, đãi ngộ và những kiến thức cần thiết để học thiết kế vi mạch và tham gia vào thị trường vi mạch.
Lộ Trình Bắt Đầu Ngành Thiết Kế Vi Mạch Bán Dẫn

Truy cập Server EDA Miễn Phí của ICTC để thực hành thiết kế vi mạch:
Truy cập Server EDA Miễn Phí

Hiện tại ICTC đang mở các khóa học thiết kế vi mạch từ cơ bản đến nâng cao, các bạn có thể tìm hiểu tại các bài viết sau nhé:

Thứ năm, 09 tháng 05, 2024
Tiến Sĩ Bùi Quang Minh - Cộng tác viên trung tâm đào tạo vi mạch ICTC
Bùi Quang Minh

Tiến Sĩ Khoa Học Máy Tính - Ph.D Université de Montréal

Đam mê và tự học đủ mọi thứ liên quan đến máy tính từ phần mềm, driver, nhúng, điện tử. Hiện tại mình đang nghiên cứu thêm vi mạch cho đủ bộ. Đang tìm kiếm một công việc trong ngành để thỏa mãn đam mê.

Đội Ngũ Giảng Viên Đến Từ Các Công ty vi mạch hàng đầu với NHiều năm kinh nghiệm

Khóa học thiết kế vi mạch ICTC giảng viên từ Ampere
Khóa học thiết kế vi mạch ICTC giảng viên từ Renesas
Khóa học thiết kế vi mạch ICTC giảng viên từ MediaTek Singapore
Khóa học thiết kế vi mạch ICTC giảng viên từ BOS
Khóa học thiết kế vi mạch ICTC giảng viên từ Marvell
Khóa học thiết kế vi mạch ICTC giảng viên từ Renesas
Khóa học thiết kế vi mạch ICTC giảng viên từ NSING
Nguyễn Thanh Vương

Nguyễn Thanh Vương

Design Verification Engineer - FPT Semiconductor

"Khóa học quá oke ấy chứ ạ. Lúc trước em fail 3 lần pv và nhận ra mình thiếu project vs tool EDA thực tế, khóa học có server vs thạo VIM em thấy lợi thế hơn hẳn luôn ấy."

Lê Tiến Đạt

Lê Tiến Đạt

Semiconductor Engineer - SemiFive

"Mình chuyển sang vi mạch thực sự khoảng đầu năm nay, mông lung và mất định hướng. Trong quá trình tự học thì biết đến ICTC, cũng nghĩ mục tiêu ban đầu là học để có cái nhìn tổng quát về ngành chứ không nghĩ là sẽ nhận được nhiều như vậy từ các anh. Mình phỏng vấn lần đầu tiên vào tháng 1, sau 6 tháng nỗ lực và tham gia cùng với ICTC thì mình nhận được offer."

Phan Minh Khôi

Phan Minh Khôi

PD Engineer - ADT Technology & SNST

"Nhờ các kiến thức của khóa học tại trung tâm nên em có cái nhìn chi tiết hơn về ngành, giúp em trả lời tốt các câu hỏi tạo điểm cộng trong mắt nhà tuyển dụng."

Nổi Bật

TỔNG KẾT VÀ TRAO CHỨNG CHỈ CHO CÁC LỚP THIẾT KẾ VI MẠCH CƠ BẢN T4 – T5. TUYỂN SINH LỚP VI MẠCH CƠ BẢN VÀ SYSTEM VERILOG UVM THÁNG 09, 10!

TỔNG KẾT VÀ TRAO CHỨNG CHỈ CHO CÁC LỚP THIẾT KẾ VI MẠCH CƠ BẢN T4 – T5. TUYỂN SINH LỚP VI MẠCH CƠ BẢN VÀ SYSTEM VERILOG UVM THÁNG 09, 10!

Vừa qua, ICTC đã có buổi tổng kết lớp kết hợp Offline và Online (cho các bạn không tham dự trực tiếp) để trao chứng chỉ cho các bạn hoàn thành đồ án cuối khóa. Đây là điều kiện tiên quyết để nhận chứng chỉ. Chúc mừng các bạn đã đạt thành tích tốt trong 3 tháng vừa...

HỌC VIÊN ICTC NHẬN ĐƯỢC OFFER TỪ SEMIFIVE 

HỌC VIÊN ICTC NHẬN ĐƯỢC OFFER TỪ SEMIFIVE 

HỌC VIÊN ICTC NHẬN ĐƯỢC OFFER TỪ SEMIFIVE , ICTC NÂNG CẤP SERVER EDA, TIẾP TỤC KHAI GIẢNG CÁC KHOÁ THIẾT KẾ VI MẠCH CƠ BẢN CUỐI THÁNG 8! Trong thời gian vừa qua ICTC đã liên tục nâng cấp hệ thống server EDA thiết kế vi mạch cho gần 100 học viên, giảng viên và các...

Bài Viết Mới

Điểm Tin Vi Mạch 18/9/2024

Điểm Tin Vi Mạch 18/9/2024

Summary:1.Intel Mất Hợp Đồng PlayStation 6 Vào Tay AMD Trị Giá 30 Tỷ USD2.Chính Phủ Mỹ Kêu Gọi Nvidia và Apple Sử Dụng Xưởng Sản Xuất của Intel3.Samsung Gặp Khó Khăn Với Hiệu Suất 2nm Chỉ Đạt 10-20%4.Trung Quốc Tiến Gần Đột Phá EUV Với Bằng Sáng Chế Mới, Thách Thức...

Khai Giảng Khóa Học Thiết Kế Vi Mạch Cơ Bản Tháng 26/08/2024

Khai Giảng Khóa Học Thiết Kế Vi Mạch Cơ Bản Tháng 26/08/2024

Cuối tháng 8 vừa rồi, ICTC đã tiến hành khai giảng lớp thiết kế vi mạch cơ bản (Fundamental IC Design & Verification) thứ 2 trong tháng với anh giảng viên đến từ Synopsys - công ty hàng đầu về thiết kế IP & EDA tools cho vi mạch. Buổi khai giảng đã diễn ra vui...

TỔNG KẾT VÀ TRAO CHỨNG CHỈ CHO CÁC LỚP THIẾT KẾ VI MẠCH CƠ BẢN T4 – T5. TUYỂN SINH LỚP VI MẠCH CƠ BẢN VÀ SYSTEM VERILOG UVM THÁNG 09, 10!

TỔNG KẾT VÀ TRAO CHỨNG CHỈ CHO CÁC LỚP THIẾT KẾ VI MẠCH CƠ BẢN T4 – T5. TUYỂN SINH LỚP VI MẠCH CƠ BẢN VÀ SYSTEM VERILOG UVM THÁNG 09, 10!

Vừa qua, ICTC đã có buổi tổng kết lớp kết hợp Offline và Online (cho các bạn không tham dự trực tiếp) để trao chứng chỉ cho các bạn hoàn thành đồ án cuối khóa. Đây là điều kiện tiên quyết để nhận chứng chỉ. Chúc mừng các bạn đã đạt thành tích tốt trong 3 tháng vừa...

BẠN CHƯA BIẾT BẮT ĐẦU TỪ ĐÂU?

Sau nhiều năm tư vấn và đào tạo vi mạch cho hàng trăm bạn sinh viên, học sinh và phụ huynh, kết hợp với kinh nghiệm từ các anh chị kỹ sư vi mạch có nhiều năm kinh nghiệm, đây là tất cả những kinh nghiệm và tài liệu mà mình đúc kết, tổng hợp lại được thành một quy trình tìm hiểu ngành vi mạch để các bạn mình mới tham gia vào ngành có thể bắt đầu một cách hiệu quả nhất.

 

Bấm nút bên dưới để tìm hiểu về ngành, về nghề nghiệp cũng như những thứ bản thân cần chuẩn bị để tham gia vào hành trình trở thành kỹ sư vi mạch tuy có phần gian nan nhưng vô cùng thú vị bạn nhé!

LỘ TRÌNH TỰ HỌC VI MẠCHGROUP CHAT HỌC TẬP VI MẠCH