Toán tử streaming: đảo byte, đảo bit, gói và tách mảng
Class cần viết: bitops · cần máy chấm có SystemVerilog · 6 case (2 mẫu) · giới hạn 4 s/case · ~15 phút
Testbench liên tục phải đổi giữa "một số nhiều bit" và "một dãy byte": dựng gói Ethernet, đóng gói dữ liệu cho bus, so payload. Toán tử streaming ({<< …} / {>> …}) của SystemVerilog làm các việc này trong một biểu thức, không cần vòng lặp hay ghép bit thủ công.
Viết class bitops chỉ gồm hàm static:
typedef byte unsigned b4_t[4]; // khai báo trong class bitops
class bitops;
static function bit [31:0] byte_swap32(bit [31:0] x); // 0x11223344 → 0x44332211
static function bit [7:0] bit_rev8(bit [7:0] x); // 1000_0110 → 0110_0001
static function bit [15:0] nibble_rev16(bit [15:0] x); // 0xABCD → 0xDCBA
static function bit [31:0] pack_be(b4_t b); // b[0] là byte CAO nhất: '{11,22,33,44} → 0x11223344
static function bit [31:0] pack_le(b4_t b); // b[0] là byte THẤP nhất: '{11,22,33,44} → 0x44332211
static function b4_t unpack_le(bit [31:0] w); // ngược của pack_le: 0x44332211 → '{11,22,33,44}
endclass
Kiểu mảng phải khai báo bên trong class: typedef byte unsigned b4_t[4];. Testbench gọi bitops::b4_t. Có thể dùng toán tử streaming hoặc ghép bit tuỳ ý, miễn kết quả đúng.
Các case
- byte_swap32mẫu
- bit_rev8mẫ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.