Hardware Recursion – Đệ quy trong thiết kế RTL (Phần 2) – Thiết kế bộ so sánh đệ quy (Recursive comparator) bằng system Verilog

Thứ ba, 23 tháng 04, 2024

Comparator là một bộ phận dùng để so sánh 2 số A và B với nhau (rộng N bit) và trả về kết quả rằng A < BA == B, hoặc là A > B. Thông thường trong sách chỉ đề cập tới việc sử dụng bộ cộng (adder) để so sánh bằng cách tính A - B rồi kiểm tra xem hiệu là âm hay dương. Trong bài này, chúng ta sẽ thiết kế một bộ so sánh riêng mà không cần dùng bộ cộng. Đặc biệt là bộ so sánh của chúng ta sẽ chạy trong log N bước.

I. So sánh từng bit

Ta bắt đầu bằng việc so sánh 2 bit A[i] và B[i]. Ta định nghĩa 2 biến như sau:

  • E[i]: bằng 1 nếu A[i] == B[i] (chữ E từ Equal).
  • L[i]: bằng 1 nếu A[i] < B[i] (chữ L từ Less than).

Chúng ta tạm thời bỏ qua A[i] > B[i] do trường hợp này cũng giống A[i] < B[i], chỉ cần đảo thứ tự A và B lại là xong.

Dùng bảng chân lý (truth table), ta có thể dễ dàng suy ra được E[i] và L[i]:

A[i]B[i]Kết luậnE[i]L[i]
00A[i] == B[i]10
01A[i] < B[i]01
10A[i] > B[i]00
11A[i] == B[i]10
E[i] = A[i] & B[i] | ~A[i] & ~B[i]
     = ~(A[i] ^ B[i])
L[i] = ~A[i] & B[i]

Lưu ý rằng ta có thể dùng cổng XNOR để tính E[i].

II. So sánh bằng

Hai số A và B bằng nhau khi tất cả mọi bit của A bằng bit của B. Ta đã có kết quả so sánh bằng từng bit E[i]. Do đó, chúng ta chỉ cần AND tất cả các bit E[i] lại để có kết quả cuối cùng.

EQ = E[0] & E[1] & E[2] & ... & E[N-1]

Nếu EQ = 1 thì tất cả E[i] = 1, do đó tất cả A[i] == B[i], nên A == B và ngược lại. Để AND tất cả các bit lại mà chỉ sử dụng các cổng 2 input, ta có thể AND 2 bit kế nhau theo từng bước như trong hình.

Số bước để AND tất cả các bit lại là log N (8 bit thì cần 3 bước, 16 bit cần 4 bước, 32 bit cần 5 bước). Do đó, delay của mạch này cũng tỉ lệ theo log N.

III. So sánh nhỏ hơn

Hãy nhớ lại cách chúng ta so sánh 2 số bình thường trong thập phân. Ta sẽ so từ trái qua phải, dừng khi gặp 2 chữ số không còn giống nhau. Giả sử rằng ta muốn so sánh 2 số 1342 và 1378. Hai chữ số đầu giống nhau, nên ta bỏ qua. Đến chữ số thứ ba (hàng chục), ta có 4 < 7, cho nên 1342 < 1378.

So sánh trong nhị phân được thực hiện y hệt như trong thập phân. Ví dụ, ta muốn so sánh 10010000 và 10011101. Bốn chữ số đầu 1001 là giống nhau, nên ta xét chữ số thứ năm. Đến đây, ta có 0 < 1, cho nên 10010000 < 10011101.

Để viết một biểu thức logic để mô tả thuật toán trên, ta chia biểu thức thành N trường hợp:

  • Nếu chữ số đầu tiên nhỏ hơn, tức L[N-1] = 1, thì A < B.
  • Nếu chữ số đầu tiên bằng nhau, tức E[N-1] = 1, thì ta xét chữ số thứ 2. Nếu L[N-2] = 1 thì A < B.
  • Nếu 2 chữ số đầu bằng nhau, tức E[N-1] = E[N-2] = 1, thì ta xét chữ số thứ 3. Nếu L[N-3] = 1 thì A < B.
  • và vân vân…

Chỉ cần 1 trường hợp đúng thì A < B. Do đó, ta có biểu thức tổng hợp như sau (LT = 1 khi A < B):

LT = L[N-1] |
     E[N-1] & L[N-2] |
     E[N-1] & E[N-2] & L[N-3] |
     E[N-1] & E[N-2] & E[N-3] & L[N-4] |
     ...
     E[N-1] & E[N-2] & ... & E[2] & E[1] & L[0]

Các bạn có thể nhập biểu thức này vào verilog và nó sẽ hoạt động. Về lý thuyết thì delay mạch này cũng tỉ lệ theo log N. Tuy nhiên, trong phần sau, mình sẽ giới thiệu một cách mô tả mạch này có hệ thống hơn (và elegant hơn).

Nếu mô tả không cẩn thận thì biểu thức trên rất dễ có delay tỉ lệ theo N (tuyến tính).

IV. Chia để trị (Divide and Conquer)

Chia để trị là một cách suy nghĩ khá quen thuộc đối với các bạn đã học giải thuật. Với đôi chút sự sáng tạo thì các bạn hoàn toàn có thể áp dụng nó vào trong phần cứng.

Nhiệm vụ của bạn là thiết kế một bộ so sánh 8 bit. Giả sử rằng bạn đã có (nhiều) bộ so sánh 4 bit (từ chip có sẵn). Vấn đề là làm thế nào để bạn có thể ghép chúng lại với nhau nhằm tạo ra một bộ so sánh lớn hơn?

Chúng ta sẽ dùng 2 bộ so sánh 4 bit. Ta sẽ sử dụng bộ so sánh đầu tiên để so sánh 4 bit cao Ahigh = A[7:4] và Bhigh = B[7:4], trả về Ehigh và LhighEhigh = 1 nếu Ahigh == Bhigh và Lhigh = 1 nếu Ahigh < Bhigh. Tương tự, ta sử dụng bộ so sánh còn lại để so sánh 4 bit thấp Alow = A[3:0] và Blow = B[3:0], trả về Elow và Llow.

Ehigh và Lhigh không thể nào cùng bằng 1, do Ahigh == Bhigh và Ahigh < Bhigh không thể đồng thời xảy ra. Tương tự, Elow và Llow cũng không thể nào cùng bằng 1.

Sau đó, ta xét các trường hợp sau:

  • Nếu Ehigh = 0 và Lhigh = 0, tức là Ahigh > Bhigh, thì A > B.
  • Nếu Lhigh = 1, tức là Ahigh < Bhigh, thì A < B.
  • Nếu Ehigh = 1, tức là Ahigh == Bhigh, thì ta xét tiếp Elow với Llow:
    • Nếu Elow = 0 và Llow = 0, thì A > B.
    • Nếu Llow = 1, thì A < B.
    • Nếu Elow = 1, thì A == B.

Cho nên, chúng ta có thể đúc kết được rằng:

EQ = Ehigh & Elow
LT = Lhigh | Ehigh & Llow

Do đó, ta có được thiết kế bộ so sánh 8 bit như sau:

Vậy làm sao để có thể thiết kế được 2 bộ so sánh 4 bit kia (để không phải mua chip ngoài tốn tiền)? Nếu các bạn chú ý thì chúng ta thật ra cũng đã giải luôn bài toán này rồi: chúng ta ghép 2 bộ so sánh 2 bit để tạo ra 1 bộ so sánh 4 bit dùng chung công thức trên.

Và rồi bộ so sánh 2 bit lại được tạo ra bởi 2 bộ so sánh 1 bit.

Và cuối cùng thì bộ so sánh 1 bit thì đã được mô tả ở phần đầu tiên.

Nếu khai triển tất cả các bộ phận ra thì ta sẽ có sơ đồ:

Mỗi lần ghép 2 bộ so sánh lại với nhau, độ rộng của bộ so sánh tăng thêm gấp đôi. Do đó chúng ta chỉ cần ghép log N bước để tăng từ 1 bit lên N bit. Nghĩa là delay của mạch này cũng tỉ lệ với log N.

Các bạn lưu ý là delay không phụ thuộc vào số cổng, mà phụ thuộc vào chiều dài của critical path trong mạch (đường dài nhất từ input đến output).

V. Code bằng SystemVerilog

Cấu trúc trên là một ví dụ của cấu trúc đệ quy (recursive structure), tức là cấu trúc sử dụng lại một phiên bản con của chính nó. Trong phần này chúng ta sẽ code một module comparator để so sánh 2 số 8-bit sử dụng cấu trúc đệ quy này. Ta sử dụng parameter N để điều chỉnh độ rộng của bộ so sánh. Module comparator được mô tả như sau:

module comparator #(parameter N = 8)(
    input logic[N-1:0] a, b,
    output logic eq, lt
);
    localparam M = N/2;

    generate
        if (N === 1) begin
            // Base case: so sanh 1 bit
            assign eq = ~(a ^ b);
            assign lt = ~a & b;
        end
        else begin
            // Recursive case: ghep 2 bo so sanh M bit lai voi nhau
            logic ehigh, lhigh, elow, llow;
            comparator #(M) highcomp(a[N-1:M], b[N-1:M], ehigh, lhigh);
            comparator #(M) lowcomp(a[M-1:0], b[M-1:0], elow, llow);
            // Merge
            assign eq = ehigh & elow;
            assign lt = lhigh | ehigh & llow;
        end
    endgenerate
endmodule

Testbench sau đây có thể được dùng để kiểm tra code trên:





module testbench();
    logic[7:0] a, b;
    logic eq, lt;

    logic[1:0] set_eq;
    logic[1:0] expected;
    int num_errors = 0;

    comparator #(8) dut(a, b, eq, lt);

    initial begin
        for (int i = 0; i < 256; i++) begin
            {a, b, set_eq} = $urandom;
            if (set_eq === 0)     // 25% chance to set b = a
                b = a;

            expected = {a == b, a < b};
            #1;
            if (expected !== {eq, lt}) begin
                $display("Error: a = %b, b = %b, result = %b, expected = %b",
                        a, b, {eq, lt}, expected);
                num_errors++;
            end
            #1;
        end
        $display("Test finished with %3d errors.", num_errors);
    end
endmodule

Code cho bài viết này có thể được tìm thấy ở comparator.sv và testbench.sv. Cảm ơn các bạn đã theo dõi.

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

——————–

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 vi mạch bán dẫn – Trung Tâm Đào Tạo Thiết Kế Vi Mạch ICTC

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 bài viết IC Overview – ICTC nhé.

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

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ứ ba, 23 tháng 04, 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