SystemC基本構文③
シミュレーション構文
4bitカウンタを作成した際に見てきた内容が多いが改めて。
時間単位の設定
- sc_set_default_time_unit(値)でシミュレーションの時間単位を指定する
- sc_set_default_time_unit(1, SC_PS); で1ps単位になる
- デフォルトは1ns
- sc_get_default_time_unit()で設定されている時間単位がわかる
- sc_set_time_resolution(値)でシミュレーションの時間分解能を指定する
- デフォルトは1ps
タイムスタンプ
- sc_simulation_time()で設定されたシミュレーション時間単位に基づいた、現在のシミュレーション時刻がわかる
- sc_time_stamp()は時間単位とともにシミュレーション時刻がわかる
- sc_simulation_time()を用いてレイテンシ情報を把握することができる
sc_clock
sc_clock CLK("CLK", 10, SC_NS, 0.5, 1, SC_NS, true)で指定した場合、
属性 | 値 | 省略可否 |
---|---|---|
周期 | 10 | × |
単位 | ns | × |
デューティ比 | 50% | 50% |
最初のエッジ発生時刻 | 1 | 0 |
極性 | true(立ち上がり) | true |
sc_time
時間変数を表す。sc_clockやsc_startで使用する。
sc_time cycle_time(10, SC_NS); sc_clock clock("clock", cycle_time);
sc_start/sc_stop
- sc_start()でシミュレーションを開始
- sc_start()に時間を指定すると指定時刻までsim実行して終了
- sc_start(-1)でイベントがなくなるまでsim実行
- イベントがなくなるとは?SC_CTHREADとかがあったら使用不可?
- sc_start()で何も指定しない場合、sc_stop()で停止させる
sc_time finish_time(100, SC_NS); sc_start(1, SC_US); // 1usまでシミュレーションして終了 sc_start(finish_time); // finish_time=100nsまでシミュレーションして終了 sc_start(-1); // イベントがなくなるまで実行
階層構造
すでにmain.cppにdutとtbをインスタンスしてシミュレーションを行っているのであまり目新しいことはない。
- モジュールはほかのモジュールをインスタンス化(instantiation)できる
- インスタンス化したモジュールをコンポーネントと呼ぶ
- コンポーネントの接続はsc_signalやsc_fifoなどを使用する
階層接続
Verilogと同じくポート名による接続と順序による接続がある。
SC_MODULE(rgb2yuv){ //ports sc_in < bool > clock; sc_fifo_in < rgb8_t > offset_in; sc_fifo_in < rgb8_t > rgb_in; sc_fifo_out < yuv8_t > yuv_out;
と
SC_MODULE(tb) { // ports sc_in < bool > clock; sc_fifo_out< rgb8_t > offset_out; sc_fifo_out< rgb8_t > rgb_out; sc_fifo_in < yuv8_t > yuv_in;
を名前で接続する場合は
// instanciate rgb2yuv i0("rgb2yuv"); tb t0("tb"); // conectivity i0.clock(clock); i0.offset_in(offset); i0.rgb_in(rgb); i0.yuv_out(yuv); t0.clock(clock); t0.offset_out(offset); t0.rgb_out(rgb); t0.yuv_in(yuv);
sc_main()
- 最上位階層。C言語のmain()関数と同じ
- 以下の内容を記述する
SC_MODULEからインスタンスを呼び出す
インスタンス宣言による呼び出しとポインタ宣言による呼び出しの2種類がある。
インスタンス宣言による呼び出し
#include "tb.h" #include "addr.h" SC_MODULE(SYSTEM) { sc_signal <bool> in1, in2, out; // モジュールのインスタンス addr addr0; tb tb0; SC_CTOR(SYSTEM) : addr0("addr0"), tb0("tb0") { addr0.i1(in1); addr0.i2(in2); addr0.o1(out); tb0.o1(in1); tb0.o2(in2); } };
ポインタ宣言による呼び出し
#include "tb.h" #include "addr.h" SC_MODULE(SYSTEM) { sc_signal <bool> in1, in2, out; // モジュールのインスタンス addr* addr0; tb* tb0; SC_CTOR(SYSTEM) { addr0 = new addr("addr0"); addr0->i1(in1); addr0->i2(in2); addr0->o1(out); tb0 = new tb("tb0"); tb0->o1(in1); tb0->o2(in2); } };