Vòng lặp SV: foreach theo shape, break và continue theo điểm đặt

Khoảng 40 phútMức 1/3Bản nháp: một số khẳng định chưa đối chiếu spec

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.

Thí nghiệm loops

Tính trước:matrix1/2/3,11/12/13→sum 42/order 012345,count 6; forskip 2 break 5 chọn 0/1/3/4 sum 8 count 4; repeat 3,forever 4 ticks kết thúc 4 ns.

tb_loops.sv testbench
`timescale 1ns/1psmodule tb_loops;  int matrix[2][3]='{'{1,2,3},'{11,12,13}};  int count=0,total=0,order=0,selected_count=0,selected_sum=0,repeat_count=0,ticks=0;  initial begin    foreach(matrix[row,col])begin      count++;total+=matrix[row][col];order=10*order+row*3+col;    end    for(int n=0;n<8;n++)begin      if(n==2)continue;      if(n==5)break;      selected_count++;selected_sum+=n;    end    repeat(3)repeat_count++;    forever begin      #1;ticks++;      if(ticks==4)break;    end    if(count!=6||total!=42||order!=12345||selected_count!=4||selected_sum!=8||repeat_count!=3||$time!=4)      $fatal(1,"loop selection/order/timing mismatch");    $display("LOOP CHECK foreach_count=6 foreach_sum=42 order=%06d selected_count=4 selected_sum=8 repeat=3 ticks=4 at=4",order);    $finish;  end  initial begin #10;$fatal(1,"loop watchdog");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 (Verilator 5.050, 2-state)

Output phải khớp: LOOP CHECK foreach_count=6 foreach_sum=42 order=012345 selected_count=4 selected_sum=8 repeat=3 ticks=4 at=4

Chỉ fixed 2 x 3 foreach, mộtfor break/continue, repeat 3 và timedforever 4 tick/watchdog 10 ns. Không claim resize giữa iteration, mọi array ordering, nested disable/fork hoặc synthesis.

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.

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

Tự kiểm tra: loops

  1. Matri x1/2/3 và 11/12/13 có count/sum bao nhiêu?
  2. For 0..7 skip 2 và break trước body 5 chọn tổng nào?
  3. Forever#1 mỗi tick, thoát sau 4 tick: kết thúc lúc nào?
  4. Continue trong for đi đâu trước lượt tiếp?
  5. Mutant đổi ngưỡng thoát thành 400 tick bị gì bắt?

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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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ở).
  6. 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.
  7. IEEE 1800-2023 SystemVerilog LRM, loops procedural semantics. Chưa đối chiếu với văn bản nguồn (chưa mở).
  8. 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.
  9. 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.