Giới thiệu dự án

Sự phát triển của ngành công nghiệp vi xử lý trong nhiều thập kỷ qua chịu sự chi phối mạnh mẽ của Định luật Moore (Moore's Law) và Giới hạn Dennard (Dennard Scaling). Giai đoạn từ năm 1983 đến 2002 chứng kiến sự bùng nổ của việc tăng xung nhịp đơn nhân nhằm nâng cao hiệu năng tính toán. Tuy nhiên, khi xung nhịp tiệm cận ngưỡng vật lý 4 GHz, các kiến trúc đơn nhân (Single-core) phải đối mặt với "bức tường công suất" (Power Wall), hiện tượng rò rỉ dòng điện (leakage current) và tiêu tán nhiệt lớn. Theo Quy tắc Pollack (Pollack's Rule), việc nhân đôi diện tích logic và độ phức tạp trên một nhân đơn chỉ giúp tăng khoảng 40% hiệu năng ($\sqrt{2}$), trong khi làm gia tăng đáng kể chi phí và năng lượng tiêu thụ.

Trong bối cảnh đó, kiến trúc xử lý đa nhân (Multi-core / Chip Multiprocessor - CMP) trở thành giải pháp tối ưu nhằm khai thác tính song song ở mức luồng (Thread-Level Parallelism - TLP), mang lại hiệu suất cải thiện từ 60% đến 80% trên cùng một mức năng lượng mà không cần đẩy xung nhịp lên ngưỡng nguy hiểm. Đồng thời, sự trỗi dậy của Kiến trúc tập lệnh nguồn mở RISC-V (RISC-V Instruction Set Architecture) từ Đại học California, Berkeley đã mở ra hướng đi mới, xóa bỏ rào cản chi phí bản quyền khổng lồ từ ARM hay x86.

Đồ án tốt nghiệp "Nghiên cứu thiết kế vi xử lý đa nhân dựa trên kiến trúc tập lệnh RISC-V" do sinh viên Nguyễn Phan Hoàng Phúc (MSSV: 17520909), Khoa Kỹ thuật Máy tính, Trường Đại học Công nghệ Thông tin - ĐHQG-HCM thực hiện dưới sự hướng dẫn của ThS. Hồ Ngọc Diễm, tập trung hiện thực hóa vi xử lý 2 nhân (Dual-core) hoàn chỉnh, tích hợp phần cứng đồng bộ hóa dữ liệu bộ nhớ.

+-------------------------------------------------------------------------+
|                               CPU TOP-LEVEL                             |
|                                                                         |
|  +-----------------------+                   +-----------------------+  |
|  |     CORE 0 (6-Stage)  |                   |     CORE 1 (6-Stage)  |  |
|  | IF-ID-B-EX-MEM-WB     |                   | IF-ID-B-EX-MEM-WB     |  |
|  +-----------+-----------+                   +-----------+-----------+  |
|              |                                           |              |
|              +-------------------+   +-------------------+              |
|                                  |   |                                  |
|                                  v   v                                  |
|                      +---------------------------+                      |
|                      |   DUAL-CORE ARBITER UNIT  |                      |
|                      |  - Memory Boundary Check  |                      |
|                      |  - Atomic Locking Control |                      |
|                      +-------------+-------------+                      |
|                                    |                                    |
|                                    v                                    |
|                      +---------------------------+                      |
|                      |     SHARED DATA MEMORY    |                      |
|                      |  [Core0 Priv|Core1 Priv|  |                      |
|                      |         Shared Region]    |                      |
|                      +---------------------------+                      |
+-------------------------------------------------------------------------+

Mục tiêu kỹ thuật cốt lõi

  1. Thiết kế kiến trúc vi xử lý 32-bit Dual-core: Hiện thực hóa hai lõi vi xử lý hoàn chỉnh hỗ trợ tập lệnh chuẩn RV32I (Base 32-bit Integer Instruction Set) và tập mở rộng đồng bộ RV32A (Atomic Extension).
  2. Xây dựng vi kiến trúc đường ống 6 tầng (6-Stage Pipeline): Tối ưu hóa chu trình lệnh qua các tầng IF (Instruction Fetch), ID (Instruction Decode), B (Branch/Bypass), EX (Execute), MEM (Memory Access), WB (Write Back), tích hợp đầy đủ khối phát hiện xung đột (Hazard Detection) và chuyển tiếp dữ liệu (Forwarding Unit).
  3. Hiện thực hóa khối Trọng tài Bộ nhớ (Arbiter Unit): Xử lý tranh chấp truy cập bộ nhớ dùng chung (Shared Memory), ngăn chặn xung đột ghi đồng thời (Write-Write collision), phân vùng không gian nhớ (Private & Shared Memory) và thực thi mô hình nhất quán tuần tự (Sequential Consistency).
  4. Phát triển chuỗi công cụ phần mềm bổ trợ (Toolchain & Testing Suite): Xây dựng bộ biên dịch hợp ngữ tùy biến (Custom Assembler) và khối tạo test case ngẫu nhiên (Random Test Generator - RTG).
  5. Tổng hợp và kiểm thử phần cứng: Đạt tần số hoạt động mục tiêu tối thiểu $F_{\max} \ge 100\text{ MHz}$ trên nền tảng Altera FPGA (DE2 Development Board).

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Nghiên cứu tiến hành khảo sát và đối chuẩn các lõi xử lý RISC-V mã nguồn mở nổi bật trên thế giới và trong nước nhằm xác định khoảng trống công nghệ:

Vi xử lý / Dự án Cấu hình lõi Tập lệnh hỗ trợ Cơ chế đồng bộ (Atomic) Quản lý bộ nhớ Hạn chế chính
RVCoreP Single-core RV32I, RV32M, RV32F Không hỗ trợ Bộ nhớ đơn cổng Không xử lý được bài toán đa luồng thực thể
Shakti Processor Single-core RV32IMAFD, RV32A Có (Chuẩn RV32A) Bộ nhớ phân cấp Xung nhịp giảm mạnh khi thêm khối Atomic ALU
Manoj Kumar Gouda et al. Quad-core Không công bố Không hỗ trợ Bộ nhớ chia sẻ tập trung Thiếu phần cứng Atomic, dễ gây Race Condition
Ahmed Kamaleldin et al. 36-core RV32I, RV32M, RV32C Không hỗ trợ Bộ nhớ phân tán (DSM) Độ phức tạp diện tích lớn, thiếu đồng bộ mức phần cứng
PicoRV32 / Pulpino RISCY Single-core RV32IMC Giới hạn Tích hợp ngoại vi lớn Chứa nhiều khối phần cứng dư thừa, suy giảm $F_{\max}$
Nghiên cứu UIT (An Xuân Tuấn) Single-core RV32I + Privileged Không hỗ trợ Đơn cổng Xung nhịp bị giới hạn ở 12.5 MHz
Đồ án này (Nguyễn Phan Hoàng Phúc) Dual-core RV32I + RV32A Hardware Arbiter + LR/SC & AMOs Dual-port Partitioned Memory Tối ưu hóa pipeline 6 tầng, $F_{\max} \ge 100\text{ MHz}$

Ma trận ưu tiên yêu cầu kỹ thuật (MoSCoW)

  • Must Have: 2 lõi 6-stage pipeline; giải mã 40 lệnh RV32I; hỗ trợ 11 lệnh RV32A; khối Arbiter chống ghi đè vùng nhớ; cấu trúc chuyển tiếp dữ liệu (Forwarding) ở tầng Branch và Execute.
  • Should Have: Trình biên dịch Assembler 2-pass tự động; khối sinh test ngẫu nhiên RTG tự động xuất mã máy; phân vùng 3 vùng nhớ vật lý (Private Core 0, Private Core 1, Shared).
  • Could Have: Bộ đệm lệnh/dữ liệu phân cấp (L1 Cache); giao tiếp bus ngoại vi UART/Wishbone.
  • Won't Have (Giai đoạn này): Xử lý dấu phẩy động (RV32F/D); thực thi lệnh không theo thứ tự (Out-of-Order Execution); chế độ đặc quyền giám sát (Supervisor/User mode).

Thiết kế hệ thống

+---------------------------------------------------------------------------------------------------+
|                                  CHI TIẾT ĐƯỜNG ỐNG 6 TẦNG (PIPELINE CORE)                        |
|                                                                                                   |
|  +---------+    +---------+    +---------+    +---------+    +---------+    +---------+           |
|  | IF STAGE|--->| ID STAGE|--->| B STAGE |--->| EX STAGE|--->|MEM STAGE|--->| WB STAGE|           |
|  +---------+    +---------+    +---------+    +---------+    +---------+    +---------+           |
|  | PC Gen  |    | Decoder |    | Branch  |    | ALU     |    | Mem Data|    | Regfile |           |
|  | Dual-ROM|    | RegFile |    | Target  |    | Shifts  |    | Align   |    | Write-  |           |
|  | Fetch   |    | Control |    | Forward |    | Math    |    | Forward |    | back    |           |
|  +----+----+    +----+----+    +----+----+    +----+----+    +----+----+    +----+----+           |
|       ^              ^              ^              |              |              |                |
|       |              |              +--------------+--------------+              |                |
|       |              +-----------------------------+-----------------------------+                |
|       +----------------- Pipeline Hazard / Stall / Flush Control ----------------+                |
+---------------------------------------------------------------------------------------------------+

Kiến trúc đường ống 6 tầng (6-Stage Pipeline Architecture)

Nhằm khắc phục tình trạng trễ đường truyền tới bộ nhớ dữ liệu và tăng tốc độ xung nhịp, đồ án cải tiến cấu trúc pipeline 5 tầng kinh điển thành 6 tầng độc lập:

  1. IF (Instruction Fetch): Tính toán Program Counter (PC), quản lý nạp lệnh từ Dual-port Instruction Memory.
  2. ID (Instruction Decode): Giải mã lệnh, đọc thanh ghi (rs1, rs2), tạo toàn bộ tín hiệu điều khiển, kiểm tra trạng thái khóa địa chỉ nguyên tử (Atomic Reservation).
  3. B (Branch / Bypass): Tách riêng việc tính toán địa chỉ nhảy (Branch Target Address) và thực hiện rẽ nhánh sớm, đồng thời tích hợp khối Forwarding từ tầng MEM/WB về tầng B để giảm thiểu Branch Penalty từ 3 chu kỳ xuống 1 chu kỳ.
  4. EX (Execute): Đơn vị số học logic (ALU) thực thi các phép toán số nguyên 32-bit (Cộng, trừ, logic AND/OR/XOR, dịch bit logic/số học SRL/SRA/SLL, so sánh SLT/SLTU).
  5. MEM (Memory Access): Điều phối dữ liệu đọc/ghi với hệ thống Data Memory qua bus Arbiter, căn chỉnh dữ liệu byte/halfword/word (LB, LH, LW, SB, SH, SW).
  6. WB (Write Back): Ghi kết quả tính toán từ ALU hoặc dữ liệu tải từ bộ nhớ về tập thanh ghi 32 thanh ghi (x0 - x31).

Thiết kế phân vùng bộ nhớ và cơ chế Trọng tài (Arbiter Unit)

Hệ thống bộ nhớ dữ liệu được tổ chức dưới dạng Dual-port SRAM với 3 vùng không gian nhớ riêng biệt nhằm đảm bảo tính toàn vẹn dữ liệu:

  • Core 0 Private Memory: Chỉ Core 0 có quyền đọc/ghi. Nếu Core 1 cố tình truy xuất, Arbiter sẽ chặn truy cập và bật cờ vi phạm (Violation Flag).
  • Core 1 Private Memory: Chỉ Core 1 có quyền truy xuất đọc/ghi.
  • Shared Memory Region: Vùng nhớ chia sẻ dùng chung cho cả 2 core để trao đổi dữ liệu và đồng bộ luồng thông qua các chỉ thị Atomic (RV32A).
// Logic nguyên lý khối Trọng tài giải quyết xung đột ghi bộ nhớ chia sẻ
always @(*) begin
    // Mặc định cho phép truy cập nếu địa chỉ nằm trong vùng hợp lệ
    grant_core0 = 1'b0;
    grant_core1 = 1'b0;
    mem_violation_0 = 1'b0;
    mem_violation_1 = 1'b0;

    // Kiểm tra biên địa chỉ Core 0
    if (addr_core0 >= CORE0_PRIV_START && addr_core0 <= CORE0_PRIV_END)
        grant_core0 = req_core0;
    else if (addr_core0 >= SHARED_START && addr_core0 <= SHARED_END) begin
        // Tranh chấp ghi đồng thời vào cùng một từ nhớ trong vùng Shared
        if (req_core0 && req_core1 && (addr_core0 == addr_core1) && we_core0 && we_core1) begin
            grant_core0 = 1'b1; // Cấp quyền ưu tiên cho Core 0
            grant_core1 = 1'b0; // Core 1 bị stall, thực hiện ở chu kỳ kế tiếp
        end else begin
            grant_core0 = req_core0;
        end
    end else begin
        mem_violation_0 = req_core0; // Báo vi phạm truy cập trái phép
    end
end

Giao diện tín hiệu Bus hệ thống

Hệ thống kết nối giữa hai lõi xử lý và khối nhớ thông qua bảng giao tiếp chuẩn:

Tên bus tín hiệu Hướng Độ rộng Mô tả chức năng
inst_address_0 / 1 Output 32-bit Địa chỉ nạp lệnh từ Core 0 / Core 1 tới Instruction Memory
instruction_0 / 1 Input 32-bit Mã lệnh nhị phân trả về tương ứng cho Core 0 / Core 1
data_address_0 / 1 Output 32-bit Địa chỉ truy xuất bộ nhớ dữ liệu phát từ Core 0 / Core 1
data_write_0 / 1 Output 32-bit Dữ liệu ghi từ Core 0 / Core 1 vào bộ nhớ dữ liệu
data_return_0 / 1 Input 32-bit Dữ liệu đọc từ bộ nhớ dữ liệu cấp về cho Core 0 / Core 1
control_bus_0 / 1 Output 8-bit Mã điều khiển thao tác đọc/ghi, kích thước dữ liệu (Byte, Halfword, Word)
write_en_0 / 1 Output 1-bit Tín hiệu kích hoạt ghi (Write Enable) từ từng lõi

Methodology & Quy trình thiết kế

Quy trình nghiên cứu áp dụng mô hình chuẩn công nghiệp thiết kế vi mạch kỹ thuật số (Altera/Intel FPGA Design Flow):

+------------------+      +-------------------+      +-------------------+
| 1. Kiến trúc     | ---> | 2. Hiện thực RTL  | ---> | 3. Mô phỏng chức  |
|    & Đặc tả ISA  |      |    (Verilog HDL)  |      |    năng (ModelSim)|
+------------------+      +-------------------+      +-------------------+
                                                               |
                                                               v
+------------------+      +-------------------+      +-------------------+
| 6. Đóng gói &    | <--- | 5. Nạp cấu hình   | <--- | 4. Tổng hợp mạch  |
|    Báo cáo       |      |    FPGA Board DE2 |      |    (Quartus II)   |
+------------------+      +-------------------+      +-------------------+
  • Kế hoạch triển khai (Timeline chi tiết):
    • Tuần 1 (08/03 - 14/03/2021): Nghiên cứu đặc tả tập lệnh RISC-V RV32I và chuẩn Atomic RV32A.
    • Tuần 2 (15/03 - 21/03/2021): Phân tích vi kiến trúc đa lõi, bài toán Memory Coherence và mô hình Sequential Consistency.
    • Tuần 3 - 4 (22/03 - 04/04/2021): Thiết kế logic khối nhớ Dual-port Instruction/Data Memory và khối Arbiter.
    • Tuần 5 - 8 (05/04 - 02/05/2021): Thiết kế RTL cho 6 tầng pipeline của lõi vi xử lý, khối Hazard & Forwarding.
    • Tuần 9 - 10 (03/05 - 16/05/2021): Phát triển Toolchain Assembler, RTG và chạy mô phỏng kiểm chứng trên ModelSim.
    • Tuần 11 - 13 (17/05 - 06/06/2021): Tổng hợp trên phần mềm Quartus, tối ưu Timing Constraints và kiểm thử trên kit FPGA DE2.
    • Tuần 14 - 16 (07/06 - 25/06/2021): Phân tích kết quả, đối chuẩn hiệu năng và hoàn thiện báo cáo đồ án tốt nghiệp.

Implementation và kết quả

Development Process & Phần mềm bổ trợ

Nhằm phục vụ quá trình kiểm thử tự động, đồ án đã phát triển bộ công cụ phần mềm độc lập:

  1. Custom Two-Pass Assembler:
    • Pass 1: Khởi tạo Hash Table cho tập lệnh (Opcode, Funct3, Funct7) và 32 thanh ghi; quét toàn bộ file .asm để phát hiện nhãn (Labels), tính toán địa chỉ offset và loại bỏ dòng trống, comment. Hỗ trợ giải mã các giả lệnh (Pseudo-instructions) phức tạp như biến đổi li rd, imm32 thành cặp lệnh lui rd, imm[31:12]addi rd, rd, imm[11:0].
    • Pass 2: Phân tích cú pháp các toán hạng, loại bỏ dấu ngoặc trong các chỉ thị truy xuất nhớ (lw x5, 40(x6)), tra cứu giá trị nhãn từ Hash Table và chuyển đổi thành chuỗi nhị phân 32-bit chuẩn. Xuất ra file .bin nạp vào ROM và file .dis phục vụ gỡ lỗi (Debugging).
# Thuật toán phân tích cú pháp và xử lý giả lệnh trong Custom Assembler
def parse_and_expand_instruction(inst_line, label_table, current_pc):
    tokens = inst_line.replace(',', ' ').split()
    opcode_mnemonic = tokens[0].lower()
    
    # Xử lý giả lệnh nạp hằng số 32-bit LI (Load Immediate)
    if opcode_mnemonic == "li":
        rd = tokens[1]
        imm = int(tokens[2], 0)
        imm_u = (imm + 0x800) >> 12
        imm_i = imm & 0xFFF
        return [
            f"lui {rd}, {hex(imm_u)}",
            f"addi {rd}, {rd}, {hex(imm_i)}"
        ]
    return [inst_line]
  1. Cơ chế đồng bộ phần cứng với tập lệnh RV32A: Hiện thực hóa chuỗi lệnh lr.w (Load-Reserved) và sc.w (Store-Conditional) cùng các thao tác nguyên tử AMOs (Atomic Memory Operations) như amoswap.w, amoadd.w, amoand.w, amoor.w, amoxor.w, amomin.w, amomax.w:
# Đoạn mã kiểm thử đồng bộ khóa tương hỗ (Spinlock Mutex) sử dụng LR/SC trên 2 Core
acquire_lock:
    lr.w  t0, (a0)         # Đọc giá trị khóa tại địa chỉ trong a0 và đăng ký Reservation
    bnez  t0, acquire_lock # Nếu khóa != 0 (đang bị chiếm giữ), tiếp tục thăm dò
    sc.w  t1, t2, (a0)     # Cố gắng ghi giá trị 1 (t2) vào khóa; t1 trả về 0 nếu thành công
    bnez  t1, acquire_lock # Nếu ghi thất bại (bị core khác can thiệp), thử lại từ đầu
# Vùng găng (Critical Section)
    # Thực hiện tính toán an toàn trên vùng nhớ chia sẻ (Shared Memory)
    sw    zero, 0(a0)      # Mở khóa giải phóng tài nguyên

Testing và validation

Quá trình kiểm chứng vi xử lý được thực hiện qua 3 lớp phòng vệ nghiêm ngặt:

  1. Kiểm thử có định hướng (Directed Tests): Kiểm tra độc lập từng lệnh trong tập 40 lệnh RV32I và 11 lệnh RV32A. Đoạn dạng sóng ModelSim ghi nhận chính xác việc thực thi lệnh nhảy điều kiện BNE, lệnh tính toán LUI, và chuỗi tuần tự LR/SC không xảy ra sai lệch dữ liệu.
  2. Bộ kiểm thử ngẫu nhiên (Random Test Generator - RTG): Sinh tự động hơn 100.000 dòng mã nhị phân ngẫu nhiên chứa các chuỗi xung đột dữ liệu ngặt nghèo (RAW, WAR, WAW) và xung đột tranh chấp bộ nhớ ở cùng một chu kỳ xung clock.
  3. Bộ kiểm thử chuẩn công nghiệp riscv-tests: Chạy toàn bộ các test bench hợp ngữ chuẩn của cộng đồng RISC-V quốc tế để xác thực tính tuân thủ đặc tả ISA.
+-------------------------------------------------------------------------+
|                KẾT QUẢ MÔ PHỎNG SỰ CỐ TRANH CHẤP TRÊN MODELSIM          |
|                                                                         |
| CLK         : _/¯\_/¯\_/¯\_/¯\_/¯\_/¯\_/¯\_/¯\_/¯\_/¯\_/¯\_/¯\_/¯\_/¯\_ |
| Core0_Addr  : ==== < 0x2000_0004 (Shared) > =========================== |
| Core0_WE    : ____/¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\____________________________ |
| Core1_Addr  : ==== < 0x2000_0004 (Shared) > =========================== |
| Core1_WE    : ____/¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\____________________________ |
| Arbiter_Gnt0: ____/¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\____________________________ |
| Arbiter_Gnt1: ____________________________/¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\____ |
| Core1_Stall : ____/¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\____________________________ |
| Data_Mem[4] : ==== < Core0_Data_Val > ===== < Core1_Data_Val > ======== |
+-------------------------------------------------------------------------+

Kết quả đạt được

Hệ thống vi xử lý Dual-core RISC-V hoàn thiện đã được tổng hợp thành công trên phần mềm Quartus Prime, mục tiêu kit FPGA Altera DE2:

+------------------------------------------------------------------------+
|                  THỐNG KÊ KẾT QUẢ TỔNG HỢP PHẦN CỨNG                   |
+------------------------------------+-----------------------------------+
| Thông số kỹ thuật                  | Giá trị thực tế đạt được          |
+------------------------------------+-----------------------------------+
| Tần số hoạt động tối đa (Fmax)     | 104.28 MHz (Vượt chỉ tiêu 100MHz) |
| Kiến trúc vi xử lý                 | Dual-core 32-bit Symmetric (SMP)  |
| Chiều sâu đường ống (Pipeline)     | 6 tầng (IF - ID - B - EX - MEM-WB)|
| Độ trễ bộ nhớ dữ liệu (Latency)    | 2 chu kỳ xung clock               |
| Tổng số lệnh tập RV32I hỗ trợ      | 40 / 40 lệnh (100%)               |
| Tổng số lệnh tập RV32A hỗ trợ      | 11 / 11 lệnh (100%)               |
| Tỷ lệ lỗi vi phạm bộ nhớ (Arbiter) | 0% (Ngăn chặn 100% truy cập lậu)  |
| Tỷ lệ vượt qua bộ test riscv-tests | 100% các bài test quy chuẩn       |
+------------------------------------+-----------------------------------+

Đổi mới và đóng góp

  1. Kiến trúc đường ống 6 tầng tối ưu trễ rẽ nhánh: Tách biệt tầng Branch/Bypass (B stage) khỏi tầng Execute (EX stage) giúp tính toán địa chỉ nhảy sớm và kết nối trực tiếp mạng chuyển tiếp dữ liệu (Forwarding Network), giảm số chu kỳ lãng phí khi dự đoán sai rẽ nhánh.
  2. Khối Trọng tài phần cứng đa tầng (Hierarchical Hardware Arbiter): Hiện thực hóa cơ chế phân vùng bộ nhớ vật lý độc lập (2 vùng Private và 1 vùng Shared) kết hợp mạch giải mã phát hiện vi phạm tức thời, triệt tiêu hiện tượng thắt cổ chai và đảm bảo tính toàn vẹn dữ liệu trong mô hình bộ nhớ chia sẻ.
  3. Hiện thực hóa trọn vẹn tập lệnh nguyên tử RV32A trên lõi đa nhân: Khác với các công trình nghiên cứu trước đây tại Việt Nam (chỉ dừng lại ở mức vi xử lý đơn nhân RV32I cơ bản), đồ án đã tích hợp thành công tập lệnh nguyên tử chuẩn RV32A, hỗ trợ đầy đủ các chỉ thị AMOs và cơ chế đặt chỗ LR/SC phục vụ đa luồng thực thể.
  4. Hệ sinh thái công cụ hỗ trợ khép kín: Xây dựng trọn vẹn chuỗi công cụ từ trình biên dịch Assembler chuyên biệt đến bộ sinh dữ liệu kiểm thử ngẫu nhiên RTG, giúp rút ngắn hơn 60% thời gian xác minh thiết kế RTL so với phương pháp thủ công.

Ứng dụng thực tế và triển khai

Kịch bản ứng dụng thực tế

  • Hệ thống điều khiển biên công nghiệp (Industrial Edge Gateways): Khả năng xử lý đa luồng với tần số trên 100 MHz cho phép một lõi xử lý các tác vụ thu thập dữ liệu cảm biến thời gian thực, trong khi lõi còn lại thực thi các thuật toán lọc số hoặc giao tiếp mạng an toàn.
  • Hệ thống nhúng IoT yêu cầu độ tin cậy cao: Phân vùng bộ nhớ riêng biệt (Private Regions) ngăn chặn hoàn toàn lỗi tràn bộ nhớ hoặc tấn công can thiệp dữ liệu giữa các tiến trình chạy song song.
  • Nền tảng đào tạo và nghiên cứu thiết kế vi mạch (ASIC/FPGA Training Platform): Là tài liệu tham khảo hoàn chỉnh về thiết kế vi kiến trúc pipeline, giải quyết xung đột bộ nhớ và kiểm thử hệ thống vi xử lý RISC-V tại các trường đại học kỹ thuật.

Hướng dẫn triển khai trên FPGA Altera DE2

  1. Mở project trong môi trường Altera Quartus Prime.
  2. Gán chân I/O (Pin Planner) tương ứng với chip FPGA Cyclone trên Kit DE2 (Clock 50MHz, Reset Switch, 7-Segment LEDs, GPIOs).
  3. Sử dụng PLL (Phase-Locked Loop) tích hợp sẵn để nâng xung nhịp nội bộ hệ thống từ 50 MHz lên 100 MHz.
  4. Biên dịch toàn bộ Netlist và tiến hành nạp file cấu hình .sof xuống kit qua cáp USB-Blaster.
  5. Nạp mã máy nhị phân sinh ra từ Custom Assembler vào bộ nhớ Instruction ROM để vi xử lý thực thi chương trình.

Hạn chế và hướng phát triển

Hạn chế kỹ thuật

  • Vi kiến trúc vẫn tuân theo mô hình thực thi tuần tự (In-Order Execution), chưa khai thác tối đa tính song song mức chỉ thị (Instruction-Level Parallelism - ILP) như các bộ xử lý siêu vô hướng (Superscalar) hoặc Out-of-Order (OoO).
  • Hệ thống chưa tích hợp bộ đệm phân cấp L1/L2 Cache gắn kèm bộ điều khiển giao thức duy trì tính nhất quán bộ đệm (Cache Coherence Protocols như MESI/MOESI).
  • Chưa tích hợp đơn vị quản lý bộ nhớ ảo (MMU) để chạy các hệ điều hành đầy đủ như Linux (yêu cầu chế độ đặc quyền Supervisor Mode).

Hướng phát triển tương lai

  • Nâng cấp mở rộng cấu hình lên Quad-core (4 lõi) hoặc Octa-core (8 lõi) kết hợp cấu trúc liên kết mạng trên chip (Network-on-Chip - NoC).
  • Bổ sung tập mở rộng nhân/chia số nguyên phần cứng RV32M và xử lý số thực dấu phẩy động chuẩn IEEE-754 RV32F/D.
  • Phát triển hệ thống bộ đệm L1 Cache riêng cho từng lõi và giao thức duy trì tính nhất quán bộ đệm Snooping Bus nhằm giảm độ trễ truy xuất bộ nhớ ngoài.
  • Nâng cấp tập lệnh lên 64-bit (RV64I) và tích hợp đơn vị MMU hỗ trợ chuyển đổi địa chỉ ảo, mở đường cho việc cài đặt hệ điều hành nhúng Linux/FreeRTOS.

Đối tượng hưởng lợi

+-----------------------------------------------------------------------------+
|                            ĐỐI TƯỢNG HƯỞNG LỢI                              |
+-----------------------------------------------------------------------------+
|  SINH VIÊN & HỌC VIÊN CAO HỌC:                                              |
|  - Tiếp cận mã nguồn phần cứng Verilog trực quan, thiết kế chuẩn mực.       |
|  - Nắm vững nguyên lý Hazard, Forwarding và giải quyết xung đột bộ nhớ.     |
+-----------------------------------------------------------------------------+
|  KỸ SƯ THIẾT KẾ VI MẠCH (RTL / ASIC DESIGNERS):                            |
|  - Tham khảo thiết kế Arbiter Unit và vi kiến trúc RV32A đã kiểm chứng.     |
|  - Tái sử dụng chuỗi công cụ Custom Assembler & RTG cho dự án thực tế.      |
+-----------------------------------------------------------------------------+
|  DOANH NGHIỆP THIẾT KẾ CHIP & IoT:                                          |
|  - Tận dụng lõi IP mở không bản quyền (Royalty-free) tiết kiệm chi phí R&D. |
|  - Nền tảng phát triển SoC chuyên dụng cho các ứng dụng công nghiệp.       |
+-----------------------------------------------------------------------------+

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

1. Yêu cầu phần cứng tối thiểu để triển khai và chạy mô phỏng thiết kế này là gì?

Để mô phỏng, máy tính cần cài đặt phần mềm ModelSim (bản Altera Starter hoặc SE)Quartus Prime (v18.1 trở lên) với RAM tối thiểu 4GB. Để nạp chạy thực tế, yêu cầu kit phát triển FPGA có dung lượng tối thiểu 20.000 Logic Elements (LEs) như Altera Cyclone II (Kit DE2) hoặc Cyclone IV/V.

2. Khối Trọng tài (Arbiter) xử lý thế nào khi cả hai lõi cùng ghi dữ liệu vào một địa chỉ ô nhớ tại cùng một chu kỳ clock?

Arbiter áp dụng thuật toán ưu tiên cố định (hoặc luân phiên Round-Robin). Khi phát hiện tranh chấp ghi đồng thời (we_core0 = 1we_core1 = 1) tại cùng một địa chỉ trong vùng Shared Memory, Arbiter sẽ cấp quyền ghi cho Core 0 trước, đồng thời giữ tín hiệu stall đưa về Core 1 để đóng băng trạng thái đường ống của Core 1 trong 1 chu kỳ clock. Core 1 sẽ thực hiện thao tác ghi ngay ở chu kỳ kế tiếp.

3. Tại sao thiết kế lại chọn pipeline 6 tầng thay vì cấu trúc 5 tầng kinh điển của MIPS/RISC-V?

Bộ nhớ dữ liệu phần cứng cần 2 chu kỳ xung clock để hoàn tất thao tác đọc/ghi ổn định (2-cycle latency). Việc chèn thêm tầng B (Branch/Bypass) và tách biệt đường truyền giúp phân tách việc tính toán địa chỉ nhảy, giảm tải đường trễ truyền dẫn (Critical Path) của khối ALU, từ đó nâng tần số hoạt động tổng thể của vi xử lý lên trên $100\text{ MHz}$.

4. Tập lệnh nguyên tử RV32A đóng vai trò gì trong hệ thống vi xử lý đa nhân này?

Tập lệnh RV32A cung cấp các thao tác đọc - sửa - ghi (Read-Modify-Write) nguyên tử không thể bị phân chia. Nhờ các lệnh như lr.w, sc.w và các chỉ thị AMOs, các lõi có thể xây dựng các cấu trúc đồng bộ phần mềm như Semaphore, Spinlock, Mutex mà không bị lỗi tương tranh dữ liệu (Race Conditions) khi truy xuất vùng nhớ chia sẻ.

5. Dự án đã kiểm tra và ngăn chặn các lỗi truy cập vùng nhớ trái phép (Memory Boundary Violation) như thế nào?

Khối Sub-Arbitrator liên tục giải mã địa chỉ phát ra từ từng lõi (data_address_0/1). Nếu Core 0 phát địa chỉ nằm ngoài vùng Private Core 0 và vùng Shared, hoặc cố tình can thiệp vào không gian địa chỉ Private của Core 1, tín hiệu mem_violation sẽ kích hoạt ngay lập tức, lệnh ghi bị hủy bỏ và trạng thái lỗi được ghi nhận để xử lý ngoại lệ.


Kết luận

Đồ án "Nghiên cứu thiết kế vi xử lý đa nhân dựa trên kiến trúc tập lệnh RISC-V" của sinh viên Nguyễn Phan Hoàng Phúc đã giải quyết thành công bài toán thiết kế phần cứng vi xử lý 2 lõi 32-bit hiệu năng cao, hoàn toàn tương thích với tập lệnh tiêu chuẩn RV32I và mở rộng nguyên tử RV32A. Với việc ứng dụng cấu trúc đường ống 6 tầng tiên tiến, hệ thống bộ nhớ phân vùng linh hoạt kết hợp khối Trọng tài phần cứng thông minh, vi xử lý đạt xung nhịp hoạt động thực tế trên 100 MHz trên nền tảng Altera FPGA, đáp ứng 100% các tiêu chuẩn kiểm thử khắt khe.

Công trình không chỉ khẳng định tính khả thi của việc phát triển các lõi vi xử lý đa nhân nguồn mở tại Việt Nam mà còn cung cấp một nền tảng thiết kế vi kiến trúc mẫu mực, sẵn sàng mở rộng thành các hệ thống vi xử lý phức tạp phục vụ cho các ứng dụng công nghiệp, IoT và nghiên cứu vi mạch tiên tiến.