やりたかったこと
Verilogでデザインを作成しているときに、イベントがループになってシミュレーション時間が進まないことがあります。
EfinixのIDEであるEfinityを使ってデザインを開発している場合、プロジェクト TEST01.xml をiVerilogによるRTLシミュレーションにかけるには、下記の通り、batファイルから起動されるpythonスクリプトにより間接的に起動します。
$ efx_run.bat TEST01.xml --flow rtlsim
しかし、このefx_run.batはiverilogを自動で起動してしまうため、event traceログを出力させるオプションをiverilogに渡すことができません。
そこで、今回 Efinity 2024.2.294.4.15を用いて、シミュレーションを実行し、event trace logを採取する方法をまとめました。
シミュレーション用のスクリプトへの追加
/Efinity/2024.2/scripts/efx_run_sim.py の332行目に iv_opts.extend(['-pfileline=1']) を追加する。
# top level module
iv_opts.extend(['-s', args.top])
for t in common_opts['extra_top']:
iv_opts.extend(['-s', t])
####### add following line to get event trace log from iverilog
iv_opts.extend(['-pfileline=1'])
# vvp log file
log_file = os.path.join(OUTPUT_PATH, args.design + '.' + args.sim + '.simlog')
if os.path.isfile(log_file): os.remove(log_file)
vvp_opts.append('-l' + log_file)
シミュレーションを実行
$ efx_run.bat TEST01.xml --flow rtlsim
と入力しシミュレーションを起動します。
$ efx_run.bat TEST01.xml --flow rtlsim
Running: efx_run_sim.py TEST01 --sim rtl --family Trion --device T20F256 -v TEST01.v,t:default --dir C:\Efinity\2024.2\project\TEST01\ip\TEST01 --output_dir outflow --project_xml C:\Efinity\2024.2\project\TEST01\TEST01.xml
シミュレーションが進まない場合は、の様にメッセージが出た後、コンソールには何の表示も出てきません。その状態で、イベントループが発生してシミュレーション時間が進まないとおもわれるところで、ctrl-C
をおして、コマンドラインモードに入ります。
画面出力ログは、C:\Efinity\2024.2\project\TEST01\outflow\TEST01.log
に出力されている為、そちらを参照すれば、現在シミュレーションがどうなっているかは確認できます。
ログファイルの取得
ログファイルは、下記に記録されています。
<ctrl-C>
** VVP Stop(0) **
** Flushing output streams.
** Current simulation time is 10009940 ticks.
> trace on <--- trace on<enter>を入力
Turning statement tracing on.
> cont <--- cont<enter>を入力
** Continue **
mt48lc16m16a2.v:869: If statement. <--- 以下、イベントトレースが出力
mt48lc16m16a2.v:885: If statement.
mt48lc16m16a2.v:901: If statement.
mt48lc16m16a2.v:917: If statement.
mt48lc16m16a2.v:868: Event wait (@) statement.
Advancing to simulation time: 10009945
mt48lc16m16a2.v:208: Blocking assignment (delay).
mt48lc16m16a2.v:869: If statement.
mt48lc16m16a2.v:885: If statement.
mt48lc16m16a2.v:901: If statement.
mt48lc16m16a2.v:917: If statement.
mt48lc16m16a2.v:868: Event wait (@) statement.
Advancing to simulation time: 10009950
mt48lc16m16a2.v:208: Blocking assignment (delay).
止める場合は、画面には表示されませんが、再度 ctrl-C
を入力し、 finish<enter>
を入力すると、バッチ ジョブを終了しますか (Y/N)?
と聞いてきますので、 y<enter>
で
シミュレーションを終了させることができます。
この時の出力ログは、C:\Efinity\2024.2\project\TEST01\outflow\TEST01.log
に記録されているので終了後に参照が可能です。