Subscriber nhận handle bị tái sử dụng: phải chép, và clone() không chép gì
Class cần viết: sample_collector · cần máy chấm có UVM · 6 case (2 mẫu) · giới hạn 15 s/case · ~25 phút
Bạn tích hợp một VIP cũ. Monitor của nó, vì lý do hiệu năng, tạo một đối tượng sample duy nhất, rồi mỗi lần lấy được mẫu mới thì ghi đè các trường và gọi ap.write(s) với cùng handle đó. Không sửa được VIP. Viết subscriber thu thập mẫu sao cho dữ liệu đã cất không bị đổi về sau.
Gói sample_pkg (có sẵn, không có do_copy hay field macro):
class sample extends uvm_sequence_item;
int unsigned ch; int val; longint ts;
endclass
Viết:
class sample_collector extends uvm_subscriber #(sample);
`uvm_component_utils(sample_collector)
sample got[$]; // mọi mẫu đã nhận, theo thứ tự, mỗi mẫu là một ĐỐI TƯỢNG RIÊNG
int unsigned per_ch[int unsigned]; // số mẫu theo kênh
function new(string name, uvm_component parent);
function void write(sample t);
function int max_val(int unsigned ch); // giá trị val lớn nhất của kênh ch; kênh chưa có mẫu thì trả 0
endclass
Testbench đóng vai monitor cũ: gọi write nhiều lần với cùng một handle, đổi trường giữa các lần gọi, rồi mới kiểm got, per_ch và max_val. Nó còn sửa đối tượng của monitor sau cùng để chắc rằng bản đã cất độc lập.
Các case
- 3 mẫu từ monitor tái sử dụng đối tượngmẫu
- Đếm số mẫu theo kênhmẫ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.