UVM factory: đăng ký lớp con, override theo kiểu và theo instance
Class cần viết: fac_setup · cần máy chấm có UVM · 6 case (2 mẫu) · giới hạn 15 s/case · ~25 phút
Factory là cơ chế giúp test thay một lớp bằng lớp con của nó mà không sửa code tạo đối tượng: đổi mọi giao dịch thành giao dịch có lỗi, hay chỉ một driver thành phiên bản chậm. Mọi component UVM đều tạo bằng type_id::create chính là để test có thể override như vậy.
Gói fac_pkg (đã import sẵn):
class base_txn extends uvm_object; // đã đăng ký factory
virtual function string kind(); return "base"; endfunction
endclass
class base_drv extends uvm_component; // đã đăng ký factory
virtual function int delay(); return 1; endfunction
endclass
Viết ba class:
class err_txn extends base_txn; // kind() trả "err"
class slow_drv extends base_drv; // delay() trả 10
class fac_setup;
static function void err_everywhere(); // từ giờ, mọi base_txn tạo bằng factory là err_txn
static function void slow_at(string path); // chỉ component có ĐƯỜNG DẪN ĐẦY ĐỦ khớp path (có thể có *)
// mới thành slow_drv
static function base_txn make(string name); // tạo một base_txn (tôn trọng mọi override)
endclass
Testbench gọi các hàm của fac_setup, rồi tạo base_txn và base_drv bằng factory (driver được đặt dưới một component env, ví dụ env.d1), và kiểm kind(), delay() cùng kiểu thật của đối tượng.
Các case
- Chưa override: make() tạo base_txnmẫu
- err_everywhere: mọi base_txn thành err_txnmẫ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.