Associative array: key tồn tại, giá trị bằng0 và thứ tự duyệt
Tiên quyết
Sau bài này bạn sẽ
- Phân biệt missing key với stored zero và overwrite với thêm entry
- Duyệt typed keys bằng return status của first/next
- Nhận diện giới hạn signed-key của flow và kiểm explicit key normalization
ID thưa không cần một array chứa mọi khoảng trống
Ba request có ID cách xa nhau không cần cấp phát một array tới ID lớn nhất. Associative array lưu theo key đã dùng. Nhưng việc đọc được số 0 không tự nói key từng được thêm: existence là câu hỏi khác với value. Dùng exists trước khi xử lý response nếu missing key là lỗi.
Chọn key type là một phần của contract
Trong bài có unsigned integral key cho numeric order đã chuẩn hoá, và string key cho tên. Không suy rằng mọi kiểu bất kỳ đều có cùng ordering hoặc được mọi tool hỗ trợ. Cú pháp type trong ngoặc sau tên khác [] của dynamic array và [$] của queue. [1]
Overwrite không làm entry count tăng
Ví dụ lưu giá trị cho ba signed input 12/-2/5 qua adapter key. Ghi lại key 5 bằng 55 thay 50 giữ num 3; key 6 vẫn không tồn tại. Nếu duplicate ID bị cấm trong scoreboard, caller phải kiểm exists rồi từ chối, vì phép gán associative array tự nó chỉ overwrite.
First và next vừa trả trạng thái vừa sửa key
Gọi first(key), kiểm return thành công rồi mới dùng key đọc entry. Next tiếp tục từ key hiện tại; sau cuối trả false, không dùng key như một entry mới. Với array rỗng, first false. Test không dựa vào thứ tự chèn và không giả định key sau failure là giá trị hợp lệ. [2]
Probe native signed-key chưa đạt kỳ vọng trong flow
Probe riêng dùng int key trực tiếp, chèn 12/-2/5 và giữ assertion rằng numeric first là-2. Verilator 5.050 thực tế trả 5; generated map dùng unsigned IData. Probe này đã fail và không được tính là pass hoặc sửa expected thành 5. Chưa đối chiếu LRM đầy đủ để kết luận mọi tool; bài không claim native signed-key traversal đã được xác minh.
Adapter unsigned key giữ thứ tự signed rõ ràng
Ví dụ chính đổi signed input 32 bit sang unsigned representation rồi XOR signbit 80000000. Vùng âm về nửa thấp, vùng không âm về nửa cao; decoding XOR lại rồi cast int. Đây là algorithm được khai báo rõ, không phải native signed ordering. Test giữ các input âm và kiểm 1024 cặp trong-16..15, cùng hai endpoint INT_MIN/INT_MAX, theo expected signed comparison độc lập.
Delete một key và xoá cả map là hai thao tác
Delete key 5 để còn hai entry, last/prev tương ứng 12/-2 sau decode. Delete() không argument làm map rỗng. String map chènz rồi a nhưng firsta trong subset đã kiểm. Đừng dùng associative iteration làm FIFO arrival order; nếu cần arrival order, lưu thêm queue riêng.
Key normalization, overwrite và kết thúc traversal
Expected trước chạy: 32 x 32=1024 orderpairs, signedinputsorted-2/5/12, overwrite 55, afterdelete 2, firststringa, emptyfirstfalse.
Bằng chứng chỉ cho algorithm explicit unsigned-key và string subset này; không xoá thất bại native signed-key khỏi nhật ký. [3]
Tự kiểm tra
Kiểm key trước khi tin dữ liệu
Tách exists, entry count, value và ordering. Với raw ID, xác định width/sign trước khi thành key để tránh collision. Khi flow khác expected, giữ diagnostic, tách adapter đã kiểm khỏi feature chưa được chứng minh. Bài vẫn draft/LRM needs-spec-check.
Nguồn và mức độ đối chiếu
- SystemVerilog Associative Array — bản chụp resources.zip, Typed associative keys. Trích dẫn; nguồn đã đọc các mục liên quan.
- SystemVerilog Associative Array — bản chụp resources.zip, Methods. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.b2.assoc, Bằng chứng và probe. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, assoc 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.assoc, Source, self-checks, metadata và verification.json; probe limits. Trích dẫn; nguồn đã đọc toàn văn.
- SystemVerilog Associative Array — bản chụp resources.zip, Syntax; Associative Array Methods; Associative Array Methods Example. Trích dẫn; nguồn đã đọc các mục liên quan.