Memory partition constraints: biên, chồng lấp và độ rộng
Tiên quyết
Sau bài này bạn sẽ
- Mô tả hai vùng nhớ bằng khoảng half-open có biên rõ
- Đếm số cấu hình hợp lệ và kiểm bằng occupancy mask độc lập
- Tránh wrap khi cộng địa chỉ với độ dài trong constraint
Đặt hợp đồng của vùng nhớ trước khi randomize
Có tám ô nhớ với chỉ số 0 đến 7. Hai vùng được gắn nhãn A và B, mỗi vùng dài 1 đến 3 ô. Mỗi vùng phải nằm trọn trong bộ nhớ và hai vùng không được dùng chung ô. Chúng có thể để lại khoảng trống; không yêu cầu phủ kín hoặc nối liên tục.
Đây là mô hình bộ nhớ trừu tượng, không phải quy tắc timing, handshake hay địa chỉ của một protocol cụ thể. Ta cần kiểm toán học về miền và khoảng, trước khi gắn generator vào một thiết kế có giao thức riêng.
Half-open: end là vị trí ngay sau vùng
Vùng bắt đầu tại s, dài n được biểu diễn bởi khoảng [s,s+n). Nó chứa n ô, từ s đến s+n-1. Vì thế start bằng 7 với length bằng 1 có end bằng 8 và vẫn hợp lệ trong bộ nhớ tám ô.
Không trộn end-exclusive của mô hình này với địa chỉ ô cuối cùng. Khi một tài liệu dùng last_address, công thức có thể chứa trừ 1; ở đây dùng end-exclusive nên điều kiện biên là end nhỏ hơn hoặc bằng 8.
Hai thứ tự đặt vùng đều phải được cho phép
Hai vùng không chồng khi end của A nhỏ hơn hoặc bằng start của B, hoặc end của B nhỏ hơn hoặc bằng start của A. Dấu bằng cho phép hai vùng chạm biên mà không có ô chung.
Chỉ viết A ở trước B sẽ loại các cấu hình hợp lệ mà B nằm trước. Thay OR bằng AND lại đòi hai vùng đều đứng trước nhau; với độ dài dương, đó không phải yêu cầu của bài toán. Oracle mask ở testbench không lặp lại expression OR để tự chấm nó.
Đừng để tổng end bị cắt về độ rộng địa chỉ
Start là field 3 bit, còn length là field 2 bit. Tổng toán học có thể lớn hơn 7. Main cast các toán hạng sang int trước khi cộng, rồi so end với 8. Oracle đi từng ô và từ chối ngay nếu một ô vượt 7.
Mutation cắt tổng end của A xuống 3 bit trước phép so. Ví dụ start 7 cộng length 2 thành 9 trong toán học nhưng thành 1 sau cắt; phép kiểm biên như vậy có thể nhận một vùng vượt bộ nhớ. Checker phải bắt được bằng mask oracle, không thay expected theo output.
282 cấu hình hợp lệ trong 576 pin
Có 8 lựa chọn start cho mỗi vùng và 3 lựa chọn length cho mỗi vùng: 8*8*3*3 = 576 cấu hình pin. Với một cặp độ dài a,b cố định, chọn thứ tự A/B rồi phân phần trống vào trước, giữa và sau hai vùng cho phép đếm số bố trí.
Gộp theo tổng độ dài 2, 3, 4, 5 và 6, số cấu hình tương ứng là 56, 84, 90, 40 và 12. Tổng bằng 282; còn 294 bị loại. Nhãn A/B và start khác nhau tạo cấu hình khác nhau, nên không chia đôi số này như khi đếm một tập vùng không có nhãn.
Kiểm bằng bit chiếm dụng thay vì lặp constraint
Oracle tạo hai mask 8 bit. Với từng ô của một vùng, nó kiểm index trong 0 đến 7 rồi đặt bit tương ứng. Nếu hai mask có bit chung, cấu hình bị loại. Cách này kiểm đồng thời biên và overlap bằng biểu diễn khác với constraint cộng end.
Main pin đủ 576 cấu hình và đối chiếu return code. Mỗi call thành công còn phải giữ đúng cả bốn giá trị được pin. Sau đó 64 mẫu tự do được đưa qua cùng oracle, không suy độ phủ hoặc phân phối từ số mẫu đó.
Không chép một công thức biên khi chưa kiểm contract
Nguồn đào tạo mô tả các ví dụ block và partition với cách đặt end khác nhau. Trong phần Memory Block, một lời giải quick-check mô tả thiếu guard của end dù code ngay phía trên có guard đó. Bài dùng nguồn để nhận diện chủ đề, không dùng mâu thuẫn ấy làm rule.
Ở mô hình này, contract half-open và occupancy mask là cơ sở đối chiếu rõ ràng. Các quy tắc ngôn ngữ về cast/constraint vẫn needs-spec-check; 282 kết quả đúng của mô hình nhỏ không thay một chuẩn cho mọi memory map hoặc protocol.
Vét 576 cấu hình và kiểm 64 mẫu
Expected tính trước chạy: 282 accept, 294 reject và 64 mẫu tự do hợp lệ, bộ nhớ có 8 ô. Không có yêu cầu alignment hoặc phủ kín ngầm thêm vào mô hình.
Tự kiểm tra
Một interval cần type, đơn vị và quy ước biên
Trước khi viết constraint, ghi start/end dùng đơn vị nào, end inclusive hay exclusive, khoảng trống có được phép không và vùng có nhãn hay không. Sau đó chọn một oracle khác cách mã hóa constraint. Kiểm các ca sát biên và phép cộng trước khi nghĩ tới seed hoặc tần suất.
Nguồn và mức độ đối chiếu
- Memory Partitioning Example — bản chụp resources.zip, Memory Block Randomization; Variable Memory Partitions. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.b6.patterns, Thí nghiệm nguyên bản và mask oracle. 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.patterns, Source, self-checks, verification.json, mutation và capability probes. Trích dẫn; nguồn đã đọc toàn văn.