Hãy tưởng tượng một ngày nào đó, bạn nhận được đề bài tập lớn của môn học: “Thiết kế một vi xử lý RISC-V 32-bit.”
Trong khi mình chỉ nắm trong tay các kiến thức của môn kỹ thuật số cơ bản mà mình đã học trong kỳ trước. Vậy bạn sẽ làm gì và bắt đầu như thế nào?
Nghe thì có vẻ cao siêu và khó nhằn, nhưng thực tế CPU cũng chỉ được ghép lại từ chính những phần tử logic cơ bản mà bạn đã học. Chỉ cần bạn biết mình phải bắt đầu từ đâu và ghép chúng lại như thế nào. Giống như trò chơi LEGO vậy. Bạn phải biết mình đang lắp ghép cái gì và dùng những khối đúng đắn để tạo nên một hình thù to lớn.
Điều đầu tiên, các bạn phải hiểu rõ những khối logic cơ bản trong phần cứng, và cách mô tả chúng bằng ngôn ngữ mô tả phần cứng (Verilog, SystemVerilog). Những module tưởng chừng đơn giản như mux, bộ mã hóa, bộ giải mã, bộ đếm, mạch phát hiện cạnh, thanh ghi… chính là nền móng để xây dựng mọi cấu trúc phức tạp bên trong CPU. Khi bạn hiểu dữ liệu chảy qua mux như thế nào, tín hiệu điều khiển làm việc ra sao, và một trigger cạnh lên khiến thanh ghi thay đổi như thế nào… thì bạn đã nắm trong tay những viên gạch đầu tiên để dựng lên bất kỳ hệ thống số nào.
Nhưng chỉ hiểu kỹ thuật số không thì vẫn thiếu đi một thứ quan trọng, đó là hiểu cách một hệ thống máy tính vận hành. Điều này không đòi hỏi bạn phải biết tất cả mọi thứ về kiến trúc máy tính, nhưng bạn cần nắm được vài khái niệm nền như CPU lấy lệnh từ đâu, PC hoạt động ra sao, cách bộ nhớ được địa chỉ hóa, load/store diễn ra như thế nào, và vai trò của thanh ghi trong một kiến trúc. Những khái niệm này giúp bạn hiểu vì sao CPU cần khối này, và khối đó phải làm gì thay vì chỉ lắp ghép trong vô thức. Khi hiểu được hệ thống vận hành ở mức tổng thể, việc ráp từng module trở nên hợp lý và có mục đích.
Tiếp theo, và có thể là quan trọng nhất, chính là hiểu tập lệnh mà bạn sẽ sử dụng cho CPU của mình. Nếu coi CPU là người thợ, thì tập lệnh chính là tập hợp các kỹ năng của người thợ đó. Bạn phải trả lời được câu hỏi: CPU của mình sẽ biết làm những gì? Với RISC-V, bạn không nhất thiết phải hỗ trợ đầy đủ các extension đồ sộ. Người mới thường chỉ cần chọn một nhóm lệnh cực nhỏ trong RV32I: vài phép cộng trừ logic, vài lệnh nạp và lưu, cùng vài lệnh nhảy. Khi đọc từng lệnh, bạn sẽ thấy nó mô tả cụ thể: cần bao nhiêu nguồn dữ liệu, lấy dữ liệu từ đâu, phải tính cái gì, đưa kết quả đi đâu. Chính phần này sẽ quyết định cấu trúc của ALU, số cổng đọc của register file, kiểu immediate cần giải mã, và cả cách bạn điều khiển PC. Khi bạn hiểu được một lệnh mô tả điều gì, bạn đang thực sự hiểu CPU cần phải xây như thế nào.
Khi đã nắm được tập lệnh, bạn bắt đầu xây những khối nền tảng. Register file thường là điểm xuất phát hợp lý. Dữ liệu của hầu hết lệnh đều nằm trong các thanh ghi, nên bạn cần một khối chứa khoảng 16 hoặc 32 thanh ghi, cho phép mỗi chu kỳ đọc hai giá trị và ghi một giá trị. Chính từ dữ liệu đọc ra này, ALU có nguyên liệu để hoạt động.
Sau đó, bạn bắt đầu xây dựng ALU. Đây là khối làm các phép tính cơ bản như cộng, trừ, AND, OR, XOR. Nếu tập lệnh bạn chọn có thêm phép dịch, bạn chỉ cần thêm mạch shift. Khi ALU hoạt động xong, bạn cho kết quả quay lại register file. Ở giai đoạn này, CPU của bạn đã chạy được những chương trình tuyến tính, nơi PC chỉ tăng dần mà không có nhánh rẽ.
Tuy nhiên, một CPU mà chỉ biết chạy thẳng thì giống như chiếc xe chỉ có ga mà không có lái. Đây là lúc bạn thêm cờ trạng thái. Khi ALU tính toán, bạn có thể sinh ra cờ zero, sign, carry, overflow… Các cờ này là tín hiệu để CPU đưa ra quyết định xem có nên nhảy sang địa chỉ khác hay không. Với việc bổ sung các lệnh nhảy theo điều kiện, chương trình của bạn đã biết rẽ nhánh và lặp lại.
Tiếp theo, bạn cần để CPU làm việc với dữ liệu nằm ngoài thanh ghi. Điều này dẫn đến việc thêm bộ nhớ dữ liệu (DMEM) và bộ nhớ lệnh (IMEM). Bạn có thể sử dụng Harvard architecture (tách riêng IMEM và DMEM) cho dễ tiếp cận. IMEM chỉ đọc để lấy lệnh, còn DMEM phục vụ load/store. Khi bộ nhớ xuất hiện, bạn đồng thời bổ sung thêm kiểu địa chỉ hoá như immediate và load/store theo địa chỉ.
Đến thời điểm này, CPU của bạn đã đủ để được gọi là một “Very Small Instruction Set Processor”: có register file, có ALU, có cờ nhảy, có bộ nhớ, có vài kiểu addressing, và quan trọng nhất là có tập lệnh rõ ràng, gọn gàng, phù hợp với khả năng của người mới.
Điều thú vị là khi bạn ghép xong tất cả, bạn sẽ nhận ra CPU không phải là thứ gì quá bí ẩn. Nó không khác mấy so với các bài lab trước đây, chỉ là bạn gom tất cả các module nhỏ thành một hệ thống lớn hơn, có tổ chức hơn. Và bài tập tưởng chừng khổng lồ ấy lại giúp bạn mở cánh cửa đến thế giới kiến trúc máy tính, pipeline, bus, và cả các hệ thống SoC hoàn chỉnh.

















