Callback: thay hành vi bằng object đăng ký và kiểm đúng thứ tự gọi
Tiên quyết
Sau bài này bạn sẽ
- Kết hợp registration, base handle và virtual dispatch thành callback
- Đặt chính sách null, thứ tự và dữ liệu truyền giữa các hook
- Kiểm kết quả lẫn accounting của từng callback
Extension point cần contract về thứ tự và dữ liệu
Driver xử lý một số qua các hook đã đăng ký. Test có thể chọn hook cộng 3 hoặc nhân 2 mà không sửa code Driver.send. Nhưng hai phép không giao hoán; nếu API không định nghĩa thứ tự, cùng cấu hình có thể tạo expected khác nhau.
Callback dùng cơ chế object và virtual method quen thuộc
Hook.apply có implementation mặc định trả input và tăng calls. AddHook và DoubleHook override công thức. Driver giữ queue Hook handles, nên call qua base handle vẫn tới object đăng ký. Callback là pattern thiết kế ở đây, không phải một scheduler region hoặc keyword mới.
Registration từ chối null theo contract riêng
Driver.add trả 0 cho null và không thêm vào queue; object hợp lệ được push_back, trả 1. Policy này được kiểm. Bài không quy định mọi callback API phải làm vậy, không có deregistration hay chống đăng ký trùng.
Cộng rồi nhân khác với nhân rồi cộng
Forward order đăng ký Add rồi Double, cho 2 x+6. Reverse order đăng ký Double rồi Add, cho 2 x+3. Main dùng bốn hook object riêng để count không trộn giữa hai driver; registration giữ handle, không clone hook.
Kết quả mỗi hook là input của hook tiếp theo
Send khởi result=value rồi cập nhật bằng apply(result) qua từng queue element. Nếu lần nào cũng gọi apply(value), hook sau bỏ qua thay đổi của hook trước. Mutation này bị symptom callback order bắt, dù từng hook riêng lẻ vẫn đúng.
Không đăng ký hook thì giữ input
Driver rỗng send 5 trả 5. Trước registration, main thử add(null) rồi kiểm queue vẫn rỗng. Cách kiểm tách rõ identity path và null policy, không dùng một default hook được ngầm tạo mà không ghi trong test.
Đếm call trên đúng object và đúng vòng kiểm
Với input 0..7, forward sum 104 và reverse sum 80. Mỗi driver gọi hai hook một lần mỗi input, nên từng hook có calls 8. TB gọi send đúng một lần mỗi driver/input rồi dùng biến f/r cho assertions và cộng tổng, tránh tự tăng count khi kiểm output.
Hai thứ tự và bốn callback object
Expected trước chạy: 8 input,forward_sum104,reverse_sum80,calls_each8,empty identity giữ 5 và null bị từ chối. Example không có timing/race/exception/UVM callback registry; không gọi pattern thuần SV này là một UVM implementation đã chạy.
Tự kiểm tra
Định nghĩa extension point đủ rõ để viết checker
Ghi thời điểm gọi, thứ tự, dữ liệu chuyển tiếp, quyền sửa và policy null/lifetime. Kiểm cả kết quả và số call khi behavior có side effect. Callback linh hoạt chỉ có ích khi caller và người viết hook cùng hiểu contract.
Nguồn và mức độ đối chiếu
- SystemVerilog Callback — bản chụp resources.zip, Nguồn đào tạo đã đọc. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.b5.callback, Bằng chứng thực nghiệm. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, Class handles, inheritance, virtual methods, access and parameterization. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Thí nghiệm nguyên bản ex.b5.callback, Source, self-checks, verification.json và mutation/capability probes. Trích dẫn; nguồn đã đọc toàn văn.
- SystemVerilog Callback — bản chụp resources.zip, 1. Define the Callback Class; 2. Register the Callback; 3. Implement the Callback; 4. Invoke the Callback; How Is a Callback Different From a Regular Method Call?. Trích dẫn; nguồn đã đọc các mục liên quan.