System tasks và functions: log đúng, số đúng, kết thúc đúng
Tiên quyết
Sau bài này bạn sẽ
- Chọn display, strobe hoặc monitor theo điểm quan sát cần thiết
- Tách log thông tin khỏi kết quả pass/fail của chương trình
- Dùng seed và signedness của random với giới hạn rõ
- Dự đoán rtoi, phép gán real sang integer và clog2 ở biên
In được PASS chưa có nghĩa test đã pass
Một testbench có thể in kết quả mong đợi rồi gặp lỗi ngay sau đó. Hệ thống regression phải xét cả assertion và exit status, không chỉ tìm chữ PASS trong log. Pipeline dự án vì vậy đòi runtime exit 0 và đủ output kỳ vọng.
System tasks/functions giúp quan sát, tạo stimulus và tính giá trị tham chiếu. Nhưng dùng sai điểm quan sát hoặc signedness có thể làm chính testbench báo sai. Bài dùng các input nhỏ đã tính tay để kiểm từng mục tiêu.
$display chụp lúc statement chạy
TB bắt đầu q 0. Tại 1 ns, nó thực hiện q <= 1 rồi $display q. Dòng display in 0 vì NBA chưa cập nhật LHS. Đây là kết quả đúng cho phép đọc trước NBA, không phải bằng chứng assignment bị bỏ qua.
Mỗi log nên có timestamp, tín hiệu và mục đích. Nếu cần kiểm state sau cạnh, chọn điểm quan sát phù hợp thay vì đổi expected của thiết kế cho khớp dòng display sớm. [1]
$strobe và $monitor nhìn cuối slot
Strobe của cùng t=1 in q1. Monitor được đăng ký tại 0, rồi in state cuối các slot có thay đổi đang theo dõi: t 0 q 0/data 10, t 1 q1/data 11, t 2 q1/data 12. Không nên dùng monitor như “một transaction đã hoàn tất” nếu mỗi transaction có nhiều chuyển động tín hiệu.
Trong cơ chế đang dùng, gọi monitor khác thay thế monitor trước; không tự có một danh sách độc lập cho mọi lần gọi. Nguồn đào tạo cũng phân biệt monitor với việc chủ động in một bản ghi ở điểm hoàn tất hành động. Các quy tắc scheduling đầy đủ còn needs-spec-check. [2]
Kết thúc batch với kết quả kiểm rõ ràng
TB dùng $fatal(1, ...) khi assertion sai và $finish sau mọi kiểm tra thành công. Những mutation probe của dự án kiểm trực tiếp runtime lỗi không được tính đạt dù đã có output trước đó.
$stop phục vụ tạm dừng/điều khiển mô phỏng tương tác; hành vi trong batch còn phụ thuộc tool và option. Bài không chạy stop và không coi nó là hợp đồng exit status portable. Khi viết regression, kiểm chính command line của flow thực tế và đặt watchdog cho trường hợp process không tới điểm kết thúc.
Trong ví dụ này assertions hoàn tất ở 3 ns rồi finish; log không được dùng thay các điều kiện kiểm. [3]
Seed là state, không phải lời hứa coverage
$random(seed) dùng rồi cập nhật biến seed. Hai biến seed khởi tạo 123 được gọi cùng số lần trong cùng Icarus cho cùng kết quả ở 8 cặp kiểm. Nếu đặt lại seed trước mọi call, bạn đang lặp điểm xuất phát thay vì tiếp tục cùng stream.
Không ghim các số cụ thể như một dãy portable qua mọi simulator. Cũng không đòi mỗi call phải khác call trước: random có thể lặp. Bài chỉ kiểm tính lặp lại theo cấu hình đã chạy và miền giá trị sau chuyển kiểu.
Random trả signed value; -5 % 4 là-1 trong thí nghiệm, không nằm trong 0..3. TB chuyển số random sang unsigned trước modulo 4 và kiểm từng sample nằm trong miền. Đây không phải chứng minh phân bố đều hoặc đủ corner case. [4]
Cùng số real, hai cách thành integer
$rtoi(-3.8) cắt phần lẻ về 0 nên trả-3. Gán trực tiếp-3.8 vào integer làm tròn và cho-4 trong ví dụ. $itor(-3) trả real-3.0; nó không làm phép chia integer đã thực hiện trước đó có lại phần lẻ đã mất. [5]
TB còn kiểm ba lời gọi riêng $clog2(1), $clog2(4) và $clog2(5), lần lượt trả 0/2/3. Địa chỉ bốn entry cần biểu diễn 0..3, còn counter chứa số entry 0..4 phải chứa thêm 4. Khi tính range, chú ý trường hợp kết quả 0 của depth 1, không tự viết range âm rồi gọi là độ rộng 0 hợp lệ. [6]
Kiểm log, random và hàm số trong một TB nhỏ
Kỳ vọng được ghi trước chạy: display t 1 q 0, strobe t 1 q 1, monitor các state nêu trên;8 cặp random cùng stream, unsigned modulo trong 0..3; rtoi-3, gán integer-4, itor-3.0 và clog2 đúng biên.
Không assert một thứ tự không cần thiết giữa strobe và monitor cùng slot. Ta kiểm mỗi output cần có và assertions dữ liệu; không biến thứ tự log tình cờ thành điều kiện ngôn ngữ. [7]
Đừng dùng format hoặc seed để che lỗi
- Chỉ tìm chuỗi PASS mà bỏ qua exit status hoặc
$fatalvề sau. - Dùng display sớm để kết luận NBA ghi sai.
- Đăng ký nhiều monitor và mong tất cả còn hoạt động riêng.
- Reset seed trong loop rồi tin đã tăng tính đa dạng stimulus.
- Lấy signed remainder làm index không kiểm miền.
- Đồng nhất
$rtoivới phép gán real sang integer. - Dùng clog2 cho count mà quên giá trị lớn nhất cần chứa.
Tự kiểm tra
Mỗi dòng log cần có một câu hỏi cụ thể
Chọn thời điểm quan sát, kiểu số và điều kiện dừng trước khi chọn câu lệnh in. Dùng directed case để kiểm biên; seed chỉ giúp tái hiện, không thay kế hoạch verification.
Bài giữ draft/LRM needs-spec-check và chỉ claim parser/simulation cho các thao tác đã chạy.
Nguồn và mức độ đối chiếu
- Verilog Display Tasks — bản chụp trong resources.zip, Difference between display and strobe. Trích dẫn; nguồn đã đọc các mục liên quan.
- Verilog Display Tasks — bản chụp trong resources.zip, Continuous Monitors. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.a7.systasks, Hợp đồng thực chạy. Trích dẫn; nguồn đã đọc toàn văn.
- Verilog $random — bản chụp trong resources.zip, Seed state. Trích dẫn; nguồn đã đọc các mục liên quan.
- Verilog Conversion Functions — bản chụp trong resources.zip, rtoi và itor. Trích dẫn; nguồn đã đọc các mục liên quan.
- Verilog Math Functions — bản chụp trong resources.zip, Integer Math Functions. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.a7.systasks, Bằng chứng nguyên bản. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, systasks language and system task 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.a7.systasks, Source, assertions và verification.json của TB nguyên bản. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, Display/monitor tasks; simulation control; random/math/conversion system functions. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Verilog Display Tasks — bản chụp trong resources.zip, Verilog Strobes; Difference between display and strobe; Verilog Continuous Monitors. Trích dẫn; nguồn đã đọc các mục liên quan.
- Verilog $random — bản chụp trong resources.zip, Syntax; seed state and repeated calls. Trích dẫn; nguồn đã đọc các mục liên quan.
- Verilog Conversion Functions — bản chụp trong resources.zip, $rtoi; $itor. Trích dẫn; nguồn đã đọc các mục liên quan.
- Verilog Math Functions — bản chụp trong resources.zip, Integer Math Functions: clog2 and address/count width. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.a7.systasks, tb_system.sv và verification.json. Trích dẫn; nguồn đã đọc toàn văn.