Movatterモバイル変換


[0]ホーム

URL:


Uploaded bykocha2012
PDF, PPTX9,453 views

SystemC Tutorial

Embed presentation

Download as PDF, PPTX
オレオレSystemC入門@LSI設計雑記帳
※注意事項※本資料は筆者が所属している団体や組織に関係あるものではありません。本資料内のソースコードを使って問題が起きても筆者は責任取りません。楽しく見ていただければ幸いです。
自己紹介Blog:LSI設計雑記帳
http://lsifrontend.blog100.fc2.com/Twitter:@kocha2012
https://twitter.com/kocha2012GitHub:Kocha
https://github.com/Kocha
SystemC is 何
C++のクラスライブラリで
HLSの入力言語だったり、仮想環境モデリング言語だったりするのです!※HLS(High Level Synthsis)
ようこそ!SystemCの世界へ
Hello World#include <systemc.h>!int sc_main(int argc, char *argv[]) {!printf("Hello World!!!n");!return 0;}
Hello WorldSystemCのヘッダーをinclude#include <systemc.h>!int sc_main(int argc, char *argv[]) {!main関数は「sc_main」printf("Hello World!!!n");!return 0;}
Hello World$> ./main !SystemC 2.3.0-ASI --- Jul 13 2012 06:33:43Copyright (c) 1996-2012 by all Contributors,ALL RIGHTS RESERVED!Hello World!!!\(^o^)/できた∼
おわり
ってことはなく、まだまだ続きます!
目次理解する設計する検証する次回予告
理解する
SystemCとはSystemCは、プログラム言語であるC++のクラスライブラリとして提供されており、それ自体言語として独立した文法を持つものではない。ライブラリにはハードウェア記述の為の機能、すなわち並列実行の概念やデータ型、それを扱う各種関数が定義されている。それを使って書かれたプログラムは通常のC++コンパイラでコンパイルすることができ、結果生成されたオブジェクトはハードウェアのシミュレータとして動作する。※Wikipedia(http://ja.wikipedia.org/wiki/SystemC)より
SystemCの適用場面仮想環境:Virtual Platformソフトウェア開発環境トランザクションベース(TLM2.0)高位合成:High Level SynthsisSystemC→Verilog HDL/VHDLサイクルベース
知っておきたいC++基礎※ポインタ:C言語クラスとメンバオーバーロードオブジェクトオーバーライドコンストラクタ多態性       継承
(インヘリタンス)(ポリモフィズム)テンプレート※他にもありますが、入門編なので省略
SystemCのシステム構成「モジュール」と呼ばれるデザイン内に「プロセス」により関数内で機能を記述し「チャネル」でモジュール間を接続する。!各プロセスは同時並列に実行プロセス内は逐次実行
sc_mainsc_main()
モジュール(SC_MODULE)sc_main()モジュールモジュールモジュール
プロセス(SC_THREAD/SC_METHOD/SC_CTHREAD)sc_main()モジュールプロセスモジュールプロセスモジュールプロセスプロセス
チャネル(sc_prim_channel)sc_main()モジュールプロセスモジュールチャネルチャネルプロセスプロセスモジュールプロセスプロセスポート/インターフェース
設計する
モジュールを作るプロセスを定義する機能(処理)を記述する
SC_MODULE( hoge ) {!sc_in<int> in;sc_out<int> out;!int x;!void process();!};SC_CTOR( hoge ){SC_THREAD( process );sensitive << in ;x = 10;}void hoge::process() {out = 0;while(1) {wait();out = in * x;}};
SC_MODULE( hoge ) {モジュール宣言!sc_in<int> in;sc_out<int> out;int x;!void process();};#define SC_MODULE(name) struct name : sc_module※classで書く場合(sc_moduleを継承する)!!※実装はマクロ(struct)class hoge : public sc_module {...};※Verilog HDL/SystemVerilogでの意味module hoge(...);:endmoduleSC_CTOR( hoge ){SC_THREAD( process );sensitive << in ;x = 10;}
SC_MODULE( hoge ) {モジュール宣言!sc_in<int> in;sc_out<int> out;!int x;初期化処理を記述する部分!void process();!};SC_CTOR( hoge ) コンストラクタ宣言{SC_THREAD( process );sensitive << in ;x = 10;}
SC_MODULE( hoge ) {※実装はマクロ!sc_in<int> in;sc_out<int> out;!int x;!void process();!};#define SC_CTOR(name) implementation-defined;name(sc_module_name)※マクロを使わずで書く場合SC_MODULE( hoge ) {必ず必要...SC_HAS_PROCESS(hoge);hoge( sc_module_name n) : sc_module_name(n) {SC_THREAD( processs );...SC_CTOR( hoge ) コンストラクタ宣言{SC_THREAD( process );sensitive << in ;※SystemVerilogだと new関数class hoge;x = 10;function new();}:endfunction
豆知識:初期化リスト※サブモジュールのインスタンス時などSC_MODULE( hoge ) {!sc_in<int> in;sc_out<int> out;!int x;!void process();!SC_CTOR( hoge ){SC_THREAD( process );sensitive << in ;x = 10;}}; 書かないといけない場合もあります書いておくと良いことあるかも!SC_CTOR( hoge ):in(“in”), out(“out”) {http://lsifrontend.blog100.fc2.com/blog-entry-432.html
SC_MODULE( hoge ) {!sc_in<int> in;sc_out<int> out;!int x;!void process();!};SC_CTOR( hoge ){SC_THREAD( process );プロセスを定義sensitive << in ;x = 10;}
SC_MODULE( hoge ) {!sc_in<int> in;sc_out<int> out;!int x;!void process();!};実際の機能(処理)void hoge::process() {out = 0;while(1) {wait();out = in * x;}};SC_CTOR( hoge )機能(処理)が記述されている関数{SC_THREAD( process );プロセスを定義sensitive << in ;x = 10;}
SC_MODULE( hoge ) {!sc_in<int> in;sc_out<int> out;!int x;!引数無しの関数void process();!};void hoge::process() {out = 0;while(1) {wait(); sensitiveに登録されている動作待ちout = in * x;}};SC_CTOR( hoge ){SC_THREAD( process );プロセスを定義sensitive << in ;x = 10; 機能(処理)が動くきっかけを指定}(この例だと in の値が変化したら)
プロセス定義は3種類SC_THREADSC_THREAD( process );sensitive << in ;void hoge::process() {...初期動作...wait(); / wait - in(value)/...Simulation...wait(); / wait - in(value)/...wait(); / wait - in(value)/...}再度呼び出しなし・関数から抜けると再度呼び出されないため
while文や for文で無限ループを作る
プロセス定義は3種類SC_METHODSC_METHOD( process );sensitive << a << b ;void hoge::process() {wait - a,b(value)...............}!!!初期動作 Simulation終了まで繰り返す・繰り返し実行されるプロセス・waitは記述出来ない
プロセス定義は3種類SC_CTHREADSC_CTHREAD( process, clock.pos() );reset_signal_is(reset, true);void hoge::process() {...初期動作......while(1) {wait(); / wait - prosedge clock/...wait(); / wait - posedge clock/...}reset_signal_isで設定されていれば強制的に}・SC_THREADをクロックイベント用にしたもの・関数から抜けると再度呼び出されないため
while文や for文で無限ループを作る
プロセス定義は3種類SC_THREADSC_METHODSC_THREAD( process );sensitive << in ;SC_METHOD( process );sensitive << a << b ;void hoge::process() {...初期動作...wait(); / wait - in(value)/...Simulation...wait(); / wait - in(value)/...wait(); / wait - in(value)/...}再度呼び出しなしvoid hoge::process() {wait - a,b(value)...............}!!!初期動作 Simulation終了まで繰り返すSC_CTHREADSC_CTHREAD( process, clock.pos() );reset_signal_is(reset, true);void hoge::process() {...初期動作......while(1) {wait(); / wait - prosedge clock/...wait(); / wait - posedge clock/...}reset_signal_isで設定されていれば強制的に}初期動作は dont_initialize();で抑制可能例)SC_THREAD( process );sensitive << in ;dont_initialize();
sensitive記述は様々※for文で記述することも出来ます。SC_THREAD( process );sensitive << in ;SC_THREAD( process );sensitive << in1 << in2 ;SC_THREAD( process );sensitive << in1.pos() ;sensitive << in2.neg() ;SC_THREAD( process );sensitive << in1.posedge() ;sensitive << in2.negeage() ;
(async_)reset_signal_isSystemC-2.3から追加reset_signal_isasync_reset_signal_isSC_THREAD( process );reset_signal_is( reset, true);SC_THREAD( process ); 信号名 極性async_reset_signal_is( reset_n, false);※clock立ち上がりエッジ(posedge)の場合clockresetリセット期間reset_nリセット期間
SC_MODULE( hoge ) {!sc_in<int> in;入出力ポート(Interface)宣言sc_out<int> out;※SystemVerilogでの意味!int x;!void process();!};module hoge(input bit[31:0] in,output bit[31:0] out);:endmoduleSC_CTOR( hoge ){SC_THREAD( process );sensitive << in ;x = 10;}
SC_MODULE( hoge ) {!sc_in<int> in;sc_out<int> out;!int x;!void process();!};SC_CTOR( hoge ){SC_THREAD( process );sensitive << in ;out.initialize(0);っと書くことも可能}void hoge::process() {out = 0;while(1) {wait();out = in * x;}};このように動いてます。out.write(0);while(1) {wait();out.write( in.read() * x);}
ポートとチャネルport/interface接続するchannelsc_signalsc_in/out/inoutsc_buffersc_clocksc_fifo_in/outsc_fifosc_mutex_ifsc_mutexsc_semaphrore_ifsc_semaphore
チャネルはレジスタ(FF)#include <systemc.h>!int sc_main(int argc, char *argv[]) {int a;sc_signal<int> b;!a = 10; b = 10;std::cout << "a = " << a << ", b = " << b << std::endl;!sc_start(1, sc_core::SC_NS);std::cout << "a = " << a << ", b = " << b << std::endl;!return 0;}実行結果a = 10, b = 0a = 10, b = 10シミュレーション時刻の経過により値が更新される。
(代入はノンブロッキング代入)
チャネルはWiresc_signal<int> x0y0;!laplacian_filter dut("dut");testbench tb("tb");!dut.clk(clk);dut.x0y0(x0y0); / input/:dut.out(y);接続(wire)tb.clk(clk);tb.x0y0(x0y0); / output/:チャネルは用途において、regもしくはwireとなる。
SC_MODULE( hoge ) {!sc_in<int> in;sc_out<int> out;!データ型int x;!void process();!};SC_CTOR( hoge ){SC_THREAD( process );sensitive << in ;x = 10;}
SC_MODULE( hoge ) {!sc_in<int> in;sc_out<int> out;!データ型int x;SystemCはC++なので、!void process();C++のデータ型は全て使えます。SC_CTOR( hoge )!{};}SC_THREAD( process );sensitive << in ;x = 10;
SystemCで追加された型データ型sc_int<N>sc_uint<N>sc_bigint<N>sc_biguint<N>sc_bitsc_logicsc_bv<N>sc_lv<N>sc_fixed<NW, NI>sc_ufixed<NW, NI>説明記述例Nビット整数sc_int<8> a = -123;Nビット符号なし整数sc_uint<8> a = 0xab;64ビット以上のsc_intsc_bigint<128> = “0xaaa...”;64ビット以上のsc_uintsc_biguint<128> = “0xaaa...”;’0’, ’1’ の2値 (使用は非推奨) sc_bit a = ‘1’;’0’, ’1’, ’x’, ’z’の4値sc_logic a = ‘z’;Nビットの sc_bitsc_bv<8> a = “10101010”;Nビットの sc_logicsc_lv<8> a = “1x101z10”;固定小数点sc_fixed<8,4> a = -0.25;符号なし固定小数点sc_uifixed<8,4> a = -1.75;
独自のデータ型(MyType)class/structに必ず実装するメンバ関数比較演算子
bool operator == (const MyType & rhs) const {代入演算子
MyType& operator = (const MyType& rhs) {トレース関数
void sc_trace(sc_trace_file *tf, const MyType & v,
const std::string & NAME ) {出力演算子
ostream& operator << ( ostream& os, MyType const & v ) {
検証する
sc_mainモジュールをインスタンスする信号を生成する変数の値を表示するタイミング波形を取得する
sc_mainは必須#include <systemc.h>s_in = 0;sc_start(10, SC_NS);int sc_main(int argc, char *argv[]) { cout << "in = " << s_in<< ", out = " << s_out << endl;sc_signal<int> s_in, s_out;hoge m_hoge(“m_hoge”);s_in = 10;m_hoge.in(s_in);sc_start(10, SC_NS);m_hoge.out(s_out);cout << "in = " << s_in<< ", out = " << s_out << endl;return 0;}
モジュールをインスタンス#include <systemc.h>s_in = 0;sc_start(10, SC_NS);cout << "in = " << s_in<< ", out = " << s_out << endl;int sc_main(int argc, char *argv[]) {sc_signal<int> s_in, s_out;hoge m_hoge(“m_hoge”);m_hoge.in(s_in);m_hoge.out(s_out);※別の書き方hoge *m_hoge;m_hoge = new hoge(“m_hoge”);m_hoge->in(s_in);m_hoge->out(s_out);}s_in = 10;sc_start(10, SC_NS);cout << "in = " << s_in<< ", out = " << s_out << endl;return 0;
信号を生成#include <systemc.h>s_in = 0;sc_start(10, SC_NS);cout << "in = " << s_in<< ", out = " << s_out << endl;int sc_main(int argc, char *argv[]) {※sc_in/outの接続は sc_signalsc_signal<int> s_in, s_out;※sc_startでシミュレーション開始hoge m_hoge(“m_hoge”);m_hoge.in(s_in);m_hoge.out(s_out);}s_in = 10;sc_start(10, SC_NS);cout << "in = " << s_in<< ", out = " << s_out << endl;return 0;
変数の値を表示する■coutsc_signal - << operatorsc_intなど- a.to_string()関数が存在s_in = 0;■printfsc_start(10, SC_NS);sc_intなど- a.to_int()関数が存在 cout << "in = " << s_in<< ", out = " << s_out << endl;■sc_reportSystemC定義の表示形式関数s_in = 10;sc_start(10, SC_NS);!cout << "in = " << s_in★ sc_time_stamp() で
<< ", out = " << s_out << endl;時刻も表示!return 0;}
タイミング波形を取得#include <systemc.h>s_in = 0;sc_start(10, SC_NS);cout << "in = " << s_in<< ", out = " << s_out << endl;int sc_main(int argc, char *argv[]) {sc_signal<int> s_in, s_out;sc_trace_file *tf;s_in = 10;tf = sc_create_vcd_trace_file("waves"); sc_start(10, SC_NS);sc_trace(tf, s_in, "in");sc_trace(tf, s_out, "out");hoge m_hoge(“m_hoge”);m_hoge.in(s_in);m_hoge.out(s_out);cout << "in = " << s_in<< ", out = " << s_out << endl; sc_close_vcd_trace_file(tf);return 0;※閉じることを忘れずに}
余談SystemCのシミュレータは無償なので、
いつでもシミュレーションできます。
Webでも → http://www.edaplayground.com仮想環境(Virtual Platform/TLM2.0)については別スライドを作成する予定です。最近、SystemC流行ってます!(ステマ)
この機会に是⾮非トライしてみてください!
おわり

Recommended

PDF
Intro to SVE 富岳のA64FXを触ってみた
PDF
Vivado hls勉強会1(基礎編)
PDF
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
PDF
ACRiウェビナー:小野様ご講演資料
PPTX
研究者のための Python による FPGA 入門
 
PPTX
ゼロから始める自作 CPU 入門
PDF
ELFの動的リンク
 
PDF
仮想化環境におけるパケットフォワーディング
PDF
VerilatorとSystemC
PDF
C++ マルチスレッド 入門
PDF
20分くらいでわかった気分になれるC++20コルーチン
 
PDF
中3女子でもわかる constexpr
PDF
雑なMySQLパフォーマンスチューニング
PPTX
イベント駆動プログラミングとI/O多重化
PDF
ソフトウェア技術者から見たFPGAの魅力と可能性
PDF
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
PDF
ネットワーク ゲームにおけるTCPとUDPの使い分け
PDF
エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)
PDF
基礎から学ぶ組み込みAndroid
PDF
C++でできる!OS自作入門
PPTX
OSを手作りするという趣味と仕事
PDF
Oss貢献超入門
PDF
レシピの作り方入門
PPTX
ARM LinuxのMMUはわかりにくい
PDF
DockerとPodmanの比較
PPTX
Zynq + Vivado HLS入門
PDF
ARM Trusted FirmwareのBL31を単体で使う!
PDF
XPDDS19 Keynote: Xen Dom0-less - Stefano Stabellini, Principal Engineer, Xilinx
PDF
TDD のこころ @ OSH2014
PDF
並列データベースシステムの概念と原理

More Related Content

PDF
Intro to SVE 富岳のA64FXを触ってみた
PDF
Vivado hls勉強会1(基礎編)
PDF
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
PDF
ACRiウェビナー:小野様ご講演資料
PPTX
研究者のための Python による FPGA 入門
 
PPTX
ゼロから始める自作 CPU 入門
PDF
ELFの動的リンク
 
PDF
仮想化環境におけるパケットフォワーディング
Intro to SVE 富岳のA64FXを触ってみた
Vivado hls勉強会1(基礎編)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ACRiウェビナー:小野様ご講演資料
研究者のための Python による FPGA 入門
 
ゼロから始める自作 CPU 入門
ELFの動的リンク
 
仮想化環境におけるパケットフォワーディング

What's hot

PDF
VerilatorとSystemC
PDF
C++ マルチスレッド 入門
PDF
20分くらいでわかった気分になれるC++20コルーチン
 
PDF
中3女子でもわかる constexpr
PDF
雑なMySQLパフォーマンスチューニング
PPTX
イベント駆動プログラミングとI/O多重化
PDF
ソフトウェア技術者から見たFPGAの魅力と可能性
PDF
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
PDF
ネットワーク ゲームにおけるTCPとUDPの使い分け
PDF
エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)
PDF
基礎から学ぶ組み込みAndroid
PDF
C++でできる!OS自作入門
PPTX
OSを手作りするという趣味と仕事
PDF
Oss貢献超入門
PDF
レシピの作り方入門
PPTX
ARM LinuxのMMUはわかりにくい
PDF
DockerとPodmanの比較
PPTX
Zynq + Vivado HLS入門
PDF
ARM Trusted FirmwareのBL31を単体で使う!
PDF
XPDDS19 Keynote: Xen Dom0-less - Stefano Stabellini, Principal Engineer, Xilinx
VerilatorとSystemC
C++ マルチスレッド 入門
20分くらいでわかった気分になれるC++20コルーチン
 
中3女子でもわかる constexpr
雑なMySQLパフォーマンスチューニング
イベント駆動プログラミングとI/O多重化
ソフトウェア技術者から見たFPGAの魅力と可能性
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
ネットワーク ゲームにおけるTCPとUDPの使い分け
エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)
基礎から学ぶ組み込みAndroid
C++でできる!OS自作入門
OSを手作りするという趣味と仕事
Oss貢献超入門
レシピの作り方入門
ARM LinuxのMMUはわかりにくい
DockerとPodmanの比較
Zynq + Vivado HLS入門
ARM Trusted FirmwareのBL31を単体で使う!
XPDDS19 Keynote: Xen Dom0-less - Stefano Stabellini, Principal Engineer, Xilinx

Viewers also liked

PDF
TDD のこころ @ OSH2014
PDF
並列データベースシステムの概念と原理
PPTX
System on Chip (SoC)
PDF
System On Chip
PDF
Design Verification Using SystemC
 
PPTX
Hardware Software Codesign
PPT
Design of embedded systems
PDF
SystemC Verification Methodology
PDF
SystemC
PDF
A practical introduction to hardware software codesign 2e
PDF
高速で無駄のない開発をするチームのための"7つ道具"(2014/03/08 - Websig)
TDD のこころ @ OSH2014
並列データベースシステムの概念と原理
System on Chip (SoC)
System On Chip
Design Verification Using SystemC
 
Hardware Software Codesign
Design of embedded systems
SystemC Verification Methodology
SystemC
A practical introduction to hardware software codesign 2e
高速で無駄のない開発をするチームのための"7つ道具"(2014/03/08 - Websig)

Similar to SystemC Tutorial

PDF
Vivado hlsのシミュレーションとhlsストリーム
PDF
プロセスとコンテキストスイッチ
PPT
Uart受信設計2013
PDF
RISC-V User level ISA
PDF
【学習メモ#11th】12ステップで作る組込みOS自作入門
 
PDF
【学習メモ#8th】12ステップで作る組込みOS自作入門
 
PDF
PEZY-SC programming overview
PDF
Unixカーネルの設計 7 プロセスの制御
PDF
2011.09.18 v7から始めるunix まとめ
PDF
SystemV IPC
PDF
2011.06.11 v7から始めるunix まとめ
PDF
Dive into RTS - another side
ODP
みんな大好き! Hello, World
PDF
C base design methodology with s dx and xilinx ml
PDF
StackExchangeで見たシステムプログラミング案件
PDF
Synthesijer and Synthesijer.Scala in HLS-friends 201512
PDF
生物データベース論(並列分散計算フレームワーク)
PDF
kagamicomput201701
PDF
kagami_comput2015_1
PDF
小二病でもGCやりたい
 
Vivado hlsのシミュレーションとhlsストリーム
プロセスとコンテキストスイッチ
Uart受信設計2013
RISC-V User level ISA
【学習メモ#11th】12ステップで作る組込みOS自作入門
 
【学習メモ#8th】12ステップで作る組込みOS自作入門
 
PEZY-SC programming overview
Unixカーネルの設計 7 プロセスの制御
2011.09.18 v7から始めるunix まとめ
SystemV IPC
2011.06.11 v7から始めるunix まとめ
Dive into RTS - another side
みんな大好き! Hello, World
C base design methodology with s dx and xilinx ml
StackExchangeで見たシステムプログラミング案件
Synthesijer and Synthesijer.Scala in HLS-friends 201512
生物データベース論(並列分散計算フレームワーク)
kagamicomput201701
kagami_comput2015_1
小二病でもGCやりたい
 

SystemC Tutorial


[8]ページ先頭

©2009-2025 Movatter.jp