0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Efinityから作成したデザインをiverilogでシミュレーションし、"event trace"ログとる方法。

Posted at

やりたかったこと

 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']) を追加する。

efx_run_sim.py
    # 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 に出力されている為、そちらを参照すれば、現在シミュレーションがどうなっているかは確認できます。

ログファイルの取得

ログファイルは、下記に記録されています。

\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 に記録されているので終了後に参照が可能です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?