SC_METHOD、SC_THREAD、SC_CTHREAD SystemC

はじめに

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についてまとめました。

コメント

タイトルとURLをコピーしました