SVA cho valid/ready: giữ valid, giữ data và $onehot0
Module cần viết: vr_chk · cần máy chấm có SystemVerilog · 6 case (2 mẫu) · giới hạn 4 s/case · ~25 phút
Giao tiếp valid/ready là xương sống của hầu hết bus on-chip: bên gửi đưa valid cùng data; giao dịch xảy ra ở nhịp có valid && ready. Hai quy tắc ổn định làm cho nó an toàn, và cả hai phải được kiểm bằng assertion trong mọi môi trường DV:
- P1. Ở nhịp nào có
valid = 1vàready = 0(giao dịch đang chờ), ở nhịp kế tiếpvalidvẫn phải bằng 1. - P2. Trong cùng tình huống đó, ở nhịp kế tiếp
dataphải giữ nguyên giá trị của nhịp hiện tại. - P3. Ở mọi nhịp,
sel(4 bit) có nhiều nhất một bit bằng 1. - Trong lúc
rst_n = 0, không kiểm gì, và mọi lần kiểm đang dở bị huỷ.
Khi không có giao dịch đang chờ (valid = 0, hoặc ngay sau nhịp có valid && ready), valid và data được tự do thay đổi.
module vr_chk (
input logic clk, rst_n, valid, ready,
input logic [7:0] data,
input logic [3:0] sel,
output int e1, e2, e3 // số lần vi phạm P1, P2, P3 (bắt đầu từ 0)
);
Mỗi vi phạm tăng bộ đếm tương ứng đúng một lần (dùng action block else eN++ của assert property). Testbench đổi tín hiệu ở cạnh xuống và so các bộ đếm với mô hình của nó.
Các case
- Giao dịch đúng: không có vi phạmmẫu
- Rút valid, đổi data khi chưa được nhậnmẫ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à 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.