Struct packed và union: trường đầu tiên là bit cao nhất
Class cần viết: rv_fields · cần máy chấm có SystemVerilog · 6 case (2 mẫu) · giới hạn 4 s/case · ~25 phút
Lệnh RISC-V 32 bit được chia thành các trường cố định. Trong testbench (và cả RTL), struct packed cho phép gọi trường theo tên thay vì nhớ chỉ số bit. Nhưng thứ tự khai báo quyết định trường nào nằm ở bit nào, và đó là chỗ hay sai nhất.
Định dạng lệnh R và lệnh I:
| Bit | 31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0 |
|---|---|---|---|---|---|---|
| R | funct7 | rs2 | rs1 | funct3 | rd | opcode |
| I | imm[11:0] (31:20) | rs1 | funct3 | rd | opcode |
Viết trong bài nộp:
typedef struct packed {...} rtype_t;với các trường đúng tênfunct7, rs2, rs1, funct3, rd, opcodevà đúng vị trí bit như bảng.typedef struct packed {...} itype_t;với các trườngimm(12 bit),rs1, funct3, rd, opcode.typedef union packed {...} insn_u;gồmrtype_t r; itype_t i; logic [31:0] raw;.class rv_fieldsvới các hàmstatic:
| Hàm | Trả về |
|---|---|
rtype_t as_r(logic [31:0] w) |
lệnh w xem như lệnh R |
logic [31:0] make_r(funct7, rs2, rs1, funct3, rd, opcode) |
lệnh ghép từ các trường (độ rộng như bảng) |
int imm_i(logic [31:0] w) |
immediate của lệnh I, mở rộng dấu lên 32 bit |
logic [31:0] with_rd(logic [31:0] w, logic [4:0] rd) |
w với trường rd thay bằng giá trị mới, các bit khác giữ nguyên |
Ví dụ: as_r(32'h40A38533) cho funct7 = 7'h20, rs2 = 10, rs1 = 7, funct3 = 0, rd = 10, opcode = 7'h33 (lệnh sub a0, t2, a0). imm_i(32'hFFF00093) = −1.
Testbench đọc các trường của struct trả về theo tên, nên tên trường phải đúng như trên.
Các case
- as_r: tách trường lệnh Rmẫu
- make_r: ghép trường thành lệnhmẫ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.