fork trong vòng for: bắt nhầm biến lặp
Class cần viết: job_pool · cần máy chấm có SystemVerilog · 6 case (2 mẫu) · giới hạn 4 s/case · ~20 phút
Khởi động N thread song song bằng fork trong vòng for là việc testbench làm thường xuyên: N agent, N sequence, N kênh. Đây cũng là một trong những câu phỏng vấn SystemVerilog "bẫy" nổi tiếng nhất. Starter chạy được, không treo, nhưng kết quả sai một cách khó hiểu.
class job_pool;
int finished[$]; // id của các worker, theo thứ tự XONG
task run_all(int n); // chạy song song n worker: id 0 … n−1
endclass
Worker có id k:
- chờ
(n − k) × 10ns, - thêm
kvào cuốifinished.
Mọi worker chạy đồng thời. run_all trả về ngay khi worker cuối cùng xong, tức sau đúng n × 10 ns, và không lâu hơn. Vì worker id lớn chờ ít hơn, thứ tự xong là n−1, n−2, …, 0.
Ví dụ run_all(3): sau 10 ns worker 2 xong, sau 20 ns worker 1 xong, sau 30 ns worker 0 xong và run_all trả về. finished = '{2, 1, 0}.
Người gọi có thể đang có các thread khác chạy nền (đã fork … join_none từ trước), và run_all không được chờ hay dừng những thread đó.
Các case
- 3 worker: thứ tự xong và thời gianmẫu
- 1 workermẫ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.