はじめに
SystemCでは3つのタイプのスレッドを持ちます。それぞれの違いについて説明します。
sc_method
SC_METHODマクロを使用して定義します。通常のC関数と同じ動作をします。
SC_METHOD(<method>)の後にsensitive << clk.pos();のように記述することで、clkの立ち上がりで<method>が実行されます。
下記のサンプルでは、clkで実行されるmethod1とaの変化で実行されるmethod2を定義しています。
sc_method.cpp
#include <systemc.h>
SC_MODULE(DFF) {
sc_in<bool> SC_NAMED(clk);
sc_signal<bool> a;
SC_CTOR(DFF) {
a = true;
SC_METHOD(method1);
sensitive << clk.pos();
SC_METHOD(method2);
sensitive << a;
}
void method1() {
printf("method1\n");
a = !a;
}
void method2() {
printf("method2\n");
}
};
int sc_main(int argc, char* argv[]) {
sc_clock clk("clk", 10, SC_NS);
DFF dff("dff");
dff.clk(clk);
sc_start(20, SC_NS);
return 0;
}
sc_thread
SC_THREADマクロを使用して定義します。マルチスレッドを定義することができます。
スレッドはwhileによる無限ループとwait文を使って記述します。
sc_thread.cpp
#include <systemc.h>
SC_MODULE(DFF) {
sc_in<bool> SC_NAMED(clk);
SC_CTOR(DFF) {
SC_THREAD(thread1);
SC_THREAD(thread2);
}
void thread1() {
while(true) {
wait(5, SC_NS);
printf("thread1\n");
}
}
void thread2() {
while(true) {
wait(10, SC_NS);
printf("thread2\n");
}
}
};
int sc_main(int argc, char* argv[]) {
sc_clock clk("clk", 10, SC_NS);
DFF dff("dff");
dff.clk(clk);
sc_start(20, SC_NS);
return 0;
}
sc_cthread
SC_CTHREADマクロを使用して定義します。同期スレッドを定義することができます。
スレッドはwhileによる無限ループとwait文を使って記述します。
sc_threadはwaitで与えた値の間隔ごとに実行されますが、sc_cthreadはwaitを空白で与えることができ、SC_CTHREADの第2引数のセンシティブにより実行されます。
sc_cthread.cpp
#include <systemc.h>
SC_MODULE(DFF) {
sc_in<bool> SC_NAMED(clk);
SC_CTOR(DFF) {
SC_CTHREAD(cthread, clk.pos());
}
void cthread() {
while(true) {
wait();
printf("cthread\n");
}
}
};
int sc_main(int argc, char* argv[]) {
sc_clock clk("clk", 10, SC_NS);
DFF dff("dff");
dff.clk(clk);
sc_start(20, SC_NS);
return 0;
}
まとめ
SystemCのsc_method, sc_thread, sc_cthreadについてまとめました。
コメント