はじめに
ちょっと奥さん、聞いてくださる? 最近1、SystemVerilogのシミュレーションが全部無料でできちゃうDSimってのが話題なんですってよ。ほら、見てよこの記事2。
驚くべきは、この「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
に置かれます。
環境変数の設定
DSimのインストール時、DSIM_LICENSE
やDSIM_HOME
、PATH
などの環境変数は自動で設定されません。したがって、シミュレーションを始める前に、これらの環境変数をあらかじめ設定しておく必要があります。DSimのインストール先には、そのためのPowerShellスクリプトやBATファイルが用意されています。
上記のshell_activate.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がトグルするだけの簡単なテストベンチを作って、
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
おまけ:UVMは使えるの?
なんとおどろき、追加ライセンスなしで、普通に使えちゃうのぜ!
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
@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
さらにおまけ:User-defined nettypeは使えるの?
これも使えました。すごい……4
ついに無料でUDN5で遊べる時代が来ましたね。
みんなも始めよう、DMS6シミュレーション!
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
@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
おわりに
バタフライダンシング
半径1メーター
撹乱アイムインベーダー7
-
EDA EXPRESS - デスクトップ利用は無料、大手製品に匹敵する論理シミュレータDSimを手掛けるMetrixのビジネスとは? ↩
-
このUser-defined nettypeという機能、基本的にデジタルのシミュレーションでは使われないので、メジャーどころのシミュレーター(QuestaとかXceliumとか、そのへん) では追加ライセンスを要求されがち。それが無料で使えちゃうってこと。しゅごおおおいのおおおほほおおおお ↩
-
UDN = User-defined nettypeの略。うどん、じゃないよ、ゆーでぃーえぬだよ。ちなみに、UDR = User-defined resolution、UDT = User-defined typeです。 ↩
-
DMS = Digital mixed-signalの略。AMS(Analog mixed-signal)simulationと対比するために、よくCadenceが使ってたりする単語。知らんけど。半導体業界、略語多すぎ問題。 ↩