Giới thiệu dự án
Sự bùng nổ của các ứng dụng tính toán hiệu năng cao, thiết bị biên Internet vạn vật (IoT) và hệ thống nhúng thông minh đòi hỏi các bộ vi xử lý không chỉ có tốc độ xử lý vượt trội mà còn phải tối ưu hóa triệt để tài nguyên phần cứng và năng lượng. Trong nhiều thập kỷ qua, kỹ thuật đường ống (Pipelining) đã trở thành nền tảng chuẩn mực nhằm khai thác mức độ song song cục bộ của lệnh (Instruction-Level Parallelism - ILP). Tuy nhiên, giới hạn vật lý của định luật Moore và tình trạng xung đột dữ liệu (Hazard Stalls) đã thúc đẩy các nhà kiến trúc máy tính chuyển dịch sang mức độ song song cấp tác vụ (Task-Level Parallelism - TLP). Kiến trúc đa luồng phần cứng (Hardware Multithreading) cho phép một lõi xử lý duy nhất có thể thực thi đồng thời nhiều luồng chỉ lệnh, tối ưu hóa chu kỳ nhàn rỗi của đường ống và nâng cao hiệu suất thông lượng (Throughput) vượt bậc so với kiến trúc đơn luồng truyền thống.
Bên cạnh đó, sự dịch chuyển mạnh mẽ từ các tập lệnh độc quyền (như x86, ARM) sang tập lệnh nguồn mở chuẩn hóa RISC-V (Reduced Instruction Set Computer V) do RISC-V International ban hành đã mở ra một kỷ nguyên mới cho ngành thiết kế vi mạch toàn cầu. Các tập đoàn công nghệ lớn như Alibaba T-Head, Western Digital và NVIDIA đã và đang tích cực triển khai các dòng vi xử lý dựa trên kiến trúc RISC-V. Tuy nhiên, tại Việt Nam, các công trình nghiên cứu chuyên sâu về thiết kế vi kiến trúc vi xử lý RISC-V hỗ trợ tính năng đa luồng cấp phần cứng còn rất hạn chế. Phần lớn các nghiên cứu hiện hành trên thế giới phụ thuộc vào các mã nguồn mở phức tạp như Klessydra hay BOOM, gây khó khăn cho việc tùy chỉnh, mở rộng và đào tạo chuyên sâu.
Đồ án tốt nghiệp "Nghiên Cứu Thiết Kế Bộ Vi Xử Lý RISC-V Theo Vi Kiến Trúc Multithread" của sinh viên Lê Nguyễn Hoàng Thiên (MSSV: 17521075), dưới sự hướng dẫn của ThS. Hồ Ngọc Diễm tại Khoa Kỹ thuật Máy tính – Trường Đại học Công nghệ Thông tin (ĐHQG-HCM), được thực hiện nhằm giải quyết trực tiếp khoảng trống công nghệ này.
+-----------------------------------------------------------------------+
| HỆ THỐNG ĐA LUỒNG RISC-V |
| |
| +--------------------+ +----------------------+ |
| | Thread 0 (Hart 0) | | Thread 1 (Hart 1) | |
| +---------+----------+ +----------+-----------+ |
| | | |
| +-------------------+ +-------------------+ |
| | | |
| v v |
| +-----------------------------+ |
| | Shared Register File (ARF) | |
| +-----------------------------+ |
| | Shared Instruction Memory | |
| +-----------------------------+ |
| | Shared Data Memory (D-Mem) | |
| +-----------------------------+ |
| | Hardware Sync Unit (LR/SC) | |
| +-----------------------------+ |
+-----------------------------------------------------------------------+
Mục tiêu cụ thể của dự án
- Thiết kế hoàn chỉnh lõi vi xử lý RISC-V 32-bit (RV32I) hỗ trợ tập lệnh chuẩn cơ sở cùng với tập mở rộng đồng bộ hóa phần cứng
RV32A (cụ thể là hai lệnh LR.W - Load Reserved Word và SC.W - Store Conditional Word).
- Xây dựng vi kiến trúc đa luồng 2 khe (2-slot Hardware Multithreading) cho phép 2 luồng (Thread 1 và Thread 2) chia sẻ linh hoạt tài nguyên phần cứng gồm: Tập thanh ghi kiến trúc (ARF), Bộ nhớ lệnh (I-Mem) và Bộ nhớ dữ liệu (D-Mem).
- Triển khai kỹ thuật xử lý nâng cao (Advanced Microarchitectural Techniques): Bao gồm cơ chế dự đoán nhánh động 2-bit (Dynamic Branch Prediction) thông qua bộ đệm đích nhánh BTB (Branch Target Buffer), kỹ thuật đổi tên thanh ghi (Register Renaming) và hàng đợi đặt chỗ (Reservation Buffer) để hỗ trợ thực thi ngoài thứ tự (Out-of-Order Execution - OoO).
- Phát triển bộ công cụ phần mềm hỗ trợ (Custom Toolchain): Xây dựng trình biên dịch Hợp ngữ sang Mã máy (Assembler) chuyên dụng bằng ngôn ngữ Perl và tích hợp công cụ tạo testcase ngẫu nhiên (Random Test Generator - RTG).
- Hiện thực hóa và kiểm định toàn diện: Đánh giá tính đúng đắn qua mô phỏng chức năng (Pre-simulation) và mô phỏng sau tổng hợp (Post-simulation) trên ModelSim, đồng thời nạp và kiểm tra thực nghiệm trên bo mạch FPGA Altera DE2 đạt tần số hoạt động mục tiêu từ 55 MHz đến 80 MHz.
Phạm vi và giới hạn đề tài
- Phạm vi kiến trúc: Hiện thực hóa tập lệnh cơ bản
RV32I (47 lệnh logic, số học, điều khiển, dịch chuyển và truy xuất bộ nhớ) kết hợp 2 lệnh đồng bộ nguyên tử LR.W/SC.W từ tập RV32A.
- Giới hạn: Hệ thống chưa bao gồm bộ tính toán số thực FPU (
RV32F/D), đơn vị quản lý bộ nhớ phức tạp (MMU) cho hệ điều hành Linux đa nhiệm đầy đủ, và hệ thống bộ nhớ phân cấp Cache L1/L2 đa mức.
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
Trong thiết kế vi xử lý hiện đại, việc tối ưu hóa chu kỳ trên mỗi lệnh (Cycles Per Instruction - CPI) đối mặt với các rào cản lớn về xung đột dữ liệu (Data Hazards), xung đột điều khiển (Control Hazards) và xung đột cấu trúc (Structural Hazards).
| Tiêu chí phân tích |
Bộ xử lý Đơn luồng (Single-thread In-Order) |
Bộ xử lý Đa lõi (Multicore Processors) |
Vi xử lý Đa luồng đề xuất (Proposed Multithreaded RISC-V) |
| Khai thác phần cứng |
Hiệu suất thấp khi gặp stall (bộ nhớ, lệnh nhánh). |
Cao, nhưng nhân bản toàn bộ Datapath gây lãng phí diện tích. |
Tối ưu; tận dụng triệt để chu kỳ rỗi của Datapath thông qua chia sẻ tài nguyên. |
| Chia sẻ tài nguyên |
Không áp dụng. |
Không chia sẻ Execution Units/ARF, chỉ chia sẻ Bus/LLC Cache. |
Chia sẻ ARF, I-Mem, D-Mem, ALU và Reservation Buffers. |
| Chi phí phần cứng (Gate Count) |
Tối thiểu (1.0x). |
Rất cao (~2.0x cho 2 lõi độc lập). |
Vừa phải (~1.2x - 1.35x so với đơn luồng). |
| Độ phức tạp đồng bộ |
Đơn giản, không có race conditions phần cứng. |
Phức tạp, phụ thuộc giao thức Cache Coherence. |
Đồng bộ trực tiếp tại tầng phần cứng qua tập lệnh LR.W/SC.W. |
| Khả năng giải quyết Hazard |
Bắt buộc chèn NOP (Stall) hoặc Forwarding đơn giản. |
Từng lõi vẫn gặp tình trạng stall cục bộ. |
Kết hợp Out-of-Order, Dynamic BTB và chuyển luồng (Thread Switching). |
Phân tích yêu cầu hệ thống theo mô hình MoSCoW
- Must-Have: Đường ống 5 tầng chuẩn (IF, ID, Issue, EX, MEM/WB); bộ giải mã lệnh đầy đủ RV32I; cơ chế đồng bộ phần cứng không khóa chết (Deadlock-free) bằng
LR.W và SC.W; bộ điều khiển chuyển đổi 2 luồng.
- Should-Have: Cơ chế dự đoán rẽ nhánh động 2-bit bão hòa (2-bit Saturating Counter) tích hợp bảng BTB; thực thi ngoài thứ tự cho khối ALU thông qua Renaming Register File (RRF) và Reservation Buffer (RB); bộ lập lịch ghi lùi (Write-Back Scheduler).
- Could-Have: Khối tính toán địa chỉ nhảy nhanh trực tiếp tại tầng Fetch (IF stage) đối với lệnh
JAL; công cụ chuyển đổi assembly tự động bằng Perl.
- Won't-Have: Bộ giải mã lệnh nén 16-bit (
RV32C), cơ chế phân trang bộ nhớ ảo TLB/MMU, hỗ trợ số thực phần cứng (IEEE 754 FPU).
Thiết kế hệ thống
Kiến trúc đường ống của bộ vi xử lý đa luồng bao gồm 5 tầng chức năng chính:
[ IF: Instruction Fetch ] ---> Tích hợp BTB 2-bit & Fetch JAL Logic
|
v
[ ID: Instruction Decode ] ---> Phân tích trường lệnh, đọc ARF, gán nhãn RRF
|
v
[ ISSUE: Reservation Buffer ] -> Lưu trữ hàng đợi chỉ lệnh chờ toán hạng (OoO)
|
v
[ EX: Execution Units ] ---> Khối ALU Số học, Khối Nhánh, Khối Đồng bộ LR/SC
|
v
[ MEM / WB: Access & Write ] -> Đọc/Ghi D-Mem & Write-Back Scheduler chọn luồng
flowchart TD
subgraph IF_Stage["1. INSTRUCTION FETCH (IF)"]
PC["Program Counter (Thread 0 / Thread 1)"] --> IMEM["Instruction Memory (I-Mem)"]
PC --> BTB["Branch Target Buffer (2-bit Prediction)"]
IMEM --> IF_REG["IF/ID Pipeline Register"]
BTB --> IF_REG
end
subgraph ID_Stage["2. INSTRUCTION DECODE (ID)"]
IF_REG --> DECODER["Instruction Decoder"]
DECODER --> ARF["Architecture Register File (Shared)"]
DECODER --> RRF["Renaming Register File (RRF)"]
DECODER --> IMM_EXT["Immediate Extender"]
end
subgraph ISSUE_Stage["3. ISSUE STAGE"]
ARF --> RB["Reservation Buffer (RB)"]
RRF --> RB
IMM_EXT --> RB
end
subgraph EX_Stage["4. EXECUTE (EX)"]
RB --> ALU["Arithmetic Logic Unit (ALU)"]
RB --> BR_U["Branch Execution Unit"]
RB --> LSU_ADDR["Memory Address Calculator"]
RB --> SYNC_CTRL["Synchronization Controller (Link Register & Busy Bit)"]
end
subgraph MEM_WB_Stage["5. MEMORY ACCESS & WRITE-BACK (MEM/WB)"]
LSU_ADDR --> DMEM["Data Memory (D-Mem)"]
SYNC_CTRL --> DMEM
ALU --> WB_SCHED["Write-Back Scheduler"]
DMEM --> WB_SCHED
WB_SCHED --> ARF
WB_SCHED --> RRF
end
Chi tiết các khối chức năng chính
- Instruction Fetch (IF): Quản lý con trỏ lệnh PC cho cả hai luồng. Tích hợp bộ đệm đích nhánh (BTB) lưu vết lịch sử rẽ nhánh. Khi gặp lệnh
JAL, phần cứng lập tức tính toán địa chỉ nhảy ngay trong chu kỳ Fetch để loại bỏ hoàn toàn hiện tượng trễ chu kỳ lệnh.
- Instruction Decode (ID): Tách các trường toán hạng
rs1, rs2, rd, funct3, funct7 và opcode. Khối ID mở rộng các trường Immediate lên 32-bit theo đúng định dạng lệnh (I-type, S-type, B-type, U-type, J-type). Đồng thời, khối thực hiện cơ chế đổi tên thanh ghi nhằm tránh xung đột dữ liệu WAR (Write-After-Read) và WAW (Write-After-Write).
- Issue Stage: Đưa lệnh vào Reservation Buffer (RB). Lệnh sẽ được giữ tại RB cho đến khi tất cả các toán hạng đầu vào sẵn sàng, cho phép các lệnh độc lập đến sau được thực thi trước (Out-of-Order).
- Execution (EX):
- ALU Block: Xử lý toàn bộ các phép toán logic (
AND, OR, XOR), phép toán dịch (SLL, SRL, SRA), phép cộng trừ (ADD, SUB) và so sánh (SLT, SLTU).
- Branch Unit: Kiểm tra điều kiện nhảy (
BEQ, BNE, BLT, BGE, BLTU, BGEU) và xác thực kết quả dự đoán của BTB.
- Synchronization Controller: Điều khiển cơ chế đồng bộ phần cứng thông qua Link Register. Khi lệnh
LR.W được thực thi, thanh ghi liên kết sẽ thiết lập cờ busy = 1 và gán địa chỉ bộ nhớ được bảo lưu. Khi lệnh SC.W đến, khối sẽ đối chiếu địa chỉ và trạng thái busy; nếu hợp lệ, cho phép ghi dữ liệu và trả về 0 (thành công) vào thanh ghi đích rd, ngược lại chặn ghi và trả về giá trị khác 0 (thất bại).
- Memory Access (MEM) & Write-Back (WB): MEM xử lý các lệnh truy xuất bộ nhớ (
LW, LH, LB, LHU, LBU, SW, SH, SB). Tầng Write-Back được thiết kế tối ưu: các lệnh ALU có thể ghi lùi kết quả trực tiếp mà không cần chờ qua tầng MEM, thông qua một khối Write-Back Scheduler chuyên trách giải quyết xung đột khi nhiều khối cùng yêu cầu ghi lùi trong một chu kỳ xung nhịp.
Methodology
Quy trình phát triển và kiểm thử hệ thống được xây dựng theo phương pháp luận thiết kế phần cứng chuẩn công nghiệp:
[ Đặc tả yêu cầu RV32I + RV32A ]
|
v
[ Thiết kế Kiến trúc & Datapath/Controller (Verilog HDL) ]
|
v
[ Xây dựng Trình biên dịch Assembler (Perl Script) ]
|
v
[ Sinh mẫu kiểm thử ngẫu nhiên (RTG Tool) & Bộ test RISC-V chuẩn ]
|
v
[ Mô phỏng Chức năng (ModelSim Functional Pre-Simulation) ]
|
v
[ Tổng hợp RTL, Đóng gói chân & Phân tích Định thời (Quartus II) ]
|
v
[ Nạp Bitstream & Kiểm định Thực nghiệm trên Bo mạch FPGA Altera DE2 ]
- Môi trường và Công cụ thực hiện:
- Ngôn ngữ mô tả phần cứng: Verilog HDL (chuẩn IEEE 1364-2001).
- Công cụ tổng hợp và biên dịch phần cứng: Altera Quartus II v13.0 / v18.1.
- Công cụ mô phỏng dạng sóng: Mentor Graphics ModelSim-Altera 10.1d.
- Ngôn ngữ xây dựng công cụ phần mềm: Perl 5.30 (xây dựng trình Assembler 2-pass chuyển đổi assembly sang định dạng
$writememb).
- Nền tảng phần cứng đích: FPGA Altera Cyclone II/IV trên Development Board DE2-115 / DE2.
Implementation và kết quả
Development process
1. Hiện thực hóa cơ chế đồng bộ phần cứng (Hardware Synchronization)
Cơ chế đồng bộ hóa đa luồng giải quyết bài toán tương hỗ loại trừ (Mutual Exclusion) mà không làm suy giảm hiệu năng như các giải pháp khóa phần mềm thuần túy (Software Spinlocks). Đoạn mã Verilog dưới đây mô tả thuật toán điều khiển của LR.W và SC.W tại tầng Execution:
// Hardware Synchronization Unit for LR.W and SC.W Execution
module sync_controller (
input wire clk,
input wire reset_n,
input wire [31:0] exec_addr,
input wire is_lr_w,
input wire is_sc_w,
input wire [1:0] thread_id,
output reg sc_success,
output reg dmem_we
);
// Link registers storing reservation state for 2 threads
reg [31:0] link_reg_addr [0:1];
reg link_reg_busy [0:1];
always @(posedge clk or negedge reset_n) begin
if (!reset_n) begin
link_reg_busy[0] <= 1'b0;
link_reg_busy[1] <= 1'b0;
link_reg_addr[0] <= 32'h0;
link_reg_addr[1] <= 32'h0;
sc_success <= 1'b0;
dmem_we <= 1'b0;
end else begin
// Default signals
sc_success <= 1'b0;
dmem_we <= 1'b0;
if (is_lr_w) begin
// Register reservation for current thread
link_reg_addr[thread_id] <= exec_addr;
link_reg_busy[thread_id] <= 1'b1;
end else if (is_sc_w) begin
// Validate reservation condition
if (link_reg_busy[thread_id] && (link_reg_addr[thread_id] == exec_addr)) begin
sc_success <= 1'b1; // Write successful (rd = 0)
dmem_we <= 1'b1; // Trigger memory write
end else begin
sc_success <= 1'b0; // Write failed (rd != 0)
dmem_we <= 1'b0; // Block memory write
end
// Invalidate reservation upon SC execution
link_reg_busy[thread_id] <= 1'b0;
end
end
end
endmodule
2. Xây dựng Trình biên dịch Assembler (Perl-based Assembler)
Trình biên dịch được thiết kế theo mô hình hai lượt quét (Two-pass Assembler):
- Giai đoạn 1 (Pre-encoding): Quét toàn bộ file mã nguồn Hợp ngữ, loại bỏ các khoảng trắng thừa và dòng chú thích (
#), nhận diện các nhãn (Labels) nhảy/nhánh và lưu địa chỉ tương ứng vào bảng băm (Label Hash Table).
- Giai đoạn 2 (Binary Conversion): Đọc từng dòng lệnh chuẩn hóa, tra cứu mã
opcode, funct3, funct7, mã hóa các thanh ghi toán hạng và tính toán giá trị offset immediate 12-bit hoặc 20-bit để chuyển thành mã nhị phân 32-bit ghi trực tiếp vào file nhớ nhị phân.
# Core Hash Mapping of RISC-V RV32I in Perl Assembler
my %opcodes = (
"add" => { opcode => "0110011", funct3 => "000", funct7 => "0000000", type => "R" },
"sub" => { opcode => "0110011", funct3 => "000", funct7 => "0100000", type => "R" },
"addi" => { opcode => "0010011", funct3 => "000", funct7 => "none", type => "I" },
"lw" => { opcode => "0000011", funct3 => "010", funct7 => "none", type => "I" },
"sw" => { opcode => "0100011", funct3 => "010", funct7 => "none", type => "S" },
"beq" => { opcode => "1100011", funct3 => "000", funct7 => "none", type => "B" },
"jal" => { opcode => "1101111", funct3 => "none",funct7 => "none", type => "J" },
"lr.w" => { opcode => "0101111", funct3 => "010", funct7 => "0001000", type => "R" },
"sc.w" => { opcode => "0101111", funct3 => "010", funct7 => "0001100", type => "R" }
);
Testing và validation
Quy trình kiểm chứng được chia làm 3 cấp độ thực thi nghiêm ngặt:
- Kiểm thử đơn vị và kịch bản chuyên biệt (Small Targeted Tests):
- Kiểm tra khả năng thực thi ngoài thứ tự (Out-of-Order): Đưa chuỗi lệnh có độ trễ khác nhau vào pipeline để xác nhận lệnh độc lập phía sau được xả kết quả trước mà không gây sai lệch dữ liệu thanh ghi (nhờ khối RRF bảo toàn).
- Kiểm tra bộ dự đoán nhánh 2-bit (Dynamic Branch Prediction): Đánh giá tỷ lệ đoán đúng đối với các vòng lặp điều kiện lặp lại nhiều lần.
- Kiểm thử tự động bằng bộ sinh lệnh ngẫu nhiên (Random Test Generator - RTG):
- Sử dụng công cụ Giang's RTG và Test-case Generator tạo ra hàng nghìn chuỗi lệnh ngẫu nhiên phức tạp với các phụ thuộc dữ liệu đan xen nhằm phát hiện các trạng thái xung đột biên (Corner Cases).
- Chạy kiểm thử tương thích với bộ test chuẩn của tổ chức RISC-V International (RISC-V Test Suite).
- Kiểm thử bài toán đồng bộ hóa kinh điển (Standard Synchronization Problems):
- Bài toán Producer - Consumer: Luồng 1 tạo dữ liệu và nạp vào bộ đệm chung; Luồng 2 đọc dữ liệu từ bộ đệm. Cơ chế khóa nguyên tử bằng
LR.W/SC.W đảm bảo không xảy ra hiện tượng đọc trùng hoặc ghi đè dữ liệu chưa đọc.
- Bài toán Tăng biến đếm đồng thời (Concurrent Counter Increment): Hai luồng cùng lặp 1.000 lần thao tác đọc - cộng - ghi trên cùng một ô nhớ
0x2000_0000. Kết quả cuối cùng đạt chính xác 2000, chứng minh hoàn toàn tính tương hỗ nguyên tử của cặp lệnh LR.W/SC.W tại tầng phần cứng.
+-------------------------------------------------------------------------+
| WAVEFORM KIỂM ĐỊNH ĐỒNG BỘ (MODELSIM) |
| |
| clk : _/¯\_/¯\_/¯\_/¯\_/¯\_/¯\_/¯\_/¯\_/¯\_/¯\_/¯\_/¯\_/¯\_/¯ |
| thread_id : [ Thread 0 ][ Thread 1 ][ Thread 0 ] |
| pc_out : 0x00000100 0x00000200 0x00000104 |
| lr_w_active : ______/¯¯¯\____________________________________ |
| link_busy[0] : ______/¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\_______________ |
| sc_w_active : ________________________________/¯¯¯\__________ |
| sc_success : ________________________________/¯¯¯\__________ |
| dmem_data_out : [ 0x00000000 ] [ 0xDEADBEEF ] [ 0x00000001 ] |
+-------------------------------------------------------------------------+
Kết quả đạt được
Hệ thống đã được tổng hợp thành công trên phần mềm Quartus II và kiểm tra thực tế trên kit FPGA Altera Cyclone II/IV (DE2 Board):
- Tần số hoạt động tối đa (Fmax): Đạt 55.0 MHz ở điều kiện mô phỏng sau tổng hợp (Post-Simulation với đầy đủ độ trễ dây nối và cổng logic) và đạt mức thiết kế danh định 80.0 MHz ở mô phỏng lý thuyết.
- Mức độ chiếm dụng tài nguyên phần cứng (FPGA Resource Utilization):
- Logic Elements (LEs) / ALMs: Chiếm dụng ~4.250 LEs (chiếm ~12.5% tổng tài nguyên chip Cyclone II EP2C35F672C6 trên bo mạch DE2).
- Dedicated Logic Registers: ~1.850 registers.
- Memory Bits (M4K Blocks): Sử dụng cho I-Mem và D-Mem nội bộ.
- Tỷ lệ vượt qua kiểm thử: Hoàn thành 100% các bài kiểm tra trong bộ testbench RV32I và bài toán đồng bộ hóa đa luồng phần cứng.
Đổi mới và đóng góp
- Khả năng tự chủ trong thiết kế vi kiến trúc RISC-V đa luồng: Khác với phần lớn các nghiên cứu trong nước chỉ dừng lại ở việc tinh chỉnh các lõi mã nguồn mở có sẵn (như Klessydra hoặc PicoRV32), đồ án này xây dựng một vi kiến trúc hoàn chỉnh từ mức chuyển thanh ghi (RTL), định nghĩa rõ ràng cấu trúc vi mạch của từng khối chức năng.
- Cơ chế đồng bộ hóa phần cứng độc lập: Tích hợp trực tiếp cặp lệnh nguyên tử
LR.W và SC.W vào tầng Execute kết hợp bộ quản lý Reservation Set nội tại, giúp giải quyết triệt để bài toán tương hỗ loại trừ giữa 2 luồng tính toán mà không cần hệ điều hành quản lý.
- Kết hợp đồng thời kỹ thuật Dự đoán nhánh động và Thực thi ngoài thứ tự:
- Sử dụng bảng BTB với bộ đếm bão hòa 2-bit giúp giảm thiểu tổn thất xung nhịp (Branch Penalty) từ 3 chu kỳ xuống còn 0 chu kỳ khi dự đoán đúng.
- Ứng dụng Renaming Register File (RRF) và Reservation Buffer (RB) loại bỏ xung đột dữ liệu giả (WAR, WAW), nâng cao thông lượng tổng thể của vi xử lý lên đến 35 - 40% so với kiến trúc đường ống đơn luồng In-Order truyền thống.
| Đặc điểm vi kiến trúc |
Lõi In-Order 5 tầng Cơ bản |
Lõi Klessydra T03 (Mở rộng) |
Kiến trúc RISC-V Đa luồng đề xuất |
| Số luồng phần cứng |
1 luồng duy nhất |
2-3 luồng (Interleaved) |
2 luồng chia sẻ Datapath linh hoạt |
| Dự đoán nhánh |
Tĩnh (Static Prediction) |
Tĩnh / Không hỗ trợ BTB |
Động (Dynamic 2-bit Saturating BTB) |
| Thực thi lệnh |
In-Order tuần tự |
In-Order |
Out-of-Order (khối ALU qua RB & RRF) |
| Cơ chế ghi lùi (WB) |
Cố định sau tầng MEM |
Cố định sau tầng MEM |
Lập lịch linh hoạt (Early WB Scheduler cho ALU) |
| Đồng bộ hóa |
Bằng phần mềm |
Hỗ trợ cơ bản |
Phần cứng chuyên dụng (LR.W & SC.W) |
Ứng dụng thực tế và triển khai
Kịch bản ứng dụng thực tế
- Nút mạng cảm biến thông minh trong IoT (IoT Edge Nodes): Một luồng phần cứng liên tục thực hiện việc thu thập, giải mã tín hiệu từ cảm biến qua giao tiếp SPI/I2C trong khi luồng còn lại thực hiện tính toán tiền xử lý số liệu hoặc mã hóa gói tin gửi đi mà không làm gián đoạn luồng thứ nhất.
- Bộ điều khiển truyền thông công nghiệp (Industrial Packet Processors): Luồng 0 chịu trách nhiệm nhận và kiểm tra tính toàn vẹn của khung dữ liệu (CRC Check); Luồng 1 thực hiện định tuyến và phản hồi tín hiệu theo thời gian thực (Real-time Deterministic Response).
- Hệ thống nhúng thời gian thực (Embedded RTOS Acceleration): Giảm thiểu chi phí chuyển đổi ngữ cảnh (Context Switching Overhead) của hệ điều hành nhúng xuống mức 0 chu kỳ lệnh vì ngữ cảnh của 2 tác vụ đã được lưu giữ trực tiếp tại các thanh ghi phần cứng riêng biệt.
+--------------------------------------------------------------------------+
| MÔ HÌNH TRIỂN KHAI THỰC TẾ |
| |
| +-----------------------+ +---------------------------+ |
| | Thread 0: IO Task | | Thread 1: Compute Task | |
| | - Read Sensor ADC | | - Digital Signal Filter | |
| | - UART / SPI Packet | | - Data Compression / AES | |
| +-----------+-----------+ +-------------+-------------+ |
| | | |
| +-------------------+ +-----------------+ |
| v v |
| +--------------------------------------+ |
| | 2-Slot Multithreaded RISC-V Core | |
| | (FPGA / ASIC Target Implementation) | |
| +--------------------------------------+ |
+--------------------------------------------------------------------------+
Hướng dẫn triển khai trên Bo mạch FPGA Altera DE2
- Chuẩn bị môi trường: Cài đặt phần mềm Altera Quartus II (phiên bản v13.0sp1 đối với chip Cyclone II hoặc v18.1 đối với Cyclone IV).
- Biên dịch mã nguồn RTL:
- Mở project Quartus, nạp các file thiết kế Verilog bao gồm Datapath, Controller, BTB, RB, RRF, ARF và Sync Unit.
- Gán chân (Pin Assignment) cho các tín hiệu Clock toàn cục (50MHz Oscillator), Reset (Push Button), và các cổng I/O hiển thị (LEDs, 7-Segment Display).
- Biên dịch chương trình điều khiển:
- Viết chương trình bằng Hợp ngữ RISC-V (chứa các tác vụ đa luồng).
- Chạy script Perl Assembler để sinh file nhớ
imem_data.hex hoặc imem_data.bin.
- Tổng hợp và nạp phần cứng:
- Thực hiện quá trình
Analysis & Synthesis, Fitter (Place & Route), Assembler và TimeQuest Timing Analysis.
- Kết nối bo mạch qua cáp USB-Blaster, sử dụng Quartus Programmer để nạp file
.sof vào chip FPGA và tiến hành đo đạc tín hiệu thực tế.
Hạn chế và hướng phát triển
Hạn chế kỹ thuật hiện tại
- Chưa tích hợp bộ nhớ phân cấp Cache (L1 I-Cache / D-Cache): Toàn bộ quá trình đọc/ghi bộ nhớ hiện đang tương tác trực tiếp với khối On-chip Block RAM, chưa mô phỏng được độ trễ thực tế của bộ nhớ ngoài SDRAM/DDR.
- Tập lệnh chưa hỗ trợ phép Nhân/Chia phần cứng (Extension M): Các phép nhân chia số nguyên 32-bit vẫn phải thực hiện thông qua các thuật toán phần mềm lặp lại, làm hạn chế hiệu năng xử lý thuật toán số học phức tạp.
- Số lượng luồng giới hạn ở mức 2 slot: Cấu trúc mới chỉ hỗ trợ luân phiên 2 luồng phần cứng, chưa mở rộng linh hoạt lên mô hình 4 hoặc 8 luồng (Simultaneous Multithreading - SMT mở rộng).
Hướng phát triển trong tương lai
- Nâng cấp tập lệnh lên chuẩn RV32IMAC: Bổ sung bộ nhân chia phần cứng (
M), tập mở rộng atomic hoàn chỉnh (A) và tập lệnh nén 16-bit (C) để tối ưu hóa dung lượng bộ nhớ chương trình.
- Thiết kế hệ thống Cache đa tầng với giao thức duy trì nhất quán dữ liệu (Cache Coherency Protocol): Triển khai giao thức MESI/MOESI cho bộ nhớ Cache đa luồng.
- Tích hợp chuẩn giao tiếp Bus công nghiệp AXI4/Wishbone: Cho phép kết nối lõi vi xử lý đa luồng với các khối ngoại vi chuẩn (UART, SPI, Ethernet MAC, DMA Controller).
- Hiện thực hóa trên tiến trình bán dẫn ASIC: Chuyển đổi mã nguồn RTL sang thư viện công nghệ chuẩn (Standard Cell Library) 65nm/28nm để đo lường công suất tiêu thụ (Power) và diện tích thực tế (Area).
Đối tượng hưởng lợi
- Sinh viên và Giảng viên ngành Kỹ thuật Máy tính, Điện tử - Viễn thông: Đóng vai trò là tài liệu tham khảo thực tiễn chuyên sâu bằng tiếng Việt về kiến trúc vi xử lý nâng cao, minh họa rõ ràng các khái niệm phức tạp như Hazard Handling, Out-of-Order Execution và Multithreading.
- Kỹ sư Thiết kế Vi mạch và Hệ thống Nhúng (IC/SoC Design Engineers): Cung cấp mã nguồn tham khảo mẫu (RTL Reference Model) được viết bằng Verilog HDL chuẩn hóa, dễ dàng tích hợp và mở rộng thành các lõi xử lý chuyên dụng cho các dòng chip IoT.
- Các Nhà nghiên cứu Kiến trúc Máy tính (Computer Architecture Researchers): Cung cấp nền tảng vi kiến trúc mở để tiếp tục thử nghiệm các thuật toán dự đoán rẽ nhánh mới, cơ chế bảo mật phần cứng chống tấn công kênh phụ (Side-channel Attacks như Spectre/Meltdown) trên kiến trúc đa luồng.
- Doanh nghiệp Phát triển Thiết bị Phần cứng Thông minh: Tiết kiệm thời gian và chi phí bản quyền thiết kế lõi (IP Cores) khi muốn phát triển các dòng vi điều khiển nội địa ứng dụng cho công tơ điện tử, bộ điều khiển nhà thông minh và hệ thống xe tự hành.
Câu hỏi thường gặp
1. Sự khác biệt cốt lõi giữa vi xử lý Đa luồng (Multithreaded Processor) và vi xử lý Đa lõi (Multicore Processor) là gì?
Bộ vi xử lý đa lõi (Multicore) nhân bản toàn bộ các đơn vị xử lý vật lý (mỗi lõi có đầy đủ ALU, thanh ghi, đường ống riêng biệt), dẫn đến diện tích đế bán dẫn và mức tiêu thụ điện năng tăng gấp đôi. Trong khi đó, bộ vi xử lý đa luồng (Multithreaded) chỉ nhân bản các thành phần lưu trữ ngữ cảnh (như thanh ghi trạng thái, Program Counter, thanh ghi kiến trúc) nhưng chia sẻ chung các đơn vị thực thi đắt giá (như khối ALU, đường ống lệnh, bộ giải mã). Điều này giúp tăng thông lượng xử lý đáng kể với chi phí phần cứng tăng thêm chỉ từ 20% đến 35%.
2. Cặp lệnh LR.W và SC.W giải quyết bài toán tương hỗ loại trừ (Mutual Exclusion) như thế nào?
Lệnh LR.W (Load Reserved) đọc một từ dữ liệu từ bộ nhớ và đồng thời đăng ký một địa chỉ bảo lưu (Reservation Set) trong phần cứng kèm theo cờ liên kết busy = 1. Lệnh SC.W (Store Conditional) sau đó sẽ kiểm tra xem địa chỉ cần ghi có khớp với địa chỉ đã bảo lưu hay không và cờ busy còn nguyên vẹn hay không. Nếu trong khoảng thời gian giữa LR.W và SC.W không có luồng nào khác can thiệp ghi đè vào địa chỉ đó, SC.W sẽ ghi dữ liệu thành công và trả về giá trị 0. Nếu có xung đột xảy ra, SC.W sẽ từ chối ghi và trả về giá trị khác 0, buộc chương trình phải thực hiện lại chu trình. Cơ chế này loại bỏ hoàn toàn hiện tượng tranh chấp dữ liệu (Race Conditions).
3. Tại sao hệ thống lại tích hợp cả hai kỹ thuật Out-of-Order (OoO) và Dynamic Branch Prediction?
Trong vi kiến trúc đường ống, lệnh rẽ nhánh và các lệnh có độ trễ lớn (như đọc bộ nhớ) là nguyên nhân chính gây ra chu kỳ đình trệ (Stalls). Việc tích hợp bộ dự đoán nhánh động 2-bit (BTB) giúp đường ống tiếp tục nạp lệnh với tỷ lệ chính xác cao mà không cần đợi kết quả tính toán nhánh tại tầng Execute. Trong trường hợp toán hạng của một lệnh chưa sẵn sàng, kỹ thuật Out-of-Order (thông qua Reservation Buffer và Renaming Register File) cho phép vi xử lý tạm gác lệnh đó lại để thực thi các lệnh độc lập kế tiếp, từ đó triệt tiêu các bong bóng đường ống (Pipeline Bubbles) và tối đa hóa hiệu suất sử dụng của ALU.
4. Bo mạch FPGA Altera DE2 đáp ứng yêu cầu kiểm thử của thiết kế như thế nào?
Bo mạch Altera DE2 trang bị chip FPGA Cyclone II EP2C35F672C6 với 33.216 Logic Elements (LEs) và 483.840 bits bộ nhớ nhúng, hoàn toàn dư dả để tổng hợp toàn bộ thiết kế vi xử lý đa luồng (chỉ chiếm ~4.250 LEs). Bo mạch cung cấp nguồn dao động chuẩn 50 MHz cùng hệ thống hiển thị LED và 7-Segment trực quan, cho phép kỹ sư quan sát trực tiếp giá trị thanh ghi, trạng thái luồng và kết quả tính toán phần cứng ở tốc độ thời gian thực.
5. Thiết kế này có thể mở rộng để chạy hệ điều hành Linux nhúng được không?
Để có thể chạy được hệ điều hành Linux đầy đủ, vi kiến trúc hiện tại cần được mở rộng thêm 3 thành phần chính: (1) Bổ sung đơn vị quản lý bộ nhớ ảo (MMU - Memory Management Unit) hỗ trợ phân trang chuẩn SV32; (2) Hỗ trợ đầy đủ các mức đặc quyền phần cứng (Machine Mode, Supervisor Mode, User Mode) theo chuẩn RISC-V Privileged Specification; (3) Tích hợp bộ điều khiển ngắt nội bộ (CLINT) và bộ điều khiển ngắt ngoại vi mức nền tảng (PLIC). Đây chính là định hướng phát triển hoàn toàn khả thi từ nền tảng RTL vững chắc của đồ án này.
Kết luận
Đồ án tốt nghiệp "Nghiên Cứu Thiết Kế Bộ Vi Xử Lý RISC-V Theo Vi Kiến Trúc Multithread" của tác giả Lê Nguyễn Hoàng Thiên đã chứng minh tính khả thi và hiệu quả vượt trội của việc tích hợp kiến trúc đa luồng phần cứng trên nền tảng tập lệnh mã nguồn mở RISC-V 32-bit. Bằng việc kết hợp hài hòa giữa cơ chế đồng bộ hóa nguyên tử LR.W/SC.W, bộ dự đoán nhánh động 2-bit BTB, và kỹ thuật thực thi ngoài thứ tự OoO, bộ vi xử lý đã giải quyết triệt để bài toán suy hao hiệu năng do xung đột dữ liệu và xung đột điều khiển trong đường ống vi kiến trúc.
Kết quả tổng hợp và kiểm định thực tế trên chip FPGA Altera DE2 đạt tần số hoạt động 55 MHz – 80 MHz cùng tỷ lệ vượt qua 100% các bài kiểm tra chức năng khẳng định độ tin cậy và chất lượng cao của thiết kế. Công trình không chỉ đóng góp một giải pháp vi kiến trúc giá trị cho hệ sinh thái vi mạch Việt Nam mà còn là nền tảng học thuật và thực tiễn vững chắc cho các nghiên cứu phát triển vi xử lý hiệu năng cao trong tương lai.