Vòng lặp SV: foreach theo shape, break và continue theo điểm đặt
Tiên quyết
Sau bài này bạn sẽ
- Đọc foreach nhiều dimension và phân biệt index order với giá trị
- Dự đoán tập iteration còn lại sau break/continue
- Giữ timing control và watchdog cho process lặp có thời gian
Cùng một loop vẫn có thể cộng khác vì vị trí break
For chạy 0..7 nhưng continue ở 2 và break trước body ở 5 chỉ chọn 0/1/3/4, tổng 8. Đặt check break sau phép cộng sẽ cho tập khác. Trước khi chạy, viết chính xác tập phần tử thực sự được xử lý.
Foreach lấy shape của array
Matrix 2 x 3 trong TB có values 1/2/3 và 11/12/13. foreach(matrix[row,col]) đi outer row rồi inner col cho shape này, count 6 và sum 42. Iterator được tạo theo dimension, không cần khai một biến global để điều khiển loop. Bài không resize array trong lúc foreach. [1]
Đừng mặc định mọi array bắt đầu từ 0
Ví dụ dùng dimension implicit 0..1 và 0..2; trace mã hoá các vị trí thành 012345. Với range khác chiều hoặc associative keys, phải đối chiếu ordering của kiểu và tool. Không dùng kết quả matrix này để suy mọi foreach luôn tăng từ 0. [2]
Continue bỏ phần còn lại của lần hiện tại
Trong for, sau continue vẫn đi qua step expression rồi kiểm condition. Vì n 2 bị skip, nó không đóng góp selected_count hay selected_sum. Với while, thiếu bước tiến ở đường continue có thể tạo loop không kết thúc; review tiến trình theo mọi nhánh, không chỉ đường bình thường.
Break rời loop chứa nó
Break ởn 5 làm các n 5/6/7 không được cộng. Với loop lồng nhau, break không tự thoát tất cả outer loops; cần cấu trúc điều khiển phù hợp. Main kiểm một for và một forever, không claim mọi nested disable/fork cancellation. [3]
Repeat đếm lượt, forever cần đường dừng
Repeat 3 tăng counter ngay trong timestep hiện tại. Forever của TB có #1 mỗi vòng và thoát sau 4 tick, nên xong 4 ns. Forever không tự mang ý nghĩa clock hay tự cho simulator tiến thời gian; chính timing control và điều kiện kết thúc tạo hành vi ấy.
Một loop mất break phải làm regression fail
Watchdog độc lập tại 10 ns bắt mutant đổi điều kiện thoát thành 400 tick. Không chờ tool timeout 120 s hoặc gọi output vắng là pass. Các loop hữu hạn tính toán được trong RTL có thể có phạm vi synthesis riêng; TB dùng delay/finish ở đây không claim synthesis.
Sáu element, bốn phần tử được chọn và bốn tick
Expected trước chạy: foreach 6/sum 42/order 012345; selected 4/sum 8; repeat 3; ticks 4 và $time4.
Code tự kiểm cả giá trị, thứ tự và thời gian, không chỉ in từng iteration. [4]
Tự kiểm tra
Liệt kê iteration và điểm thời gian trước
Theo dõi bước tiến, skip, exit và side effect của body. Với process kéo dài, kiểm cả đường thoát lẫn watchdog. Bài vẫn draft/LRM needs-spec-check, không đồng nhất procedural loop với generate hardware.
Nguồn và mức độ đối chiếu
- SystemVerilog foreach loop — bản chụp resources.zip, Foreach syntax. Trích dẫn; nguồn đã đọc các mục liên quan.
- SystemVerilog foreach loop — bản chụp resources.zip, Iteration order. Trích dẫn; nguồn đã đọc các mục liên quan.
- SystemVerilog 'break' and 'continue' — bản chụp resources.zip, Break/continue. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.b3.loops, Bằng chứng. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, loops 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.loops, 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, loops procedural semantics. Chưa đối chiếu với văn bản nguồn (chưa mở).
- SystemVerilog foreach loop — bản chụp resources.zip, Syntax; Iteration Order; Example #2: Multidimensional Arrays. Trích dẫn; nguồn đã đọc các mục liên quan.
- SystemVerilog 'break' and 'continue' — bản chụp resources.zip, Syntax; break; continue; break in Nested Loops. Trích dẫn; nguồn đã đọc các mục liên quan.