Register file 2 cổng đọc, 1 cổng ghi, x0 = 0 và bypass
Module cần viết: regfile · 6 case (2 mẫu) · giới hạn 4 s/case · ~25 phút
Register file là bộ nhớ nhỏ, nhanh nhất trong CPU. Một CPU RISC-V cơ bản đọc hai toán hạng và ghi một kết quả mỗi nhịp. Bài này gồm hai chi tiết mà người phỏng vấn hay hỏi: thanh ghi x0 luôn bằng 0, và bypass, tức đọc ngay giá trị đang được ghi trong cùng nhịp. Nhờ bypass, lệnh ở tầng decode không phải chờ thêm một nhịp sau khi tầng writeback ghi.
module regfile (
input logic clk,
input logic rst_n, // reset bất đồng bộ: mọi thanh ghi = 0
input logic [2:0] ra1, ra2, // địa chỉ đọc
output logic [7:0] rd1, rd2, // dữ liệu đọc (tổ hợp)
input logic we,
input logic [2:0] wa,
input logic [7:0] wd
);
8 thanh ghi 8 bit, x0 … x7:
- Ghi: ở sườn lên, nếu
we = 1vàwa != 0thìx[wa] = wd. Ghi vàox0bị bỏ qua. - Đọc (tổ hợp):
rd1= giá trị củax[ra1], với hai ngoại lệ:ra1 == 0thì luôn ra 0;- bypass: nếu
we = 1,wa == ra1vàwa != 0thì rawdngay trong nhịp đó.
rd2tương tự vớira2.
Testbench đặt tín hiệu ở sườn xuống và đọc rd1, rd2 1 ns sau đó, trước sườn lên kế tiếp.
Các case
- Ghi rồi đọc lạimẫu
- x0 luôn bằng 0mẫu
Cùng 4 case ẩn kiểm các yêu cầu còn lại của đề. Case ẩn chỉ báo đúng/sai, không nói chi tiết: tự tìm chỗ sai từ đề, hoặc mở gợi ý.
Testbench có mô hình tham chiếu riêng, độc lập với lời giải mẫu. Lời giải mẫu đã chạy qua mọi case trên simulator thật, và 4 bản lỗi mẫu đều bị ít nhất một case bắt. Case mẫu sai sẽ cho biết chỗ sai đầu tiên (giá trị mong đợi so với giá trị nhận được); case ẩn chỉ báo đúng/sai.