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

Trong lĩnh vực thiết kế vi mạch và kiến trúc máy tính, RISC-V là kiến trúc tập lệnh mã nguồn mở (open-source ISA) ra đời từ năm 2010, cho phép các nhà phát triển tùy biến và tối ưu hóa phần cứng theo nhu cầu cụ thể. Tuy nhiên, giai đoạn xác minh chức năng (functional verification) của lõi vi xử lý RISC-V đối mặt với nhiều rào cản kỹ thuật. Quá trình kiểm tra thiết kế đòi hỏi sự kết hợp phức tạp giữa các môi trường mô phỏng phần mềm và phần cứng, dẫn đến sự thiếu đồng bộ và tăng nguy cơ phát sinh sai sót.

Các giải pháp công cụ kiểm chứng quốc tế hiện nay như Rocket Chip Generator hay RISC-V Verification Suite tuy hỗ trợ nhiều cấu hình nhưng có cấu trúc phức tạp, đòi hỏi chuyên môn cao để thiết lập môi trường và thiếu giao diện trực quan cho người sử dụng. Trước thực trạng đó, khóa luận tập trung nghiên cứu và xây dựng một hệ thống đánh giá kiểm tra tích hợp mang tên "RISC-V Co-Simulation Test Suite" (RVCoTS) nhằm tự động hóa quy trình xác minh chức năng cho các thiết kế vi xử lý dựa trên tập lệnh RISC-V RV32I.

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 kiến trúc tập lệnh RISC-V RV32I, đảm bảo khả năng mô phỏng và kiểm tra 37 lệnh cơ bản thuộc 6 định dạng lệnh (R, I, S, SB, U, UJ).
  2. Thiết kế và phát triển bộ mô phỏng tập lệnh độc lập phần cứng (Instruction Set Simulator - ISS) bằng ngôn ngữ Python, đóng vai trò mô hình tham chiếu chuẩn (golden model).
  3. Xây dựng môi trường mô phỏng phần cứng (RTL Simulation) cho mã nguồn Verilog thông qua thư viện cocotb trên nền tảng Python.
  4. Phát triển khối Comp-Runner và Coverage Monitor nhằm tự động hóa quy trình so sánh kết quả giữa ISS và RTL Simulation, đồng thời đo lường độ bao phủ chức năng (functional coverage) theo tệp cấu hình của người dùng.
  5. Thực hiện kiểm tra chéo (cross-check) kết quả mô phỏng với các công cụ tiêu chuẩn gồm phần mềm Vivado và trình mô phỏng RISC-V Interpreter để xác minh độ tin cậy của hệ thống.

Đối tượng và phạm vi nghiên cứu:

  • Đối tượng nghiên cứu: Quy trình xác minh chức năng vi xử lý, kiến trúc tập lệnh RISC-V RV32I và mô hình phần cứng RTL của vi xử lý RISC-V Core.
  • Phạm vi nghiên cứu: Tập lệnh số nguyên 32-bit RV32I; môi trường thực thi trên hệ điều hành Ubuntu, sử dụng công cụ Visual Studio, ngôn ngữ Python, thư viện Cocotb và ngôn ngữ mô tả phần cứng Verilog HDL.

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

Khóa luận xây dựng trên nền tảng lý thuyết về kiến trúc tập lệnh RISC-V RV32I và phương pháp đồng mô phỏng (co-simulation) trong kiểm chứng vi mạch.

1. Khung lý thuyết kiến trúc RISC-V RV32I

Kiến trúc RV32I là tập lệnh số nguyên 32-bit cơ bản, gồm 32 thanh ghi đa năng 32-bit (từ x0 đến x31, trong đó x0 luôn giữ giá trị 0) và một thanh ghi đếm chương trình (Program Counter - PC). 37 lệnh cơ bản được nhóm theo 6 định dạng chuẩn:

Định dạng Nhóm chức năng Danh sách lệnh trong phạm vi nghiên cứu
R-type Số học và logic giữa 3 thanh ghi ADD, SUB, SLL, SLT, SLTU, XOR, SRL, SRA, OR, AND
I-type Số học với giá trị tức thời, nạp dữ liệu ADDI, SLTI, SLTIU, XORI, ORI, ANDI, SLLI, SRLI, SRAI, LB, LH, LW, LBU, LHU, JALR
S-type Lưu dữ liệu vào bộ nhớ SB, SH, SW
SB-type Rẽ nhánh có điều kiện BEQ, BNE, BLT, BGE, BLTU, BGEU
U-type Thao tác 20-bit tức thời bậc cao LUI, AUIPC
UJ-type Nhảy vô điều kiện JAL

2. Phương pháp nghiên cứu và phát triển

Tác giả áp dụng quy trình kỹ thuật 5 bước:

  1. Phân tích yêu cầu: Xác định chức năng của từng khối trong hệ thống đồng mô phỏng và các tiêu chí bao phủ cần đo lường.
  2. Thiết kế hệ thống: Xây dựng kiến trúc phân tầng kết nối giữa trình dịch hợp ngữ, bộ mô phỏng ISS, bộ mô phỏng RTL và mô-đun so sánh.
  3. Hiện thực hóa (Lập trình): Viết mã nguồn Python cho bộ Assembler, ISS, Testbench Controller, Comp-Runner, Coverage Monitor và tích hợp cocotb điều khiển mô hình RTL Verilog.
  4. Kiểm tra độc lập: Kiểm thử riêng biệt từng khối chức năng để bảo đảm tính toàn vẹn dữ liệu trước khi tích hợp.
  5. Triển khai và Đánh giá: Chạy quy trình đồng mô phỏng tự động, trích xuất dữ liệu trạng thái (thanh ghi, bộ nhớ, luồng lệnh) và kiểm tra chéo với Vivado và RISC-V Interpreter.

Thiết kế và triển khai

Hệ thống RVCoTS được thiết kế dạng mô-đun hóa, gồm 6 thành phần chính phối hợp trong quy trình kiểm chứng khép kín:

            [Khối ISS (Python)]                             [Khối RTL (Cocotb/Verilog)]
                                      [Coverage Monitor]

1. Trình biên dịch hợp ngữ (Assembler)

Khối Assembler nhận mã nguồn hợp ngữ (.s) và biên dịch thành mã máy nhị phân 32-bit (.txt) thông qua 7 bước xử lý:

  • Bước 1: Khởi động trình biên dịch.
  • Bước 2: Đọc tệp hợp ngữ từ thư mục đầu vào.
  • Bước 3: Tiền xử lý, lọc bỏ các dòng chú thích (comments) và khoảng trắng.
  • Bước 4: Phân tích cú pháp nhãn dán (labels) và lưu trữ bảng địa chỉ phân nhánh.
  • Bước 5: Mã hóa các câu lệnh hợp ngữ thành định dạng nhị phân 32-bit theo đúng opcode, funct3, funct7 và trường immediate của RV32I.
  • Bước 6: Kiểm tra điều kiện kết thúc tệp đầu vào để lặp lại hoặc kết thúc.
  • Bước 7: Xuất tệp nhị phân hoàn chỉnh.

2. Tệp cấu hình đánh giá (Configuration File)

Hệ thống cho phép người dùng định nghĩa các tiêu chí kiểm tra và độ bao phủ mục tiêu:

STT Tiêu chí trong tệp cấu hình Ý nghĩa chức năng
1 Instnum(37) Số lượng các loại lệnh phân biệt cần kích hoạt
2 .ImmNum(50) Số lượng giá trị tức thời (immediate) khác nhau được sử dụng
3 InsTime(100) Tổng số lần một lệnh mục tiêu được thực thi
4 InsObj(ADDI) Tên lệnh mục tiêu cần kiểm tra tần suất
5 .RegNum(32) Tổng số thanh ghi được sử dụng trong quá trình chạy
6 .RegDest(32) Số lượng thanh ghi đích ($r_d$) được ghi giá trị
7 .RegSrc(32) Số lượng thanh ghi nguồn ($r_{s1}, r_{s2}$) được đọc
8 JumpForwardTime(20) Số lần thực hiện bước nhảy tới phía trước
9 JumpBackwardTime(20) Số lần thực hiện bước nhảy lùi về phía sau
10 .BranchForward(1) Số lần rẽ nhánh tiến
11 .BranchBack(1) Số lần rẽ nhánh lùi
12 .MemSeq(5) Số lần truy xuất liên tiếp vào cùng địa chỉ bộ nhớ

3. Bộ mô phỏng tập lệnh ISS và Bộ mô phỏng RTL

  • Khối ISS: Thực thi mã máy nhị phân tuần tự ở chế độ Run Program, cập nhật trạng thái của 32 thanh ghi và không gian bộ nhớ mô phỏng, xuất ra tệp nhật ký trạng thái chuẩn.
  • Khối RTL Simulation: Sử dụng Python kết hợp thư viện cocotb để nạp mã máy vào khối bộ nhớ lệnh (Instruction_Memory.v), điều khiển xung clock, reset và giám sát tín hiệu đầu ra của thiết kế phần cứng Verilog, đồng thời xuất giản đồ dạng sóng (waveform).

4. Khối so sánh Comp-Runner và Coverage Monitor

  • Comp-Runner: Nhận dữ liệu thực thi từ cả hai môi trường ISS và RTL, tiến hành đối soát từng dòng lệnh đã chạy, kiểm tra tính đồng nhất của từng ô nhớ và từng thanh ghi từ x0 đến x31.
  • Coverage Monitor: Tính toán tỷ lệ phần trăm đạt được so với các tiêu chí trong tệp cấu hình, đồng thời kích hoạt cửa sổ giao diện thông báo kết quả tổng kết (Pass/Error và Execution Time).

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 tổng quan về sự phát triển của kiến trúc RISC-V trên thế giới và tại Việt Nam, nêu bật các sản phẩm thương mại tiêu biểu như Freedom U540 (SiFive), ESP32-C3 (Espressif Systems), SweRV Core EH1 (Western Digital). Tác giả chỉ ra hạn chế của các bộ công cụ kiểm thử quốc tế hiện hành (Rocket Chip Generator, RISC-V Verification Suite) về độ phức tạp và khả năng tiếp cận. Từ đó, chương xác lập mục tiêu nghiên cứu, phạm vi hỗ trợ 37 lệnh RV32I và quy trình thực hiện 5 bước của khóa luận.

Chương 2: Tổng hợp lý thuyết

Chương 2 trình bày chi tiết về cấu trúc kiến trúc tập lệnh RISC-V, phân tích 9 nhóm opcode và 6 định dạng câu lệnh chuẩn của RV32I. Tác giả tổng hợp đặc tả chức năng, công thức tính toán địa chỉ, bit dấu và tác vụ của từng câu lệnh trong các nhóm rẽ nhánh, nạp, lưu, số học, logic và nhảy. Đồng thời, chương giới thiệu nguyên lý của 5 thành phần trong hệ thống xác minh vi xử lý: Random Testcase Generator (RTG), Testbench Controller, ISS (Golden Model), RTL Simulation và Comp-Runner.

Chương 3: Tổng quan thiết kế hệ thống

Chương 3 mô tả kiến trúc kỹ thuật chi tiết của hệ thống RVCoTS. Nội dung tập trung vào sơ đồ luồng dữ liệu giữa Assembler, ISS Simulation, RTL Simulation và Comp-Runner. Tác giả trình bày thuật toán 7 bước của trình biên dịch hợp ngữ, cấu trúc tệp cấu hình tham số đánh giá độ bao phủ, cách thức nạp mã nhị phân vào tệp Instruction_Memory.v trong mô phỏng phần cứng và cơ chế thu thập dữ liệu nhật ký thực thi từ hai mô hình.

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

Chương 4 thuyết minh quy trình đồng mô phỏng 12 bước tích hợp và thực nghiệm trên chương trình hợp ngữ mẫu chứa đầy đủ các cấu trúc lệnh rẽ nhánh (BEQ), nhảy (JAL), tính toán (ADDI, SUB, OR, AND) và nạp địa chỉ (AUIPC). Kết quả mô phỏng cho thấy hệ thống ghi nhận chính xác trạng thái của từng thanh ghi và ô nhớ. Tác giả thực hiện kiểm tra chéo với công cụ Xilinx Vivado và phần mềm RISC-V Interpreter, chứng minh tính đồng nhất dữ liệu và hiệu quả đo lường độ bao phủ đạt 100% tiêu chí đề ra.

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

Chương cuối đúc kết các kết quả đạt được của hệ thống RVCoTS trong việc tự động hóa đánh giá thiết kế lõi RV32I, đồng thời chỉ rõ các điểm cần cải tiến về khả năng mở rộng tập lệnh và xử lý các hiện tượng bất đồng bộ do đường ống (pipeline) phần cứng.


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

1. Kết quả thực nghiệm cụ thể

Hệ thống RVCoTS đã hoàn thành việc mô phỏng, đánh giá và kiểm tra chéo với các số liệu ghi nhận trực tiếp từ thực nghiệm:

  • Khả năng thực thi lệnh: Hỗ trợ đầy đủ 37 câu lệnh cơ bản của tập lệnh RV32I.
  • Kết quả kiểm tra bộ mẫu thử (Testcases): Thực hiện kiểm chứng 3 tệp testcase đầu vào, đạt kết quả tuyệt đối:
    • Số lượng TestCase: 3
    • Số lượng đạt (Pass): 3/3
    • Số lượng lỗi (Error): 0/3
    • Đánh giá thiết kế: Correct (Thiết kế phần cứng chính xác)
  • Kết quả đo lường độ bao phủ (Functional Coverage): Đạt 10/10 tiêu chí đánh giá trong tệp cấu hình (Pass: 10/10, Error: 0/10, tỷ lệ 100%):
    • Số lượng câu lệnh kích hoạt: 37/37 (100.0%)
    • Tần suất lệnh mục tiêu (ADDI): 120/20 (100.0%)
    • Giá trị tức thời (Immediate): 37/37 (100.0%)
    • Số lượng thanh ghi sử dụng: 65/32 (100.0%)
    • Thanh ghi đích ($r_d$): 32/32 (100.0%)
    • Thanh ghi nguồn ($r_s$): 59/32 (100.0%)
    • Nhảy tiến (Jump Forward): 5/5 (100.0%)
    • Nhảy lùi (Jump Backward): 8/5 (100.0%)
    • Rẽ nhánh tiến (Branch Forward): 5/5 (100.0%)
    • Rẽ nhánh lùi (Branch Backward): 19/5 (100.0%)
  • Thời gian thực thi mô phỏng RTL (Execution Time):
    • Testcase 0 (binary_out_0): 0.177395 giây
    • Testcase 1 (binary_out_1): 0.216778 giây
    • Testcase 2 (binary_out_2): 0.110034 giây
  • Kiểm tra chéo (Cross-verification): Kết quả xuất ra từ hệ thống khớp hoàn toàn với kết quả mô phỏng dạng sóng/thanh ghi trên phần mềm Vivado và trình thông dịch RISC-V Interpreter.

2. So sánh với các công cụ nghiên cứu liên quan

Tiêu chí so sánh Rocket Chip Generator RISC-V Verification Suite RVCoTS (Khóa luận này)
Mục đích chính Thiết kế và sinh mã CPU RISC-V Kiểm tra trình biên dịch và mô phỏng Đánh giá, xác minh thiết kế RTL RISC-V Core
Môi trường điều khiển Chisel / Scala / C++ C / Shell scripts Python / Thư viện Cocotb
Độ phức tạp cài đặt Cao, cấu hình môi trường phức tạp Cao, yêu cầu chuyên môn sâu Thấp, cấu hình tinh gọn trên nền Python
Giao diện báo cáo Không có giao diện trực quan Không có giao diện trực quan Cửa sổ Coverage Monitor hiển thị kết quả
Mô hình tham chiếu Bộ mô phỏng C++ tích hợp Spike / Trình mô phỏng ngoài ISS độc lập viết bằng Python
Kiểm tra thiết kế Verilog Có Hạn chế Trực tiếp thông qua Cocotb RTL Simulation

3. Đóng góp của đề tài

  • Xây dựng một quy trình đồng mô phỏng tự động khép kín giữa phần mềm mô phỏng ISS và mô hình phần cứng RTL Verilog thông qua thư viện cocotb.
  • Cung cấp cơ chế đánh giá độ bao phủ chức năng linh hoạt, cho phép người dùng tùy biến các tiêu chí kiểm tra thông qua tệp cấu hình độc lập.
  • Đơn giản hóa quy trình xác minh thiết kế vi xử lý RISC-V RV32I, phục vụ hiệu quả cho công tác nghiên cứu và thực hành thiết kế vi mạch.

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

1. Hạn chế

  • Hệ thống hiện tại chỉ mới tập trung hỗ trợ tập lệnh số nguyên cơ bản 32-bit (RV32I), chưa tích hợp các tập lệnh mở rộng chuẩn của RISC-V.
  • Mô hình ISS hoạt động theo nguyên lý mô phỏng tuần tự từng lệnh, do đó chưa mô hình hóa đầy đủ các xung đột dữ liệu (data hazard), xung đột điều khiển (control hazard) và hiệu ứng đường ống (pipeline effects) phức tạp vốn có trong mô hình RTL phần cứng.

2. Hướng nghiên cứu tiếp

  • Mở rộng hỗ trợ kiến trúc 64-bit (RV64I) và các tập lệnh mở rộng tiêu chuẩn như M (nhân/chia số nguyên), A (toán tử nguyên tử), F/D (số thực dấu phẩy động) và C (lệnh nén).
  • Nâng cấp bộ mô phỏng ISS để hỗ trợ mô hình hóa chu kỳ chính xác (cycle-accurate simulation) và các trạng thái pipeline.
  • Hoàn thiện giao diện người dùng đồ họa (GUI) toàn diện và tích hợp thêm các chuẩn kết nối công nghiệp phục vụ quy trình thiết kế vi mạch chuyên sâu.

Giá trị tham khảo

Tài liệu khóa luận có giá trị tham khảo thiết thực cho các đối tượng sau:

  • Sinh viên và học viên ngành Kỹ thuật Máy tính, Thiết kế Vi mạch, Điện tử - Viễn thông: Nắm bắt phương pháp luận và kỹ thuật đồng mô phỏng vi xử lý bằng cách kết hợp ngôn ngữ bậc cao (Python) với ngôn ngữ phần cứng (Verilog) qua cocotb.
  • Kỹ sư và nhóm nghiên cứu phần cứng RISC-V: Tham khảo mô hình kiến trúc của khối so sánh Comp-Runner và phương pháp đo lường độ bao phủ chức năng (functional coverage) dựa trên tệp cấu hình tham số.
  • Giảng viên và người xây dựng học liệu: Sử dụng Chương 2 và Chương 3 làm tài liệu hướng dẫn thực hành kiểm tra và xác minh chức năng cho các môn học Kiến trúc Máy tính và Thiết kế Hệ thống số.

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

1. Hệ thống RVCoTS sử dụng công cụ và ngôn ngữ nào để kết nối mô phỏng phần mềm với thiết kế phần cứng Verilog?
Hệ thống sử dụng ngôn ngữ Python kết hợp với thư viện mã nguồn mở cocotb (Coroutine-based Cosimulation Testbench) trên môi trường hệ điều hành Ubuntu để điều khiển và giám sát mô hình phần cứng viết bằng Verilog HDL.

2. Khóa luận hỗ trợ kiểm tra bao nhiêu câu lệnh và thuộc những định dạng nào của kiến trúc RISC-V?
Khóa luận hỗ trợ kiểm tra 37 câu lệnh cơ bản của tập lệnh RISC-V RV32I, được phân chia theo 6 định dạng lệnh chuẩn gồm: R-type (10 lệnh), I-type (15 lệnh), S-type (3 lệnh), SB-type (6 lệnh), U-type (2 lệnh) và UJ-type (1 lệnh).

3. Mô hình tham chiếu chuẩn (Golden Model) trong hệ thống được xây dựng như thế nào?
Mô hình tham chiếu là bộ mô phỏng tập lệnh ISS (Instruction Set Simulator) được lập trình hoàn toàn bằng ngôn ngữ Python, hoạt động độc lập với thiết kế phần cứng của người dùng, thực thi mã máy tuần tự để tạo ra trạng thái chuẩn của thanh ghi và bộ nhớ phục vụ việc đối soát.

4. Khối Comp-Runner thực hiện những nhiệm vụ so sánh và đánh giá cụ thể nào?
Comp-Runner thực hiện so sánh song song giá trị của 32 thanh ghi (x0 đến x31), không gian bộ nhớ và thứ tự các câu lệnh thực thi giữa ISS và RTL Simulation; đồng thời tính toán các chỉ số độ bao phủ (số lượng lệnh, thanh ghi nguồn/đích, bước nhảy tiến/lùi, rẽ nhánh) dựa trên tệp cấu hình của người dùng và xuất kết quả ra tệp nhật ký đánh giá.

5. Kết quả của hệ thống RVCoTS được kiểm tra chéo với những công cụ tiêu chuẩn nào để xác minh tính chính xác?
Kết quả thực thi của hệ thống được kiểm tra chéo với trình mô phỏng phần cứng thương mại Xilinx Vivado (so sánh giản đồ sóng và giá trị thanh ghi) và phần mềm RISC-V Interpreter (so sánh việc thực thi tập lệnh và trạng thái bộ nhớ).


Kết luận

Khóa luận "Nghiên cứu phát triển bộ kiểm tra đánh giá hệ thống RISC-V Core" đã thiết kế và triển khai thành công hệ thống đồng mô phỏng RVCoTS phục vụ xác minh chức năng cho vi xử lý RISC-V RV32I. Bằng việc kết hợp mô hình tham chiếu ISS viết bằng Python và môi trường mô phỏng RTL thông qua thư viện cocotb, hệ thống tự động hóa hoàn toàn quy trình đối soát dữ liệu và đo lường độ bao phủ chức năng theo cấu hình người dùng. Các kết quả thực nghiệm và kiểm tra chéo với Vivado cùng RISC-V Interpreter chứng minh hệ thống đạt độ chính xác cao, cung cấp một giải pháp kiểm thử tin cậy và trực quan cho cộng đồng thiết kế vi mạch.