Fursoy: CPU RISC-V out-of-order 64-bit chạy Linux 6.6
Một dự án mới công bố lõi xử lý RISC-V 64-bit out-of-order superscalar viết bằng SystemVerilog, có thể khởi động nhân Linux 6.6.50 và BusyBox. Thiết kế đạt 500 MHz trên thư viện chuẩn Nangate 45nm và gây chú ý vì mức độ hoàn thiện hiếm thấy ở các dự án CPU mã nguồn mở.

Một dự án mang tên Fursoy Slice-1 vừa được giới thiệu trên Hacker News: lõi xử lý RISC-V 64-bit out-of-order superscalar (thực thi không theo thứ tự, nhiều lệnh mỗi chu kỳ) viết hoàn toàn bằng SystemVerilog, có khả năng khởi động nhân Linux chính thức 6.6.50 cùng không gian người dùng BusyBox. Điểm đáng chú ý là dự án không chỉ dừng ở mô phỏng lý thuyết mà còn có báo cáo tổng hợp phần cứng thực tế ở tần số 500 MHz.
Kiến trúc vi xử lý
Lõi fursoy_s1_core hỗ trợ tập lệnh RV64IMAFDV, bổ sung các tập mở rộng Zba, Zbb, Zicsr và Zifencei. Ở mức vi kiến trúc:
- 2-wide superscalar: tìm nạp, giải mã, đổi tên thanh ghi và hoàn tất (retire) 2 lệnh mỗi chu kỳ, hỗ trợ ba chế độ đặc quyền M/S/U với
medeleg/mideleg, lệnhWFI,MRET/SRET. - Reorder Buffer (ROB) 128 mục với thẻ epoch 4 bit an toàn khi tràn số, cho phép khôi phục chính xác khi có ngoại lệ hoặc ngắt.
- Thanh ghi vật lý nguyên 160 mục (trong đó 128 mục speculative), kèm 8 checkpoint nhánh để quay lui bảng đổi tên thanh ghi (RAT) trong một chu kỳ.
- Hàng đợi phát lệnh riêng: 32 mục cho phép tính nguyên, 32 mục cho bộ nhớ, cùng hàng đợi vector tách rời 8 mục với VLEN = 256, ELEN = 64 và 48 thanh ghi vector vật lý.
- Bộ ALU và branch unit Kogge-Stone dùng tiền tố song song 64-bit, bộ nhân pipeline 3 tầng và bộ chia phần cứng.
Phần bộ nhớ ảo dùng Sv39 (không gian địa chỉ ảo 39 bit) với DTLB hai cổng: TLB nền 64 mục 4 đường kết hợp (16 tập, thay thế Tree-PLRU) cùng CAM siêu trang 8 mục cho trang 2 MiB và 1 GiB, cộng bảng yêu cầu dịch địa chỉ 32 mục. ITLB có cấu trúc tương tự. Bộ PTW (bộ đi bảng trang phần cứng) dùng chung, có cơ chế snoop dữ liệu bẩn của L1D để quan sát trực tiếp các lần ghi bảng trang còn nằm trong cache, kết hợp làm sạch hàng đợi store và cache dữ liệu khi gặp SFENCE.VMA.
Hai cache cấp 1 đều 16 KiB, 4 đường kết hợp (64 tập × 64 B). L1I an toàn VIPT với bộ nạp trước next-line thận trọng và 2 I-MSHR. L1D có 8 bank, là cache dữ liệu non-blocking với 16 mục Load Queue, 16 mục Store Queue, 4 MSHR và bộ đệm ghi lại 2 mục.
SoC, ngoại vi và tổng hợp vật lý
Phần SoC fursoy_s1_soc dùng crossbar ưu tiên 5-1: MMIO của lõi > đi bảng trang > nạp lại L1I > nạp lại L1D > ghi ngược dữ liệu bẩn, có cơ chế chống đói tài nguyên và bẫy lỗi bus khi truy cập vùng địa chỉ chưa ánh xạ. Nền tảng gồm giao diện DRAM 256 MiB tại 0x8000_0000, CLINT tại 0x0200_0000, PLIC tại 0x0C00_0000 với 31 nguồn ngoại vi, UART 16550 tại 0x1000_0000 và firmware M-mode tối giản hỗ trợ SBI v2.0 (Base, TIME, SRST, DBCN).
Dự án đã tổng hợp thử nghiệm 8 khối chức năng lõi trên thư viện chuẩn Nangate 45nm (điện áp 1.10V, 25°C) bằng Yosys 0.33, sv2v và OpenSTA 3.1.0, nhắm mục tiêu 500 MHz (chu kỳ 2.000 ns). Kết quả: cả 8/8 khối đạt yêu cầu về thời gian (timing) với TNS = 0.00 ns, tổng cộng 111.019 cell và 14.836 flip-flop, diện tích tương đương 219,43 kGE. Trong đó DTLB là khối lớn nhất với 50.417 cell. Lưu ý rằng đây mới là kết quả tổng hợp từng khối độc lập — place-and-route toàn SoC và biên dịch macro SRAM chưa được thực hiện.
Khởi động Linux và đo đạc CPI
Báo cáo nghiệm thu giai đoạn M9 ghi nhận việc khởi động Linux 6.6.50 trên Verilator không có kernel panic, không oops, không lỗi truy cập, với 0 lỗi bảo toàn CPI trên 89.861.075 chu kỳ mô phỏng. Cụ thể: 76.236.390 lệnh hoàn tất, 2.227.761 lệnh ở chế độ người dùng, 2.255 lỗi trang theo yêu cầu (1.027 trong số đó ở U-mode), đạt IPC = 0,84838. Bộ kiểm thử trong không gian người dùng chạy 21 bài test, bao gồm kiểm tra bộ nhớ stack và heap đa độ rộng, tất cả đều vượt qua.
Điểm thú vị là dự án phân loại chính xác từng chu kỳ vào 8 nhóm loại trừ lẫn nhau, với điều kiện tổng luôn bằng mcycle:
| Nhóm CPI | Chu kỳ | Tỷ lệ |
|---|---|---|
| C_productive (hoàn tất hữu ích) | 43.079.458 | 47,94% |
| C_br_recover (đoán sai nhánh, khôi phục) | 15.024.530 | 16,72% |
| C_idle_other (WFI, bọt pipeline) | 14.806.625 | 16,48% |
| C_be_rename (nghẽn đổi tên) | 5.709.439 | 6,35% |
| C_mem_stall (trượt L1D, xung đột bank) | 5.549.273 | 6,18% |
| C_be_sched (nghẽn phát lệnh) | 2.736.785 | 3,05% |
| C_serialize (CSR, SFENCE.VMA, FENCE.I) | 2.450.147 | 2,73% |
| C_fe_starve (frontend cạn hàng đợi) | 504.818 | 0,56% |
Cách chạy thử
Dự án hướng dẫn cài trên Ubuntu 24.04 hoặc WSL2 với các gói verilator, g++, python3, device-tree-compiler, cùng chuỗi công cụ gcc-riscv64-unknown-elf và gcc-riscv64-linux-gnu. Các bước kiểm thử gồm lint RTL, các bộ regression nhanh (khoảng 3–6 phút), tổng hợp và kiểm tra STA, và cuối cùng là bài khởi động Linux đầy đủ mất khoảng 1,5–2 giờ thời gian thực. Mã nguồn phát hành theo giấy phép Apache License 2.0.
Góc nhìn
Với lập trình viên và kỹ sư phần cứng Việt Nam, Fursoy là một mẫu tham chiếu đáng đọc: nó cho thấy một thiết kế RISC-V out-of-order hoàn chỉnh có thể được xây dựng và kiểm chứng bằng bộ công cụ mã nguồn mở, từ Verilator đến Yosys và OpenSTA, mà không cần giấy phép thương mại đắt đỏ. Cách dự án công bố bằng chứng nghiệm thu dưới dạng JSON và phân rã chu kỳ theo từng nhóm CPI cũng là một chuẩn mực tốt về minh bạch kỹ thuật, hữu ích cho các nhóm đang làm IP lõi hoặc thiết kế SoC nội bộ.
Tuy vậy, cần giữ kỳ vọng đúng mức: kết quả 500 MHz mới là tổng hợp từng khối, chưa có place-and-route toàn SoC, chưa biên dịch macro SRAM, và hành trình từ mô phỏng Verilator sang FPGA hay silicon vẫn còn nhiều bài toán về timing, công suất và kiểm chứng. Những ai muốn học kiến trúc out-of-order nên bắt đầu từ việc chạy các bộ test nhỏ trong kho mã nguồn, còn các nhóm đánh giá lõi để tích hợp nên chờ dữ liệu triển khai thực tế trước khi đưa ra quyết định.
Nguồn: github.com · Quy trình biên tập


