Cơ chế callback: chuỗi hook trước/sau khi gửi
Class cần viết: pkt_driver · cần máy chấm có SystemVerilog · 8 case (2 mẫu) · giới hạn 4 s/case · ~35 phút
Callback cho phép test thay đổi hành vi của một thành phần, như chèn lỗi, đổi dữ liệu hay ghi log, mà không sửa code của thành phần đó. UVM có hẳn bộ máy uvm_callbacks cho việc này. Ở đây bạn tự dựng phiên bản thu nhỏ: một driver gọi chuỗi hook trước và sau mỗi lần gửi.
Lớp cơ sở callback đã có sẵn trong starter. Giữ nguyên chữ ký của nó, vì testbench sẽ kế thừa từ lớp này:
virtual class pkt_cb;
virtual function void pre_send(ref int data, ref bit drop); endfunction // mặc định: không làm gì
virtual function void post_send(int data); endfunction
endclass
Bạn viết driver:
class pkt_driver;
int sent[$]; // các giá trị đã gửi, theo thứ tự
int dropped; // số gói bị bỏ
function void add_cb(pkt_cb cb); // thêm vào CUỐI chuỗi
function void prepend_cb(pkt_cb cb); // thêm vào ĐẦU chuỗi
function void delete_cb(pkt_cb cb); // bỏ MỌI lần xuất hiện của đúng đối tượng cb
function void send(int data);
endclass
send(data):
d = data,drop = 0. Gọi lần lượtpre_send(d, drop)của từng callback theo thứ tự trong chuỗi. Mỗi callback thấydđã bị callback trước sửa.- Ngay khi
drop = 1thì dừng: không gọipre_sendcủa các callback còn lại,dropped++, không gọipost_send, và không gửi. - Nếu không bị drop:
sent.push_back(d), rồi gọipost_send(d)của từng callback theo thứ tự với giá trị cuối cùngd.
Một đối tượng callback có thể nằm trong chuỗi nhiều lần. Mỗi lần xuất hiện được gọi một lần.
Các case
- Không có callbackmẫu
- Một callback cộngmẫu
Cùng 6 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à 5 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.