Pipeline giữa các thread bằng mailbox
Class cần viết: stage · cần máy chấm có SystemVerilog · 6 case (2 mẫu) · giới hạn 4 s/case · ~25 phút
Testbench hiện đại gồm nhiều thành phần chạy song song (generator, driver, monitor, scoreboard) và nối với nhau bằng mailbox. Mỗi thành phần là một vòng forever: lấy phần tử từ mailbox vào, xử lý, đặt vào mailbox ra.
Viết class stage:
| Thành phần | Yêu cầu |
|---|---|
function new(mailbox #(int) in_mb, mailbox #(int) out_mb) |
lưu hai mailbox |
task run() |
chạy mãi: lấy từng phần tử x từ in_mb, đặt 2*x + 1 vào out_mb, theo đúng thứ tự |
int unsigned count |
số phần tử đã xử lý (đã đặt xong vào out_mb) |
out_mb có thể có giới hạn (ví dụ new(2)), và phía nhận có thể đọc chậm. Stage phải chờ khi out_mb đầy; không được làm mất phần tử.
mailbox #(int) a = new(), b = new(2);
stage s = new(a, b);
fork s.run(); join_none
a.put(5); // một lúc sau: b.get(x) → x = 11
Bẫy kiểu: nhiều simulator kiểm kiểu chặt với mailbox có tham số (mailbox #(int)). Biểu thức 2 * x + 1 có hằng số không kích thước nên có thể bị coi là kiểu integer (4-state), không phải int, và put(2 * x + 1) báo lỗi lúc elaboration. Ép int'(2 * x + 1) hoặc gán vào một biến int trước khi put.
Chỉ viết class. Testbench import package chứa class của bạn.
Đề này cần máy chấm có engine SystemVerilog.
Các case
- 3 phần tử qua stage ×2+1mẫu
- Thứ tự được giữ nguyênmẫ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à 3 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.