Loại trừ lẫn nhau giữa các thread bằng semaphore
Class cần viết: shared_bus · cần máy chấm có SystemVerilog · 6 case (2 mẫu) · giới hạn 4 s/case · ~20 phút
Nhiều thread trong testbench (ví dụ nhiều sequence, nhiều driver ảo) cùng muốn dùng một tài nguyên dùng chung, như một bus hay một cổng cấu hình. Nếu hai thread dùng cùng lúc, giao dịch của chúng trộn lẫn. Semaphore bảo đảm tại một thời điểm chỉ một thread được dùng.
Viết class shared_bus:
| Thành phần | Yêu cầu |
|---|---|
int unsigned in_use |
số thread đang dùng bus (phải luôn ≤ 1) |
int log[$] |
id của các thread theo thứ tự được cấp bus |
task access(int id, int dur) |
chờ tới lượt; khi được cấp: ghi id vào log, tăng in_use, chiếm bus dur ns (#dur), giảm in_use, nhả bus |
Nhiều thread gọi access đồng thời qua fork … join. Không có ràng buộc về thứ tự giữa các thread chờ; chỉ yêu cầu không chồng lấn và không thread nào bị bỏ lại.
shared_bus b = new();
fork b.access(1, 10); b.access(2, 5); join // tổng thời gian 15 ns, không bao giờ in_use = 2
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
- Một thread dùng bus 5 nsmẫu
- Hai thread cùng lúc: không chồng lấ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.