Đếm tần suất bằng mảng kết hợp khoá string
Class cần viết: word_count · cần máy chấm có SystemVerilog · 7 case (2 mẫu) · giới hạn 4 s/case · ~15 phút
Mảng kết hợp (associative array) là "dictionary" của SystemVerilog. Scoreboard dùng nó để tra giao dịch theo ID, coverage tự viết dùng nó để đếm giá trị đã gặp, mô hình bộ nhớ thưa dùng nó thay cho mảng khổng lồ. Bài này dựng một bộ đếm tần suất từ.
class word_count;
function void add(string w); // tăng số đếm của w thêm 1
function int count(string w); // số đếm hiện tại của w; 0 nếu chưa có
function int distinct(); // số từ khác nhau đang có số đếm > 0
function int total(); // tổng mọi số đếm
function void remove(string w); // giảm số đếm của w đi 1; về 0 thì bỏ hẳn w;
// w chưa có thì không làm gì
function string most_frequent(); // từ có số đếm lớn nhất; hoà thì lấy từ NHỎ NHẤT theo
// thứ tự từ điển; chưa có từ nào thì trả ""
endclass
Ví dụ: sau add("dv"), add("rtl"), add("dv"), add("uvm"), add("rtl"):
count("dv") = 2,count("sva") = 0,distinct() = 3,total() = 5.most_frequent() = "dv", vì "dv" và "rtl" cùng có 2 và "dv" < "rtl".- Gọi tiếp
remove("uvm")thìdistinct() = 2.
Các case
- add và countmẫu
- most_frequent cơ bảnmẫ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à 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.