Array methods: tìm value, tìm index và cộng đúng width
Tiên quyết
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.
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
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
- 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.
- SystemVerilog Array Manipulation — bản chụp resources.zip, Reduction. Trích dẫn; nguồn đã đọc các mục liên quan.
- 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.
- 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.
- 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ở).
- 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.
- 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.