Rand và randc: chu kỳ nhỏ khác với một mẫu ngẫu nhiên có thể lặp
Tiên quyết
- Module B5: OOP: Đang tải
- Class handle và object: hai tên có thể cùng sửa một transaction: Đang tải
Sau bài này bạn sẽ
- Phân biệt property randomizable với state thường của object
- Kiểm randc trên miền nhỏ và ổn định
- Tách invariant của test khỏi thứ tự số ngẫu nhiên theo seed/tool
Sinh được số chưa chứng minh đã phủ tình huống cần kiểm
Testbench cần cả dữ liệu hợp lệ lẫn cách biết tình huống nào đã thử. Một vòng randomize dài không tự bảo đảm mọi corner case xuất hiện. Với miền nhỏ, hãy định nghĩa coverage cần đạt và chọn cơ chế phù hợp; với miền lớn, cần kế hoạch verification thay vì chỉ tăng số vòng.
Rand cho phép giá trị lặp
Draw.ordinary là rand bit 3, bị giới hạn vào 0..5. Main không đòi các lần gọi liên tiếp khác nhau hoặc mọi giá trị xuất hiện với tần suất bằng nhau. Lặp lại là hợp lệ; một test xem repetition tự nó là lỗi sẽ kiểm sai contract.
Randc đi hết miền nhỏ trước khi lặp trong cùng chu kỳ
Draw.cyclic là randc bit 2 không có constraint thêm trên field đó. Main chia 32 call thành 8 nhóm 4 call, mỗi nhóm phải thấy đủ 0/1/2/3 và không lặp. Không ghim thứ tự từng nhóm; giá trị cuối nhóm trước có thể bằng giá trị đầu nhóm sau mà không vi phạm chu kỳ.
Giới hạn claim vào domain và coupling đã chạy
Miền cyclic trong example cố định bốn giá trị, tách khỏi constraint ordinary. Bài không claim randc với domain đổi giữa chừng, nhiều randc phụ thuộc nhau hoặc arbitrary constraint luôn tìm được mọi nghiệm. Không lấy ví dụ 2 bit làm bằng chứng mọi array/randc width đều được tool hỗ trợ.
Seed giúp tái hiện trong một flow, không tạo dãy portable
Main gọi srandom 37 cho object rồi kiểm các thuộc tính của kết quả. Nó không yêu cầu giá trị đầu tiên hoặc một chuỗi 32 số cụ thể. Simulator, solver, source và cách sử dụng RNG đều có thể ảnh hưởng dãy; ghi chúng cùng seed khi debug.
Repetition được chứng minh bằng kích thước miền
Có 32 lần sinh ordinary nhưng chỉ 6 giá trị hợp lệ, nên ít nhất một giá trị phải lặp theo nguyên lý pigeonhole. Main kiểm repeat_seen, không dùng một ngưỡng histogram tuỳ ý để gọi phân phối là đúng. Đây không phải chứng minh độ đồng đều, độc lập xác suất hoặc chất lượng RNG.
Kiểm return trước khi dùng các field vừa randomize
Mỗi call phải trả thành công trước khi TB dùng ordinary/cyclic. Field held không có rand và khởi tạo 19; nó phải giữ 19 trong main. Không dùng assert bị tắt để vô tình bỏ cả randomize; source dùng if/fatal rõ ràng.
32 call, tám chu kỳ và một field không randomize
Expected tính trước chạy: 32 call thành công,8 nhóm có maskf,ordinary có repetition và held 19. Mutation đổi randc thành rand bị checker bắt ở seed/flow ghim; không sửa oracle thành cho phép lặp trong nhóm để nhận kết quả sai.
Tự kiểm tra
Kiểm thuộc tính và coverage thay vì yêu cầu một dãy đẹp
Ghi domain, tính chu kỳ cần có, field nào không randomize và điều kiện thành công. Tái hiện bằng seed/tool/source cụ thể; test correctness bằng invariant. Nếu cần mọi giá trị hoặc cross, phải có checker/coverage phù hợp chứ không chỉ nhìn vài dòng output.
Nguồn và mức độ đối chiếu
- SystemVerilog Random — bản chụp resources.zip, Nguồn đào tạo đã đọc theo section. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.b6.rand-randc, Bằng chứng thực nghiệm. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, Class randomization and constraint expressions. 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.rand-randc, Source, self-checks, verification.json và mutation probes. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, Class randomization, constraint expressions and randomization methods. Chưa đối chiếu với văn bản nguồn (chưa mở).
- SystemVerilog Random — bản chụp resources.zip, rand: Uniformly Distributed, Repeats Allowed; randc: Cycles Through Every Value Before Repeating. Trích dẫn; nguồn đã đọc các mục liên quan.
- SystemVerilog Randomization — bản chụp resources.zip, Randomizing Class Properties; Always Check the Return Value. Trích dẫn; nguồn đã đọc các mục liên quan.