z386: CPU 80386 mã nguồn mở tái tạo từ microcode gốc của Intel

Công nghệ23 tháng 5, 2026·5 phút đọc

z386 là một bộ vi xử lý lớp 386 mã nguồn mở được xây dựng trên FPGA, sử dụng microcode gốc của Intel để điều khiển phần cứng tái tạo. Dự án này có thể khởi động DOS, chạy các chương trình chế độ bảo vệ và chơi game Doom với hiệu suất ấn tượng.

z386: CPU 80386 mã nguồn mở tái tạo từ microcode gốc của Intel

Đây là phần thứ năm trong loạt bài về dòng vi xử lý 80386. CPU FPGA này đã phát triển đủ xa để chạy các phần mềm thực tế, và bài viết này sẽ giải thích cách thức hoạt động của nó. z386 là một CPU lớp 386 được xây dựng xung quanh microcode gốc của Intel, theo cùng tinh thần với dự án z8086 trước đó.

Khác với các trình giả lập lệnh theo kiểu RTL truyền thống, mục tiêu của z386 là tái tạo đủ các thành phần của máy móc gốc để ROM điều khiển 386 đã được khôi phục có thể vận hành nó. Hiện tại, z386 có thể khởi động DOS 6 và DOS 7, chạy các chương trình chế độ bảo vệ (protected-mode) như DOS/4GW và DOS/32A, cũng như chơi các tựa game kinh điển như Doom và Cannon Fodder.

Doom II chạy trên z386Doom II chạy trên z386

Hiệu năng so với ao486

Trong các bản dựng hiện tại, z386 hoạt động tương đương với một máy 386 có bộ nhớ đệm (cached) nhanh (~70MHz) hoặc một dòng 486 cấp thấp. Nó chạy ở xung nhịp cao hơn nhiều so với các CPU 386 lịch sử, nhưng với chỉ số CPI (chu kỳ trên mỗi lệnh) thấp hơn một chút. Bộ nhớ đệm hiện tại là L1 thống nhất 16 KB, 4-way set-associative, được chọn để giữ cho xung nhịp ở mức cao.

Dưới đây là một số con số so sánh với lõi ao486:

Chỉ sốz386ao486
Dòng code (cloc)8K17.6K
ALUTs18K21K
Thanh ghi5K6.5K
BRAM116K131K
Xung nhịp FPGA85MHz90MHz
3DBench FPS3443
Doom (FPS, chi tiết cao nhất)16.521.0

Kiến trúc tổng quan của z386

Ở mức độ cao, 386 được tổ chức xung quanh tám đơn vị chính. z386 tuân theo sự phân chia này khá chặt chẽ đến mức sơ đồ khối gốc của Intel vẫn là một bản đồ hữu ích.

Sơ đồ khối 80386Sơ đồ khối 80386

Tám đơn vị này bao gồm:

  1. Đơn vị nạp trước (Prefetch unit): Giữ cho hàng đợi mã 16 byte luôn được lấp đầy từ bộ nhớ.
  2. Bộ giải mã (Decoder): Tiêu thụ byte lệnh, theo dõi tiền tố, nhận dạng các dạng ModR/M và SIB.
  3. Trình tự vi mã (Microcode sequencer): Lấy các từ vi mã mở rộng, xử lý các bước nhảy, lỗi và hành vi chạy lệnh tiếp theo.
  4. ALU và bộ dịch (Shifter): Thực hiện số học, logic, cờ, thao tác bit, dịch, xoay, nhân và chia.
  5. Đơn vị phân đoạn (Segmentation unit): Tính toán địa chỉ logic-tuyến tính, áp dụng cơ sở và giới hạn phân đoạn.
  6. Đơn vị bảo vệ (Protection unit): Tái tạo hành vi PLA Bảo vệ của 386 để xác thực bộ chọn và mô tả.
  7. Đơn vị phân trang (Paging unit): Xử lý tra cứu TLB, chuyển đổi trang và lỗi trang.
  8. BIU/Cache/Đường dẫn bộ nhớ: Kết nối các thao tác bộ nhớ CPU với phân trang, cache, SDRAM và hệ thống PC xung quanh.

Bộ giải mã lệnh và Vi mã

Giải mã lệnh x86 là một thách thức vì ranh giới của lệnh không rõ ràng. Bộ giải mã của z386 sử dụng máy trạng thái được hỗ trợ bởi hai bảng kiểu PLA để xác định cấu trúc lệnh và điểm nhập vi mã.

z386 sử dụng vi mã gốc của Intel 386 làm chương trình điều khiển chính. Mỗi vi lệnh rộng 37 bit. Một điểm thú vị là vi mã 386 có "khe trễ" (delay slot). Ví dụ, một lệnh di chuyển thanh ghi-thanh ghi đơn giản cần tối thiểu 2 chu kỳ: chu kỳ đầu tiên chọn thanh ghi nguồn và đánh dấu RNI (Run Next Instruction), chu kỳ thứ hai là khe trễ ghi thanh ghi đích.

Thiết kế Cache

CPU 386 gốc không có cache L1 trên chip, nhưng Intel mong đợi các hệ thống hiệu suất cao sử dụng bộ điều khiển cache bên ngoài. z386 thêm một cache L1 để hệ thống bộ nhớ FPGA hoạt động giống như các hệ thống bộ nhớ cục bộ nhanh mà 386 được thiết kế để làm việc cùng.

Cache của z386 có dung lượng 16KB, sử dụng cơ chế VIPT (Virtually Indexed, Physically Tagged). Điều này cho phép tra cứu cache bắt đầu song song với dịch vụ địa chỉ, giúp giảm độ trễ và duy trì xung nhịp cao.

Kiểm thử và Khác biệt với ao486

Việc kiểm thử z386 khó hơn nhiều so với z8086 do chế độ bảo vệ phức tạp. Tác giả đã sử dụng bộ kiểm tra SingleStepTests cho chế độ thực và chế độ bảo vệ, cùng với SeaBIOS, FreeDOS và các công cụ mở rộng DOS như DOS/4GW để kiểm tra tích hợp hệ thống.

So với ao486 (một lõi FPGA x86 trưởng thành), z386 theo phong cách tổ chức các đơn vị lớn hợp tác với nhau, trong khi ao486 sử dụng các giai đoạn pipeline tinh hơn. z386 tập trung vào việc tái tạo hợp đồng phần cứng-phần mềm gốc của Intel, mang lại cái nhìn sâu sắc về kiến trúc lịch sử này.

z386 hiện đã có thể chạy trên nhiều họ FPGA khác nhau, bao gồm Altera Cyclone V và Gowin GW5A, đánh dấu một bước tiến lớn trong việc bảo tồn và nghiên cứu kiến trúc máy tính cổ điển.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗