String trong testbench: chỉ số byte, bản sao và lỗi parse bị che
Tiên quyết
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.
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
Đừ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
- 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.
- SystemVerilog Strings — 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.b1.strings, Bằng chứng. Trích dẫn; nguồn đã đọc toàn văn.
- 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ở).
- 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.
- 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ở).
- 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.