SystemVerilogでの検証中にある関数がどこから呼ばれているかを知りたいことは割と頻繁にあると思います。
言語の標準機能ではこれを表示させる方法は無いのですが、実はデファクトスタンダードになっている$stacktraceというコマンドがあり、この機能を使うことで関数呼び出しの順番をログに表示させることができます。
function void fa();
fb();
endfunction
function void fb();
$display("Going to print stack trace");
$stacktrace;
endfunction
module topmd();
initial begin
fa();
end
endmodule
以下はVCSのログです。出力結果はシミュレータによって少しずつ異なりますが、どれも同等の情報が出力されます。
Compiler version S-2021.09; Runtime version S-2021.09; Oct 19 21:42 2022
Going to print stack trace
#0 in fb at testbench.sv:7
#1 in fa at testbench.sv:2
#2 in topmd at testbench.sv:12
V C S S i m u l a t i o n R e p o r t
Time: 0 ns
Questa, Xcelium, VCSで動作することを確認しています。
注意点ですが、本機能はあくまでログにスタックトレースを表示する機能であって、文字列として結果を返す関数ではないです。なのでSystemVerilogのプログラム中で結果を文字列として受け取ってuvm_infoに渡して、、、などという使いかたはできません。