String trong testbench: chỉ số byte, bản sao và lỗi parse bị che

Khoảng 35 phútMức 1/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 dynamic string với packed vector cố định chứa text
  • Dự đoán index, substring inclusive và compare trả0 khi bằng
  • Nhận diện numeric conversion không phải báo hợp lệ đầu vào

Tên test không nên biến mất ở đầu vì thiếu bit

Gán chuỗi 5 byte DV:ab vào string giữ cả 5 byte. Gán cùng literal vào vector 16 bit chỉ giữ hai byte cuối ab. Một log trông hợp lý vẫn có thể đã mất prefix cần phân biệt test. Chọn kiểu theo dữ liệu: string động cho text TB, packed vector có width/encoding rõ cho dữ liệu bit của thiết kế.

Default rỗng và length thay đổi theo giá trị

string chưa gán là chuỗi rỗng; len trả 0. Với DV:ab, len 5, inde x0 là D và index 4 là b. Đây là byte-oriented ASCII subset đang kiểm, không phải API tách ký tự Unicode tiếng Việt theo code point hoặc grapheme. Dữ liệu text thực tế cần xác định encoding trước khi suy số ký tự từ len. [1]

Substr có cả hai đầu

Sau putc tại index 3 thành A, text là DV:Ab. Substr(3,4) lấy hai vị trí 3 và 4, trả Ab với length 2. Nhầm đầu cuối loại trừ như một số ngôn ngữ khác sẽ mất byte b. Test kiểm cả giá trị và length để không chỉ in output rồi đọc bằng mắt.

Copy rồi sửa không đổi chuỗi gốc đã lưu

copy_text=text trước putc giữ DV:ab. Sửa text thành DV:Ab không đổi copy_text. Tolower trả giá trị mới dv:ab; nếu chỉ gọi mà không gán, biến text vẫn DV:Ab. TB kiểm cả return value và biến nguồn, tránh hiểu method tên hành động nào cũng mutate object.

Compare trả 0 cho bằng nhau

String equality dùng == cho một predicate dễ đọc. Compare trả 0 nếu bằng; với khác nhau chỉ dựa vào dấu cần thiết, không buộc magnitude phải là 1 hay-1. Icompare bỏ khác biệt case cho subset ASCII đã thử. If(compare(other)) vì thế đi vào nhánh khi khác, trái với một checker định viết bằng nhau. [2]

Atoi bằng 0 chưa phân biệt invalid với số 0

Trong thử nghiệm, 42 thành 42, oops thành 0 và chuỗi 0 cũng thành 0. Kết quả số không phải cờ parse-success. Với config ảnh hưởng test, hãy kiểm cú pháp/độ dài/trailing input theo contract bằng parser có trạng thái và test cả invalid; không ngầm thay mọi lỗi thành 0. Bài không cung cấp strict numeric parser hoặc quy tắc mọi prefix.

Xây text để quan sát, không biến text thành hardware

Itoa(-17) ghi chuỗi -17 vào biến đích; concat Ab với dấu chấm than tạo Ab!, replicate hai lần tạo AbAb. Các thao tác string động ở đây là testbench runtime, không claim tổng hợp thành bộ nhớ hay logic mạch. Synthesis cho fixed literals/flow cụ thể là vấn đề khác, không cần khái quát rằng mọi xuất hiện chữ string đều bất khả tổng hợp.

Một chuỗi 5 byte và hai cách nhận 0

Tính trước: packedtext 6162, copyDV:ab, changedDV:Ab, partAb, compareequal 0; valid 42→42, invalid→0, valid 0→0, itoa-17.

Thí nghiệm strings

Kỳ vọng tính trước chạy: ASCII DV:ab5byte,16 bit giữab=6162;putc 3 A,substr 3..4 Ab;compareequal 0;atoi 42/invalid 0/valid 00;itoa-17.

tb_strings.sv testbench
module tb_strings;  string text,copy_text,part,number,invalid;  bit[15:0] packed_text;  int parsed,trailing;  int signed_order;  initial begin    if(text!=""||text.len()!=0) $fatal(1,"string initial value");    text="DV:ab";packed_text="DV:ab";    if(text.len()!=5||packed_text!==16'h6162||text.getc(0)!=8'h44||text.getc(4)!=8'h62)      $fatal(1,"string/vector size or indexing");    copy_text=text;text.putc(3,"A");part=text.substr(3,4);    if(text!="DV:Ab"||copy_text!="DV:ab"||part!="Ab"||part.len()!=2) $fatal(1,"string copy/substr");    if(text.compare("DV:Ab")!=0||text.icompare(copy_text)!=0||text.compare(copy_text)>=0)      $fatal(1,"string comparison sign/equality");    if(text.tolower()!="dv:ab"||text!="DV:Ab") $fatal(1,"tolower modified source");    number="42";invalid="oops";    if(number.atoi()!=42||invalid.atoi()!=0) $fatal(1,"atoi observed values");    number="0";if(number.atoi()!=invalid.atoi()) $fatal(1,"atoi is not validity flag");    number.itoa(-17);if(number!="-17") $fatal(1,"itoa mismatch");    if({part,"!"}!="Ab!"||{2{part}}!="AbAb") $fatal(1,"string concat/replicate");    $display("STRING CHECK length=5 vector_hex=6162 copy=DV:ab changed=DV:Ab part=Ab equal_compare=0");    $display("STRING NUMBER valid42=42 invalid=0 valid0=0 itoa=-17");    $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: STRING CHECK length=5 vector_hex=6162 copy=DV:ab changed=DV:Ab part=Ab equal_compare=0STRING NUMBER valid42=42 invalid=0 valid0=0 itoa=-17

Testbench ASCII subset, không claim Unicode code-point API, strict numeric parser hoặc dynamic string synthesis. compare chỉ kiểm dấu/zero, không yêu cầu magnitude.

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.

Assertions kiểm các giá trị và hiệu ứng copy/mutation, không so toàn bộ log format hoặc claim Unicode. [3]

Tự kiểm tra

Tự kiểm tra: strings

  1. Sau textDV:Ab, substr(3,4) trả gì?
  2. Literal DV:ab gán vào vector 16 bit giữ gì?
  3. text.compare(text) trả gì?
  4. Atoi cho cả oops và 0 kết quả 0: suy ra gì?
  5. copy=text rồi putc sửa text, copy trong test thế nào?

Đừng dùng log đẹp thay parser đúng

Chốt width/encoding của text, đọc rõ inclusive index và phân biệt return value với mutation. Khi text điều khiển cấu hình, parse failure phải có đường báo lỗi riêng; default 0 không đủ làm bằng chứng hợp lệ. Bài giữ draft/LRM needs-spec-check.

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

  1. SystemVerilog Strings — bản chụp resources.zip, String và vector. Trích dẫn; nguồn đã đọc các mục liên quan.
  2. SystemVerilog Strings — 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.b1.strings, Bằng chứng. Trích dẫn; nguồn đã đọc toàn văn.
  4. IEEE 1800-2023 SystemVerilog LRM, strings types, assignment and conversion 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.b1.strings, Source, self-checks, metadata và verification.json. Trích dẫn; nguồn đã đọc toàn văn.
  6. IEEE 1800-2023 SystemVerilog LRM, strings type and conversion semantics. Chưa đối chiếu với văn bản nguồn (chưa mở).
  7. SystemVerilog Strings — bản chụp resources.zip, What is a SystemVerilog string ?; How are strings represented in Verilog ?; String Operators; Basic String Methods; String Conversion Methods. Trích dẫn; nguồn đã đọc các mục liên quan.