Array methods: tìm value, tìm index và cộng đúng width

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

Sau bài này bạn sẽ

  • Phân biệt kết quả locator là value hay index và trường hợp không match
  • Dùng with expression đủ width cho reduction/count
  • Nhận diện ordering methods mutate array và không dựa unique return order

Một method ngắn vẫn có kiểu trả về

Find, find_index và sum đều viết gọn nhưng trả những dữ liệu khác nhau. Một queue giá trị 3/3/2 không thể tự được dùng như queue inde x0/2/3. Với reduction, phải biết width tại từng bước; một intermediate 4 bit không thể giữ tổng 45.

Find lấy value, find index lấy vị trí

Values 3/1/3/2/0 với điều kiện>=2 cho values 3/3/2, indices 0/2/3. Hai kết quả đều có 3 element nhưng nội dung khác. Test dùng custom iterator v cho find và item mặc định cho find_index, luôn có with predicate. [1]

Không match là queue rỗng

Find_first của value 7 trong dữ liệu bài không có match nên result size 0. Không lấy result[0] rồi xem default 0 là một match. First ở đây vẫn trả một collection kết quả, khác thao tác associative first sửa key bằng argument; đọc đúng API thay vì suy từ tên gần giống.

Tổng value và đếm predicate là hai phép tính

Tổng 3+1+3+2+0=9. Đếm element>=2 cần cộng int của predicate 0/1, kết quả 3; không dùng một intermediate boolean làm nơi giữ số đếm lớn hơn 1. Bài viết cast ở expression with để ý định được kiểm rõ. [2]

Ba nibble 15 có tổng 45 hoặc modulo 16 là 13

Array có ba phần tử 4 bit 15, tổng số học 45. Phép gán sum vào narrow_result4bit chỉ giữ 45 modulo16=13; wide_resultint dùng with int(item) giữ 45. Nếu sau đó chép narrow_result vào int, carry đã mất không quay lại. Bài kiểm hai context cụ thể này, không suy return width của mọi reduction chỉ từ tên element type; probe bỏ cast trong context int của tool vẫn cho 45 nên không được dùng làm bằng chứng lỗi.

Kiểm set unique mà không buộc thứ tự chưa hứa

Dữ liệu bài có bốn value khác nhau 0/1/2/3. Test lấy unique rồi sort bản kết quả trước khi so set, không yêu cầu thứ tự unique phải là thứ tự gặp đầu. Không xoá kiểm multiplicity ở array gốc; unique là thao tác đúng khi contract cần một tập, sai nếu duplicate count có ý nghĩa.

Sort và reverse đổi array hiện tại

Sort values thành 0/1/2/3/3 rồi reverse cho 3 ở đầu và 0 ở cuối. Nếu cần giữ arrival order gốc, copy trước. Bài không claim sort stable khi key bằng nhau hoặc kiểm phân phối shuffle; những thuộc tính đó không theo từ một log đẹp. [3]

Locator, predicate count và overflow reduction

Expected trước chạy: matches 3/inde x0/2/3,total 9,count 3,narrowsum 13,widesum 45,unique 4.

Thí nghiệm methods

Kỳ vọng tính trước chạy: 3/1/3/2/0→sum 9,>=2 matches 3 inde x0/2/3;three4bit15sum45mod16=13;castitemwide 45,unique0/1/2/3.

tb_methods.sv testbench
module tb_methods;  int values[5]='{3,1,3,2,0};  int found_values[$],indices[$],uniques[$];  bit[3:0] narrow[3]='{15,15,15};  int total,matching_count,wide_result;  bit[3:0] narrow_result;  initial begin    found_values=values.find(v) with(v>=2);    indices=values.find_index with(item>=2);    if(found_values.size()!=3||found_values[0]!=3||found_values[1]!=3||found_values[2]!=2||       indices.size()!=3||indices[0]!=0||indices[1]!=2||indices[2]!=3) $fatal(1,"locator values versus indices");    found_values=values.find_first with(item==7);if(found_values.size()!=0) $fatal(1,"locator empty queue");    total=values.sum();matching_count=values.sum() with(int'(item>=2));    if(total!=9||matching_count!=3) $fatal(1,"reduction numeric value/predicate count");    narrow_result=narrow.sum();wide_result=narrow.sum() with(int'(item));    if(narrow_result!=4'd13||wide_result!=45) $fatal(1,"reduction expression width");    uniques=values.unique();uniques.sort();    if(uniques.size()!=4||uniques[0]!=0||uniques[1]!=1||uniques[2]!=2||uniques[3]!=3) $fatal(1,"unique set");    values.sort();    if(values[0]!=0||values[1]!=1||values[2]!=2||values[3]!=3||values[4]!=3) $fatal(1,"sort order");    values.reverse();if(values[0]!=3||values[4]!=0) $fatal(1,"reverse modifies array");    $display("METHOD CHECK matches=3 indices=0/2/3 total=9 count=3 narrow_sum=13 wide_sum=45 unique=4");    $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: METHOD CHECK matches=3 indices=0/2/3 total=9 count=3 narrow_sum=13 wide_sum=45 unique=4

Chỉ locator/ordering/reduction subset và context cụ thể trong TB. Narrow intermediate 4 bit giữ 13, explicitwide 45; bỏ cast vào contextint của pinned tool vẫn cho 45, không dùng làm bằng chứng mọi reduction return đều hẹp theo element.

Không claim stable sort, thứ tự unique, shuffle distribution, mọi iterator/collection combination hoặc 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.

Source dùng tên biến không trùng keyword và đặt method result trong context có kiểu rõ. Không claim mọi iterator/collection combination đã được tool hỗ trợ. [4]

Tự kiểm tra

Tự kiểm tra: methods

  1. Values 3/1/3/2/0 find_index>=2 cho gì?
  2. Ba nibble 15, narrow sum và sum with int(item) cho gì?
  3. Sum with int(item>=2) của dữ liệu bài là gì?
  4. Unique được so sau sort trong TB để làm gì?
  5. Find_first value 7 trong 3/1/3/2/0 trả gì?

Hỏi method trả gì và có sửa nguồn không

Ghi kiểu/kích thước kết quả, empty behavior, expression width và side effect. Với unique/order, chỉ kiểm thuộc tính thực cần; với sum, đặt width rõ trước khi giữ kết quả trung gian. Bài vẫn draft/LRM needs-spec-check.

Nguồn và mức độ đối chiếu

  1. SystemVerilog Array Manipulation — bản chụp resources.zip, Locator methods. Trích dẫn; nguồn đã đọc các mục liên quan.
  2. SystemVerilog Array Manipulation — bản chụp resources.zip, Reduction. Trích dẫn; nguồn đã đọc các mục liên quan.
  3. SystemVerilog Array Manipulation — bản chụp resources.zip, Ordering methods. Trích dẫn; nguồn đã đọc các mục liên quan.
  4. Thí nghiệm nguyên bản ex.b2.methods, Bằng chứng. Trích dẫn; nguồn đã đọc toàn văn.
  5. IEEE 1800-2023 SystemVerilog LRM, methods array and collection semantics. Chưa đối chiếu với văn bản nguồn (chưa mở).
  6. Thí nghiệm nguyên bản ex.b2.methods, Source, self-checks, metadata và verification.json; probe limits. Trích dẫn; nguồn đã đọc toàn văn.
  7. SystemVerilog Array Manipulation — bản chụp resources.zip, Array Locator Methods; Array Ordering Methods; Array Reduction Methods. Trích dẫn; nguồn đã đọc các mục liên quan.