Named block và final: thoát đúng phạm vi, kiểm đúng lúc kết thúc

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ẽ

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

Thí nghiệm labels-final

Tính trước:disable blockởk 3 sauvisits 0/1/2,sum 3;finish 2 ns, mộtfinalblockkiểmfinished 1 cùngt 2; không phụ thuộc thứ tự nhiều final.

tb_labels.sv testbench
`timescale 1ns/1psmodule tb_labels;  int visits=0,total=0,finished=0;  initial begin    begin: scan      integer k;      for(k=0;k<5;k++)begin        if(k==3)disable scan;        visits++;total+=k;      end    end: scan    if(visits!=3||total!=3||scan.k!==3)$fatal(1,"named block disable scope");    #2;finished=1;    $display("LABEL CHECK visits=3 sum=3 stopped_index=3 before_finish=2");    $finish;  end  final begin    if(visits!=3||total!=3||finished!=1||$time!=2)$fatal(1,"final accounting mismatch");    $display("FINAL CHECK visits=3 sum=3 finished=1 at=2");  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: LABEL CHECK visits=3 sum=3 stopped_index=3 before_finish=2FINAL CHECK visits=3 sum=3 finished=1 at=2

Chỉ namedblock/endlabel/disable và một final block trên Icarus. Không claim mọi statementlabel, nhiều final ordering, fork/task cancellation, OS-kill cleanup 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.

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ự kiểm tra: labels-final

  1. Disable scan trước body tại k 3 tạo visits/sum nào?
  2. Sau disable, scan.k được kiểm là bao nhiêu?
  3. Final trong example chạy tại thời điểm nào?
  4. Ví dụ một final block chứng minh điều gì?
  5. Nếu đã in expected rồi fatal, pipeline có tính simulation pass không?

Đặ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

  1. 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.
  2. 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.
  3. 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.
  4. 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ở).
  5. 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.
  6. 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ở).
  7. 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.
  8. 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.