チラシの裏は意外と白くない

最近忘れっぽくなったので調べたことをチラシの裏に書きます

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

f:id:samurai375:20200414133659j:plain

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をインスタンスしてシミュレーションを行っているのであまり目新しいことはない。

階層接続

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_start()によるシミュレーション開始
    • 戻り値はreturn 0

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);
    }
};