UVM callback: gắn cho một instance hay cho cả kiểu
Class cần viết: cb_setup · cần máy chấm có UVM · 6 case (2 mẫu) · giới hạn 15 s/case · ~25 phút
Callback cho phép test thay đổi hành vi của một component có sẵn mà không phải kế thừa và override nó qua factory, ví dụ chèn lỗi vào gói tin trước khi driver gửi. Driver đã cho sẵn (gói cbk_pkg, không nộp lại):
class pkt extends uvm_object; int unsigned data; bit corrupt; endclass
class drv_cb extends uvm_callback;
virtual function void pre_send(drv d, pkt p); endfunction // mặc định: không làm gì
endclass
class drv extends uvm_component;
`uvm_register_cb(drv, drv_cb)
function void send(pkt p);
`uvm_do_callbacks(drv, drv_cb, pre_send(this, p)) // gọi mọi callback đang gắn
...
endfunction
endclass
Viết:
class flip_cb extends drv_cb, có thuộc tính int unsigned every. Trong pre_send, callback đếm số gói mà chính nó đã thấy; gói thứ every, 2·every, 3·every… bị làm hỏng: lật bit 0 của p.data và đặt p.corrupt = 1. Các gói khác giữ nguyên.
class cb_setup với các hàm static:
| Hàm | Việc |
|---|---|
flip_cb attach(drv d, int unsigned every) |
tạo một flip_cb mới, gắn chỉ vào driver d, trả về nó |
flip_cb attach_all(int unsigned every) |
tạo một flip_cb và gắn cho mọi driver (cả driver đã có lẫn tạo sau); bộ đếm dùng chung cho mọi driver vì chỉ có một đối tượng |
void detach(drv d, flip_cb cb) |
gỡ cb khỏi driver d: từ đó các gói qua d không bị callback này đụng tới, kể cả khi sau đó cấu hình của cb bị thay đổi |
Ví dụ: attach(d1, 3) rồi gửi 7 gói qua d1: gói 3 và 6 bị lật; gói qua d2 không bị gì.
Các case
- every = 1: lật mọi góimẫu
- every = 3: lật gói thứ 3, 6mẫ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à 4 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.