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

Kiến trúc tập lệnh RISC-V (Reduced Instruction Set Computer) được khởi xướng bởi Đại học California, Berkeley vào năm 2010 dưới dạng một tập lệnh mã nguồn mở (Open-source ISA). Khác với các kiến trúc độc quyền như ARM, Intel, IBM hay MIPS đòi hỏi chi phí bản quyền lớn, RISC-V cho phép mọi cá nhân và tổ chức tự do thiết kế, sản xuất và thương mại hóa các sản phẩm phần cứng cũng như phần mềm. Mô hình này giúp chuẩn hóa phần mềm trên các hệ thống vi xử lý (System on Chip - SoC), hỗ trợ việc tái sử dụng và tối ưu hóa chi phí sản xuất vi mạch. Tuy nhiên, quy trình thiết kế và xác minh vi xử lý mới đòi hỏi chi phí rất lớn về nhân lực chuyên môn cao và các công cụ mô phỏng, kiểm thử bản quyền. Trong khi cộng đồng quốc tế đã phát triển nhiều sản phẩm CPU RISC-V tiêu biểu (như Rocket/BOOM, ORCA, Sodor, Syntacore SCR1, PICORV32, Z-Scale, RISCY), tại Việt Nam vào thời điểm năm 2021, các nghiên cứu về RISC-V còn rất mới và chưa ghi nhận công trình nào xây dựng bộ phát sinh chương trình kiểm tra ngẫu nhiên cho thiết kế vi xử lý.

Đề tài "Bộ phát sinh chương trình kiểm tra ngẫu nhiên cho thiết kế RISC-V" do tác giả Trương Thị Giang thực hiện nhằm giải quyết các mục tiêu và nhiệm vụ nghiên cứu cụ thể:

  1. Tìm hiểu kiến trúc tập lệnh mở RISC-V và thiết kế bộ phát sinh chương trình kiểm tra ngẫu nhiên (RISC-V Random Test Generator - RISC-V RTG) đầu tiên tại Việt Nam.
  2. Thiết lập mục tiêu đạt 90% độ bao phủ (coverage) khi mô phỏng qua bộ mô phỏng tập lệnh (Instruction Set Simulator - ISS) theo 5 tiêu chí xác minh:
    • Tiêu chí lệnh: Kiểm tra đầy đủ 37 lệnh của tập lệnh cơ bản RV32I và 6 định dạng lệnh (R-type, I-type, S-type, SB-type, U-type, UJ-type).
    • Tiêu chí lệnh nhảy: Bảo đảm kiểm tra các nhánh nhảy tới, nhảy lùi, điều kiện có nhảy và không nhảy.
    • Tiêu chí số tức thời: Phát sinh đầy đủ số 0, số âm, số dương, giá trị lớn nhất và giá trị nhỏ nhất.
    • Tiêu chí thanh ghi đa dụng: Thực hiện ghi và đọc trên toàn bộ 32 thanh ghi (x0 đến x31); kiểm tra thanh ghi vừa làm toán hạng nguồn vừa làm toán hạng đích; với các lệnh số học và luận lý (ALU), kiểm tra trường hợp cả hai toán hạng nguồn và toán hạng đích là cùng một thanh ghi, hoặc cả hai toán hạng nguồn đều là thanh ghi x0.
    • Tiêu chí truy xuất bộ nhớ: Thực hiện truy xuất các địa chỉ bộ nhớ liên tiếp (mô phỏng truy xuất mảng) và đọc/ghi lặp lại nhiều lần trên cùng một địa chỉ.
  3. Tạo ra hai nhóm tệp thử nghiệm (testcases) dạng hợp ngữ: nhóm tệp chứa chuỗi lệnh có nghĩa để kiểm tra tính đúng đắn chức năng và nhóm tệp chứa chuỗi lệnh phụ thuộc vào trọng số của các nhóm lệnh nhằm phục vụ các kịch bản kiểm tra chuyên biệt.

Đối tượng nghiên cứu của khóa luận là kiến trúc tập lệnh số nguyên 32-bit RV32I và các phương pháp sinh kiểm tra ngẫu nhiên cho vi xử lý. Phạm vi nghiên cứu được thực hiện tại Khoa Kỹ thuật Máy tính, Trường Đại học Công nghệ Thông tin - Đại học Quốc gia TP. Hồ Chí Minh trong năm học 2020–2021, tập trung vào mô hình xác minh phần mềm độc lập phần cứng trước khi chuyển giao mã máy cho nhóm mô phỏng phần cứng RTL.

Cơ sở lý thuyết và phương pháp

Khóa luận xây dựng dựa trên đặc tả kiến trúc tập lệnh cơ sở RV32I của RISC-V. RV32I là kiến trúc số nguyên 32-bit sử dụng không gian địa chỉ 32-bit theo định dạng lưu trữ byte nhỏ trước (little endian), áp dụng kiến trúc Load-Store (chỉ có các lệnh nạp và lưu mới được truy xuất bộ nhớ, các thao tác tính toán thực hiện trên tập thanh ghi). Bộ xử lý gồm thanh ghi đếm chương trình (PC) và 32 thanh ghi đa dụng 32-bit (từ x0 đến x31, trong đó x0 luôn cố định giá trị 0). Toàn bộ 47 lệnh của RV32I được phân loại theo chức năng và opcode thành 9 nhóm (rẽ nhánh, nạp, lưu, số học và luận lý, hệ thống, đồng bộ, nhảy), cấu trúc thành 6 định dạng lệnh chính: R-type, I-type, S-type, SB-type, U-type và UJ-type.

Khung hệ thống xác minh chức năng bộ xử lý trong khóa luận bao gồm 5 khối chức năng phối hợp:

  • RISC-V RTG: Phần mềm phát sinh các kịch bản kiểm tra ngẫu nhiên dạng mã nguồn hợp ngữ.
  • Instruction Set Simulator (ISS): Bộ mô phỏng tập lệnh độc lập phần cứng đóng vai trò mô hình tham chiếu chuẩn (golden model) để tạo kết quả kỳ vọng.
  • RTL Simulation: Mô hình mô phỏng thiết kế phần cứng ở mức chuyển thanh ghi.
  • Comp-runner: Khối điều khiển so sánh trạng thái giữa ISS và mô hình RTL sau từng lệnh, xử lý các hiện tượng trễ pipeline và lệch nhịp thời gian giữa hai mô hình.
  • Coverage Monitor: Khối giám sát và thống kê độ bao phủ kiểm tra ngoại tuyến thông qua việc đếm tần suất xuất hiện của lệnh, thanh ghi, nhánh rẽ và truy xuất bộ nhớ.

Về phương pháp sinh ca kiểm thử, tác giả phân tích ba phương pháp truyền thống:

  1. Table Based Generators (dựa trên bảng): Tạo testcase nhanh, chi phí bảo trì thấp nhưng bị giới hạn trong các trường hợp phức tạp.
  2. Static Generators (bộ phát sinh tĩnh): Mở rộng số lượng testcase nhưng chưa kiểm soát toàn diện các ràng buộc phức tạp.
  3. Dynamic Generators (bộ phát sinh động): Tạo được testcase phức tạp nhưng chi phí xây dựng và bảo trì cao.

Từ đánh giá trên, khóa luận kết hợp phương pháp Table Based Generators với kỹ thuật ngẫu nhiên theo trọng số (Weighted Randomness). Phương pháp này gán mỗi nhóm lệnh với một trọng số xác suất xác định trong tệp cấu hình, cho phép người dùng định hướng mật độ phát sinh của từng nhóm lệnh cụ thể. Nguồn dữ liệu phục vụ nghiên cứu bao gồm tài liệu đặc tả kỹ thuật tập lệnh RISC-V RV32I ISA và các thông số thực nghiệm được thiết lập qua tệp cấu hình đầu vào.

Thiết kế và triển khai

Hệ thống được tổ chức thành hai thành phần chính: bộ phát sinh chương trình kiểm tra ngẫu nhiên (RISC-V RTG) và trình biên dịch hợp ngữ (Assembler). Luồng xử lý bắt đầu từ việc đọc tệp cấu hình (configuration.txt), sinh mã hợp ngữ (.S) kèm tệp báo cáo thống kê (.txt), sau đó chuyển đổi sang mã máy nhị phân (.elf) và đưa qua bộ mô phỏng ISS để đo độ bao phủ.

Bộ phát sinh RISC-V RTG được lập trình bằng ngôn ngữ C++ theo mô hình hướng đối tượng (OOP), tận dụng tính kế thừa và đa hình, phát triển trên môi trường Microsoft Visual Studio và đóng gói thành tệp thực thi RTG.exe. Chương trình sử dụng các cấu trúc dữ liệu và thư viện chuẩn của C++:

  • std::vector (<vector>): Quản lý danh sách các lệnh được tạo ra và tự động cấp phát bộ nhớ.
  • std::map (<map>): Lưu trữ ánh xạ cấu trúc liên kết giữa các cặp khóa và giá trị.
  • Con trỏ hàm (<iterator>): Điều hướng và gọi thực thi các hàm có cùng kiểu trả về và tham số.
  • Bộ sinh số ngẫu nhiên (<cstdlib>, <ctime>): Sử dụng hàm rand() và hàm khởi tạo mầm ngẫu nhiên srand() với biến số thay đổi theo thời gian; tạo giá trị ngẫu nhiên trong khoảng xác định theo công thức rand() % (max - min + 1) + min.
  • Xáo trộn lệnh (<algorithm>, <random>): Sử dụng hàm shuffle() để xáo trộn ngẫu nhiên danh sách các lệnh được sinh ra.
  • Xử lý luồng tệp (ifstream, ofstream): Đọc thông số cấu hình và ghi dữ liệu chương trình hợp ngữ, tệp báo cáo.
  • Đo thời gian (<time.h>): Sử dụng hàm clock() và kiểu clock_t để tính thời gian thực thi của chương trình.

Tệp cấu hình cho phép người dùng định nghĩa hai chế độ sinh testcase:

  • Tham số NumSequence: Xác định số lượng testcase dạng chuỗi lệnh có nghĩa dựa trên Table Based Generators. Khối thuật toán tự động ngăn chặn đệ quy, triệt tiêu các vòng lặp vô hạn do gọi hàm ngẫu nhiên và bảo đảm địa chỉ đích của lệnh rẽ nhánh luôn nằm trong phạm vi chương trình hợp lệ.
  • Tham số NumWeights: Xác định số lượng testcase phụ thuộc vào trọng số của 5 nhóm lệnh: rẽ nhánh (Branch), nạp (Load), lưu (Store), số học và luận lý (ALU), nhảy (Jump). Trọng số càng cao thì xác suất nhóm lệnh đó xuất hiện trong chương trình càng lớn.
Thành phần cấu hình Giá trị minh họa Mục đích kiểm thử
NumSequence 200 Tạo 200 kịch bản hợp ngữ có nghĩa kiểm tra chức năng logic
NumWeights 200 Tạo 200 kịch bản hợp ngữ dựa trên trọng số xác suất
Trọng số Branch 2 Phân bổ 2 lệnh rẽ nhánh trong chuỗi lệnh ngẫu nhiên
Trọng số Load 2 Phân bổ 2 lệnh nạp bộ nhớ trong chuỗi lệnh ngẫu nhiên
Trọng số Store 1 Phân bổ 1 lệnh lưu bộ nhớ trong chuỗi lệnh ngẫu nhiên
Trọng số ALU 4 Phân bổ 4 lệnh số học/luận lý trong chuỗi lệnh ngẫu nhiên
Trọng số Jump 1 Phân bổ 1 lệnh nhảy không điều kiện trong chuỗi lệnh

Trình biên dịch hợp ngữ Assembler được viết bằng ngôn ngữ Perl thông qua tệp kịch bản Assembler_RISC-V_CE.pl. Quy trình thực thi gồm 8 bước:

  1. Khởi tạo giá trị ban đầu.
  2. Đọc từng dòng của tệp chương trình hợp ngữ.
  3. Thực hiện giai đoạn tiền mã hóa (Pre-Encoding): kiểm tra dòng trống, đẩy các nhãn (labels) vào cấu trúc bảng băm (Hash table), loại bỏ các dòng chú thích và ghi nội dung chuẩn hóa sang tệp hợp ngữ mới (New Assembly).
  4. Kiểm tra điều kiện hoàn tất tệp mới; nếu chưa hoàn tất thì quay lại bước 2.
  5. Đọc từng dòng lệnh trong tệp hợp ngữ mới.
  6. Chuyển đổi mã hợp ngữ thành chuỗi mã máy nhị phân 32-bit.
  7. Kiểm tra kết thúc dòng; nếu chưa hoàn tất thì quay lại bước 5.
  8. Kết thúc chương trình và xuất tệp mã máy (.elf).

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

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

Chương này phân tích động lực phát triển của kiến trúc tập lệnh mở RISC-V trên thế giới và khó khăn về kinh phí kiểm định vi mạch độc lập. Tác giả khảo cứu các dòng CPU RISC-V tiêu biểu cũng như hai công trình quốc tế về xác minh RISC-V: nghiên cứu của Chupilko và cộng sự (2018) trên nền tảng MicroTESK (sinh testcase kiểm tra toán hạng ngẫu nhiên, giá trị biên, đường dẫn thực thi) và nghiên cứu của Herdt và cộng sự (2020) sử dụng công cụ GRIFT (tạo 8.900 testcases trong 392 giây, đạt độ bao phủ từ 67% đến 86% trên RV32I nhưng bị hạn chế ở nhóm lệnh nhảy, rẽ nhánh và bộ nhớ). Tác giả chỉ ra khoảng trống nghiên cứu tại Việt Nam và xác định mục tiêu đạt độ bao phủ 90% cho 37 lệnh RV32I.

Chương 2. Sơ lược về kiến trúc tập lệnh RISC-V

Chương 2 trình bày cơ sở lý thuyết về kiến trúc tập lệnh cơ sở RV32I và các phần mở rộng tiêu chuẩn (M, A, F, D, Q, C). Tác giả tổng hợp cấu trúc 6 định dạng lệnh (R, I, S, SB, U, UJ), các trường toán hạng bit (opcode, rd, funct3, rs1, rs2, funct7, immediate) và lập bảng chi tiết về chức năng, cú pháp của các nhóm lệnh: rẽ nhánh (BEQ, BNE, BLT, BGE, BLTU, BGEU), nạp (LB, LH, LW, LBU, LHU, LUI), lưu (SB, SH, SW), số học và luận lý (ADDI, SLTI, SLTIU, XORI, ORI, ANDI, SLLI, SRLI, SRAI, ADD, SUB, SLL, SLT, SLTU, XOR, SRL, SRA, OR, AND, AUIPC) và nhóm lệnh nhảy (JAL, JALR). Đồng thời, chương này mô tả nguyên lý vận hành của hệ thống xác minh chức năng gồm ISS, RTL Simulation, Comp-runner và Coverage Monitor.

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

Chương 3 chi tiết hóa cấu trúc hệ thống RISC-V RTG và Assembler. Tác giả mô tả giải thuật sinh testcase kết hợp Table Based và Weighted Randomness, mô hình tệp cấu hình và cấu trúc dữ liệu C++ sử dụng trong RTG.exe. Chương này giải thích định dạng tệp báo cáo thống kê (Reports), ghi nhận chi tiết tần suất sử dụng của từng lệnh (Num_inst was used) và từng thanh ghi (Num_reg was used) cho mỗi testcase. Đồng thời, tác giả mô tả chi tiết giải thuật 8 bước của Assembler viết bằng Perl và sơ đồ giải thuật Pre-Encoding sử dụng bảng băm để phân giải nhãn địa chỉ.

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

Chương 4 thiết lập quy trình mô phỏng 7 bước sử dụng lệnh ./RTG.exe, nạp testcases vào ISS và đối chiếu với tiêu chí độ bao phủ. Tác giả trình bày các biểu đồ thống kê định lượng về phạm vi phân bố số lượng lệnh được tạo ra, phân bố chi tiết nhóm lệnh ALU, biểu đồ xác minh tính ngẫu nhiên, biểu đồ tần suất sử dụng 32 thanh ghi (x0 đến x31) qua ba tệp testcase thực nghiệm, sơ đồ thuật toán đo độ bao phủ theo tiêu chí InstNum và biểu đồ độ bao phủ tổng thể của RISC-V RTG. Cuối chương, kết quả nghiên cứu được đối chiếu với hai công trình của Chupilko và Herdt.

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

Chương 5 tổng kết các kết quả đạt được của khóa luận: hoàn thành công cụ sinh testcase ngẫu nhiên bằng C++, hoàn thành trình biên dịch hợp ngữ bằng Perl, xuất tệp báo cáo định lượng và đạt chỉ tiêu độ bao phủ 90% theo các tiêu chí thiết kế. Chương kết thúc bằng việc đề xuất sơ đồ hệ thống mở rộng hỗ trợ các tập lệnh mở rộng và tích hợp kiểm thử phần cứng sâu hơn trong tương lai.

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

Khóa luận đã thiết kế và hiện thực thành công công cụ RISC-V RTG và trình biên dịch Assembler, đáp ứng đầy đủ các tiêu chí xác minh chức năng cho kiến trúc tập lệnh RV32I. Kết quả thực nghiệm ghi nhận:

  • Hệ thống phát sinh thành công 400 testcases trong kịch bản thử nghiệm chuẩn (gồm 200 chương trình hợp ngữ có nghĩa và 200 chương trình hợp ngữ theo trọng số phân bổ 5 nhóm lệnh).
  • Kiểm tra toàn diện 37 lệnh cơ bản của RV32I ISA thuộc 6 định dạng lệnh (R-type, I-type, S-type, SB-type, U-type, UJ-type).
  • Tệp báo cáo thống kê phản ánh chính xác tần suất thực thi của các lệnh và thanh ghi. Ví dụ trong mẫu báo cáo thực nghiệm: thanh ghi x0 được sử dụng 41 lần, x11 được sử dụng 8 lần, x3 được sử dụng 7 lần; lệnh lưu nửa từ SH xuất hiện 11 lần, lệnh nạp byte LB xuất hiện 6 lần, lệnh rẽ nhánh BEQ xuất hiện 4 lần.
  • Đạt chỉ tiêu độ bao phủ 90% trên mô hình mô phỏng ISS theo đầy đủ 5 tiêu chí: bao phủ tập lệnh, bao phủ nhánh nhảy hai chiều, bao phủ miền giá trị số tức thời biên, bao phủ thao tác đọc/ghi 32 thanh ghi đa dụng và bao phủ truy xuất bộ nhớ lặp/mảng.
Tiêu chí so sánh Công trình Chupilko và cs. (2018) Công trình Herdt và cs. (2020) Công trình của khóa luận (2021)
Nền tảng công cụ MicroTESK GRIFT RISC-V RTG (C++) và Assembler (Perl)
Tập lệnh mục tiêu RISC-V ISA RV32I ISA RV32I ISA (37 lệnh cơ bản)
Cơ chế sinh kiểm tra Toán hạng ngẫu nhiên, giá trị biên, đường dẫn thực thi 8.900 testcases ngẫu nhiên thỏa mãn ràng buộc biên Kết hợp Table Based Generators và Weighted Randomness
Khả năng tùy biến Cố định theo kịch bản mẫu kiểm thử Ràng buộc cục bộ bước nhảy và bộ nhớ Tùy biến trọng số 5 nhóm lệnh và chuỗi lệnh có nghĩa
Độ bao phủ đạt được Bao phủ các định dạng lệnh ngắn Đạt từ 67% đến 86% (hạn chế ở jump, branch, load/store) Đạt chỉ tiêu 90% trên các tiêu chí (lệnh, thanh ghi, tức thời, nhảy, bộ nhớ)

Đóng góp của khóa luận thể hiện ở việc đề xuất giải pháp kỹ thuật dung hòa giữa phương pháp dựa trên bảng (giúp kiểm soát luồng điều khiển, tránh đệ quy và triệt tiêu vòng lặp vô hạn) và phương pháp ngẫu nhiên theo trọng số (cho phép người kiểm thử tập trung vào các nhóm lệnh trọng điểm). Đây là công trình đầu tiên tại Việt Nam công bố thiết kế hoàn chỉnh của một bộ phát sinh chương trình kiểm tra ngẫu nhiên cho vi xử lý RISC-V.

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

Khóa luận tồn tại một số hạn chế gắn liền với phạm vi nghiên cứu được công bố trong văn bản:

  • Phạm vi kiểm tra mới dừng lại ở tập lệnh số nguyên 32-bit cơ bản RV32I; chưa hỗ trợ các tập lệnh cơ sở khác (RV32E, RV64I, RV128I) cũng như các tập lệnh mở rộng tiêu chuẩn (M, A, F, D, C).
  • Quy trình kiểm thử tập trung chủ yếu vào môi trường mô phỏng phần mềm thông qua bộ mô phỏng tập lệnh ISS; các bước kết nối với mô hình RTL Simulation và khối Comp-runner để xử lý hiện tượng lệch nhịp pipeline phần cứng chưa được triển khai hoàn chỉnh trong thực nghiệm.
  • Việc thiết lập trọng số phân phối xác suất cho các nhóm lệnh vẫn phụ thuộc vào cấu hình thủ công của người sử dụng trong tệp configuration.txt.

Hướng nghiên cứu tiếp theo được tác giả đề xuất tại Chương 5 bao gồm:

  • Mở rộng kiến trúc RISC-V RTG để hỗ trợ các tập lệnh mở rộng tiêu chuẩn của RISC-V như tập nhân/chia số nguyên (M), tập tính toán số thực dấu chấm động (F, D) và tập lệnh nén 16-bit (C).
  • Hoàn thiện việc kết nối và đồng bộ hóa với khối Comp-runner trên mô hình mô phỏng RTL thực tế nhằm xác minh toàn diện thiết kế vi mạch.
  • Tự động hóa cơ chế phản hồi độ bao phủ từ Coverage Monitor để điều chỉnh trọng số sinh mã ngẫu nhiên theo thời gian thực.

Giá trị tham khảo

Khóa luận là tài liệu tham khảo hữu ích cho sinh viên, học viên cao học và nghiên cứu sinh thuộc các ngành Kỹ thuật Máy tính, Điện tử - Viễn thông, Công nghệ Thông tin đang nghiên cứu về kiến trúc máy tính, thiết kế vi mạch tích hợp (ASIC/FPGA) và xác minh phần cứng.

Nội dung khóa luận cung cấp giá trị tham khảo cụ thể ở các phần:

  • Bảng tổng hợp chi tiết chức năng, định dạng và cú pháp của 37 lệnh RV32I tại Chương 2, hỗ trợ cho việc tra cứu thiết kế kiến trúc vi xử lý.
  • Mô hình kiến trúc hệ thống xác minh chức năng vi mạch phối hợp giữa RTG, ISS, RTL Simulation, Comp-runner và Coverage Monitor.
  • Thuật toán C++ kết hợp Table-based và Weighted Randomness giúp xây dựng công cụ sinh mã kiểm thử an toàn, loại bỏ nguy cơ treo máy do vòng lặp vô hạn.
  • Cấu trúc giải thuật Pre-Encoding trong tệp Perl của trình biên dịch Assembler, minh họa phương pháp phân giải nhãn hợp ngữ bằng bảng băm.

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

1. Khóa luận hỗ trợ kiểm tra bao nhiêu lệnh trong tập kiến trúc RV32I và gồm những định dạng nào?
Khóa luận hỗ trợ kiểm tra đầy đủ 37 lệnh của RV32I ISA, bao gồm các nhóm lệnh rẽ nhánh (BEQ, BNE, BLT, BGE, BLTU, BGEU), nạp (LB, LH, LW, LBU, LHU, LUI), lưu (SB, SH, SW), số học và luận lý (ADDI, SLTI, SLTIU, XORI, ORI, ANDI, SLLI, SRLI, SRAI, ADD, SUB, SLL, SLT, SLTU, XOR, SRL, SRA, OR, AND, AUIPC) và nhảy (JAL, JALR). Toàn bộ 37 lệnh này phân bổ trên 6 định dạng lệnh: R-type, I-type, S-type, SB-type, U-type và UJ-type.

2. Hai tham số NumSequence và NumWeights trong tệp cấu hình tạo ra các tệp kiểm tra khác nhau như thế nào?
Tham số NumSequence tạo ra các tệp thử nghiệm là những chuỗi lệnh hợp ngữ có nghĩa dựa trên phương pháp Table Based Generators, có cấu trúc hàm chính và hàm phụ ngẫu nhiên nhưng được kiểm soát để tránh đệ quy, không tạo vòng lặp vô hạn và bảo đảm địa chỉ rẽ nhánh luôn hợp lệ. Ngược lại, tham số NumWeights tạo ra các chuỗi lệnh phụ thuộc vào trọng số xác suất của 5 nhóm lệnh (Branch, Load, Store, ALU, Jump) do người dùng quy định, cho phép phát sinh nhiều lệnh ở nhóm có trọng số cao hoặc không phát sinh lệnh ở nhóm có trọng số bằng 0.

3. Tệp báo cáo (Reports) do RISC-V RTG xuất ra chứa những thông tin định lượng gì?
Tệp báo cáo đi kèm mỗi testcase cung cấp bảng thống kê chi tiết hai thông số: số lần xuất hiện của từng lệnh cụ thể (Num_inst was used) trong toàn bộ 37 lệnh, và số lần truy xuất của từng thanh ghi (Num_reg was used) trên toàn bộ 32 thanh ghi từ x0 đến x31. Dữ liệu này giúp người kiểm thử đánh giá tính ngẫu nhiên và kiểm tra xem chuỗi lệnh có tuân thủ đúng tỷ lệ trọng số đã cấu hình hay không.

4. Giai đoạn Pre-Encoding trong trình biên dịch hợp ngữ Assembler thực hiện nhiệm vụ gì?
Trong giai đoạn Pre-Encoding, trình biên dịch đọc từng dòng của tệp hợp ngữ gốc, kiểm tra dòng trống, đẩy các nhãn (labels) vào bảng băm (Hash table) để xác định địa chỉ, đồng thời loại bỏ toàn bộ các dòng chú thích và nhãn dán. Kết quả của giai đoạn này là một tệp hợp ngữ trung gian chuẩn hóa (New Assembly), làm cơ sở để chương trình dịch chính xác từng dòng lệnh sang chuỗi mã máy nhị phân 32-bit.

5. Kết quả độ bao phủ của nghiên cứu này có điểm gì nổi bật khi so sánh với nghiên cứu của Herdt và cộng sự (2020)?
Nghiên cứu của Herdt và cộng sự sử dụng công cụ GRIFT bị hạn chế về độ bao phủ (chỉ đạt từ 67% đến 86%) do gặp khó khăn tại các lệnh nhảy, rẽ nhánh và truy xuất bộ nhớ load/store khi áp dụng các ràng buộc tránh vòng lặp. Trong khi đó, RISC-V RTG khắc phục được nhược điểm này bằng cách kết hợp cơ chế Table-based có kiểm soát nhánh và cơ chế Weighted Randomness, giúp đạt chỉ tiêu độ bao phủ 90% trên toàn bộ các tiêu chí lệnh, thanh ghi, số tức thời, lệnh nhảy và bộ nhớ.

Kết luận

Khóa luận tốt nghiệp của tác giả Trương Thị Giang đã nghiên cứu và hiện thực thành công bộ phát sinh chương trình kiểm tra ngẫu nhiên (RISC-V RTG) cùng trình biên dịch hợp ngữ (Assembler) cho kiến trúc tập lệnh RV32I. Bằng việc kết hợp phương pháp sinh mã dựa trên bảng và kỹ thuật ngẫu nhiên theo trọng số, công cụ cho phép tạo ra cả chuỗi lệnh có nghĩa lẫn chuỗi lệnh phân bổ theo xác suất người dùng yêu cầu. Kết quả mô phỏng trên bộ mô phỏng tập lệnh ISS xác nhận hệ thống đạt chỉ tiêu độ bao phủ 90% trên 37 lệnh cơ bản và 32 thanh ghi đa dụng. Công trình đóng góp giải pháp kỹ thuật thiết thực cho lĩnh vực thiết kế và xác minh vi xử lý RISC-V tại Việt Nam.