Memory partition constraints: biên, chồng lấp và độ rộng

Khoảng 45 phútMức 3/3Bản nháp: một số khẳng định chưa đối chiếu spec

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.

A chiếm ô 0 và 1; B chiếm ô 3,4,5; các ô 2,6,7 còn trống

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.

[1]

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.

Memory partition constraints: biên, chồng lấp và độ rộng

Expected tính trước chạy: MEMORY CHECK pinned=576 accepted=282 rejected=294 sampled=64 slots=8

tb.sv testbench
`timescale 1ns/1ps// 8 slots, two labeled non-overlapping intervals, each length1..3, gaps allowed.// Expected count by length sums:56+84+90+40+12=282 accepted among576 pins.class MemoryPair;  rand bit[2:0] start_a,start_b;  rand bit[1:0] length_a,length_b;  constraint sizes {length_a inside {[1:3]};length_b inside {[1:3]};}  constraint bounds {    int'(start_a)+int'(length_a)<=8;    int'(start_b)+int'(length_b)<=8;  }  constraint disjoint {    (int'(start_a)+int'(length_a)<=int'(start_b)) ||    (int'(start_b)+int'(length_b)<=int'(start_a));  }endclassmodule tb_patterns;  MemoryPair item;  int accepted=0,rejected=0,samples=0;  function automatic bit oracle(input int a,na,b,nb);    bit[7:0] mask_a,mask_b;    if(na<1||na>3||nb<1||nb>3)return 0;    mask_a=0;mask_b=0;    for(int i=0;i<na;i++)begin if(a+i<0||a+i>=8)return 0;mask_a[a+i]=1;end    for(int i=0;i<nb;i++)begin if(b+i<0||b+i>=8)return 0;mask_b[b+i]=1;end    return (mask_a&mask_b)==0;  endfunction  initial begin    item=new();item.srandom(109);    for(int a=0;a<8;a++)for(int b=0;b<8;b++)for(int na=1;na<=3;na++)for(int nb=1;nb<=3;nb++)begin      int result;bit legal;      legal=oracle(a,na,b,nb);      result=item.randomize() with {start_a==local::a;start_b==local::b;length_a==local::na;length_b==local::nb;};      if(result!=int'(legal))$fatal(1,"memory mask legal-set oracle");      if(result)begin        if(item.start_a!=a||item.start_b!=b||item.length_a!=na||item.length_b!=nb)$fatal(1,"memory pins ignored");accepted++;      end else rejected++;    end    repeat(64)begin      if(!item.randomize())$fatal(1,"memory free call failed");      if(!oracle(int'(item.start_a),int'(item.length_a),int'(item.start_b),int'(item.length_b)))$fatal(1,"memory free mask oracle");samples++;    end    if(accepted!=282||rejected!=294||samples!=64)$fatal(1,"memory accounting");    $display("MEMORY CHECK pinned=576 accepted=282 rejected=294 sampled=64 slots=8");    $finish;  endendmodule

Đã kiểm chứng thế nào

  • Phân tích và elaborate theo LRM (pyslang 12.1.0)
  • Mô phỏng, exit 0 và output khớp kỳ vọng tính tay (Verilator 5.050, 2-state)

Output phải khớp: MEMORY CHECK pinned=576 accepted=282 rejected=294 sampled=64 slots=8

Verilator 5.050/2-state, SMT solver; chỉ scope đã kiểm, không thay LRM.

Chỉ 2 vùng có nhãn/8 ô/length 1..3, cho gap, không alignment hoặc full-coverage. Không claim memorymap/protocol compliance/synthesis.

Các kiểm tra chạy lúc xây dựng nội dung (2026-11-06), không chạy trong trình duyệt. Kỳ vọng được tính tay trước khi chạy.

[2]

Tự kiểm tra

Tự kiểm tra: patterns

  1. Trong 576 cấu hình pin hai vùng có nhãn, expected số cấu hình hợp lệ của bài là bao nhiêu?
  2. Vùng half-open có start 7, length 1 trong bộ nhớ 8 ô có hợp lệ về biên không?
  3. A=[0,2), B=[2,5). Hai vùng có chồng lấp không?
  4. Tổng toán học start 7+length 2 bằng 9. Nếu cắt xuống 3 bit trước kiểm, nó thành gì?
  5. Những yêu cầu nào thuộc mô hình memory của bài?

    Chọn tất cả đáp án đúng.

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

  1. 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.
  2. 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.
  3. 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ở).
  4. 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ở).
  5. 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.