System tasks và functions: log đúng, số đúng, kết thúc đúng

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ẽ

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

In log đúng điểm quan sát và kiểm hàm tiện ích

Kỳ vọng trước chạy: displayt 1 q 0/strobet 1 q 1, monitor 0/1/2 thấy cuối slot; rtoi-3.8=-3, integer assign=-4, clog2(1/4/5)=0/2/3.

tb_system.sv testbench
module tb_system;  timeunit 1ns;  timeprecision 1ps;  reg q = 0;  integer data = 10, seed_a = 123, seed_b = 123, i, a, b;  integer bounded, truncated, rounded;  real converted;  initial begin    $monitor("SYSTEM MON at=%0d q=%b data=%0d", $time, q, data);    for (i = 0; i < 8; i = i + 1) begin      a = $random(seed_a); b = $random(seed_b);      if (a !== b || seed_a !== seed_b) $fatal(1, "same-tool seeded sequence mismatch");      bounded = $unsigned(a) % 4;      if (bounded < 0 || bounded > 3) $fatal(1, "bounded sample out of range");    end    if ((-5 % 4) != -1) $fatal(1, "signed remainder mismatch");    $display("SYSTEM RANDOM paired_samples=8 bounded=0..3 signed_remainder=%0d", -5 % 4);    truncated = $rtoi(-3.8); rounded = -3.8; converted = $itor(-3);    if (truncated != -3 || rounded != -4 || converted != -3.0 ||        $clog2(1) != 0 || $clog2(4) != 2 || $clog2(5) != 3)      $fatal(1, "conversion or clog2 mismatch");    $display("SYSTEM MATH rtoi=%0d rounded=%0d itor=%0.1f clog2=0/2/3", truncated, rounded, converted);    #1;    data = 11; q <= 1;    if (q !== 0) $fatal(1, "NBA updated before active check");    $display("SYSTEM DISPLAY at=%0d q=%b", $time, q);    $strobe("SYSTEM STROBE at=%0d q=%b", $time, q);    #1; data = 12;    #1;    if (q !== 1 || data != 12 || $time != 3) $fatal(1, "final state mismatch");    $display("SYSTEM FINISH at=%0d q=%b data=%0d", $time, q, data);    $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 (Icarus Verilog 11.0, 4-state)

Output phải khớp: SYSTEM RANDOM paired_samples=8 bounded=0..3 signed_remainder=-1SYSTEM MATH rtoi=-3 rounded=-4 itor=-3.0 clog2=0/2/3SYSTEM MON at=0 q=0 data=10SYSTEM DISPLAY at=1 q=0SYSTEM STROBE at=1 q=1SYSTEM MON at=1 q=1 data=11SYSTEM MON at=2 q=1 data=12SYSTEM FINISH at=3 q=1 data=12

Random kiểm hai seed bằng nhau trong cùng Icarus và 8 sample unsigned%4 trong 0..3; không ghim dãy số portable, không claim uniform/coverage closure.

Không chạy $stop tương tác, không claim synthesis hoặc mọi system task/function.

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.

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 $fatal về 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 $rtoi vớ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

Tự kiểm tra: systasks

  1. Với-3.8, rtoi và phép gán trực tiếp vào integer trong TB lần lượt là gì?
  2. Các giá trị clog2(1), clog2(4), clog2(5) lần lượt là gì?
  3. Trong cùng process q 0, q<=1 rồi display tại 1 ns. Display và strobe cuối slot in gì?
  4. Đặt seed lại cùng hằng số trước mọi random call có tác động gì?
  5. Output đúng đã được in nhưng runtime sau đó fatal exit 1. Pipeline phải chấm thế nào?

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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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.
  8. 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ở).
  9. 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.
  10. 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ở).
  11. 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.
  12. 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.
  13. 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.
  14. 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.
  15. 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.