Debug randomization: khoanh vùng xung đột trước khi đổi seed
Tiên quyết
Sau bài này bạn sẽ
- Tính giao của type domain, state và các hard constraint đang bật
- Dùng mode để khoanh vùng xung đột rồi khôi phục đúng contract
- Phân biệt một request vô nghiệm với lỗi tool hoặc thiếu coverage
Return 0 là tín hiệu cần điều tra, không phải một mẫu khác
Một generator có value 3 bit, ceiling bằng 5, rule chẵn và allowed_codes gồm 2, 4, 6. Khi một request thất bại, đừng bỏ qua return code rồi dùng giá trị đang nằm trong object. Nó chưa được xác nhận là stimulus hợp lệ cho request ấy.
Đổi seed không làm hai hard rule mâu thuẫn trở nên tương thích. Trước tiên phải xác định type domain, state đang giữ, inline pin và tất cả constraint có liên quan; sau đó mới xem cơ chế lấy mẫu hoặc khả năng của tool.
Tính giao tập nghiệm bằng tay
Miền kiểu dữ liệu là 0 đến 7. Ceiling 5 giữ 0 đến 5. Rule chẵn giữ 0, 2, 4, 6. Allowed_codes giữ 2, 4, 6. Giao cuối cùng chỉ có 2 và 4.
Main pin từng giá trị 0 đến 7. Kỳ vọng là 2 accept và 6 reject; giá trị được pin không được tự đổi thành một giá trị khác rồi báo thành công. Bảng miền nhỏ là oracle đầu tiên để phân biệt generator sai với request không thể thỏa.
Field bị giữ vẫn tham gia bài toán
Test đặt value bằng 3 rồi tắt rand_mode của field. Khi đó randomize không được chọn lại value để cứu request. Ceiling vẫn cho phép 3, nhưng rule chẵn và allowed_codes đều không cho phép.
Call phải trả 0. Đó là một request vô nghiệm theo contract hiện tại, không phải bằng chứng seed xấu. State được giữ và mode phải được ghi vào log tái hiện, cùng cấu hình tool và phiên bản source.
Tắt một rule chưa chắc đã gỡ hết xung đột
Test tắt riêng even_value; call vẫn phải thất bại vì allowed_codes còn loại 3. Sau đó tắt allowed_codes; giờ chỉ ceiling đang áp dụng cho value bị giữ, nên call có thể thành công và giữ 3.
Ba mốc fail, fail, success giúp khoanh vùng hai ràng buộc cùng gây xung đột. Nó không biến 3 thành stimulus hợp lệ của generator gốc. Việc tắt mode ở đây là thí nghiệm chẩn đoán, không phải cách sửa specification.
Khôi phục contract trước khi tiếp tục test DUT
Main bật lại hai constraint và rand_mode, rồi thực hiện 32 call tự do. Mỗi call phải thành công và value phải thuộc tập 2 hoặc 4. Bỏ sót bước khôi phục có thể làm những ca kiểm sau âm thầm kiểm một miền khác.
Khi dùng helper debug trong một testbench lớn, hãy ghi nhận trạng thái ban đầu và có đường khôi phục ngay cả khi bước chẩn đoán phát hiện lỗi. Main ở đây là chuỗi nhỏ cố định; nó không mô phỏng cơ chế exception hoặc mọi kiểu cleanup của một framework.
Phân phối không thay việc tính miền hợp lệ
Dist gắn trọng số cho giá trị; cú pháp := và :/ xử lý trọng số của range khác nhau theo nguồn đào tạo. Tính trọng số trong một mô hình phải được tách khỏi phép kiểm field có hợp lệ với các hard rule khác hay không.
Một probe riêng kết hợp dist, cận trên và inline pin không khớp return-code oracle trên Verilator 5.050 đã ghi. Main của bài dùng membership tường minh để kiểm luồng debug; nó không claim dist+inline hoặc một tỷ lệ xác suất đã được engine thực hiện đúng.
Tách ba loại bằng chứng
Request có giao tập rỗng là lỗi cấu hình hay kỳ vọng của test. Một mẫu return 1 nhưng sai oracle là khác biệt thực thi cần điều tra ở code/tool. Cuối cùng, một miền hợp lệ chưa được hit đủ là câu chuyện về coverage và lấy mẫu; hai vấn đề trước không được sửa bằng cách chỉ chạy thêm seed.
Các diagnostic UNSAT cho pin cố ý vô nghiệm được giữ. Lỗi giao tiếp solver, parse/build fail hoặc assertion bị bắt trong capability probe được ghi đúng loại, không đổi expected để gọi là simulation pass.
8 pin, 3 mốc chẩn đoán và 32 call sau khôi phục
Expected tính trước chạy: 2 accept/6 reject trong 8 pin; ba mốc chẩn đoán; 32 call sau khôi phục đều thuộc 2 hoặc 4. Mẫu tạm cho phép 3 không được dùng làm bằng chứng generator gốc hợp lệ.
Tự kiểm tra
Repro nhỏ phải giữ cả state và oracle
Lưu source, tool, seed, state trước call và mode đang bật. Thu nhỏ miền để tính nghiệm bằng tay, kiểm return code trước khi đọc dữ liệu, rồi đối chiếu mẫu thành công với oracle độc lập. Một bộ test xanh chỉ có nghĩa trong phạm vi các assertion đã thực sự được chạy.
Nguồn và mức độ đối chiếu
- SystemVerilog Disable Constraints — bản chụp resources.zip, Syntax; Method; Example. Trích dẫn; nguồn đã đọc các mục liên quan.
- SystemVerilog Constraint Examples — bản chụp resources.zip, Weighted Distributions; := Operator; :/ Operator. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.b6.debug, Oracle, mutation và dist capability probe. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, Constraint expressions, callbacks, arrays and randomization methods. Chưa đối chiếu với văn bản nguồn (chưa mở).
- IEEE 1800-2023 SystemVerilog LRM, Class randomization, array constraints and callbacks — chưa đối chiếu LRM. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Thí nghiệm nguyên bản ex.b6.debug, Source, self-checks, verification.json, mutation và capability probes. Trích dẫn; nguồn đã đọc toàn văn.