Sequence với randomize() with: local:: và giá trị trả về
Class cần viết: range_seq · cần máy chấm có UVM · 6 case (2 mẫu) · giới hạn 20 s/case · ~25 phút
Sequence UVM hiếm khi tự đặt mọi trường của giao dịch. Thường nó randomize giao dịch kèm vài ràng buộc lấy từ cấu hình của chính sequence. Cách viết đó có một cái bẫy về phạm vi tên mà rất nhiều testbench thật mắc phải.
Giao dịch đã cho sẵn (gói rseq_pkg):
class wr_item extends uvm_sequence_item;
rand bit [15:0] addr;
rand bit [7:0] data;
rand bit [3:0] len;
constraint c_len { len inside {[1:8]}; }
endclass
Viết class range_seq extends uvm_sequence #(wr_item) với các trường (đã có trong starter, test đặt chúng trước khi start):
bit [15:0] addr = 16'h0000; // địa chỉ gốc
int unsigned count = 4;
bit [3:0] max_len = 8;
int unsigned n_rand_fail; // số lần randomize thất bại
body() gửi tối đa count giao dịch. Giao dịch thứ i (i = 0..count−1) được randomize với ràng buộc thêm:
addrcủa giao dịch =addrcủa sequence + 16·i;len≤max_len(vẫn ≥ 1 theoc_len);datatự do.
Nếu randomize thất bại (ví dụ max_len = 0), tăng n_rand_fail và không gửi giao dịch đó.
Đề cần máy chấm có engine UVM hỗ trợ đầy đủ randomize.
Các case
- 4 giao dịch từ 0x0100mẫu
- 10 giao dịch, max_len = 3mẫ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à 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.