Scoreboard UVM so khớp theo thứ tự
Class cần viết: inorder_sb · cần máy chấm có UVM · 7 case (2 mẫu) · giới hạn 15 s/case · ~40 phút
Trong một env UVM, predictor gửi các gói mong đợi và monitor gửi các gói thực tế tới cùng một scoreboard. DUT giữ đúng thứ tự gói, nên gói mong đợi thứ k phải khớp với gói thực tế thứ k. Tuy vậy, hai luồng tới vào những thời điểm khác nhau: có lúc DUT nhanh hơn model, nên gói thực tế tới trước.
Package pkt_pkg cho sẵn (đã import vào code của bạn):
class pkt extends uvm_sequence_item;
bit [7:0] id;
bit [31:0] data;
function string convert2string(); // "id=.. data=0x........"
endclass
Yêu cầu
Viết class inorder_sb extends uvm_scoreboard, đăng ký factory bằng `uvm_component_utils(inorder_sb).
| Thành phần | Yêu cầu |
|---|---|
exp_imp, act_imp |
hai analysis imp, kiểu uvm_analysis_imp_exp #(pkt, inorder_sb) và uvm_analysis_imp_act #(pkt, inorder_sb), tạo trong new |
write_exp(pkt t) / write_act(pkt t) |
nhận gói mong đợi / thực tế. So gói thứ k của hai luồng khi cả hai đã tới, không phụ thuộc phía nào tới trước |
n_match, n_mismatch (int unsigned) |
số cặp giống nhau (cùng id và data) / khác nhau. Mỗi cặp khác nhau báo đúng một `uvm_error("SB", …) |
check_phase(uvm_phase phase) |
đặt n_missing = số gói mong đợi chưa có cặp, n_extra = số gói thực tế chưa có cặp. Mỗi gói đó báo đúng một `uvm_error("SB", …) |
Cặp khớp, hoặc gói đang chờ cặp, không được sinh UVM_ERROR.
Testbench kiểm gì
Testbench tạo scoreboard bằng inorder_sb::type_id::create("sb", null). Gói được đưa vào bằng sb.exp_imp.write(p) và sb.act_imp.write(p); cuối mỗi case, testbench gọi sb.check_phase(null). Sau đó testbench so bốn bộ đếm, số UVM_ERROR và số báo cáo mang id "SB" với mô hình tham chiếu của nó.
Case mẫu (E = mong đợi, A = thực tế, ghi id:data):
| Case | Thứ tự tới | Mong đợi |
|---|---|---|
| 1 | E 1:10, E 2:20, E 3:30, E 4:40, rồi A 1:10, A 2:20, A 3:30, A 4:40 | khớp 4, lệch 0, thiếu 0, thừa 0; 0 UVM_ERROR |
| 2 | E 1:10, A 1:10, A 2:20, E 2:20, E 3:30, A 3:31, A 4:40, E 4:40 | khớp 3, lệch 1, thiếu 0, thừa 0; 1 UVM_ERROR |
Các case ẩn kiểm thêm: thứ tự tới khác nhau, gói sai theo từng trường, thiếu gói, thừa gói, và một chuỗi dài ngẫu nhiên.
Luật bài nộp
- Code được đặt bên trong một package đã có sẵn
import uvm_pkg::*;,`include "uvm_macros.svh"vàimport pkt_pkg::*;. Dùng`uvm_analysis_imp_declngay trong code của bạn. - Không khai báo
modulehaypackage; không dùng`timescale,`includehay DPI.
Đề này cần máy chấm có engine UVM. Một lượt chấm đề UVM lâu hơn đề thường (từ vài giây tới vài phút) vì phải biên dịch cùng testbench UVM.
Các case
- 4 gói mong đợi rồi 4 gói thực tế, khớp hếtmẫu
- Xen kẽ, có gói thực tế tới trước, 1 gói sai datamẫu
Cùng 5 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à 3 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.