Bối cảnh và vấn đề nghiên cứu

Trong nền công nghiệp máy tính và vi mạch bán dẫn, việc đề xuất, thiết kế và xác minh một kiến trúc tập lệnh (ISA - Instruction Set Architecture) mới đòi hỏi chi phí tài chính rất lớn cùng năng lực chuyên môn đa ngành phức tạp (điện tử kỹ thuật số, trình biên dịch, hệ điều hành, kỹ thuật phần mềm). Hầu hết các kiến trúc tập lệnh thương mại trước đây đều yêu cầu chi phí bản quyền cao và phụ thuộc vào các công cụ đóng gói đắt đỏ. Sự ra đời của kiến trúc tập lệnh mở RISC-V (Reduced Instruction Set Computer - Five), được khởi xướng từ Đại học California, Berkeley vào năm 2010, đã cung cấp một chuẩn ISA miễn phí, dạng module hóa, cho phép các trường đại học, viện nghiên cứu và doanh nghiệp tự do thiết kế, tùy biến và thương mại hóa phần cứng mà không phải chịu chi phí tác quyền.

Tuy nhiên, việc thiết kế một bộ xử lý RISC-V luôn đi kèm thách thức lớn trong khâu xác minh chức năng (functional verification) nhằm phát hiện lỗi thiết kế phần cứng trước khi chế tạo vi mạch. Tại Việt Nam ở thời điểm thực hiện đề tài (năm 2021), các công trình nghiên cứu và phát triển công cụ tự động tạo dữ liệu kiểm thử (testcases) cho vi xử lý RISC-V còn rất hạn chế, mới chỉ ghi nhận một đề tài tiền đề trong nước. Do đó, khóa luận tốt nghiệp kỹ sư ngành Kỹ thuật Máy tính của tác giả Trần Thị Lan Trinh tại Trường Đại học Công nghệ Thông tin - Đại học Quốc gia TP.HCM đã tập trung vào đề tài: "Bộ phát sinh chương trình kiểm tra ngẫu nhiên cho thiết kế RISC-V" (RISC-V Random Test Generator - RISC-V RTG).

Mục tiêu và nhiệm vụ nghiên cứu của đề tài được xác định cụ thể như sau:

  1. Nghiên cứu tổng quan về kiến trúc tập lệnh mở RISC-V, trọng tâm là tập lệnh số nguyên 32-bit cơ sở RV32I.
  2. Thiết kế và hiện thực bộ phát sinh chương trình kiểm tra ngẫu nhiên (RISC-V RTG) có khả năng sinh ra các tệp hợp ngữ (.S) có ý nghĩa, phụ thuộc vào trọng số cấu hình của các nhóm lệnh và ứng dụng giải thuật di truyền.
  3. Hiện thực trình biên dịch hợp ngữ (Assembler) để chuyển đổi các testcase hợp ngữ thành mã máy nhị phân (.elf/binary).
  4. Đạt 100% độ bao phủ (coverage) trên mô hình mô phỏng tập lệnh (ISS) theo các tiêu chí xác minh sau:
    • Đối với lệnh: Kiểm tra đầy đủ 37 lệnh của RV32I ISA (bao gồm các lệnh: BEQ, BNE, BLT, BGE, BLTU, BGEU, LB, LH, LW, LBU, LHU, LUI, SB, SH, SW, ADDI, SLTI, SLTIU, XORI, ORI, ANDI, SLLI, SRLI, SRAI, ADD, SUB, SLL, SLT, SLTU, XOR, SRL, SRA, OR, AND, AUIPC, JAL, JALR) và toàn bộ 6 định dạng lệnh (R-type, I-type, S-type, SB-type, U-type, UJ-type).
    • Đối với lệnh nhảy: Đảm bảo kiểm tra cả các trường hợp nhảy tới và nhảy lùi.
    • Đối với số tức thời: Sinh được các giá trị tức thời gồm số 0, số âm, số dương, số lớn nhất và số nhỏ nhất.
    • Đối với thanh ghi đa dụng: Ghi và đọc giá trị đến/từ toàn bộ 32 thanh ghi (x0 đến x31); thanh ghi vừa là toán hạng nguồn vừa là toán hạng đích; toán hạng nguồn và đích cùng một thanh ghi đối với lệnh ALU; hai toán hạng nguồn đều là thanh ghi x0.
    • Đối với truy xuất bộ nhớ: Truy xuất các địa chỉ bộ nhớ liên tiếp (truy xuất mảng); đọc và ghi một địa chỉ bộ nhớ nhiều lần.

Đối tượng nghiên cứu của khóa luận là kiến trúc tập lệnh RV32I và phương pháp phát sinh chuỗi lệnh kiểm thử ngẫu nhiên. Phạm vi đề tài tập trung vào việc tạo testcase phần mềm, chuyển đổi mã máy và đo độ bao phủ trên bộ mô phỏng tập lệnh ISS độc lập, cung cấp đầu vào mã máy cho các nhóm kiểm tra RTL (Register-Transfer Level).

Cơ sở lý thuyết và phương pháp nghiên cứu

Về mặt cơ sở lý thuyết, khóa luận dựa trên hai trụ cột chính:

  1. Kiến trúc tập lệnh RISC-V: Tập lệnh RV32I định nghĩa không gian địa chỉ 32-bit, kiến trúc nạp/lưu (Load-Store Architecture), thứ tự byte kiểu Little Endian, gồm 32 thanh ghi đa dụng 32-bit (với thanh ghi x0 luôn cố định giá trị 0) và thanh ghi bộ đếm chương trình (PC). Tập lệnh được phân bổ vào 6 định dạng cơ bản (R-type, I-type, S-type, SB-type, U-type, UJ-type) và chia thành các nhóm chức năng: rẽ nhánh (Branch), nạp (Load), lưu (Store), số học và luận lý (ALU), và nhảy (Jump).
  2. Hệ thống xác minh chức năng bộ xử lý: Mô hình kiểm tra chức năng vi xử lý chuẩn bao gồm các khối:
    • Random Test Generator (RTG): Sinh chuỗi lệnh kiểm thử.
    • Testbench Controller: Nạp và điều khiển luồng thực thi testcase trên các mô hình.
    • Instruction Set Simulator (ISS): Mô hình mô phỏng kiến trúc mức cao, đóng vai trò là "mô hình tham chiếu vàng" (Golden Model) không chứa độ trễ pipeline.
    • RTL Simulation: Mô hình mô phỏng phần cứng thực tế (chứa pipeline và các hiệu ứng phần cứng).
    • Comp-runner: So sánh trạng thái hoạt động giữa ISS và RTL để phát hiện sai lệch.
    • Coverage Monitor: Đếm tần suất xuất hiện của lệnh, thanh ghi, nhánh rẽ và truy xuất bộ nhớ để tính toán độ bao phủ kiểm tra.

Về phương pháp nghiên cứu và giải thuật:

  • Đề tài kết hợp phương pháp phát sinh dựa trên bảng (Table-Based Generator), phương pháp phân bổ ngẫu nhiên có trọng số (Weighted Randomness) và thuật toán di truyền (Genetic Algorithms - GA).
  • Trong thuật toán di truyền, mỗi lệnh được coi như một cá thể được mã hóa thành chuỗi nhị phân (nhiễm sắc thể). Quy trình gồm 4 bước: khởi tạo quần thể ban đầu, chọn lọc cá thể ngẫu nhiên, lai ghép trao đổi nhiễm sắc thể và đột biến một hoặc nhiều bit để tạo ra quần thể mới thỏa mãn các điều kiện từ tệp cấu hình. Giải thuật này giải quyết nhược điểm khó xuất hiện hoặc xác suất xuất hiện thấp của các câu lệnh phức tạp và lệnh biên.
  • Nguồn dữ liệu thực thi: Chương trình RTG được xây dựng bằng ngôn ngữ C (sử dụng môi trường Microsoft Visual Studio, khai thác các hàm <stdlib.h>, <time.h>, <stdio.h>), công cụ Assembler được xây dựng bằng ngôn ngữ Python, và kết quả kiểm thử được đối soát thông qua bộ mô phỏng ISS.

Thiết kế và triển khai hệ thống

Hệ thống RISC-V RTG được thiết kế theo luồng xử lý khép kín gồm các thành phần chính:

[Tệp cấu hình Configuration] 
[Trình biên dịch Assembler (Python)]
  1. Tệp tin cấu hình (Configuration File): Cho phép người dùng tham số hóa toàn bộ quá trình sinh testcase thông qua các trường dữ liệu:

    • NumCommands: Số lượng lệnh cần sinh trong mỗi testcase.
    • NumFile: Tổng số lượng tệp testcase cần tạo.
    • Branch, Load, Store, ALU, Jump: Trọng số quy định số lượng tối thiểu các lệnh thuộc từng nhóm chức năng xuất hiện trong testcase.
  2. Khối RISC-V RTG: Tiếp nhận thông số từ tệp cấu hình, thực thi giải thuật di truyền và cơ chế ngẫu nhiên hóa để tạo ra các tệp hợp ngữ .S. Cấu trúc mỗi tệp gồm:

    • Phần khởi tạo (initialization): Dùng các lệnh ADDI để nạp giá trị ban đầu vào các thanh ghi từ x1 đến x31.
    • Phần thân chính (Main và các nhãn Loop): Chứa các chuỗi lệnh thực thi có kiểm soát nhánh, địa chỉ bộ nhớ và quan hệ phụ thuộc dữ liệu.
    • Phần kiểm tra kết thúc (Pass, Fail, End): Đánh giá tính đúng đắn luồng điều khiển.
    • Đồng thời, RTG xuất ra tệp báo cáo thống kê số lần sử dụng của từng mã lệnh và từng thanh ghi trong từng testcase.
  3. Trình biên dịch hợp ngữ (Assembler): Được viết bằng Python, xử lý theo thuật toán 2 giai đoạn (8 bước):

    • Giai đoạn Pre-Encoding: Đọc từng dòng tệp .S, loại bỏ dòng trống, phát hiện các nhãn dán (labels) và lưu địa chỉ nhãn vào bảng băm (Hash Table), tạo ra tệp trung gian "New Assembly" không còn nhãn.
    • Giai đoạn Encoding: Đọc tệp "New Assembly", phân tích cú pháp từng lệnh, tra cứu bảng mã opcode/funct3/funct7 và ánh xạ các trường toán hạng sang định dạng nhị phân 32-bit theo đúng đặc tả RV32I, xuất ra tệp mã máy nhị phân (.elf/binary).

Nội dung chính theo từng chương

Chương 1: Giới thiệu đề tài

Chương 1 thiết lập bối cảnh nghiên cứu về xu thế mở của kiến trúc phần cứng RISC-V và nhu cầu cấp thiết của việc xây dựng công cụ xác minh vi xử lý độc lập. Tác giả tiến hành khảo sát và tổng hợp các công trình nghiên cứu liên quan trên thế giới và trong nước:

  • Nghiên cứu của Chupilko và cộng sự (2018) dựa trên nền tảng MicroTESK, tập trung tạo testcase kiểm tra lệnh đơn lẻ với toán hạng biên và đường dẫn thực thi.
  • Nghiên cứu của Herdt và cộng sự (2020) sử dụng công cụ kiểm thử hình thức GRIFT, sinh 8.900 trường hợp thử nghiệm trong 392 giây, nhưng độ bao phủ trên RV32I chỉ đạt từ 67% đến 86% do hạn chế ở nhóm lệnh nhảy và truy xuất bộ nhớ.
  • Nghiên cứu trong nước của Trương Thị Giang (2020) tại Đại học Công nghệ Thông tin, áp dụng phương pháp bảng và ngẫu nhiên có trọng số, kiểm tra được 36/37 lệnh RV32I. Từ các phân tích trên, chương 1 xác định rõ mục tiêu hoàn thiện bộ sinh testcase đạt 100% độ bao phủ trên 37 lệnh RV32I bằng cách kết hợp thuật toán di truyền.

Chương 2: Cơ sở lý thuyết

Chương 2 trình bày chi tiết về mặt kỹ thuật của kiến trúc tập lệnh RISC-V và hệ thống xác minh phần cứng:

  • Hệ thống hóa các tập lệnh cơ sở (RV32I, RV32E, RV64I, RV128I) và các tập mở rộng tiêu chuẩn (M, A, F, D, Q, C) cùng các mở rộng đang phát triển (L, B, J, T, P, V, N).
  • Bảng đặc tả chi tiết 37 lệnh RV32I, phân loại theo 6 cấu trúc định dạng lệnh (R, I, S, SB, U, UJ) với các trường bit opcode, rd, funct3, rs1, rs2, funct7, imm.
  • Phân tích nguyên lý hoạt động của các khối trong hệ thống xác minh: RTG, Testbench Controller, mô hình ISS (Golden Model), mô hình RTL, khối Comp-runner (xử lý sự lệch pha và va chạm do pipeline giữa ISS và RTL), và Coverage Monitor.

Chương 3: Thiết kế đề xuất

Chương 3 đi sâu vào kiến trúc chi tiết và các giải thuật được triển khai trong RISC-V RTG:

  • Trình bày kiến trúc phần mềm với đầu vào là tệp cấu hình và đầu ra là các tệp hợp ngữ .S, tệp mã máy nhị phân và tệp thống kê.
  • Chi tiết hóa thuật toán di truyền áp dụng cho việc phát sinh lệnh: cơ chế mã hóa cá thể lệnh, phép toán lai ghép và đột biến để sinh chuỗi lệnh thỏa mãn các ràng buộc phức tạp.
  • Cấu trúc tệp cấu hình mẫu và quy cách phân bổ trọng số cho 5 nhóm lệnh (Branch, Load, Store, ALU, Jump).
  • Thuật toán 8 bước của khối Assembler viết bằng Python, bao gồm chi tiết quy trình Pre-Encoding xử lý nhãn qua Hash Table và quy trình chuyển đổi sang mã nhị phân 32-bit.

Chương 4: Mô phỏng và đánh giá kết quả

Chương 4 trình bày quy trình thực thi kiểm thử 10 bước và phân tích các số liệu thu được:

  • Minh họa quá trình thực thi từ việc cấu hình sinh 100 testcase (mỗi testcase gồm 54 câu lệnh, có tối thiểu 1 Branch, 2 Load, 2 Store, 3 ALU, 1 Jump) đến việc tạo ra các tệp hợp ngữ (out_18.S) và tệp nhị phân tương ứng.
  • Đưa các testcase vào mô phỏng trên ISS để kiểm tra tính đúng đắn và đo lường các tiêu chí bao phủ.
  • Trình bày các biểu đồ thống kê: phạm vi phân bố số lượng lệnh theo nhóm, tần suất xuất hiện chi tiết của các lệnh ALU, số lần truy xuất trên từng thanh ghi từ x0 đến x31, và biểu đồ độ bao phủ tổng thể của RISC-V RTG.
  • Bảng đối sánh kết quả trực tiếp với các công trình của Chupilko (2018), Herdt (2020) và Trương Thị Giang (2020).

Chương 5: Kết luận và hướng phát triển

Chương cuối cùng đúc kết toàn bộ kết quả của khóa luận, khẳng định việc hoàn thành thiết kế bộ RISC-V RTG đạt độ bao phủ 100% trên các tiêu chí đặt ra cho tập lệnh RV32I, đồng thời vạch ra các hướng phát triển kỹ thuật cho tương lai.

Kết quả và đóng góp

Khóa luận đã hoàn thành việc xây dựng công cụ phát sinh chương trình kiểm tra ngẫu nhiên và trình biên dịch mã máy cho tập lệnh RV32I với các kết quả cụ thể:

  1. Kết quả định lượng và độ bao phủ:

    • Khởi tạo thành công các bộ testcase có cấu trúc hợp lệ, tránh rơi vào vòng lặp vô hạn và không phát sinh truy cập bộ nhớ ngoài vùng cho phép.
    • Đạt độ bao phủ 100% trên toàn bộ các tiêu chí xác minh được thiết lập:
      • Phủ toàn bộ 37/37 lệnh người dùng của RV32I và 6 định dạng lệnh.
      • Phủ toàn bộ 32 thanh ghi đa dụng (x0 - x31) ở cả vai trò nguồn và đích.
      • Bao phủ các trường hợp rẽ nhánh/nhảy cả chiều tiến và chiều lùi.
      • Bao phủ đầy đủ các giá trị số tức thời biên (0, âm, dương, cực đại, cực tiểu).
      • Kiểm tra thành công các thao tác truy xuất bộ nhớ mảng liên tiếp và truy xuất lặp trên một địa chỉ.
  2. So sánh với các nghiên cứu liên quan:

Tiêu chí / Công trình Chupilko et al. (2018) [MicroTESK] Herdt et al. (2020) [GRIFT] Trương Thị Giang (2020) [UIT] Khóa luận Trần Thị Lan Trinh (2021)
Phương pháp sinh testcase Mẫu thử đơn lệnh trên MicroTESK Formal Tools (GRIFT) Table-Based & Weighted Randomness Table-Based, Weighted & Genetic Algorithms
Số lượng lệnh RV32I kiểm tra Kiểm tra các lệnh đơn lẻ Phụ thuộc ràng buộc tập RV32I 36 / 37 lệnh 37 / 37 lệnh
Độ bao phủ (Coverage) Phủ theo đường dẫn đặc tả 67% - 86% (hạn chế ở lệnh nhảy/bộ nhớ) Đạt trên các tiêu chí cơ bản (thiếu 1 lệnh) 100% trên các tiêu chí đặt ra
Cơ chế trọng số & cấu hình Theo tham số macro Thiết lập ràng buộc hình thức Có tệp cấu hình trọng số Tệp cấu hình trọng số linh hoạt kết hợp GA
Công cụ chuyển mã Bộ sinh tích hợp Bộ sinh tích hợp Assembler Assembler 2 pha (Pre-encoding & Encoding)
  1. Đóng góp của tác giả:
    • Ứng dụng thành công thuật toán di truyền vào việc sinh chuỗi lệnh kiểm thử ngẫu nhiên cho vi xử lý, giải quyết được bài toán phân bổ xác suất xuất hiện của các lệnh khó và lệnh biên.
    • Xây dựng hoàn chỉnh chu trình từ cấu hình, sinh mã hợp ngữ, chuyển đổi nhị phân qua Assembler độc lập bằng Python đến tự động hóa đo độ bao phủ trên ISS.
    • Nâng cấp kết quả nghiên cứu trong nước từ mức 36 lệnh lên trọn vẹn 37 lệnh RV32I với độ bao phủ kiểm thử đạt 100%.

Hạn chế và hướng nghiên cứu tiếp theo

Dựa trên nội dung khóa luận, các hạn chế và hướng mở rộng được tác giả xác định như sau:

  • Hạn chế:
    • Đề tài mới dừng lại ở việc hỗ trợ tập lệnh số nguyên cơ sở 32-bit (RV32I) ở mức người dùng, chưa hỗ trợ các tập lệnh mở rộng tiêu chuẩn khác.
    • Chưa hỗ trợ các lệnh ở mức đặc quyền (Privileged/System instructions), hệ thống thanh ghi điều khiển và trạng thái (CSR), cũng như chưa kiểm tra cơ chế xử lý ngắt (Interrupts) và ngoại lệ (Exceptions).
    • Chưa kết nối trực tiếp bộ RTG vào môi trường mô phỏng RTL tự động (như UVM) để thực thi so sánh đồng bộ thời gian thực qua khối Comp-runner.
  • Hướng phát triển tiếp theo:
    • Mở rộng bộ RTG và Assembler để hỗ trợ kiến trúc 64-bit (RV64I) và các tập lệnh mở rộng tiêu chuẩn của RISC-V: nhân/chia số nguyên (RV32M), số thực dấu phẩy động độ chính xác đơn và kép (RV32F, RV32D), tập lệnh nén 16-bit (RV32C).
    • Tích hợp thêm các bộ phát hiện và xử lý ngắt, ngoại lệ và các lệnh hệ thống.
    • Hoàn thiện việc liên kết tự động giữa RTG, ISS và mô hình phần cứng RTL thông qua Testbench Controller và Comp-runner để tạo thành luồng xác minh vi mạch khép kín hoàn chỉnh.

Giá trị tham khảo

Khóa luận là tài liệu tham khảo chuyên ngành có giá trị đối với:

  • Sinh viên ngành Kỹ thuật Máy tính, Điện tử - Viễn thông và Công nghệ Thông tin: Cung cấp tài liệu hệ thống hóa rõ ràng về kiến trúc tập lệnh RV32I, định dạng mã máy và phương pháp luận xây dựng hệ thống xác minh phần cứng (Chương 2).
  • Người nghiên cứu và kỹ sư thiết kế - kiểm thử vi mạch (ASIC/FPGA Verification): Tham khảo phương pháp kết hợp thuật toán di truyền với cơ chế ngẫu nhiên có trọng số để giải quyết bài toán độ bao phủ trong kiểm thử vi xử lý (Chương 3).
  • Các đề tài phát triển trình biên dịch hoặc công cụ nhúng: Cung cấp thuật toán 2 giai đoạn (Pre-Encoding và Encoding) bằng Python để xây dựng một Assembler cho tập lệnh RISC-V từ đầu.

Câu hỏi thường gặp

1. Tại sao tác giả phải bổ sung Thuật toán di truyền (Genetic Algorithms) vào bộ phát sinh testcase?
Trả lời: Phương pháp sinh ngẫu nhiên theo bảng và trọng số thông thường gặp hạn chế về việc một số lệnh có xác suất xuất hiện rất thấp hoặc không xuất hiện trong testcase ngắn. Thuật toán di truyền coi mỗi lệnh là một cá thể nhị phân, thông qua quá trình lai ghép và đột biến để tạo ra quần thể lệnh mới, giúp đảm bảo xuất hiện đầy đủ các lệnh khó, lệnh biên và phủ kín 37/37 lệnh RV32I.

2. Tệp cấu hình (Configuration File) của RISC-V RTG điều khiển những tham số nào?
Trả lời: Tệp cấu hình điều khiển 2 nhóm thông số chính:

  • Số lượng: NumCommands (số lệnh trong mỗi testcase) và NumFile (tổng số testcase cần sinh).
  • Trọng số tối thiểu của 5 nhóm lệnh: Branch (rẽ nhánh), Load (nạp), Store (lưu), ALU (số học/luận lý), và Jump (nhảy).

3. Tiêu chí đạt 100% độ bao phủ trong khóa luận bao gồm những yếu tố nào?
Trả lời: Độ bao phủ 100% được xác lập trên 5 tiêu chí: đủ 37 lệnh RV32I và 6 định dạng lệnh; lệnh nhảy có cả nhảy tiến và nhảy lùi; số tức thời gồm 0, số âm, số dương, giá trị cực đại và cực tiểu; kiểm tra đầy đủ 32 thanh ghi đa dụng với các quan hệ toán hạng nguồn/đích khác nhau; và truy xuất bộ nhớ mảng liên tiếp cũng như đọc/ghi lặp lại trên cùng địa chỉ.

4. Trình biên dịch hợp ngữ (Assembler) trong đề tài được xây dựng như thế nào?
Trả lời: Assembler được viết bằng ngôn ngữ Python, hoạt động qua 2 giai đoạn chính gồm 8 bước: Giai đoạn Pre-Encoding loại bỏ dòng trống, bóc tách nhãn dán đưa vào bảng băm (Hash Table) để tạo tệp hợp ngữ mới không còn nhãn; và Giai đoạn Encoding đọc từng dòng lệnh, ánh xạ sang mã nhị phân 32-bit theo chuẩn RV32I để xuất ra tệp mã máy (.elf/binary).

Kết luận

Khóa luận tốt nghiệp của tác giả Trần Thị Lan Trinh đã giải quyết thành công bài toán tự động hóa kiểm thử chức năng cho kiến trúc tập lệnh RISC-V RV32I thông qua việc xây dựng bộ công cụ RISC-V RTG kết hợp thuật toán di truyền và trình biên dịch Assembler chuyên dụng. Công trình đạt độ bao phủ kiểm thử 100% trên toàn bộ các tiêu chí thiết lập và khắc phục được các hạn chế về độ bao phủ của những nghiên cứu trước đó. Kết quả nghiên cứu đóng góp một giải pháp thực tế và có giá trị tham khảo cao cho lĩnh vực thiết kế và xác minh vi mạch số dựa trên chuẩn mở RISC-V tại Việt Nam.