Associative array: key tồn tại, giá trị bằng0 và thứ tự duyệt

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 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.

Thí nghiệm assoc

Kỳ vọng trước chạy:1024 signed input pair qua sign-bit bias thành unsigned key; signedinput-2/5/12 có thứ tự tương ứng, overwrite 55, deletecount 2, stringa, emptyfirst 0.

tb_assoc.sv testbench
module tb_assoc;  // Chuẩn hoá signed input thành unsigned key có numeric order rõ ràng.  typedef int unsigned order_key_t;  int sparse[order_key_t];  function automatic order_key_t order_key(input int signed value);    return order_key_t'(value)^32'h80000000;  endfunction  function automatic int signed signed_key(input order_key_t value);    return int'(value^32'h80000000);  endfunction  int names[string];  order_key_t key;  int ok,a,b;  string name_key;  initial begin    for(a=-16;a<16;a++)for(b=-16;b<16;b++)      if((order_key(a)<order_key(b))!=(a<b)) $fatal(1,"normalized key ordering a=%0d b=%0d",a,b);    if(order_key(-2147483648)!==32'h0||order_key(2147483647)!==32'hffffffff)      $fatal(1,"normalized key signed endpoints");    if(sparse.num()!=0||sparse.exists(order_key(6))) $fatal(1,"assoc initial state");    sparse[order_key(12)]=120;sparse[order_key(-2)]=20;sparse[order_key(5)]=50;sparse[order_key(5)]=55;    if(sparse.num()!=3||sparse[order_key(5)]!=55||sparse.exists(order_key(6))) $fatal(1,"assoc overwrite or existence");    ok=sparse.first(key);if(!ok||signed_key(key)!=-2) $fatal(1,"assoc first sorted key");    ok=sparse.next(key);if(!ok||signed_key(key)!=5) $fatal(1,"assoc next key5");    ok=sparse.next(key);if(!ok||signed_key(key)!=12) $fatal(1,"assoc next key12");    ok=sparse.next(key);if(ok) $fatal(1,"assoc next beyond last");    sparse.delete(order_key(5));    ok=sparse.last(key);if(!ok||signed_key(key)!=12) $fatal(1,"assoc last");    ok=sparse.prev(key);if(!ok||signed_key(key)!=-2||sparse.exists(order_key(5))||sparse.num()!=2) $fatal(1,"assoc deletion/traverse");    names["z"]=9;names["a"]=1;    ok=names.first(name_key);if(!ok||name_key!="a") $fatal(1,"string-key order");    sparse.delete();ok=sparse.first(key);if(ok||sparse.num()!=0) $fatal(1,"empty assoc iteration");    $display("ASSOC CHECK normalized_pairs=1024 sorted=-2/5/12 overwrite=55 after_delete=2 first_string=a empty_first=0");    $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: ASSOC CHECK normalized_pairs=1024 sorted=-2/5/12 overwrite=55 after_delete=2 first_string=a empty_first=0

Explicit unsigned-key sign-bit normalization được kiểm 1024 signed comparison pairs và endpoints, cùng string-key subset. Không claim native signed-key traversal hoặc synthesis.

Probe riêng native int key trên Verilator 5.050 trảfirst 5 với signedinputs-2/5/12, assertion giữ kỳ vọng-2 và exit 1. Không đổi expectation để gọi pass; chưa đối chiếu LRM đầy đủ.

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.

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

Tự kiểm tra: assoc

  1. Có 3 entry, overwrite key 5 thành 55: num là bao nhiêu?
  2. Phân biệt missing key với stored 0 bằng gì?
  3. Normalization kiểm mọi cặp signed input-16..15: có bao nhiêu cặp?
  4. Probe native signed int-key trong flow có được gọi pass không?
  5. First khi map rỗng cần caller làm gì?

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

  1. 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.
  2. SystemVerilog Associative Array — bản chụp resources.zip, Methods. Trích dẫn; nguồn đã đọc các mục liên quan.
  3. 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.
  4. 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ở).
  5. 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.
  6. 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.