Named block và final: thoát đúng phạm vi, kiểm đúng lúc kết thúc
Tiên quyết
Sau bài này bạn sẽ
- Dùng block name/end label để thấy phạm vi disable
- Dự đoán statement nào không được chạy sau disable
- Dùng một final block kiểm accounting mà không dựa thứ tự nhiều final
Thoát block khác với chỉ bỏ một iteration
Scan chạy k 0..4 nhưng disable scan khi k 3. Cả named block kết thúc, không chạy các increment trong lượt 3 và không đi tới lượt 4. Control tiếp tục ở statement sau block, không kết thúc cả simulation.
Tên block tạo scope nhìn được
Begin scan và end scan làm ranh giới dễ review. K là biến trong scope scan; TB đọc scan.k để xác nhận điểm dừng 3. Ví dụ chỉ dùng block/end labels, không claim mọi statement-label syntax hoặc portability của chúng qua các tool. [1]
Điểm đặt disable quyết định số side effect
Vì check k 3 đứng trước visits++/total+=k, main chỉ xử lý 0/1/2, count 3 và sum 3. Mutant dời ngưỡng sang 4 tạo thêm lượt 3 và bị checker bắt. Đừng dùng tên block như một từ khoá break tổng quát mà không nhìn scope thật.
Disable theo tên không tự là cancellation an toàn
Bài không dùng nhiều instance/call song song cùng named task hay disable fork. Những trường hợp ấy cần hiểu process tree và lifetime, không suy từ một block đơn. Đặt tên rõ, kiểm phạm vi và giữ các process không liên quan còn chạy đúng.
Final chạy ở cuối simulation mà không thêm thời gian
Sau scan, initial đợi 2 ns, đặt finished 1 rồi gọi $finish. Một final block kiểm counters và time 2, in dòng kiểm cuối. Không thêm #delay trong final để chờ kết quả mà các process khác chưa hoàn tất; accounting cần đã sẵn ở thời điểm kết thúc. [2]
Một final không chứng minh thứ tự nhiều final
Example dùng đúng một final block và không đọc giá trị do final khác mới ghi. Không dựa file order/module order để suy các final sẽ chạy theo một thứ tự mong muốn. Nếu việc tổng hợp kết quả cần ordering, thiết kế cơ chế coordination trước $finish.
Có in dòng tổng kết không thay exit status
Checker trong initial và final có thể fatal khi accounting sai. Pipeline chỉ tính simulation đạt khi exit 0 và đủ output expected; một output đẹp rồi fatal vẫn fail. Bài không dùng final để nuốt lỗi hoặc ép regression kết thúc xanh khi chưa đủ dữ liệu.
Ba iteration và accounting tại 2 ns
Expected trước chạy: visits 3,sum 3,stoppedindex 3; trước finish 2 ns và finalfinished 1/time 2.
Icarus thực thi final thật; không claim synthesis hoặc chứng nhận cleanup khi process bị OS kill. [3]
Tự kiểm tra
Đặt phạm vi và thời điểm kết thúc thành contract
Theo dõi side effect nào xảy ra trước disable, ai hoàn tất trước $finish và final đang đọc dữ liệu đã ổn định nào. Giữ exit/error nguyên vẹn; đừng để dòng summary trở thành cách che lỗi.
Nguồn và mức độ đối chiếu
- Named Blocks, Statement Labels — bản chụp resources.zip, Named blocks. Trích dẫn; nguồn đã đọc các mục liên quan.
- SystemVerilog final block — bản chụp resources.zip, Final block. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.b3.labels-final, Bằng chứng. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, labels-final procedural/package 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.b3.labels-final, Source, self-checks, metadata, verification.json và mutation probes. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, labels-final procedural semantics. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Named Blocks, Statement Labels — bản chụp resources.zip, Named Blocks, Statement Labels; Disable block and disable statements. Trích dẫn; nguồn đã đọc các mục liên quan.
- SystemVerilog final block — bản chụp resources.zip, SystemVerilog final block; final block example. Trích dẫn; nguồn đã đọc các mục liên quan.