SlideShare ist ein Scribd-Unternehmen logo
1 von 40
Downloaden Sie, um offline zu lesen
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
久々に、
ソースコード解析職人
でした

Weitere ähnliche Inhalte

Was ist angesagt?

ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)Mr. Vengineer
 
シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門icchy
 
Zynq mp勉強会資料
Zynq mp勉強会資料Zynq mp勉強会資料
Zynq mp勉強会資料一路 川染
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチMasami Ichikawa
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐりKazuyuki TAKASE
 
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenIntel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenMITSUNARI Shigeo
 
TCAMのしくみ
TCAMのしくみTCAMのしくみ
TCAMのしくみogatay
 
自作LSIコミュニティの可能性
自作LSIコミュニティの可能性自作LSIコミュニティの可能性
自作LSIコミュニティの可能性Junichi Akita
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とdo_aki
 
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解MITSUNARI Shigeo
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールMITSUNARI Shigeo
 
Ansibleの最近の動向を追ってみた
Ansibleの最近の動向を追ってみたAnsibleの最近の動向を追ってみた
Ansibleの最近の動向を追ってみたKeijiUehata1
 
技術紹介: S2E: Selective Symbolic Execution Engine
技術紹介: S2E: Selective Symbolic Execution Engine技術紹介: S2E: Selective Symbolic Execution Engine
技術紹介: S2E: Selective Symbolic Execution EngineAsuka Nakajima
 
WebAssembly向け多倍長演算の実装
WebAssembly向け多倍長演算の実装WebAssembly向け多倍長演算の実装
WebAssembly向け多倍長演算の実装MITSUNARI Shigeo
 
ACRiウェビナー:小野様ご講演資料
ACRiウェビナー:小野様ご講演資料ACRiウェビナー:小野様ご講演資料
ACRiウェビナー:小野様ご講演資料直久 住川
 
iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方歩 柴田
 
WebSocketでカメラの映像を共有してみた
WebSocketでカメラの映像を共有してみたWebSocketでカメラの映像を共有してみた
WebSocketでカメラの映像を共有してみたonozaty
 
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 

Was ist angesagt? (20)

ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
 
シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門
 
Zynq mp勉強会資料
Zynq mp勉強会資料Zynq mp勉強会資料
Zynq mp勉強会資料
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
 
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenIntel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
 
TCAMのしくみ
TCAMのしくみTCAMのしくみ
TCAMのしくみ
 
自作LSIコミュニティの可能性
自作LSIコミュニティの可能性自作LSIコミュニティの可能性
自作LSIコミュニティの可能性
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
 
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
 
Ansibleの最近の動向を追ってみた
Ansibleの最近の動向を追ってみたAnsibleの最近の動向を追ってみた
Ansibleの最近の動向を追ってみた
 
技術紹介: S2E: Selective Symbolic Execution Engine
技術紹介: S2E: Selective Symbolic Execution Engine技術紹介: S2E: Selective Symbolic Execution Engine
技術紹介: S2E: Selective Symbolic Execution Engine
 
WebAssembly向け多倍長演算の実装
WebAssembly向け多倍長演算の実装WebAssembly向け多倍長演算の実装
WebAssembly向け多倍長演算の実装
 
レシピの作り方入門
レシピの作り方入門レシピの作り方入門
レシピの作り方入門
 
ACRiウェビナー:小野様ご講演資料
ACRiウェビナー:小野様ご講演資料ACRiウェビナー:小野様ご講演資料
ACRiウェビナー:小野様ご講演資料
 
iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方
 
WebSocketでカメラの映像を共有してみた
WebSocketでカメラの映像を共有してみたWebSocketでカメラの映像を共有してみた
WebSocketでカメラの映像を共有してみた
 
PostgreSQL Query Cache - "pqc"
PostgreSQL Query Cache - "pqc"PostgreSQL Query Cache - "pqc"
PostgreSQL Query Cache - "pqc"
 
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)
 

Ähnlich wie 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
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回Tomoya Kawanishi
 
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
 

Ähnlich wie 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
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
 
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(基礎編)
 

Mehr von 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
 

Mehr von 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編 をダウンロード販売しています。