ハードウェアの気になるあれこれ

技術的に興味のあることを調べて書いてくブログ。主にハードウェアがネタ。

DSimに入門してみた(2):CLIを使ってシミュレーションを実行する

スポンサーリンク

前回の記事ではDSim Desktopをインストールして、チュートリアルVScodeで動かすまでを取り上げた。

今回は同じチュートリアルのデータをCLIを使って実行してみる。

この辺の確認を行うにあたっては、DSimのユーザーズマニュアルとKnowledge baseを参照した。

help.metrics.ca

help.metrics.ca

公開後にXでいくつかコメントを頂いたので追記しました。

チュートリアルを動かすための環境は以下にあります。DSim Desktopのインストールが終わっていることを前提にしていますが、とりあえず簡単にコマンドライン上で動かしてみたいとかがあれば参考にどうぞ。

github.com

ツールの設定とライセンスのセットアップ

まずCLIを使ってDSimによるシミュレーションを実行するためには、ツールの設定とライセンスのセットアップが必要になる。

ツールのセットアップはDSimインストール時に、ツールセットアップ用のスクリプトが同時にインストールされているため、それを読み込むだけで良い。

Ubuntuでインストールした場合${HOME}/metrics-ca/dsim/<tool_version>の下にshell_activate.bashというセットアップスクリプトがあるのでこれを実行する。

$ source ${HOME}/metrics-ca/dsim/<tool_version>/shell_activate.bash

自分の手元で実行した際のログが以下。

diningyo@diningyo-desktop:~/workspace/dsim/dsim_trial$ source /home/diningyo/metrics-ca/dsim/20240422.4.0/shell_activate.bash
Activating DSim version: 20240422.4.0

ライセンスの設定は前回の記事で書いたとおり、環境変数にライセンスファイルのパスを設定すればOK。

$ export DSIM_LICENSE=<ライセンスファイルのパス>

CLIを使ったシミュレーションの実行

VScodeコンパイル、シミュレーションを実行した際の出力を見ると分かるが、DSimでシミュレーションを実行するためには以下3つのツールを使うことになる。

  • dvhcom
  • dvlcom
  • dsim

最初の2つはAnalyzeの専用ツールとなっており、それぞれVHDL用とVerilog/SystemVerilog用で別れている。

またDSimでは他のシミュレータでもあるように、次の3種類のフローが準備されている

  • 1-path : Compile, Elaborate, Simulationを1回で実施(コマンド実行は1回のみ)
  • 2-path : Compileを実行後、Elaborate、Simulationを一回のコマンドで実行(計2回のコマンド実行)
  • 3-path : Compile、Elaborate、Simulationをそれぞれ一回ずつコマンドを実行(計3回のコマンド実行)

これ以降ではDSimのチュートリアル・データを使って、上記3つのフローをそれぞれ実行してみる。

1-pathシミュレーション

1-pathで実行する場合はdsimコマンドのみで実行可能で、シミュレーションを実行するには次のように、シミュレーションに必要なファイル(もしくはファイルリスト)を読み込ませるだけで良い。

$ dsim sv_file_0 sv_file_1 sv_file_2 ... sv_file_n

チュートリアルデータの場合は次のようになる。(ここでは<dsim_tutorial>/SystemVerilog/simディレクトリ直下で実行)

$ dsim ../design/module_full_adder.v ../design/carry_lookahead_adder.v ../testbench/carry_lookahead_adder_directed_tb.sv 

以下のログにも書いてあるが、Elaborateの際にトップ階層を判別してシミュレーションが実行される。

diningyo@diningyo-desktop:~/workspace/dsim/carry_lookahead_adder-main/SystemVerilog/sim$ dsim ../design/module_full_adder.v ../design/carry_lookahead_adder.v ../testbench/carry_lookahead_adder_directed_tb.sv 
=N:[UsageMeter (2024-06-23 16:09:31 +0900)] Using /etc/ssl/certs as location of CA certificates to verify license server.
=N:[UsageMeter (2024-06-23 16:09:31 +0900)] usage server initial connection
=N:[License] 
Licensed for Metrics Design Automation.
=N:[License] New lease granted.
Analyzing...
Elaborating...
  Top-level modules:
    $unit
    carry_lookahead_adder_tb
  Found 6 unique specialization(s) of 6 design element(s).
Optimizing...
Building models...
PLI/VPI access: (none) 
Simulation time precision is 1ns.
~中略~
[25600 ns] [carry_lookahead_adder_tb/Stimulus] New values r_add1=15, r_add2=15
[25605 ns] [carry_lookahead_adder_tb/Checker] Info: Sum is correct: r_add1=15, r_add2=15, result=30
Test: PASSED (0 errors encountered)
=T:Simulation terminated by $finish at time 25610 (../testbench/carry_lookahead_adder_directed_tb.sv:80);
Run directory: /home/diningyo/workspace/dsim/carry_lookahead_adder-main_tt/SystemVerilog/sim
  System timescale is 1ns / 1ns
  Metrics DSim version: 20240422.4.0 (b:R #c:0 h:33f2681ede os:ubuntu_22.04)
  Random seed: (defaulted to 1)

チュートリアルで使っているファイルリストを読み込むには-Fオプションを使用する

$ dsim -F filelist.txt

なお、試した限りでは1-pathのフローはVerilog/SystemVerilogのみのデザインでは可能だったが、VHDLのみ、またはVHDL/Verilog混在のデザインではVHDLファイルのコンパイルがエラーとなった。

diningyo@diningyo-desktop:~/workspace/dsim/carry_lookahead_adder-main_tt/VHDL/sim$ dsim -F filelist.txt 
=N:[UsageMeter (2024-06-23 16:06:40 +0900)] Using /etc/ssl/certs as location of CA certificates to verify license server.
=N:[UsageMeter (2024-06-23 16:06:41 +0900)] usage server initial connection
=N:[License] 
Licensed for Metrics Design Automation.
=N:[License] New lease granted.
Analyzing...
=E:[ParseError]:
    Parser errors encountered at the following locations:    

    ../design/module_full_adder.vhd:1:1        unrecognized tokens before '--'    

    ../design/module_full_adder.vhd:1:9        unrecognized tokens before '--'    

    ../design/carry_lookahead_adder.vhd:1:7    unrecognized tokens before '--'    

  Metrics DSim version: 20240422.4.0 (b:R #c:0 h:33f2681ede os:ubuntu_22.04)

Verilog/SystemVerilogのみのデザインという制約はあるが、とりあえずシミュレーションを実行したいといった際には、一番お手軽に使えるフローだと思う。

2-pathシミュレーション

2-pathシミュレーションではソールファイルのAnalyzeのみを別コマンド(dvhcom/dvlcom)で実行し、ElaborateとSimulationを一回のdsimコマンドで実行する。

VHDL/Verilog混在のチュートリアルを例にすると、次のようになる。

$ dvlcom -lib sim -F filelist_SV.txt
$ dvhcom -lib sim -F filelist_VHDL.txt
$ dsim -lib sim -top work.carry_lookahead_adder_tb

2-pathの場合はdsim実行時にシミュレーションのトップ階層を-topオプションで指定する必要がある。デフォルトではworkというライブラリの下にシミュレーションのトップ階層であるcarry_lookahead_adder_tbが存在する構成になっているため、トップ階層のフルパスはwork.carry_lookahead_adder_tbとなる。

なお、ライブラリ名はAnalyzeの実行時に-lib <lib_name>で変更が可能。dsim-libオプションのデフォルト値がworkとなっているので、ライブラリ名を変更した場合はdsim実行時にも-libの指定が必要になる。

$ dvlcom -lib sim -F filelist_SV.txt
$ dvhcom -lib sim -F filelist_VHDL.txt
$ dsim -lib sim -top work.carry_lookahead_adder_tb

以下は上記コマンド実行時のログ

diningyo@diningyo-desktop:~/workspace/dsim/carry_lookahead_adder-main_tt/VHDL_SystemVerilog/sim$ dvlcom -lib sim -F filelist_SV.txt 
=N:[LibUpdate] Updated library sim.
diningyo@diningyo-desktop:~/workspace/dsim/carry_lookahead_adder-main_tt/VHDL_SystemVerilog/sim$ dvhcom -lib sim -F filelist_VHDL.txt 
=N:[LibUpdate] Updated library sim.
diningyo@diningyo-desktop:~/workspace/dsim/carry_lookahead_adder-main_tt/VHDL_SystemVerilog/sim$ dsim -lib sim -top work.carry_lookahead_adder_tb
=N:[UsageMeter (2024-06-23 16:49:30 +0900)] Using /etc/ssl/certs as location of CA certificates to verify license server.
=N:[UsageMeter (2024-06-23 16:49:31 +0900)] usage server initial connection
=N:[License] 
Licensed for Metrics Design Automation.
=N:[License] New lease granted.
Analyzing...
Elaborating...
  Top-level modules:
    $unit
    carry_lookahead_adder_tb
  Found 6 unique specialization(s) of 6 design element(s).
Optimizing...
Building models...
PLI/VPI access: (none) 
Simulation time precision is 1ns.
  [1/11] module $root: 180 functions, 416 basic blocks
  [2/11] module $pkgs: 1 functions, 2 basic blocks
  [3/11] CU scope $unit: 1 functions, 2 basic blocks
  [4/11] module carry_lookahead_adder_tb#(3): 8 functions, 47 basic blocks
  [5/11] package std: 23 functions, 64 basic blocks
  [6/11] VHDL package standard: 0 functions, 0 basic blocks
  [7/11] VHDL package textio: 0 functions, 0 basic blocks
  [8/11] VHDL package std_logic_1164: 0 functions, 0 basic blocks
  [9/11] VHDL package numeric_std: 1 functions, 2 basic blocks
  [10/11] architecture carry_lookahead_adder(rtl)#(3): 26 functions, 117 basic blocks
  [11/11] architecture module_full_adder(rtl): 10 functions, 45 basic blocks
Linking image.so...
Using default typical min/typ/max.
=S:Begin run-time elaboration and static initialization...
=N:Starting event scheduler...
[5 ns] [carry_lookahead_adder_tb/Checker] Info: Sum is correct: r_add1=0, r_add2=0, result=0
~以下略~

-- 追記部分 --

2-pathのやり方はAnalyze、Elaborateで1回、Simulationで1回の方法もあるとのこと。 下記のポストで触れられている通り、この方法はVerilog/SystemVerilogのみのデザイン時に有効。

$ dsim -genimage sim_tutorial -top work.carry_lookahead_adder_tb -F filelist.txt
$ dsim -image sim_tutorial

-- ここまで --

3-pathシミュレーション

3-pathのフローではAnalyze、Elaborate、Simulationを別々に実行する。Elaborateが終わった時点でシミュレーション実行のイメージファイルが生成されるので、UVMなどで複数のテストケースを実行するような場合にElaborateの手間が省ける。

VHDL/Verilog混在のチュートリアルを3-pathで実行すると次のようになる。

# Analyze
$ dvlcom -F filelist_SV.txt
$ dvhcom -F filelist_VHDL.txt
# Elaborate and generate image
$ dsim -genimage sim_tutorial -top work.carry_lookahead_adder_tb
# Run simulation
$ dsim -image sim_tutorial

以下3-path実行時のログ。

diningyo@diningyo-desktop:~/workspace/dsim/carry_lookahead_adder-main_tt/VHDL_SystemVerilog/sim$ dvlcom -F filelist_SV.txt 
=N:[LibUpdate] Updated library work.
diningyo@diningyo-desktop:~/workspace/dsim/carry_lookahead_adder-main_tt/VHDL_SystemVerilog/sim$ dvhcom -F filelist_VHDL.txt 
=N:[LibUpdate] Updated library work.
diningyo@diningyo-desktop:~/workspace/dsim/carry_lookahead_adder-main_tt/VHDL_SystemVerilog/sim$ dsim -genimage sim_tutorial -top work.carry_lookahead_adder_tb
=N:[UsageMeter (2024-06-23 16:58:31 +0900)] Using /etc/ssl/certs as location of CA certificates to verify license server.
=N:[UsageMeter (2024-06-23 16:58:31 +0900)] usage server initial connection
=N:[License] 
Licensed for Metrics Design Automation.
=N:[License] New lease granted.
Analyzing...
Elaborating...
  Top-level modules:
    $unit
    carry_lookahead_adder_tb
  Found 6 unique specialization(s) of 6 design element(s).
Optimizing...
Building models...
PLI/VPI access: (none) 
Simulation time precision is 1ns.
  [1/11] module $root: 180 functions, 416 basic blocks
  [2/11] module $pkgs: 1 functions, 2 basic blocks
  [3/11] CU scope $unit: 1 functions, 2 basic blocks
  [4/11] module carry_lookahead_adder_tb#(3): 8 functions, 47 basic blocks
  [5/11] package std: 23 functions, 64 basic blocks
  [6/11] VHDL package standard: 0 functions, 0 basic blocks
  [7/11] VHDL package textio: 0 functions, 0 basic blocks
  [8/11] VHDL package std_logic_1164: 0 functions, 0 basic blocks
  [9/11] VHDL package numeric_std: 1 functions, 2 basic blocks
  [10/11] architecture carry_lookahead_adder(rtl)#(3): 26 functions, 117 basic blocks
  [11/11] architecture module_full_adder(rtl): 10 functions, 45 basic blocks
Linking sim_tutorial.so...
  Metrics DSim version: 20240422.4.0 (b:R #c:0 h:33f2681ede os:ubuntu_22.04)
diningyo@diningyo-desktop:~/workspace/dsim/carry_lookahead_adder-main_tt/VHDL_SystemVerilog/sim$ dsim -image sim_tutorial
=N:[UsageMeter (2024-06-23 17:00:08 +0900)] Using /etc/ssl/certs as location of CA certificates to verify license server.
=N:[UsageMeter (2024-06-23 17:00:08 +0900)] usage server initial connection
=N:[License] 
Licensed for Metrics Design Automation.
=N:[License] New lease granted.
Using default typical min/typ/max.
=S:Begin run-time elaboration and static initialization...
=N:Starting event scheduler...
[5 ns] [carry_lookahead_adder_tb/Checker] Info: Sum is correct: r_add1=0, r_add2=0, result=0
~以下略~

使いそうなオプション

シミュレーションを実行する一連のフロー上で、使いそうなものをいくつか記載する。

インクルードディレクトリを指定したい

-incdir dir[...]で指定可能。(1-pathの場合はdsimに、それ以外のフローではdvlcom/dvhcomに指定)

-- 追記部分 --

Classic扱いされてるけど+incdir+dir[+...]の形式も使用可能。(この後に出てくるdefine指定も同様に+define形式が使用可能)

なんでわざわざ残してるんだろう?と思ったが、下記のリプライを頂いて腑に落ちました。 コメントありがとうございました。

-- ここまで --

波形を取得したい場合

波形を取得したい場合は次のように+acc-wavesオプションを指定する。

$ dvlcom -F filelist_SV.txt +acc
$ dsim -top <path_to_tb> +acc -waves <wave_name>.[mxd|vcd]

DSimは-wavesオプションに与えたファイルの拡張子でMXD形式 or VCD形式での波形ダンプが可能。 個人的にはVScodeを使っているならMXD形式の方が見やすいのでオススメ。VCD形式で保存しておけばGTKWaveなどでも開けるので汎用性はあるかもしれない。 ちなみに+accオプションつけ忘れても波形ファイル自体は生成されるが、シミュレーション時の波形情報が反映されないので注意。

ライブラリを読み込みたい場合

Analyze時に複数のライブラリを作っておいて、イメージ生成時 or シミュレーション実行時に結合する場合などには -L <ライブラリ名>でライブラリの指定が可能。

シミュレーション実行時にdefineを指定したい

Analyze時に-define <define>[=value]形式で指定可能。

他にも色々オプションがあるので、詳細が知りたい場合は公式の説明を読むのが吉。

help.metrics.ca

おまけ

シミュレーションのイメージファイル

3-path形式で-genimageオプションを指定することで、シミュレーションのイメージファイルが生成されると書いたが、1-path/2-pathのケースでもイメージファイルはデフォルト名のimageとして生成されている。

そのため、1-path.2-pathで実行したシミュレーションをそのまま再度実行したい場合は、次のようにdsimを実行すればOK

$ dsim -image image

ライセンスを掴んだまま、離さなくなる

DSimでシミュレーションを実行した際にCtrl-Cでキャンセルするとたまに以下のエラーに出くわした。 ライセンスを掴んだ後にプロセスを強制終了した結果、ライセンスを掴みっぱなしで開放できなくなった模様。 PCを再起動したら直ったので、PC上で何らかのプロセスが動いてるのかも。

-- 追記部分 --

上記、incdirにまつわるリプライにある通りで、Simulation実行時にハートビートが送られているらしい。最後のハートビート送信から一定期間空くと、ライセンスが自動的に開放される仕組みになってるとのこと。 なので、上記のPC再起動してる間にこの一定期間が経過して、ライセンスが開放されたというのが正しそう。

-- ここまで --

diningyo@diningyo-desktop:~/workspace/dsim/dsim_trial$ dsim -top work.carry_lookahead_adder_tb
=N:[UsageMeter (2024-06-22 15:41:45 +0900)] Using /etc/ssl/certs as location of CA certificates to verify license server.
=N:[UsageMeter (2024-06-22 15:41:45 +0900)] usage server initial connection
=F:[UsageMeter (2024-06-22 15:41:46 +0900)] License not obtained: Lease acquisition denied. Already at maxLeases (1) for supplied license.
make: *** [Makefile:40: sim_2path] エラー 105

まとめ

今回はDSimのチュートリアルのデータをCLIで実行する流れを確認した。商用シミュレーターを使ってる人は、こちらの使い方のほうが馴染みがありそうに感じる。 実際、指定可能なオプションは割と見覚えがあるものが多いように思った。 CLIを使えばMakefile等でシミュレーション実行なども可能になるので、使うとしたらこちらの方式かなぁという印象でした。