SlideShare uma empresa Scribd logo
1 de 40
Baixar para ler offline
Verilator勉強会用資料
2021.05.29
@Vengineer
VerilatorとSystemC
ブログ (2007年~) : Vengineerの戯言

 http://blogs.yahoo.co.jp/verification_engineer



SlideShare : 

 https://www.slideshare.net/ssuser479fa3





Twitter (2009年~) :

@Vengineer

ソースコード解析職人
● Verilator とは?
● SystemC とは?
● 現在の SystemC は?
● VerilatorでSystemCを使うには?
● 例題での C++ と SystemC の比較
● ユーザー定義関数
● final メソッド
● 波形ダンプ
● おわりに
発表内容
Verilator とは? (https://github.com/verilator)
Welcome to Verilator, the fastest Verilog/SystemVerilog simulator.
● Accepts synthesizable Verilog or SystemVerilog
● Performs lint code-quality checks
● Compiles into multithreaded C++, or SystemC
● Creates XML to front-end your own tools
テストベンチ側に、
● マルチスレッドな C++
● SystemC
が使える
Verilatorで「出来ないこと」
@msyksphinz さんのブログ
Verilatorの使い方
(1. Verilatorの考え方と基本的なシミュレーション実行方法)
● 全ての遅延記述 (#) は無視される。
● event系のイベント (waitなど) はサポートされない。
● Unknownステートはサポートされない
つまり、テストベンチ側の Verilog HDL/SystemVerilog コードはダメ!
Verilatorで「出来ないこと」
antmicro の Dynamic Scheduler 版 verilator (v4.108ベース)
● 全ての遅延記述 (#)
● event系のイベント (waitなど)
● fork/join
内部表現を変えないと難しいと思います。
● Unknownステートはサポートされない
Dynamic Scheduler版のVerilatorの中を調べる(その1)
Dynamic Scheduler版のVerilatorの中を調べる(その2)
Dynamic Scheduler版のVerilatorの中を調べる(その3)
Dynamic Scheduler版のVerilatorの中を調べる(その4)
SystemC とは?
1999年にOpen SystemC(OSCI)が創設され、1999年9月にv0.9が公開
- 米Synopsys, Inc.
- 米CoWare, Inc.
- ベルギーFrontier Design社
● 2005.6 v2.1 LRM & TLM 1.0
● 2005.12 IEEE 1666-2005 (v2.1ベース)
● 2008.6 TLM 2.0 (2008.6)
● 2009.7 TLM 2.0 LRM (2009.7)
● 2010.2 AMS Extensions (2010.2)
現在の SystemC は?
accellera で管理
● 2018.11 SystemC 2.3.3 (Includes TLM)
● 2020.4 SystemC AMS 2.3
IEEE Standards Association (IEEE-SA)
● IEEE Std. 1666-2011 SystemC (SystemC 2.2 + TLM 2.0.1)
● IEEE Std. 1666.1-2016 SystemC AMS (SystemC AMS 2.0)
github : https://github.com/accellera-official/systemc
● 2.3.3
VerilatorでSystemCを使うには?
先に、SystemC 2.3.3 をどこか (/usr/local/systemc/2.3.3) にインストール
後、SYSTEMC_INCLUDE環境変数に、/usr/local/systemc/2.3.3/include を
設定して、verilator をビルド
$ git clone -b v4.202 https://github.com/verilator/verilator.git
v4.202 にて、SystemC で FST (Fast Signal Trace) をサポート
$ cd verilator
$ export SYSTEMC_INCLUDE=/usr/local/systemc/2.3.3/include
$ autoconf
$ ./configure --prefix=/usr/local/verilator/v4.202
$ make -j
$ make install
例題での C++ と SystemC の比較
verilator コマンドのオプションが違う
C++ : --cc
SystemC : --sc
● examples/make_hello_c
● examples/make_hello_sc
● examples/make_tracing_c
● examples/make_tracing_sc
● examples/cmake_hello_c
● examples/cmake_hello_sc
● examples/cmake_tracing_c
● examples/cmake_tracing_sc
examples/make_hello_c
module top;
initial begin
$display("Hello World!");
$finish;
end
endmodule
#include <verilated.h>
#include "Vtop.h"
int main(int argc, char** argv, char** env) {
if (false && argc && argv && env) {}
Vtop* top = new Vtop{“top”};
while (!Verilated::gotFinish()) {
top->eval();
}
top->final();
delete top;
return 0;
}
examples/make_hello_sc
module top;
initial begin
$display("Hello World!");
$finish;
end
endmodule
#include <systemc.h>
#include <verilated.h>
#include "Vtop.h"
int sc_main(int argc, char* argv[]) {
if (false && argc && argv) {}
Vtop* top = new Vtop{"top"};
sc_start(1, SC_NS);
while (!Verilated::gotFinish()) {
sc_start(1, SC_NS);
}
top->final();
delete top;
return 0;
}
C++ と SystemC の比較
#include <systemc.h>
#include <verilated.h>
#include "Vtop.h"
int sc_main(int argc, char* argv[]) {
if (false && argc && argv) {}
Vtop* top = new Vtop{"top"};
sc_start(1, SC_NS);
while (!Verilated::gotFinish()) {
sc_start(1, SC_NS);
}
top->final();
delete top;
return 0;
}
#include <verilated.h>
#include "Vtop.h"
int main(int argc, char** argv, char** env) {
if (false && argc && argv && env) {}
Vtop* top = new Vtop{"top"};
while (!Verilated::gotFinish()) {
top->eval();
}
top->final();
delete top;
return 0;
}
C++ と SystemC の比較 (初期化)
#include <systemc.h>
SystemCでは、systemc.h ファイルをイン
クルードする必要がある
int sc_main(int argc, char* argv[]) {
main 関数ではなく、sc_main 関数がス
タートポイントになる
if (false && argc && argv && env) {}
Vtop* top = new Vtop{"top"};
int main(int argc, char** argv, char** env) {
if (false && argc && argv && env) {}
Vtop* top = new Vtop{"top"};
C++ と SystemC の比較 (実行)
sc_start(1, SC_NS);
SystemC では、最初に sc_start 関数を
ちょっとだけ実行する必要がある
while (!Verilated::gotFinish()) {
sc_start(1, SC_NS);
}
top->eval() ではなく、sc_start 関数を使
う
top->final();
while (!Verilated::gotFinish()) {
top->eval();
}
top->final();
Verilated::gotFinish メソッド
while (!Verilated::gotFinish()) {
sc_start(1, SC_NS);
}
while (!Verilated::gotFinish()) {
top->eval();
}
Verilog HDL/SystemVerilog 側で、$stop システムタスク、$finish システ
ムタスク、$fatal システムタスクが呼ばれると、Verilated::gotFinish メソッ
ドの戻り値が false から true になり、上記の while ループから抜ける
while ループでは、シミュレーションの時間を進めるために、
● C++ : top->eval()
● SystemC : sc_start(1, SC_NS)
を実行する
examples/make_hello_c
module top;
initial begin
$display("Hello World!");
$finish;
end
endmodule
$ cd examples/make_hello_c
$ make
….
-- RUN ---------------------
obj_dir/Vtop
Hello World!
- top.v:11: Verilog $finish
-- DONE --------------------
examples/make_hello_c
module top;
initial begin
$display("Hello World!");
// $finish;
end
endmodule
$ cd examples/make_hello_c
$ make
….
-- RUN ---------------------
obj_dir/Vtop
Hello World!
終了しない。。。
生成されたC++コード (obj_dir/Vtop.h)
VL_MODULE(Vtop) {
public:
Vtop__Syms* __VlSymsp;
private:
VL_UNCOPYABLE(Vtop);
public:
Vtop(VerilatedContext* contextp, const char* name = "TOP");
Vtop(const char* name = "TOP")
: Vtop(nullptr, name) {}
~Vtop();
VerilatedContext* contextp();
void eval() { eval_step(); }
void eval_step();
void eval_end_step() {}
void final();
生成されたSystemCコード (obj_dir/Vtop.h)
SC_MODULE(Vtop) {
public:
Vtop__Syms* __VlSymsp;
private:
VL_UNCOPYABLE(Vtop);
public:
SC_CTOR(Vtop);
virtual ~Vtop();
VerilatedContext* contextp();
private:
void eval() { eval_step(); }
void eval_step();
public:
void final();
生成されたコードの比較 (obj_dir/Vtop.h)
SC_MODULE(Vtop) {
SC_CTOR(Vtop);
virtual ~Vtop();
VL_MODULE(Vtop) {
Vtop(VerilatedContext* contextp, const char* name = "TOP");
Vtop(const char* name = "TOP")
: Vtop(nullptr, name) {}
~Vtop();
生成されたC++コード (obj_dir/Vtop.cpp)
Vtop::Vtop(VerilatedContext* _vcontextp__, const char* _vcname__)
: VerilatedModule{_vcname__}
{
Vtop__Syms* __restrict vlSymsp = __VlSymsp =
new Vtop__Syms(_vcontextp__, this, name());
Vtop* const __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp;
// Reset internal values
// Reset structure values
_ctor_var_reset();
}
生成されたSystemCコード (obj_dir/Vtop.cpp)
Vtop::Vtop(sc_module_name) {
Vtop__Syms* __restrict vlSymsp = __VlSymsp =
new Vtop__Syms(nullptr, this, name());
Vtop* const __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp;
// Sensitivities on all clocks and combo inputs
SC_METHOD(eval);
// Reset internal values
// Reset structure values
_ctor_var_reset();
}
SC_METHODマクロを使っているが、
sensitive << がない
=> 何故なら、top に信号線がないから!
examples/make_trace_sc
module top(
input clk,
input fastclk,
input reset_l,
output wire [1:0] out_small,
output wire [39:0] out_quad,
output wire [69:0] out_wide,
input [1:0] in_small,
input [39:0] in_quad,
input [69:0] in_wide
);
assign out_small = ~reset_l ? '0 : (in_small + 2'b1);
assign out_quad = ~reset_l ? '0 : (in_quad + 40'b1);
assign out_wide = ~reset_l ? '0 : (in_wide + 70'b1);
sub sub ( .clk(clk), .fastclk(fastclk), .reset_l(reset_l) );
endmodule
生成されたSystemCコード (obj_dir/Vtop.h)
SC_MODULE(Vtop) {
public:
// PORTS
// The application code writes and reads these signals to
// propagate new values into/out from the Verilated model.
sc_in<bool> clk;
sc_in<bool> fastclk;
sc_in<bool> reset_l;
sc_out<uint32_t> out_small;
sc_in<uint32_t> in_small;
sc_out<vluint64_t> out_quad;
sc_in<vluint64_t> in_quad;
sc_out<sc_bv<70> > out_wide;
sc_in<sc_bv<70> > in_wide;
input clk,
input fastclk,
input reset_l,
output wire [1:0] out_small,
output wire [39:0] out_quad,
output wire [69:0] out_wide,
input [1:0] in_small,
input [39:0] in_quad,
input [69:0] in_wide
生成されたSystemCコード (obj_dir/Vtop.cpp)
Vtop::Vtop(sc_module_name)
: clk("clk"), fastclk("fastclk"), reset_l("reset_l"), out_small("out_small"),
in_small("in_small"), out_quad("out_quad"), in_quad("in_quad"), out_wide("out_wide"),
in_wide("in_wide"){
SC_METHOD(eval);
sensitive << clk;
sensitive << fastclk;
sensitive << reset_l;
sensitive << in_small;
sensitive << in_quad;
sensitive << in_wide;
_ctor_var_reset();
}
sensitive << で登録した信号が変化したら、
eval メソッドが呼ばれる
Verilated::gotFinish メソッド
while (!Verilated::gotFinish()) {
sc_start(1, SC_NS);
}
while (!Verilated::gotFinish()) {
top->eval();
}
Verilog HDL/SystemVerilog 側で、$stop システムタスク、$finish システムタ
スク、$fatal システムタスクが呼ばれると、Verilated::gotFinish メソッドの戻り
値が false から true になり、上記の while ループから抜ける
while ループでは、シミュレーションの時間を進めるために、
● C++ : top->eval()
● SystemC : sc_start(1, SC_NS) => top->eval() が呼ばれている
を実行する
ユーザー定義関数
Verilator では、$finishシステムタスク、$stopシステムタスク、$fatalシステムタスクを呼ぶと、
vl_finish 関数、vl_stop 関数、vl_fatal 関数が呼ばれる
これらの関数は、ユーザー定義関数にできる
- $finish システムタスク => vl_finish
- $stop システムタスク=> vl_stop
- $fatal システムタスク=> vl_fatal
vl_finishの再定義
#ifdef VL_USER_STOP
void vl_finish(const char *filename, int linenum, const char *hier) VL_MT_UNSAFE
{
sc_stop();
cout << "call vl_finish" << endl;
}
#endif
Makefile の verilator コマンド に -CFLAGS -DVL_USER_STOP を追加する
 $(VERILATOR) -sc --exe --build -j top.v sc_main.cpp -CFLAGS -DVL_USER_STOP
を追加する
examples/make_hello_sc
module top;
initial begin
$display("Hello World!");
$finish;
end
endmodule
$ cd examples/make_hello_c
$ make
….
-- RUN ---------------------
obj_dir/Vtop
Hello World!
- top.v:11: Verilog $finish
call vl_finish
-- DONE --------------------
vl_finishを再定義した結果
#include <systemc.h>
#include <verilated.h>
#include "Vtop.h"
int sc_main(int argc, char* argv[]) {
if (false && argc && argv) {}
Vtop* top = new Vtop{"top"};
// sc_start 実行中に、
// sc_stopが呼ばれると、
// sc_start から抜ける
sc_start();
top->final();
delete top;
return 0;
}
#include <systemc.h>
#include <verilated.h>
#include "Vtop.h"
int sc_main(int argc, char* argv[]) {
if (false && argc && argv) {}
Vtop* top = new Vtop{"top"};
sc_start(1, SC_NS);
while (!Verilated::gotFinish()) {
sc_start(1, SC_NS);
}
top->final();
delete top;
return 0;
}
final メソッド (obj_dir/Vtop__Slow.cpp)
生成されたコードでは、final メソッドは、C++/SystemC で同じ
この例題では、特に何もしていない?
void Vtop::final() {
VL_DEBUG_IF(VL_DBG_MSGF("+ Vtop::finaln"); );
// Variables
Vtop__Syms* __restrict vlSymsp = this->__VlSymsp;
Vtop* const __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp;
}
では?、final メソッドは、何に使われるのか?
SystemVerilog の final
module top;
initial begin
$display("Hello World!");
$finish;
end
final begin
$display("top : final");
end
endmodule
-- RUN ---------------------
obj_dir/Vtop
Hello World!
- top.v:11: Verilog $finish
call vl_finish
top : final
-- DONE --------------------
final メソッド (obj_dir/Vtop__Slow.cpp)
生成されたコードでは、final メソッドは、C++/SystemC で同じ
vlTOPp->_final_TOP(vlSymsp) の中で、VL_WRITEF(“top : finaln”) で呼んでいる
void Vtop::final() {
VL_DEBUG_IF(VL_DBG_MSGF("+ Vtop::finaln"); );
// Variables
Vtop__Syms* __restrict vlSymsp = this->__VlSymsp;
Vtop* const __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp;
vlTOPp->_final_TOP(vlSymsp);
}
void Vtop::_final_TOP(Vtop__Syms* __restrict vlSymsp) {
VL_DEBUG_IF(VL_DBG_MSGF("+ Vtop::_final_TOPn"); );
// Variables
Vtop* const __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp;
// Body
VL_WRITEF("top : finaln");
}
波形ダンプのフォーマットとして、
● VCD (Value Change Dump)
○ verilated_vcd_sc.h を include する
● FST (Fast Signal Trace)
○ verilated_fst_sc.h を include する
が使える
波形表示は、gtkwave できる
波形ダンプ
波形ダンプ : VCD
Verilated::traceEverOn(true);
VerilatedVcdSc* tfp = NULL;
const char* flag = Verilated::commandArgsPlusMatch("trace");
if (flag && 0 == strcmp(flag, "+trace")) {
tfp = new VerilatedVcdSc;
top->trace(tfp,99);
tfp->open("vlt_dump.vcd");
}
sc_start();
top->final();
if(tfp) {
tfp->flush(); tfp->close(); tfp = NULL;
}
波形ダンプ : FST
Verilated::traceEverOn(true);
VerilatedFstSc* tfp = NULL;
const char* flag = Verilated::commandArgsPlusMatch("trace");
if (flag && 0 == strcmp(flag, "+trace")) {
tfp = new VerilatedFstSc;
top->trace(tfp,99);
tfp->open("vlt_dump.fst");
}
sc_start();
top->final();
if(tfp) {
tfp->flush(); tfp->close(); tfp = NULL;
}
● Verilator とは?
● SystemC とは?
● 現在の SystemC は?
● VerilatorでSystemCを使うには?
● 例題での C++ と SystemC の比較
● ユーザー定義関数
● final メソッド
● 波形ダンプ
● おわりに
まとめ
Verilatorの薄い本
BOOTH : https://vengineer.booth.pm/ にて、
ソースコード解析職人の薄い本として、
● Verilatorの中を調べる、No.1 : 例題解析編
● Verilatorの中を調べる、No.2 : テストデータ解析編
● Verilatorの中を調べる、No.3 : SystemC編
をダウンロード販売しています。
ありがとうございました
@Vengineer
久々に、
ソースコード解析職人
でした

Mais conteúdo relacionado

Mais procurados

すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!Genya Murakami
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたMITSUNARI Shigeo
 
SystemC Tutorial
SystemC TutorialSystemC Tutorial
SystemC Tutorialkocha2012
 
マルチコア時代の並列プログラミング
マルチコア時代の並列プログラミングマルチコア時代の並列プログラミング
マルチコア時代の並列プログラミングAkihiko Matuura
 
いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例Fixstars Corporation
 
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015CODE BLUE
 
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarrayRyosuke839
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門Fixstars Corporation
 
LinuxのFull ticklessを試してみた
LinuxのFull ticklessを試してみたLinuxのFull ticklessを試してみた
LinuxのFull ticklessを試してみたHiraku Toyooka
 
eStargzイメージとlazy pullingによる高速なコンテナ起動
eStargzイメージとlazy pullingによる高速なコンテナ起動eStargzイメージとlazy pullingによる高速なコンテナ起動
eStargzイメージとlazy pullingによる高速なコンテナ起動Kohei Tokunaga
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由kikairoya
 
FPGA+SoC+Linux実践勉強会資料
FPGA+SoC+Linux実践勉強会資料FPGA+SoC+Linux実践勉強会資料
FPGA+SoC+Linux実践勉強会資料一路 川染
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門Norishige Fukushima
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介MITSUNARI Shigeo
 
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門Preferred Networks
 

Mais procurados (20)

すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
 
SystemC Tutorial
SystemC TutorialSystemC Tutorial
SystemC Tutorial
 
マルチコア時代の並列プログラミング
マルチコア時代の並列プログラミングマルチコア時代の並列プログラミング
マルチコア時代の並列プログラミング
 
いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例
 
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
 
LLVM最適化のこつ
LLVM最適化のこつLLVM最適化のこつ
LLVM最適化のこつ
 
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 
LinuxのFull ticklessを試してみた
LinuxのFull ticklessを試してみたLinuxのFull ticklessを試してみた
LinuxのFull ticklessを試してみた
 
eStargzイメージとlazy pullingによる高速なコンテナ起動
eStargzイメージとlazy pullingによる高速なコンテナ起動eStargzイメージとlazy pullingによる高速なコンテナ起動
eStargzイメージとlazy pullingによる高速なコンテナ起動
 
C++ マルチスレッド 入門
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門
 
Aio
AioAio
Aio
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
FPGA+SoC+Linux実践勉強会資料
FPGA+SoC+Linux実践勉強会資料FPGA+SoC+Linux実践勉強会資料
FPGA+SoC+Linux実践勉強会資料
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
Java8でRDBMS作ったよ
Java8でRDBMS作ったよJava8でRDBMS作ったよ
Java8でRDBMS作ったよ
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
 
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
 

Semelhante a VerilatorとSystemC

社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)Iwana Chan
 
T90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvmT90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvm伸男 伊藤
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門伸男 伊藤
 
Php in ruby
Php in rubyPhp in ruby
Php in rubydo_aki
 
EC-CUBEプラグイン講義
EC-CUBEプラグイン講義EC-CUBEプラグイン講義
EC-CUBEプラグイン講義ria1201
 
ATLに見る魔術
ATLに見る魔術ATLに見る魔術
ATLに見る魔術egtra
 
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目hecomi
 
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~Fujio Kojima
 
Circle ci and docker+serverspec
Circle ci and docker+serverspecCircle ci and docker+serverspec
Circle ci and docker+serverspecTsuyoshi Yamada
 
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理keki3
 
OpenStack本番環境の作り方 - Interop 2016
OpenStack本番環境の作り方 - Interop 2016OpenStack本番環境の作り方 - Interop 2016
OpenStack本番環境の作り方 - Interop 2016VirtualTech Japan Inc.
 
Zynq VIPを利用したテストベンチ
Zynq VIPを利用したテストベンチZynq VIPを利用したテストベンチ
Zynq VIPを利用したテストベンチMr. Vengineer
 
New Features in C# 10/11
New Features in C# 10/11New Features in C# 10/11
New Features in C# 10/11Akira Inoue
 
Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7Takaaki Suzuki
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについてtako pons
 
Vivado hls勉強会1(基礎編)
Vivado hls勉強会1(基礎編)Vivado hls勉強会1(基礎編)
Vivado hls勉強会1(基礎編)marsee101
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門Sho A
 

Semelhante a VerilatorとSystemC (20)

社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)
 
T90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvmT90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvm
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
 
Php in ruby
Php in rubyPhp in ruby
Php in ruby
 
EC-CUBEプラグイン講義
EC-CUBEプラグイン講義EC-CUBEプラグイン講義
EC-CUBEプラグイン講義
 
ATLに見る魔術
ATLに見る魔術ATLに見る魔術
ATLに見る魔術
 
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
 
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
Circle ci and docker+serverspec
Circle ci and docker+serverspecCircle ci and docker+serverspec
Circle ci and docker+serverspec
 
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
 
OpenStack本番環境の作り方 - Interop 2016
OpenStack本番環境の作り方 - Interop 2016OpenStack本番環境の作り方 - Interop 2016
OpenStack本番環境の作り方 - Interop 2016
 
Zynq VIPを利用したテストベンチ
Zynq VIPを利用したテストベンチZynq VIPを利用したテストベンチ
Zynq VIPを利用したテストベンチ
 
emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
 
Driverについて
DriverについてDriverについて
Driverについて
 
New Features in C# 10/11
New Features in C# 10/11New Features in C# 10/11
New Features in C# 10/11
 
Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについて
 
Vivado hls勉強会1(基礎編)
Vivado hls勉強会1(基礎編)Vivado hls勉強会1(基礎編)
Vivado hls勉強会1(基礎編)
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門
 

Mais de Mr. Vengineer

XilinxのxsimでSoftware Driven Verification.pdf
XilinxのxsimでSoftware  Driven Verification.pdfXilinxのxsimでSoftware  Driven Verification.pdf
XilinxのxsimでSoftware Driven Verification.pdfMr. Vengineer
 
Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Mr. Vengineer
 
Cloud Deep Learning Chips Training & Inference
Cloud Deep Learning Chips Training & InferenceCloud Deep Learning Chips Training & Inference
Cloud Deep Learning Chips Training & InferenceMr. Vengineer
 
TensorFlow Lite Delegateとは?
TensorFlow Lite Delegateとは?TensorFlow Lite Delegateとは?
TensorFlow Lite Delegateとは?Mr. Vengineer
 
Pixel Visual Core device driver source code analysis
Pixel Visual Core device driver source code analysisPixel Visual Core device driver source code analysis
Pixel Visual Core device driver source code analysisMr. Vengineer
 
Google Edge TPUで TensorFlow Liteを使った時に 何をやっているのかを妄想してみる 2 「エッジAIモダン計測制御の世界」オ...
Google Edge TPUで TensorFlow Liteを使った時に 何をやっているのかを妄想してみる 2  「エッジAIモダン計測制御の世界」オ...Google Edge TPUで TensorFlow Liteを使った時に 何をやっているのかを妄想してみる 2  「エッジAIモダン計測制御の世界」オ...
Google Edge TPUで TensorFlow Liteを使った時に 何をやっているのかを妄想してみる 2 「エッジAIモダン計測制御の世界」オ...Mr. Vengineer
 
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」Mr. Vengineer
 
Facebook Glow Compiler のソースコードをグダグダ語る会
Facebook Glow Compiler のソースコードをグダグダ語る会Facebook Glow Compiler のソースコードをグダグダ語る会
Facebook Glow Compiler のソースコードをグダグダ語る会Mr. Vengineer
 
Ultra96(UltraZed)実践勉強会
Ultra96(UltraZed)実践勉強会Ultra96(UltraZed)実践勉強会
Ultra96(UltraZed)実践勉強会Mr. Vengineer
 
Bridge TensorFlow to run on Intel nGraph backends (v0.4)
Bridge TensorFlow to run on Intel nGraph backends (v0.4)Bridge TensorFlow to run on Intel nGraph backends (v0.4)
Bridge TensorFlow to run on Intel nGraph backends (v0.4)Mr. Vengineer
 
Bridge TensorFlow to run on Intel nGraph backends (v0.5)
Bridge TensorFlow to run on Intel nGraph backends (v0.5)Bridge TensorFlow to run on Intel nGraph backends (v0.5)
Bridge TensorFlow to run on Intel nGraph backends (v0.5)Mr. Vengineer
 
TensorFlow local Python XLA client
TensorFlow local Python XLA clientTensorFlow local Python XLA client
TensorFlow local Python XLA clientMr. Vengineer
 
Tiramisu をちょっと、味見してみました。
Tiramisu をちょっと、味見してみました。Tiramisu をちょっと、味見してみました。
Tiramisu をちょっと、味見してみました。Mr. Vengineer
 
LeFlowを調べてみました
LeFlowを調べてみましたLeFlowを調べてみました
LeFlowを調べてみましたMr. Vengineer
 
Tensorflow dynamically loadable XLA plugin ソースコード解析
Tensorflow  dynamically loadable XLA plugin ソースコード解析Tensorflow  dynamically loadable XLA plugin ソースコード解析
Tensorflow dynamically loadable XLA plugin ソースコード解析Mr. Vengineer
 
Tensor comprehensions
Tensor comprehensionsTensor comprehensions
Tensor comprehensionsMr. Vengineer
 
TensorFlow Lite (r1.5) & Android 8.1 Neural Network API
TensorFlow Lite (r1.5) & Android 8.1 Neural Network APITensorFlow Lite (r1.5) & Android 8.1 Neural Network API
TensorFlow Lite (r1.5) & Android 8.1 Neural Network APIMr. Vengineer
 

Mais de Mr. Vengineer (20)

XilinxのxsimでSoftware Driven Verification.pdf
XilinxのxsimでSoftware  Driven Verification.pdfXilinxのxsimでSoftware  Driven Verification.pdf
XilinxのxsimでSoftware Driven Verification.pdf
 
TVM VTA (TSIM)
TVM VTA (TSIM) TVM VTA (TSIM)
TVM VTA (TSIM)
 
Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析
 
Cloud Deep Learning Chips Training & Inference
Cloud Deep Learning Chips Training & InferenceCloud Deep Learning Chips Training & Inference
Cloud Deep Learning Chips Training & Inference
 
TensorFlow Lite Delegateとは?
TensorFlow Lite Delegateとは?TensorFlow Lite Delegateとは?
TensorFlow Lite Delegateとは?
 
Pixel Visual Core device driver source code analysis
Pixel Visual Core device driver source code analysisPixel Visual Core device driver source code analysis
Pixel Visual Core device driver source code analysis
 
Google Edge TPUで TensorFlow Liteを使った時に 何をやっているのかを妄想してみる 2 「エッジAIモダン計測制御の世界」オ...
Google Edge TPUで TensorFlow Liteを使った時に 何をやっているのかを妄想してみる 2  「エッジAIモダン計測制御の世界」オ...Google Edge TPUで TensorFlow Liteを使った時に 何をやっているのかを妄想してみる 2  「エッジAIモダン計測制御の世界」オ...
Google Edge TPUで TensorFlow Liteを使った時に 何をやっているのかを妄想してみる 2 「エッジAIモダン計測制御の世界」オ...
 
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
 
Facebook Glow Compiler のソースコードをグダグダ語る会
Facebook Glow Compiler のソースコードをグダグダ語る会Facebook Glow Compiler のソースコードをグダグダ語る会
Facebook Glow Compiler のソースコードをグダグダ語る会
 
Ultra96(UltraZed)実践勉強会
Ultra96(UltraZed)実践勉強会Ultra96(UltraZed)実践勉強会
Ultra96(UltraZed)実践勉強会
 
Bridge TensorFlow to run on Intel nGraph backends (v0.4)
Bridge TensorFlow to run on Intel nGraph backends (v0.4)Bridge TensorFlow to run on Intel nGraph backends (v0.4)
Bridge TensorFlow to run on Intel nGraph backends (v0.4)
 
Bridge TensorFlow to run on Intel nGraph backends (v0.5)
Bridge TensorFlow to run on Intel nGraph backends (v0.5)Bridge TensorFlow to run on Intel nGraph backends (v0.5)
Bridge TensorFlow to run on Intel nGraph backends (v0.5)
 
TensorFlow XLA RPC
TensorFlow XLA RPCTensorFlow XLA RPC
TensorFlow XLA RPC
 
TensorFlow local Python XLA client
TensorFlow local Python XLA clientTensorFlow local Python XLA client
TensorFlow local Python XLA client
 
Tiramisu をちょっと、味見してみました。
Tiramisu をちょっと、味見してみました。Tiramisu をちょっと、味見してみました。
Tiramisu をちょっと、味見してみました。
 
LeFlowを調べてみました
LeFlowを調べてみましたLeFlowを調べてみました
LeFlowを調べてみました
 
Tensorflow dynamically loadable XLA plugin ソースコード解析
Tensorflow  dynamically loadable XLA plugin ソースコード解析Tensorflow  dynamically loadable XLA plugin ソースコード解析
Tensorflow dynamically loadable XLA plugin ソースコード解析
 
Tiramisu概要
Tiramisu概要Tiramisu概要
Tiramisu概要
 
Tensor comprehensions
Tensor comprehensionsTensor comprehensions
Tensor comprehensions
 
TensorFlow Lite (r1.5) & Android 8.1 Neural Network API
TensorFlow Lite (r1.5) & Android 8.1 Neural Network APITensorFlow Lite (r1.5) & Android 8.1 Neural Network API
TensorFlow Lite (r1.5) & Android 8.1 Neural Network API
 

VerilatorとSystemC

  • 2. ブログ (2007年~) : Vengineerの戯言
  http://blogs.yahoo.co.jp/verification_engineer
 
 SlideShare : 
  https://www.slideshare.net/ssuser479fa3
 
 
 Twitter (2009年~) :
 @Vengineer
 ソースコード解析職人
  • 3. ● Verilator とは? ● SystemC とは? ● 現在の SystemC は? ● VerilatorでSystemCを使うには? ● 例題での C++ と SystemC の比較 ● ユーザー定義関数 ● final メソッド ● 波形ダンプ ● おわりに 発表内容
  • 4. Verilator とは? (https://github.com/verilator) Welcome to Verilator, the fastest Verilog/SystemVerilog simulator. ● Accepts synthesizable Verilog or SystemVerilog ● Performs lint code-quality checks ● Compiles into multithreaded C++, or SystemC ● Creates XML to front-end your own tools テストベンチ側に、 ● マルチスレッドな C++ ● SystemC が使える
  • 5. Verilatorで「出来ないこと」 @msyksphinz さんのブログ Verilatorの使い方 (1. Verilatorの考え方と基本的なシミュレーション実行方法) ● 全ての遅延記述 (#) は無視される。 ● event系のイベント (waitなど) はサポートされない。 ● Unknownステートはサポートされない つまり、テストベンチ側の Verilog HDL/SystemVerilog コードはダメ!
  • 6. Verilatorで「出来ないこと」 antmicro の Dynamic Scheduler 版 verilator (v4.108ベース) ● 全ての遅延記述 (#) ● event系のイベント (waitなど) ● fork/join 内部表現を変えないと難しいと思います。 ● Unknownステートはサポートされない Dynamic Scheduler版のVerilatorの中を調べる(その1) Dynamic Scheduler版のVerilatorの中を調べる(その2) Dynamic Scheduler版のVerilatorの中を調べる(その3) Dynamic Scheduler版のVerilatorの中を調べる(その4)
  • 7. SystemC とは? 1999年にOpen SystemC(OSCI)が創設され、1999年9月にv0.9が公開 - 米Synopsys, Inc. - 米CoWare, Inc. - ベルギーFrontier Design社 ● 2005.6 v2.1 LRM & TLM 1.0 ● 2005.12 IEEE 1666-2005 (v2.1ベース) ● 2008.6 TLM 2.0 (2008.6) ● 2009.7 TLM 2.0 LRM (2009.7) ● 2010.2 AMS Extensions (2010.2)
  • 8. 現在の SystemC は? accellera で管理 ● 2018.11 SystemC 2.3.3 (Includes TLM) ● 2020.4 SystemC AMS 2.3 IEEE Standards Association (IEEE-SA) ● IEEE Std. 1666-2011 SystemC (SystemC 2.2 + TLM 2.0.1) ● IEEE Std. 1666.1-2016 SystemC AMS (SystemC AMS 2.0) github : https://github.com/accellera-official/systemc ● 2.3.3
  • 9. VerilatorでSystemCを使うには? 先に、SystemC 2.3.3 をどこか (/usr/local/systemc/2.3.3) にインストール 後、SYSTEMC_INCLUDE環境変数に、/usr/local/systemc/2.3.3/include を 設定して、verilator をビルド $ git clone -b v4.202 https://github.com/verilator/verilator.git v4.202 にて、SystemC で FST (Fast Signal Trace) をサポート $ cd verilator $ export SYSTEMC_INCLUDE=/usr/local/systemc/2.3.3/include $ autoconf $ ./configure --prefix=/usr/local/verilator/v4.202 $ make -j $ make install
  • 10. 例題での C++ と SystemC の比較 verilator コマンドのオプションが違う C++ : --cc SystemC : --sc ● examples/make_hello_c ● examples/make_hello_sc ● examples/make_tracing_c ● examples/make_tracing_sc ● examples/cmake_hello_c ● examples/cmake_hello_sc ● examples/cmake_tracing_c ● examples/cmake_tracing_sc
  • 11. examples/make_hello_c module top; initial begin $display("Hello World!"); $finish; end endmodule #include <verilated.h> #include "Vtop.h" int main(int argc, char** argv, char** env) { if (false && argc && argv && env) {} Vtop* top = new Vtop{“top”}; while (!Verilated::gotFinish()) { top->eval(); } top->final(); delete top; return 0; }
  • 12. examples/make_hello_sc module top; initial begin $display("Hello World!"); $finish; end endmodule #include <systemc.h> #include <verilated.h> #include "Vtop.h" int sc_main(int argc, char* argv[]) { if (false && argc && argv) {} Vtop* top = new Vtop{"top"}; sc_start(1, SC_NS); while (!Verilated::gotFinish()) { sc_start(1, SC_NS); } top->final(); delete top; return 0; }
  • 13. C++ と SystemC の比較 #include <systemc.h> #include <verilated.h> #include "Vtop.h" int sc_main(int argc, char* argv[]) { if (false && argc && argv) {} Vtop* top = new Vtop{"top"}; sc_start(1, SC_NS); while (!Verilated::gotFinish()) { sc_start(1, SC_NS); } top->final(); delete top; return 0; } #include <verilated.h> #include "Vtop.h" int main(int argc, char** argv, char** env) { if (false && argc && argv && env) {} Vtop* top = new Vtop{"top"}; while (!Verilated::gotFinish()) { top->eval(); } top->final(); delete top; return 0; }
  • 14. C++ と SystemC の比較 (初期化) #include <systemc.h> SystemCでは、systemc.h ファイルをイン クルードする必要がある int sc_main(int argc, char* argv[]) { main 関数ではなく、sc_main 関数がス タートポイントになる if (false && argc && argv && env) {} Vtop* top = new Vtop{"top"}; int main(int argc, char** argv, char** env) { if (false && argc && argv && env) {} Vtop* top = new Vtop{"top"};
  • 15. C++ と SystemC の比較 (実行) sc_start(1, SC_NS); SystemC では、最初に sc_start 関数を ちょっとだけ実行する必要がある while (!Verilated::gotFinish()) { sc_start(1, SC_NS); } top->eval() ではなく、sc_start 関数を使 う top->final(); while (!Verilated::gotFinish()) { top->eval(); } top->final();
  • 16. Verilated::gotFinish メソッド while (!Verilated::gotFinish()) { sc_start(1, SC_NS); } while (!Verilated::gotFinish()) { top->eval(); } Verilog HDL/SystemVerilog 側で、$stop システムタスク、$finish システ ムタスク、$fatal システムタスクが呼ばれると、Verilated::gotFinish メソッ ドの戻り値が false から true になり、上記の while ループから抜ける while ループでは、シミュレーションの時間を進めるために、 ● C++ : top->eval() ● SystemC : sc_start(1, SC_NS) を実行する
  • 17. examples/make_hello_c module top; initial begin $display("Hello World!"); $finish; end endmodule $ cd examples/make_hello_c $ make …. -- RUN --------------------- obj_dir/Vtop Hello World! - top.v:11: Verilog $finish -- DONE --------------------
  • 18. examples/make_hello_c module top; initial begin $display("Hello World!"); // $finish; end endmodule $ cd examples/make_hello_c $ make …. -- RUN --------------------- obj_dir/Vtop Hello World! 終了しない。。。
  • 19. 生成されたC++コード (obj_dir/Vtop.h) VL_MODULE(Vtop) { public: Vtop__Syms* __VlSymsp; private: VL_UNCOPYABLE(Vtop); public: Vtop(VerilatedContext* contextp, const char* name = "TOP"); Vtop(const char* name = "TOP") : Vtop(nullptr, name) {} ~Vtop(); VerilatedContext* contextp(); void eval() { eval_step(); } void eval_step(); void eval_end_step() {} void final();
  • 20. 生成されたSystemCコード (obj_dir/Vtop.h) SC_MODULE(Vtop) { public: Vtop__Syms* __VlSymsp; private: VL_UNCOPYABLE(Vtop); public: SC_CTOR(Vtop); virtual ~Vtop(); VerilatedContext* contextp(); private: void eval() { eval_step(); } void eval_step(); public: void final();
  • 21. 生成されたコードの比較 (obj_dir/Vtop.h) SC_MODULE(Vtop) { SC_CTOR(Vtop); virtual ~Vtop(); VL_MODULE(Vtop) { Vtop(VerilatedContext* contextp, const char* name = "TOP"); Vtop(const char* name = "TOP") : Vtop(nullptr, name) {} ~Vtop();
  • 22. 生成されたC++コード (obj_dir/Vtop.cpp) Vtop::Vtop(VerilatedContext* _vcontextp__, const char* _vcname__) : VerilatedModule{_vcname__} { Vtop__Syms* __restrict vlSymsp = __VlSymsp = new Vtop__Syms(_vcontextp__, this, name()); Vtop* const __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; // Reset internal values // Reset structure values _ctor_var_reset(); }
  • 23. 生成されたSystemCコード (obj_dir/Vtop.cpp) Vtop::Vtop(sc_module_name) { Vtop__Syms* __restrict vlSymsp = __VlSymsp = new Vtop__Syms(nullptr, this, name()); Vtop* const __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; // Sensitivities on all clocks and combo inputs SC_METHOD(eval); // Reset internal values // Reset structure values _ctor_var_reset(); } SC_METHODマクロを使っているが、 sensitive << がない => 何故なら、top に信号線がないから!
  • 24. examples/make_trace_sc module top( input clk, input fastclk, input reset_l, output wire [1:0] out_small, output wire [39:0] out_quad, output wire [69:0] out_wide, input [1:0] in_small, input [39:0] in_quad, input [69:0] in_wide ); assign out_small = ~reset_l ? '0 : (in_small + 2'b1); assign out_quad = ~reset_l ? '0 : (in_quad + 40'b1); assign out_wide = ~reset_l ? '0 : (in_wide + 70'b1); sub sub ( .clk(clk), .fastclk(fastclk), .reset_l(reset_l) ); endmodule
  • 25. 生成されたSystemCコード (obj_dir/Vtop.h) SC_MODULE(Vtop) { public: // PORTS // The application code writes and reads these signals to // propagate new values into/out from the Verilated model. sc_in<bool> clk; sc_in<bool> fastclk; sc_in<bool> reset_l; sc_out<uint32_t> out_small; sc_in<uint32_t> in_small; sc_out<vluint64_t> out_quad; sc_in<vluint64_t> in_quad; sc_out<sc_bv<70> > out_wide; sc_in<sc_bv<70> > in_wide; input clk, input fastclk, input reset_l, output wire [1:0] out_small, output wire [39:0] out_quad, output wire [69:0] out_wide, input [1:0] in_small, input [39:0] in_quad, input [69:0] in_wide
  • 26. 生成されたSystemCコード (obj_dir/Vtop.cpp) Vtop::Vtop(sc_module_name) : clk("clk"), fastclk("fastclk"), reset_l("reset_l"), out_small("out_small"), in_small("in_small"), out_quad("out_quad"), in_quad("in_quad"), out_wide("out_wide"), in_wide("in_wide"){ SC_METHOD(eval); sensitive << clk; sensitive << fastclk; sensitive << reset_l; sensitive << in_small; sensitive << in_quad; sensitive << in_wide; _ctor_var_reset(); } sensitive << で登録した信号が変化したら、 eval メソッドが呼ばれる
  • 27. Verilated::gotFinish メソッド while (!Verilated::gotFinish()) { sc_start(1, SC_NS); } while (!Verilated::gotFinish()) { top->eval(); } Verilog HDL/SystemVerilog 側で、$stop システムタスク、$finish システムタ スク、$fatal システムタスクが呼ばれると、Verilated::gotFinish メソッドの戻り 値が false から true になり、上記の while ループから抜ける while ループでは、シミュレーションの時間を進めるために、 ● C++ : top->eval() ● SystemC : sc_start(1, SC_NS) => top->eval() が呼ばれている を実行する
  • 28. ユーザー定義関数 Verilator では、$finishシステムタスク、$stopシステムタスク、$fatalシステムタスクを呼ぶと、 vl_finish 関数、vl_stop 関数、vl_fatal 関数が呼ばれる これらの関数は、ユーザー定義関数にできる - $finish システムタスク => vl_finish - $stop システムタスク=> vl_stop - $fatal システムタスク=> vl_fatal
  • 29. vl_finishの再定義 #ifdef VL_USER_STOP void vl_finish(const char *filename, int linenum, const char *hier) VL_MT_UNSAFE { sc_stop(); cout << "call vl_finish" << endl; } #endif Makefile の verilator コマンド に -CFLAGS -DVL_USER_STOP を追加する  $(VERILATOR) -sc --exe --build -j top.v sc_main.cpp -CFLAGS -DVL_USER_STOP を追加する
  • 30. examples/make_hello_sc module top; initial begin $display("Hello World!"); $finish; end endmodule $ cd examples/make_hello_c $ make …. -- RUN --------------------- obj_dir/Vtop Hello World! - top.v:11: Verilog $finish call vl_finish -- DONE --------------------
  • 31. vl_finishを再定義した結果 #include <systemc.h> #include <verilated.h> #include "Vtop.h" int sc_main(int argc, char* argv[]) { if (false && argc && argv) {} Vtop* top = new Vtop{"top"}; // sc_start 実行中に、 // sc_stopが呼ばれると、 // sc_start から抜ける sc_start(); top->final(); delete top; return 0; } #include <systemc.h> #include <verilated.h> #include "Vtop.h" int sc_main(int argc, char* argv[]) { if (false && argc && argv) {} Vtop* top = new Vtop{"top"}; sc_start(1, SC_NS); while (!Verilated::gotFinish()) { sc_start(1, SC_NS); } top->final(); delete top; return 0; }
  • 32. final メソッド (obj_dir/Vtop__Slow.cpp) 生成されたコードでは、final メソッドは、C++/SystemC で同じ この例題では、特に何もしていない? void Vtop::final() { VL_DEBUG_IF(VL_DBG_MSGF("+ Vtop::finaln"); ); // Variables Vtop__Syms* __restrict vlSymsp = this->__VlSymsp; Vtop* const __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; } では?、final メソッドは、何に使われるのか?
  • 33. SystemVerilog の final module top; initial begin $display("Hello World!"); $finish; end final begin $display("top : final"); end endmodule -- RUN --------------------- obj_dir/Vtop Hello World! - top.v:11: Verilog $finish call vl_finish top : final -- DONE --------------------
  • 34. final メソッド (obj_dir/Vtop__Slow.cpp) 生成されたコードでは、final メソッドは、C++/SystemC で同じ vlTOPp->_final_TOP(vlSymsp) の中で、VL_WRITEF(“top : finaln”) で呼んでいる void Vtop::final() { VL_DEBUG_IF(VL_DBG_MSGF("+ Vtop::finaln"); ); // Variables Vtop__Syms* __restrict vlSymsp = this->__VlSymsp; Vtop* const __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; vlTOPp->_final_TOP(vlSymsp); } void Vtop::_final_TOP(Vtop__Syms* __restrict vlSymsp) { VL_DEBUG_IF(VL_DBG_MSGF("+ Vtop::_final_TOPn"); ); // Variables Vtop* const __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; // Body VL_WRITEF("top : finaln"); }
  • 35. 波形ダンプのフォーマットとして、 ● VCD (Value Change Dump) ○ verilated_vcd_sc.h を include する ● FST (Fast Signal Trace) ○ verilated_fst_sc.h を include する が使える 波形表示は、gtkwave できる 波形ダンプ
  • 36. 波形ダンプ : VCD Verilated::traceEverOn(true); VerilatedVcdSc* tfp = NULL; const char* flag = Verilated::commandArgsPlusMatch("trace"); if (flag && 0 == strcmp(flag, "+trace")) { tfp = new VerilatedVcdSc; top->trace(tfp,99); tfp->open("vlt_dump.vcd"); } sc_start(); top->final(); if(tfp) { tfp->flush(); tfp->close(); tfp = NULL; }
  • 37. 波形ダンプ : FST Verilated::traceEverOn(true); VerilatedFstSc* tfp = NULL; const char* flag = Verilated::commandArgsPlusMatch("trace"); if (flag && 0 == strcmp(flag, "+trace")) { tfp = new VerilatedFstSc; top->trace(tfp,99); tfp->open("vlt_dump.fst"); } sc_start(); top->final(); if(tfp) { tfp->flush(); tfp->close(); tfp = NULL; }
  • 38. ● Verilator とは? ● SystemC とは? ● 現在の SystemC は? ● VerilatorでSystemCを使うには? ● 例題での C++ と SystemC の比較 ● ユーザー定義関数 ● final メソッド ● 波形ダンプ ● おわりに まとめ
  • 39. Verilatorの薄い本 BOOTH : https://vengineer.booth.pm/ にて、 ソースコード解析職人の薄い本として、 ● Verilatorの中を調べる、No.1 : 例題解析編 ● Verilatorの中を調べる、No.2 : テストデータ解析編 ● Verilatorの中を調べる、No.3 : SystemC編 をダウンロード販売しています。