2
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?

DSimをコマンドラインから使ってみよう

Last updated at Posted at 2024-12-28

はじめに

ちょっと奥さん、聞いてくださる? 最近1、SystemVerilogのシミュレーションが全部無料でできちゃうDSimってのが話題なんですってよ。ほら、見てよこの記事2

Screenshot 2024-12-28 194847.png

驚くべきは、この「DSim」はデスクトップ利用は無料でライセンス費用がかからない。「VSCode IDE」に組み込まれており、誰でも容易にセットアップ可能で(Metrix曰く10分以内にシミュレーション可能)、無料ツールにありがちな利用期限やコード量などの制限は一切なく普通に利用できる。

……ってことでね、ええ、今日はこのDSimとやらを試していこうと思います。
グッバイ、Questa*-Intel® FPGA Starter Edition!元気でな!

DSimのインストール

下記をページを参考に、VS Code経由でDSimをインストールします。

Windowsを使っている場合、インストール先は C:\Users\ユーザー名\AppData\Local\metrics-ca\dsim になり、ランセンスファイルは C:\Users\ユーザー名\AppData\Local\metrics-ca\dsim-license.json に置かれます。

Screenshot 2024-12-28 121236.png

環境変数の設定

DSimのインストール時、DSIM_LICENSEDSIM_HOMEPATHなどの環境変数は自動で設定されません。したがって、シミュレーションを始める前に、これらの環境変数をあらかじめ設定しておく必要があります。DSimのインストール先には、そのためのPowerShellスクリプトやBATファイルが用意されています。

Screenshot 2024-12-28 122348.png

上記のshell_activate.batを利用して環境変数を設定しつつ、シミュレーションを実行するようなスクリプトを書くと、こんなかんじ。

run.bat
@echo off
set "DSIM_LICENSE=%USERPROFILE%\AppData\Local\metrics-ca\dsim-license.json"
cd "%USERPROFILE%\AppData\Local\metrics-ca\dsim\20240923.7.0"
call shell_activate.bat
cd %~dp0
dsim test.sv +acc -waves waves.vcd
pause
exit

*.mxdというDSim独自の形式で波形ファイルを出力することもできますが、DSimの波形ビューワーは、現時点ではまだ、real型の変数の表示に対応していないようです。そのため、波形ファイルの出力は*.vcdにしておき、GTKWaveを使って波形を確認することにします。

簡単なテストベンチの作成と実行

DSimの動作確認のために、Clockがトグルするだけの簡単なテストベンチを作って、

test.sv
module test;
  timeunit 1ns;
  timeprecision 1ps;

  bit clk = 1'b0;

  initial begin
    forever begin
      #1ns;
      clk = ~clk;
    end
  end

  initial begin
    $monitor("clk = %0b", clk);
    #5ns;
    $finish();
  end
  
endmodule

先ほど用意したrun.batでシミュレーションを実行すると、実際に期待通りに動作していることが確認できます。GTKWaveを使って、出力されたVCDファイルを開くと波形も見れます。これでついに、「趣味でSystemVerilogのフル機能が使える環境」ゲットだぜ!3

Screenshot 2024-12-28 131124.png

Screenshot 2024-12-28 131836.png

おまけ:UVMは使えるの?

なんとおどろき、追加ライセンスなしで、普通に使えちゃうのぜ!

top.sv
package my_pkg;
  `include "uvm_macros.svh"
  import uvm_pkg::*;

  class simple_test extends uvm_test;
    `uvm_component_utils(simple_test)
    
    function new (string name="simple_test", uvm_component parent=null);
      super.new(name, parent);
    endfunction

    task run_phase (uvm_phase phase);
      phase.raise_objection(this);
      `uvm_info(get_type_name(), "Hello", UVM_MEDIUM)
      `uvm_info(get_type_name(), "World", UVM_MEDIUM)
      phase.drop_objection(this);
    endtask
  endclass
  
endpackage

module top;
  timeunit 1ns;
  timeprecision 1ps;

  import uvm_pkg::*;
  import my_pkg::*;

  initial begin
    run_test();
  end
  
endmodule
run.bat
@echo off
set "DSIM_LICENSE=%USERPROFILE%\AppData\Local\metrics-ca\dsim-license.json"
cd "%USERPROFILE%\AppData\Local\metrics-ca\dsim\20240923.7.0"
call shell_activate.bat
cd %~dp0
dsim -suppress IneffectiveDynamicCast:MissingTimescale -uvm 1.2 +UVM_NO_RELNOTES +UVM_TESTNAME=simple_test top.sv 
pause
exit

Screenshot 2024-12-28 184413.png

さらにおまけ:User-defined nettypeは使えるの?

これも使えました。すごい……4
ついに無料でUDN5で遊べる時代が来ましたね。
みんなも始めよう、DMS6シミュレーション!

test.sv
package my_nettype_pkg;
  timeunit 1s;
  timeprecision 1ns;

  function automatic real real_sum_res (real driver[]);
    real total;
    foreach (driver[i]) begin
      total += driver[i];
    end
    return total;
  endfunction

  nettype real real_sum with real_sum_res;
  
endpackage

module test
  import my_nettype_pkg::real_sum;
();
  timeunit 1s;
  timeprecision 1ns;

  // Net
  real_sum i_out;

  // Variable
  real i1 = 0;
  real i2 = 0;

  // Drive i_out net with I1 and I2
  assign i_out = i1;
  assign i_out = i2;

  initial begin
    $monitor("(i1, i2, i_out) = (%4.1f, %4.1f, %4.1f)", i1, i2, i_out);
    repeat (10) begin
      #1ns;
      i1 = 1.0 - $urandom_range(0, 20)*0.1;
      i2 = 1.0 - $urandom_range(0, 20)*0.1;
    end
    #1ns
    $finish();
  end
  
endmodule
run.bat
@echo off
set "DSIM_LICENSE=%USERPROFILE%\AppData\Local\metrics-ca\dsim-license.json"
cd "%USERPROFILE%\AppData\Local\metrics-ca\dsim\20240923.7.0"
call shell_activate.bat
cd %~dp0
dsim test.sv +acc -waves waves.vcd
pause
exit

Screenshot 2024-12-28 175934.png

おわりに

バタフライダンシング
半径1メーター
撹乱アイムインベーダー7

  1. Twitterの某界隈でDSimの話題が出始めたのは、もう半年以上前だって?そんなバカな……

  2. EDA EXPRESS - デスクトップ利用は無料、大手製品に匹敵する論理シミュレータDSimを手掛けるMetrixのビジネスとは?

  3. ピッピカチュー!

  4. このUser-defined nettypeという機能、基本的にデジタルのシミュレーションでは使われないので、メジャーどころのシミュレーター(QuestaとかXceliumとか、そのへん) では追加ライセンスを要求されがち。それが無料で使えちゃうってこと。しゅごおおおいのおおおほほおおおお

  5. UDN = User-defined nettypeの略。うどん、じゃないよ、ゆーでぃーえぬだよ。ちなみに、UDR = User-defined resolution、UDT = User-defined typeです。

  6. DMS = Digital mixed-signalの略。AMS(Analog mixed-signal)simulationと対比するために、よくCadenceが使ってたりする単語。知らんけど。半導体業界、略語多すぎ問題。

  7. この記事は、この動画をバックグラウンドで無限ループしながら執筆されました。

2
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
2
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?