Vengineerの妄想(準備期間)

人生は短いけど、長いです。人生を楽しみましょう!

finalは、いつ呼ばれるか?

Verification Engineerの戯言

SystemVerilogには、final blockが導入されました。

final blockは、initial blockと同じように記述しますが、
functionのようにゼロ時間で実行されるので、時間待ち等の記述は使えません。

final blockは、$finsihシステムタスク、PLIのtf_dofinish(), VPIのvpi_control(vpiFinish,...)が
呼ばれると直ちに実行されます。

ModelSim XEのGUIモードでは、$finishを呼んだ後、ModelSimを終了してよいかというウィンドウが
表示されるが、このときにいいえ(No)のボタンをクリックするとfinal blockは実行されません。
はい(Yes)のボタンをクリックすると、ModelSim XEが終了しますが、transcriptにはfinal blockが
実行されたことを示すメッセージを表示することができます。

次の例では、final blockが呼ばれると、"call final"が表示されます。

==========================================================================================

module Test;

initial begin
#10;
$display("finish");
$finish;
end

// finalは、$finishが呼ばれた後に、実行される。
// Are you sure you want to finishで、いいえ(No)をクリックすると、finalは実行されない。
// # ** Note: $finish : final.sv(5)
// # Time: 10 ps Iteration: 0 Instance: /Test
// # call final
final begin
$display("call final");
end
endmodule : Test

==========================================================================================

ModelSim XEでは、シミュレーション実行後、transcriptを見ると、
次のように$finishシステムタスクを実行後、"call final"が表示されます。

==========================================================================================

# finish
# ** Note: $finish : final.sv(6)
# Time: 10 ps Iteration: 0 Instance: /Test
# 1
# Break in Module Test at final.sv line 6
# call final