Vừa

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

fork-joinautomaticconcurrencytrapinterview

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:

  1. chờ (n − k) × 10 ns,
  2. thêm k vào cuối finished.

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

  1. 3 worker: thứ tự xong và thời gianmẫu
  2. 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.

Đang kết nối máy chấm…
Đang nạp bản nháp…

Tab để thụt lề. Nhấn Esc rồi Tab để rời trình soạn. Bản nháp tự lưu trong trình duyệt.

Gợi ý

Mỗi gợi ý mở trước khi AC giảm 10% điểm của đề.

Lời giải và phân tích

Lịch sử nộp bài

Chưa có lượt nào.

Độ khó: Vừa. Điểm gốc 40.