Randomize và constraints: inside, dist, implication, inline with
Tiên quyết
- Module B5: OOP: Đang tải
- Rand và randc: chu kỳ nhỏ khác với một mẫu ngẫu nhiên có thể lặp: Đang tải
Sau bài này bạn sẽ
- Tính tập nghiệm trước khi chạy solver
- Kiểm nhiều constraint cùng áp dụng và inline pinning không thay hard constraint
- Phân biệt randomize thất bại với một mẫu mới hợp lệ
Tập hợp hợp lệ phải có trước lời gọi randomize
Rectangle có width/height 4 bit. Hai kích thước được giới hạn 1..4 và tích không quá 6. Trước khi dùng solver, hãy liệt kê những hình chữ nhật hợp lệ: một thông báo randomize thành công chưa cho biết hợp đồng của test đã viết đúng.
Constraint là điều kiện, không phải lệnh gán
Các hard constraint đang bật phải cùng đúng. Block dimensions và area_limit được giải cùng nhau; thứ tự viết không làm block sau ghi đè block trước. Bài dùng quan hệ số học nguyên bản, không đưa thêm quy tắc protocol hoặc coi ví dụ là đặc tả bus.
Đếm giao của hai miền thay vì cộng hai điều kiện
Width 1 cho height 1..4; width 2 cho 1..3; width 3 cho 1..2; width 4 chỉ height 1. Tổng 4+3+2+1=10 cặp. Constraint không yêu cầu solver sinh theo thứ tự bảng này hoặc mỗi cặp có cùng tần suất trong một mẫu nhỏ.
Width của biểu thức vẫn ảnh hưởng cả solver lẫn checker
Area_limit dùng intcast trước multiplication để phép tính không vô tình bị giới hạn trong width 4 bit. TB kiểm theo bảng chiều cao hợp lệ theo từng width, không dùng output DUT để tạo expected. Vấn đề width trong B1 vẫn áp dụng dù biểu thức nằm trong constraint.
Inline pinning bổ sung điều kiện cho một call
Main ép từng cặp width/height bằng inline with và local qualifier, quét đủ 256 cặp của miền 4 bit. Đúng 10 cặp phải thành công và 246 cặp phải thất bại. Inline không ghi đè dimensions; yêu cầu width 0 vẫn không hợp lệ dù call đã chỉ định nó.
Return 0 không phải một mẫu mới
Trước mỗi pinned call, main đặt hai field thành 9. Với 246 call vô nghiệm, cả hai field phải giữ 9; TB không gửi chúng như dữ liệu hợp lệ chỉ vì đã gọi randomize. Sau đó 64 call bình thường đều phải thoả oracle, không yêu cầu một histogram cụ thể.
Kiểm đủ tập nghiệm và phép inside dùng trong quiz
Expected trước chạy: 256 pin,10 accept/246 reject,64 sample hợp lệ,246 failure giữ field; thêm 64 địa chỉ 0..63 kiểm inside 0..60 và căn 4, có 16 giá trị được chọn. Phần địa chỉ chỉ là bài toán số học, không khẳng định quy tắc bus. Hai question ID cũ được giữ nguyên nghĩa để bảo toàn lịch sử làm bài.
Dist là trọng số, còn hỗ trợ tool phải được đo riêng
Dist không thay hard legality. Repo đã ghi hạn chế lịch sử của Verilator 5.050 khi ghép dist và inline trên cùng field trong docs/toolchain.md; đây không phải yêu cầu LRM hay một phép đo vừa chạy lại. Ví dụ chính dùng inside/hard constraints, không gọi dist+inline unsupported là đã simulated. Code APB cũ chỉ giữ nguyên làm regression, không được nâng trạng thái hoặc dùng để nghiên cứu protocol mới.
Giữ nguyên embed cũ bên dưới để tài nguyên hiện có không biến mất khỏi bài. Source, expected và proof của nó không đổi; phần phát triển mới dùng Rectangle ở section code.
Tự kiểm tra
Dùng oracle tập nghiệm để debug constraint
Liệt kê miền, width và giao các điều kiện; kiểm return của mỗi call trước khi dùng field. Với miền nhỏ hãy pin mọi điểm để kiểm cả legal/illegal, rồi thêm sample bình thường. Giữ scope của source, solver và đặc tả tách rõ; parse hoặc compile được chưa chứng minh solver sinh đúng.
Nguồn và mức độ đối chiếu
- SystemVerilog Constraint Blocks — 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.constraints, 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ở).
- ChipVerify — SystemVerilog tutorial, §8 Constraints. Trích dẫn; nguồn mới xem mục lục. danh mục chủ đề
- Thí nghiệm nguyên bản ex.b6.constraints, 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 Constraint Blocks — bản chụp resources.zip, Syntax; Multiple Constraint Blocks; How the Solver Handles Multiple Blocks. Trích dẫn; nguồn đã đọc các mục liên quan.
- SystemVerilog Constraint 'inside' — bản chụp resources.zip, Used in Constraints; Inverted inside. Trích dẫn; nguồn đã đọc các mục liên quan.
- Kết quả thực nghiệm toolchain của dự án (docs/toolchain.md), Hạn chế dist+inline đã ghi trong docs/toolchain.md. Trích dẫn; nguồn đã đọc toàn văn.