Giải mã immediate RISC-V: I, S, B, U, J
Module cần viết: imm_gen · 6 case (2 mẫu) · giới hạn 4 s/case · ~30 phút
RISC-V cố ý xáo trộn bit của immediate trong lệnh: bit dấu luôn ở inst[31], và các trường được đặt sao cho phần cứng giải mã dùng chung nhiều dây nhất. Giá phải trả là bảng ghép bit trông rất "kỳ". Bộ tạo immediate là khối đầu tiên của tầng decode, và là câu phỏng vấn quen thuộc cho vị trí CPU/RTL.
module imm_gen (
input logic [31:0] inst,
input logic [2:0] fmt, // 0: I, 1: S, 2: B, 3: U, 4: J (5…7: imm = 0)
output logic [31:0] imm // đã mở rộng dấu lên 32 bit
);
| Dạng | imm (trước khi mở rộng dấu từ bit cao nhất) |
|---|---|
| I | imm[11:0] = inst[31:20] |
| S | imm[11:5] = inst[31:25], imm[4:0] = inst[11:7] |
| B | imm[12] = inst[31], imm[11] = inst[7], imm[10:5] = inst[30:25], imm[4:1] = inst[11:8], imm[0] = 0 |
| U | imm[31:12] = inst[31:12], imm[11:0] = 0 |
| J | imm[20] = inst[31], imm[19:12] = inst[19:12], imm[11] = inst[20], imm[10:1] = inst[30:21], imm[0] = 0 |
Ví dụ: addi x1, x0, -1 là 32'hFFF00093 với fmt = I, nên imm = 32'hFFFFFFFF.
Mạch tổ hợp; testbench đọc imm 1 ns sau khi đổi đầu vào.
Các case
- I-type: addi x1, x0, -1 và 2047mẫu
- S-typemẫ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.