Ràng buộc cho gói tin: khoảng [a:b], kích thước mảng và & thiếu ngoặc
Class cần viết: pkt · cần máy chấm có SystemVerilog · 6 case (2 mẫu) · giới hạn 4 s/case · ~20 phút
Ràng buộc (constraint) là ngôn ngữ để mô tả "mọi kích thích hợp lệ". Viết thiếu thì testbench sinh dữ liệu rác; viết thừa thì bỏ sót cả một vùng của thiết kế mà không ai biết. Bài này là một gói tin nhỏ với bốn quy tắc.
Kiểu kind_e và các trường đã có trong starter (giữ nguyên tên):
typedef enum bit [1:0] { READ, WRITE, IDLE } kind_e;
class pkt;
rand kind_e kind;
rand bit [15:0] addr;
rand bit [4:0] len;
rand bit [7:0] payload[];
endclass
Viết các constraint sao cho mọi lần randomize() thành công cho ra gói thoả:
lentừ 1 đến 16 (mọi giá trị trong khoảng đều phải có thể xuất hiện).payload.size() == len.- Gói
WRITEcóaddrchia hết cho 4. GóiREADkhông bị ràng buộc về địa chỉ. - Gói
IDLEcólen == 1vàaddr == 0.
Và ràng buộc của bạn phải cho phép nơi gọi thêm ràng buộc inline, ví dụ p.randomize() with { kind == WRITE; addr inside {[16'h100:16'h1FF]}; }.
Testbench randomize hàng nghìn lần, kiểm từng gói theo 4 quy tắc, và đo thêm vài thống kê (có gói WRITE không, READ có địa chỉ lẻ không, len có trải khắp khoảng không) để phát hiện ràng buộc thừa. Đề cần simulator hỗ trợ đầy đủ randomize của IEEE 1800.
Các case
- 200 gói ngẫu nhiên hợp lệmẫu
- Gói WRITE vẫn xuất hiện và căn 4mẫ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.