Viết uvm_sequence: burst ghi, đọc lại để kiểm, dừng khi lỗi
Class cần viết: burst_seq · cần máy chấm có UVM · 8 case (2 mẫu) · giới hạn 20 s/case · ~30 phút
Sequence là nơi viết kịch bản kích thích trong UVM. Driver biết cách đẩy một giao dịch lên dây, còn sequence quyết định gửi giao dịch nào, theo thứ tự nào, và phản ứng với kết quả ra sao. Bài này viết một sequence có dùng response: ghi một dải địa chỉ, tuỳ chọn đọc lại để tự kiểm, và dừng ngay khi bus báo lỗi.
Gói bus_seq_pkg (đã import sẵn):
typedef enum bit { READ = 0, WRITE = 1 } op_e;
class bus_item extends uvm_sequence_item;
op_e op; bit [31:0] addr, data; bit err;
endclass
Viết:
class burst_seq extends uvm_sequence #(bus_item);
`uvm_object_utils(burst_seq)
int unsigned n = 4; // số địa chỉ
bit [31:0] base;
bit verify = 0; // 1: ghi xong thì đọc lại từng địa chỉ để so
int unsigned n_err; // số response có err = 1
int unsigned n_mismatch; // số lần đọc lại ra dữ liệu khác dữ liệu đã ghi
bit aborted; // 1 nếu đã dừng sớm vì lỗi
function new(string name = "burst_seq");
task body();
endclass
body():
- Ghi: với
i = 0 … n-1, gửiWRITEtớiaddr = base + 4*ivớidata = base ^ (i * 32'h0101_0101). Mỗi giao dịch gửi xong thì lấy response. - Đọc lại (chỉ khi
verify = 1): vớii = 0 … n-1, gửiREADtới cùng các địa chỉ đó theo cùng thứ tự. Response códatakhác dữ liệu đã ghi thìn_mismatch++. - Lỗi: bất kỳ response nào có
err = 1(ghi hay đọc) thìn_err++,aborted = 1, và dừng ngay: không gửi thêm giao dịch nào.
Mỗi giao dịch có đúng một response. Testbench có sequencer và driver riêng. Driver mô phỏng một bộ nhớ, có thể được cấu hình để báo lỗi hoặc trả sai dữ liệu ở vài địa chỉ. Test gọi seq.start(sequencer) rồi kiểm các giao dịch driver nhận được và các bộ đếm của sequence.
Các case
- 4 lệnh ghimẫu
- Ghi rồi đọc lại, mọi thứ đúngmẫu
Cùng 6 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.