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
Lê Tiến Đạt

Lê Tiến Đạt

DFT 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."

Nguyễn Thị Phương Quỳnh

Nguyễn Thị Phương Quỳnh

Technical Engineer - Synopsys

"Trong mùa hè muốn phát triển bản thân, mình đã chọn tham gia khóa học IC Overview tại ICTC để củng cố kiến thức về RTL và DV. Trước đây, mình chỉ tập trung coding module mà bỏ qua kỹ năng thiết kế - điều cốt lõi của kỹ sư vi mạch. Qua khóa học, mình hiểu rõ hơn vai trò và công việc thực tế của một kỹ sư vi mạch. Đội ngũ giảng viên giàu kinh nghiệm đã hỗ trợ tận tình cả trong và ngoài lớp học, giúp mình cải thiện đáng kể, đặc biệt khi phỏng vấn cho các offer hiện tại của mình. Xin cảm ơn anh Ân và ICTC rất nhiều!"

Phan Vinh Phong

Phan Vinh Phong

RTL Design Engineer - BOS Semiconductor

"Những ngày tu luyện miệt mài trên server của ICTC được đền đáp bằng một offer RTL Design đầu tiên, một thành quả không tưởng với bản thân mình của 3 tháng trước. Mình thực sự rất biết ơn các anh giảng viên trong đội ngũ ICTC đã tạo nên một môi trường học tập vô cùng chuyên nghiệp, tâm huyết và đầy cảm hứng để các bạn trẻ như mình, dù xuất phát điểm trái ngành, vẫn có thể tự tin theo đuổi và hiện thực hóa giấc mơ của trong lĩnh vực vi mạch."

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ê Duy Thức

Lê Duy Thức

Technical Engineer - Synopsys

"Khóa học thiết kế vi mạch cơ bản do anh Ân phụ trách thật sự rất bổ ích. Anh Ân dạy rất dễ hiểu, lại còn cực kỳ thân thiện và luôn sẵn sàng hỗ trợ tụi em khi gặp khó khăn. Em thấy nội dung khóa học giúp ích rất nhiều cho quá trình phỏng vấn thực tập sau này. Đặc biệt, phần final project khiến em nắm vững hơn về cách đọc và hiểu code RTL, cực kỳ thực tế và sát với công việc. Đây là một khóa học đáng giá cho những ai muốn học và làm về thiết kế vi mạch."

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 Khóa Học Thiết Kế Vi Mạch Cơ Bản Tháng 6 2024

Tổng Kết Khóa Học Thiết Kế Vi Mạch Cơ Bản Tháng 6 2024

Hôm nay, khóa học Thiết kế Vi mạch Cơ bản tại Trung tâm ICTC đã chính thức khép lại với buổi lễ tổng kết ý nghĩa. Đây là dịp để giảng viên và học viên cùng nhau nhìn lại hành trình học tập, những thành quả đạt được, và chia sẻ cảm nghĩ sau khóa học. Cảm Nghĩ Của Học...

TỔNG KẾT OFFLINE VI MẠCH 07/2024

TỔNG KẾT OFFLINE VI MẠCH 07/2024

Vậy là sau hơn 4 tiếng đồng hồ giao lưu và chia sẻ các kiến thức về tổng quan ngành vi mạch, các vị trí việc làm, tuyển dụng, các kinh nghiệm học tập, phỏng vấn, ... buổi offline ngày hôm nay đã kết thúc thành công tốt đẹp.Rất cảm ơn các bạn đã không ngại đường xá xa...

Bài Viết Mới

VLSI Testing – Phần 3: Testing Trong Quy Trình Sản Xuất IC

VLSI Testing – Phần 3: Testing Trong Quy Trình Sản Xuất IC

Bài viết nằm trong series về VLSI Testing Hình dưới đây mô tả các bước để làm ra 1 con chip. Sau khi chip đã được thiết kế hoàn chỉnh, một số con chip mẫu (prototype chip) sẽ được gửi về để test (prototype test). Sau khi quá trình testing hoàn tất và fix tất cả các...

VLSI Testing – Phần 2: Test Là Quá Trình Đưa Ra Quyết Định

VLSI Testing – Phần 2: Test Là Quá Trình Đưa Ra Quyết Định

Bài viết nằm trong series bài viết về VLSI Testing Các Khả Năng Xảy Ra Khi Test Chip Có 4 khả năng xảy ra khi test chip 1.True PASS: tất cả các tính năng của chip đều được test một cách chính xác, chip hoạt động tốt, không có defect nào cả. 2.Test escape: quá trình...

VLSI Testing – Phần 1: VLSI Testing (Chip Testing) Là Gì?

VLSI Testing – Phần 1: VLSI Testing (Chip Testing) Là Gì?

Bài viết nằm trong series bài viết về VLSI Testing. VLSI Testing là gì? VLSI testing, hay chip testing là quá trình diễn ra sau IC đã được sản xuất, nhằm xác định một phần hoặc toàn bộ chip hoạt động đúng tính năng hay không (PASS or FAIL).Testing là công đoạn bắt...

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