Khó

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

uvmscoreboardanalysis-impcheck-phasequeue

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_decl ngay trong code của bạn.
  • Không khai báo module hay package; không dùng `timescale, `include hay 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

  1. 4 gói mong đợi rồi 4 gói thực tế, khớp hếtmẫu
  2. 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.

Đang kết nối máy chấm…
Đang nạp bản nháp…

Tab để thụt lề. Nhấn Esc rồi Tab để rời trình soạn. Bản nháp tự lưu trong trình duyệt.

Gợi ý

Mỗi gợi ý mở trước khi AC giảm 10% điểm của đề.

Lời giải và phân tích

Lịch sử nộp bài

Chưa có lượt nào.

Độ khó: Khó. Điểm gốc 80.