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

Trong kiến trúc máy tính hiện đại, tập lệnh nguồn mở RISC-V (Reduced Instruction Set Computer) đang trở thành xu hướng phát triển nhờ tính tự do bản quyền, khả năng mở rộng linh hoạt và tiềm năng ứng dụng rộng rãi từ các thiết bị Internet vạn vật (IoT) cho đến các hệ thống tính toán hiệu năng cao. Việc sử dụng kiến trúc tập lệnh mở cho phép chuẩn hóa nền tảng phần cứng và tái sử dụng phần mềm lâu dài mà không bị phụ thuộc vào các kiến trúc độc quyền.

Tuy nhiên, các bộ xử lý vô hướng (scalar processor) truyền thống chỉ có thể nạp và thực thi tối đa một lệnh trong mỗi chu kỳ xung nhịp, tạo ra giới hạn về thông lượng xử lý. Để khai thác tính song song mức lệnh (Instruction-Level Parallelism - ILP), kiến trúc Superscalar được áp dụng nhằm thực thi đồng thời nhiều lệnh trên một chu kỳ. Đi kèm với việc nâng cao hiệu suất xử lý là hai nút thắt kỹ thuật lớn: độ trễ truy xuất bộ nhớ và tổn thất chu kỳ do rẽ nhánh điều khiển (Control Hazard). Tốc độ của bộ vi xử lý nhanh hơn rất nhiều so với bộ nhớ chính, đòi hỏi hệ thống bộ nhớ phân cấp phải có bộ nhớ đệm (Cache) tốc độ cao. Đồng thời, các lệnh rẽ nhánh trong cấu trúc chương trình đòi hỏi cơ chế dự đoán rẽ nhánh (Branch Prediction) để hạn chế tối đa số chu kỳ lãng phí (bubble/stall) khi nạp lệnh vào đường ống (pipeline).

Từ thực tiễn trên, đề tài khóa luận "Thiết kế và hiện thực lõi vi xử lý RISC-V RV64IM theo kiến trúc Superscalar, hỗ trợ 4-way Set Associative Cache và Branch Prediction trên FPGA" của tác giả Trần Tuấn Khanh và Phạm Thanh Lâm (ngành Kỹ thuật Máy tính, Trường Đại học Công nghệ Thông tin – ĐHQG-HCM, năm 2023) tập trung giải quyết các bài toán thiết kế phần cứng nêu trên.

Mục tiêu nghiên cứu được xác định cụ thể gồm 8 nội dung:

  1. Thiết kế bộ vi xử lý 64-bit thực thi các lệnh cơ bản thuộc kiến trúc RV64I và các lệnh nhân/chia thuộc phần mở rộng RV64M.
  2. Thiết kế pipeline 5 tầng, tích hợp 32 thanh ghi số nguyên 64-bit cho tập lệnh RISC-V RV64IM.
  3. Thiết kế và tích hợp khối dự đoán rẽ nhánh (Branch Prediction).
  4. Thiết kế vi xử lý theo kiến trúc Superscalar thực thi 2 lệnh đồng thời.
  5. Thiết kế và tích hợp bộ nhớ đệm 4-Way Set Associative Cache.
  6. Kiểm tra các tập lệnh và không gian địa chỉ thông qua mô phỏng trên phần mềm Vivado.
  7. Đạt tần số hoạt động 100 MHz cho thiết kế phần cứng.
  8. Nạp và thực thi thành công thiết kế lên kit FPGA thương mại.

Đối tượng nghiên cứu là lõi vi xử lý RISC-V RV64IM 64-bit. Phạm vi nghiên cứu giới hạn ở việc mô hình hóa phần cứng bằng ngôn ngữ mô tả phần cứng trên công cụ Xilinx Vivado, tích hợp Cache dung lượng 512 bytes, cơ chế Two-Level Adaptive Branch Prediction, kiểm thử mô phỏng dạng sóng và thực thi vật lý trên kit FPGA Xilinx Virtex-7 VC707 ở tần số 100 MHz.


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

Khóa luận dựa trên nền tảng lý thuyết kiến trúc máy tính và tập lệnh phần cứng chuẩn của tổ chức RISC-V International:

  • Kiến trúc tập lệnh RISC-V: Sử dụng tập lệnh cơ sở RV32I, RV64I và phần mở rộng phép nhân/chia số nguyên RV32M, RV64M. Không gian địa chỉ 64-bit, tổ chức theo định dạng Little-Endian với kiến trúc Load-Store. Hệ thống 32 thanh ghi đa năng ($x_0 - x_{31}$) có độ rộng 64-bit, trong đó $x_0$ luôn giữ giá trị 0.
  • Kỹ thuật đường ống (Pipeline 5 tầng): Gồm các giai đoạn Nạp lệnh (IF), Giải mã lệnh (ID), Thực thi (EX), Truy xuất bộ nhớ (MEM) và Ghi lại thanh ghi (WB). Cơ chế xử lý xung đột dữ liệu (Data Hazard) qua Forwarding Unit và xử lý xung đột điều khiển (Control Hazard) qua khối kiểm tra rẽ nhánh.
  • Dự đoán rẽ nhánh động (Dynamic Branch Prediction): Áp dụng mô hình Two-Level Adaptive Predictor, bao gồm thanh ghi dịch lịch sử rẽ nhánh (Branch History Shift Register - BHSR) $k$-bit và Bảng lịch sử mẫu (Pattern History Table - PHT) sử dụng bộ đếm bão hòa 2-bit (2-bit Saturating Counter) với 4 trạng thái: Strong Taken (11), Weak Taken (10), Weak Not Taken (01), Strong Not Taken (00).
  • Bộ nhớ đệm ánh xạ tập hợp 4 đường (4-Way Set Associative Cache): Cấu trúc phân chia địa chỉ gồm trường Tag, Index (5-bit) và Offset; dữ liệu quản lý qua các trường Valid bit, Tag và Data. Giải thuật thay thế khối bộ nhớ đệm sử dụng nguyên lý FIFO (First-In, First-Out).
  • Thuật toán xử lý số học phần cứng: Phép nhân thực hiện theo giải thuật dịch và cộng (Shift-and-add Multiplier); phép chia thực hiện theo giải thuật dịch và trừ (Shift-and-subtract Divider).
  • Chuẩn giao tiếp hệ thống: Giao thức bus chuẩn công nghiệp ARM AMBA AXI4 (Advanced eXtensible Interface).

Phương pháp nghiên cứu gồm: thiết kế phần cứng mức chuyển thanh ghi (RTL), mô phỏng chức năng và dạng sóng (waveform timing simulation) trên Xilinx Vivado, tổng hợp logic (Logic Synthesis), tối ưu hóa định tuyến (Place & Route) và nạp bitstream kiểm thử thực nghiệm trên kit phần cứng Xilinx Virtex-7 VC707.


Thiết kế và triển khai

Hệ thống vi xử lý được thiết kế theo kiến trúc Superscalar 2 luồng (dual-issue), cho phép nạp và xử lý đồng thời 2 lệnh trong một chu kỳ xung nhịp qua đường ống 5 tầng:

Giai đoạn Pipeline Chức năng chi tiết trong thiết kế
Instruction Fetch (IF) Bộ đếm chương trình (PCReg) cấp địa chỉ cho khối Instruction Memory / ICache để lấy 2 mã lệnh liên tiếp (ins1[31:0], ins2[31:0]). Xử lý lựa chọn địa chỉ kế tiếp ($PC+8$, $PC+4$, $PC+\text{imm}$, hoặc địa chỉ nhảy) dựa trên tín hiệu từ khối Branch Prediction.
Instruction Decode (ID) Giải mã đồng thời 2 lệnh, đọc dữ liệu từ Register File (32 thanh ghi 64-bit). Khối Hazard Detection kiểm tra xung đột dữ liệu giữa các cặp lệnh (RAW, WAW) để tạo tín hiệu stall hoặc kích hoạt Forwarding; khối Branch Compare xác định điều kiện rẽ nhánh.
Execute (EX) Thực thi tính toán số học trên 2 khối ALU độc lập, tính toán địa chỉ bộ nhớ cho Data Cache. Khối Nhân (Shift-and-add) và khối Chia (Shift-and-subtract) được điều khiển theo chu kỳ đếm (count_div[5:0]).
Memory Access (MEM) Truy xuất đọc/ghi dữ liệu vào Data Memory / DCache. Do đường truyền dữ liệu chỉ có 1 cổng truy xuất chính, hệ thống ưu tiên phân luồng truy cập đã được thiết lập từ tầng IF.
Write Back (WB) Chọn lựa kết quả từ ALU hoặc Data Cache để cập nhật giá trị trả về các thanh ghi đích trong Register File.
                               KIẾN TRÚC TỔNG THỂ HỆ THỐNG

Về tổ chức bộ nhớ đệm, khối Cache được xây dựng theo cấu trúc 4-way set associative với tổng dung lượng 512 bytes, chia thành 32 Set (mỗi Set gồm 4 Way). Bộ điều khiển Cache thực hiện so sánh trường Tag của địa chỉ truy xuất với 4 Tag trong Set tương ứng; nếu trùng khớp (Cache Hit), dữ liệu được truyền thẳng tới CPU; nếu không trùng khớp (Cache Miss), bộ điều khiển truy xuất bộ nhớ chính và nạp khối mới vào Cache theo giải thuật thay thế FIFO.

Khối thiết kế hệ thống trên Vivado Block Design tích hợp lõi vi xử lý thông qua giao thức AXI4, liên kết với IP vi điều khiển MicroBlaze, IP bộ nhớ cục bộ (Local Memory) và IP AXI UART Lite để phục vụ truyền nhận dữ liệu gỡ lỗi và xuất kết quả ra thiết bị ngoại vi.


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

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

Chương 1 trình bày tổng quan về nguồn gốc và lợi thế của kiến trúc tập lệnh mở RISC-V trong bối cảnh phát triển công nghệ IoT và thiết kế vi xử lý không bản quyền. Tác giả phân tích tính cấp thiết của việc áp dụng kiến trúc Superscalar kết hợp 4-way Set Associative Cache và kỹ thuật Branch Prediction nhằm giải quyết các giới hạn về hiệu năng của vi xử lý vô hướng. Chương này xác định rõ 8 mục tiêu kỹ thuật, giới hạn đề tài ở tập lệnh RV64IM, tần số 100 MHz trên FPGA, đồng thời điểm qua các công trình nghiên cứu liên quan trong nước (Đại học Công nghệ Thông tin) và quốc tế (Hội nghị ACM WCAE, IEEE DSD).

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

Chương 2 cung cấp toàn bộ cơ sở lý thuyết phần cứng:

  • Bảng danh mục các tập lệnh: RV32I (37 lệnh), RV64I (12 lệnh mở rộng 64-bit), RV32M (8 lệnh nhân chia 32-bit), RV64M (5 lệnh nhân chia 64-bit) và cấu trúc 32 thanh ghi 64-bit.
  • 6 định dạng lệnh chuẩn của RISC-V: R-type, I-type, S-type, B-type, U-type, J-type.
  • Nguyên lý hoạt động của đường ống 5 tầng và cơ chế giải quyết các xung đột: Structural Hazard, Data Hazard (bằng kỹ thuật Forwarding) và Control Hazard.
  • Phân tích và so sánh các kỹ thuật dự đoán rẽ nhánh: Static, Dynamic (Two-Level Adaptive) và Tournament. Phân tích chi tiết mô hình Two-Level Adaptive với bộ đếm bão hòa 2-bit, chứng minh ưu thế số lần dự đoán sai ít hơn so với 1-bit (qua ví dụ 2 vòng lặp lồng nhau: 1-bit sai 5-6 lần, 2-bit sai 3-5 lần trên 15 lần nhảy) và lý giải nguyên nhân không dùng 3-bit/4-bit dựa trên nghiên cứu của Marwa A. Ibrahim và Cherif Salama.
  • Kiến trúc Superscalar và phương pháp giải quyết xung đột Write-after-Write (WAW), Read-after-Write (RAW), các kịch bản xuất hiện lệnh nhảy đồng thời.
  • Thuật toán nhân dịch-cộng (Shift-and-add) và thuật toán chia dịch-trừ (Shift-and-subtract).
  • Cấu trúc bộ nhớ đệm ánh xạ trực tiếp (Direct-mapped) và ánh xạ tập hợp 4 đường (4-way set associative) dung lượng 512 bytes gồm 32 Sets, kèm giải thuật thay thế FIFO.

Chương 3. Thiết kế vi xử lý RISC-V

Chương 3 chi tiết hóa việc thiết kế các khối chức năng phần cứng ở mức thanh ghi và cổng logic:

  • Sơ đồ khối tổng quan và luồng dữ liệu chi tiết của đường ống 5 tầng tích hợp ICache và DCache.
  • Thiết kế khối Instruction Memory (IMem): đầu vào addrPC[9:0], xuất đồng thời 2 lệnh 32-bit ins1[31:0] và ins2[31:0].
  • Thiết kế khối PCReg: quản lý tín hiệu clk, clr, stall, flush, is_div, count_div[5:0], PCin[63:0] và PCout[63:0].
  • Thiết kế khối Register File (32 thanh ghi 64-bit), khối Decoder, khối Hazard Detection, khối Branch Compare, khối tính toán số học ALU, khối chuyển tiếp Forwarding Unit, khối Data Memory và khối Cache_2port.

Chương 4. Mô phỏng và đánh giá thiết kế

Chương 4 tập trung vào quy trình kiểm thử và đánh giá định lượng:

  • Mô phỏng độc lập khối nhân và khối chia, thiết lập tần số xung nhịp và phân tích tổng hợp timing.
  • Kiểm thử các tập lệnh cơ bản của RV64IM, tập lệnh kiểm tra xung đột dữ liệu (Hazard Test) và các tập lệnh nhảy không điều kiện (jal, jalr), nhảy có điều kiện (beq, bne, blt, bge, bltu, bgeu).
  • Đánh giá thực nghiệm độ chính xác của khối dự đoán rẽ nhánh qua 5 tập chương trình kiểm thử có cấu trúc vòng lặp từ 1 đến 3 tầng (Test 1 đến Test 5).
  • Báo cáo kết quả tổng hợp (Synthesis) và thực thi (Implementation) trên phần mềm Vivado: thống kê tài nguyên phần cứng (LUT, FF, BRAM, I/O), báo cáo timing đạt tần số 100 MHz, báo cáo công suất tiêu thụ (Power Report) và kết quả kiểm thử thực tế khi nạp bitstream lên kit FPGA Xilinx Virtex-7 VC707.

Chương 5. Thiết kế Block Design trên Vivado với giao thức AXI4

Chương 5 trình bày việc tích hợp hệ sinh thái System-on-Chip (SoC) xung quanh lõi vi xử lý RISC-V:

  • Tổng quan cấu trúc giao thức bus ARM AMBA AXI4, chu trình giao dịch đọc (Read Transaction) và ghi (Write Transaction).
  • Xây dựng sơ đồ khối thiết kế tổng thể (Block Design) trên Vivado.
  • Cấu hình và kết nối các khối IP chuẩn của Xilinx: IP vi xử lý MicroBlaze giao tiếp Local Memory và IP AXI UART Lite phục vụ truyền thông nối tiếp.

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

Chương 6 tổng kết các kết quả đạt được đối chiếu với mục tiêu đề ra ban đầu và đề xuất các định hướng nghiên cứu mở rộng trong tương lai.


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

Khóa luận đã hoàn thành thiết kế, mô phỏng và hiện thực hóa thành công lõi vi xử lý trên phần cứng với các kết quả cụ thể:

1. Thông số kỹ thuật và kết quả phần cứng

Hạng mục thiết kế Đặc tính kỹ thuật đạt được
Kiến trúc tập lệnh RISC-V RV64IM đầy đủ (gồm RV32I, RV64I, RV32M, RV64M).
Kiến trúc vi xử lý Superscalar dual-issue (xử lý 2 lệnh song song/chu kỳ), Pipeline 5 tầng.
Tập thanh ghi 32 thanh ghi đa năng độ rộng 64-bit ($x_0 - x_{31}$).
Dự đoán rẽ nhánh Two-Level Adaptive Predictor (kết hợp BHSR và PHT 2-bit counter).
Bộ nhớ đệm (Cache) 4-Way Set Associative Cache, dung lượng 512 Bytes, 32 Sets, giải thuật FIFO.
Tần số hoạt động Đạt 100 MHz sau khi tổng hợp và tối ưu timing trên Vivado.
Phần cứng thực thi Kit FPGA thương mại Xilinx Virtex-7 VC707 (đã generate bitstream và nạp thành công).
Giao tiếp ngoại vi Tích hợp hệ thống qua giao thức bus AXI4, liên kết MicroBlaze và AXI UART Lite.

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

  • Hoàn thiện một lõi xử lý 64-bit mở rộng (RV64IM) trên FPGA có khả năng thực thi song song 2 lệnh đồng thời, tự động xử lý xung đột dữ liệu và cấu trúc.
  • Hiện thực thành công bộ nhớ đệm 4 đường và cơ chế dự đoán rẽ nhánh 2 tầng, giúp giảm đáng kể số chu kỳ trễ khi truy xuất bộ nhớ và thực thi các khối mã lệnh lặp/nhánh.
  • Xây dựng hoàn chỉnh mô hình Block Design chuẩn AXI4, tạo tiền đề ghép nối các IP ngoại vi phức tạp cho các ứng dụng nhúng và IoT.

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

Dựa trên giới hạn phạm vi nghiên cứu được nêu trong văn bản, đề tài còn một số điểm cần tiếp tục phát triển:

  • Hạn chế:
    • Dung lượng bộ nhớ đệm Cache tích hợp còn nhỏ (512 bytes), chưa đáp ứng được các ứng dụng yêu cầu tập dữ liệu lớn.
    • Khối nhân và khối chia sử dụng giải thuật dịch-cộng và dịch-trừ tuần tự, dẫn đến việc tiêu tốn nhiều chu kỳ xung nhịp so với việc sử dụng các khối DSP cứng chuyên dụng hoặc thuật toán cây Wallace (Wallace Tree).
    • Chưa tích hợp khối quản lý bộ nhớ (Memory Management Unit - MMU) và các tập lệnh tính toán số thực dấu chấm động (Floating Point Extensions - F/D).
  • Hướng nghiên cứu tiếp:
    • Mở rộng dung lượng và phân cấp bộ nhớ đệm (L1, L2 Cache).
    • Nâng cấp khối nhân/chia số học bằng việc tận dụng tài nguyên DSP Slices trên FPGA để rút ngắn chu kỳ thực thi.
    • Bổ sung khối MMU và các tập lệnh mở rộng chuẩn để có thể nạp và chạy các hệ điều hành mã nguồn mở (như Linux) trên lõi vi xử lý.
    • Tối ưu hóa kiến trúc Superscalar để mở rộng khả năng phát nhiều hơn 2 lệnh đồng thời (multi-issue).

Giá trị tham khảo

Báo cáo khóa luận là tài liệu tham khảo giá trị cho:

  • Sinh viên và học viên cao học thuộc các chuyên ngành Kỹ thuật Máy tính, Điện tử - Viễn thông, Thiết kế Vi mạch và Khoa học Máy tính cần nghiên cứu về thiết kế vi xử lý, kiến trúc RISC-V và kỹ thuật lập trình phần cứng bằng HDL.
  • Kỹ sư thiết kế phần cứng / FPGA: Tham khảo chi tiết thiết kế khối dự đoán rẽ nhánh Two-Level Adaptive Predictor (BHSR + PHT), cấu trúc bộ nhớ đệm 4-Way Set Associative với giải thuật FIFO, quy trình tổng hợp timing đạt 100 MHz và phương pháp tích hợp giao tiếp AXI4 trên Xilinx Vivado.

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

1. Tại sao đề tài lựa chọn bộ dự đoán Two-Level Adaptive Branch Prediction 2-bit thay vì 1-bit hoặc 3-4 bit?

Trong Chương 2, tác giả đã kiểm chứng rằng cơ chế 2-bit (với 4 trạng thái: Strong/Weak Taken, Strong/Weak Not Taken) giảm số lần dự đoán sai từ 5-6 lần xuống còn 3-5 lần trong cùng một cấu trúc vòng lặp so với bộ dự đoán 1-bit. Mặt khác, trích dẫn nghiên cứu của Marwa A. Ibrahim và Cherif Salama cho thấy khi tăng lên 3-bit hoặc 4-bit, tỷ lệ dự đoán sai khi số vòng lặp tăng lên lại cao hơn so với 2-bit, đồng thời làm phức tạp hóa phần cứng. Do đó, Two-Level Adaptive 2-bit là cấu hình tối ưu giữa độ chính xác và chi phí tài nguyên phần cứng.

2. Bộ nhớ đệm 4-Way Set Associative trong thiết kế được tổ chức như thế nào?

Bộ nhớ đệm có dung lượng 512 bytes, được tổ chức thành 32 Set, mỗi Set gồm 4 đường (4 Way / Cache line). Mỗi dòng Cache lưu trữ các trường: 1 bit Valid (xác thực dữ liệu hợp lệ), trường Tag (để so sánh nhận diện địa chỉ) và trường Data. Địa chỉ từ CPU phát ra được chia làm 3 trường: Tag, Index (5-bit tương ứng 32 Set) và Offset. Giải thuật thay thế khối khi xảy ra Cache Miss là giải thuật FIFO (First-In, First-Out).

3. Kiến trúc Superscalar trong thiết kế xử lý xung đột dữ liệu (RAW, WAW) và lệnh nhảy như thế nào?

  • Đối với xung đột dữ liệu giữa 2 lệnh chạy cùng chu kỳ (như WAW hoặc RAW), hệ thống thực hiện stall lệnh thứ hai 1 chu kỳ so với lệnh thứ nhất.
  • Đối với xung đột RAW giữa các lệnh lệch nhau chu kỳ, hệ thống kích hoạt khối Forwarding Unit truyền trực tiếp kết quả từ tầng EX hoặc MEM về đầu vào ALU mà không cần chờ ghi về Register File.
  • Đối với 2 lệnh nhảy xuất hiện cùng lúc, hệ thống chỉ thực hiện lệnh nhảy thứ nhất và phớt lờ lệnh nhảy thứ hai. Nếu một lệnh nhảy đi kèm một lệnh không nhảy, lệnh nhảy được ưu tiên và lệnh sau bị hủy nếu nhánh được thực thi.

4. Thuật toán phần cứng nào được sử dụng cho khối Nhân và khối Chia trong phần mở rộng M?

Khối Nhân (MUL/MULW/...) sử dụng giải thuật Shift-and-add Multiplier (dịch trái toán hạng được nhân và cộng dồn vào kết quả dựa trên từng bit của toán hạng nhân). Khối Chia (DIV/DIVW/REM/REMW/...) sử dụng giải thuật Shift-and-subtract Divider (dịch phải số chia và thực hiện phép trừ nhị phân với số bị chia để sinh từng bit của thương số và số dư).

5. Thiết kế đã được tổng hợp, kiểm thử và thực thi trên nền tảng phần cứng nào?

Thiết kế được mô phỏng chức năng, kiểm tra dạng sóng và tổng hợp trên phần mềm Xilinx Vivado, đạt tần số làm việc 100 MHz. Thiết kế đã được tạo file bitstream và nạp thực thi thành công trên kit đánh giá phần cứng FPGA Xilinx Virtex-7 VC707 (tích hợp giao tiếp hệ thống AXI4 với MicroBlaze và AXI UART Lite).


Kết luận

Khóa luận tốt nghiệp của tác giả Trần Tuấn Khanh và Phạm Thanh Lâm đã nghiên cứu và hiện thực thành công lõi vi xử lý 64-bit RISC-V RV64IM theo kiến trúc Superscalar trên nền tảng FPGA Xilinx Virtex-7 VC707. Bằng việc tích hợp bộ nhớ đệm 4-Way Set Associative dung lượng 512 bytes và khối dự đoán rẽ nhánh Two-Level Adaptive 2-bit, thiết kế đã giải quyết hiệu quả bài toán tối ưu thông lượng xử lý và giảm độ trễ truy xuất dữ liệu ở tần số hoạt động 100 MHz. Toàn bộ công trình cung cấp sơ đồ thiết kế chi tiết, phương pháp xử lý xung đột đường ống và quy trình kiểm thử hoàn chỉnh theo chuẩn công nghiệp AXI4.