Applistar

5. 3. 3 sc_clock

TOP > 5 SystemC入門 > 5. 3 時間 > 5. 3. 3 sc_clock
  5. 3. 3 sc_clock  

5. 3. 3 sc_clock

sc_clock の一番簡単な使い方は、次のような形です。

sc_clock 配置名(クロック名, クロック周期);

例えば

sc_clock clk1("clk1", 20);

などのように書きます。

sc_clock は インタフェースクラスの一つ、 sc_signal_in_if<bool> を実装する 階層チャネル ()です。 正確には、そういうクラスの一つです。

Doxygen では次のところで見られます。 http://www.iro.umontreal.ca/~chareslu/systemc-2.0.1/classsc__clock.html

また継承関係は次のようになっています。

sc_clock には、上に示した形の他に、 引数により、次のような四通りの使い方があります。

    sc_clock( sc_module_name name_,
              const sc_time& period_,
              double         duty_cycle_ = 0.5,
              const sc_time& start_time_ = SC_ZERO_TIME,
              bool           posedge_first_ = true );

    sc_clock( sc_module_name name_,
              double         period_v_,
              sc_time_unit   period_tu_,
              double         duty_cycle_ = 0.5 );

    sc_clock( sc_module_name name_,
              double         period_v_,
              sc_time_unit   period_tu_,
              double         duty_cycle_,
              double         start_time_v_,
              sc_time_unit   start_time_tu_,
              bool           posedge_first_ = true );

    // for backward compatibility with 1.0
    sc_clock( sc_module_name name_,
              double         period_,            // in default time units
              double         duty_cycle_ = 0.5,
              double         start_time_ = 0.0,  // in default time units
              bool           posedge_first_ = true );

この中で = で初期値の指定のある引数は (C++ の約束事により)後の方から順に、 省略可能です。

最初に挙げた次の例は、

sc_clock 配置名(クロック名, クロック周期);

上の四通りのうちの、 一番簡単な最初の形を使ったものです。 この例では、引数が省略されているので、暗黙に 「デューティサイクル 0.5 開始時間 0、周期の初めに立上る」と解釈されます。

引数を省略しなければ、 デューティサイクル、開始時間、周期の初めに立上るか、指定時の時間単位 などが指定できます。

5. 3. 3. 1 sc_clock を実際に使ってみる

sc_clock は上の継承関係図にもある通り、sc_module を引継いでいるので、 そのままモジュールとなり、 sc_main に置くことが出来ます。例えば、次のような三つの記述を用意します。

Makefile.defs   Makefile の共通部分
   clock.cpp     クロックの SystemC 記述
   Makefile      Makefile の個別部分

それぞれの内容は次の通りです。

clock.cpp:

#include <systemc.h>
int sc_main(int argc, char **argv)
{
  sc_trace_file *trace_file;
  trace_file = sc_create_vcd_trace_file( "clk-trace" );

  sc_clock clk("clock", 100, SC_NS);
  sc_trace(trace_file, clk, "clk");
  sc_start(810, SC_NS);
  return(0);
}

Makefile:

TARGET_ARCH = cygwin

CC     = g++
OPT    = -O3
DEBUG  = -g
OTHER  = -Wall
CFLAGS = $(OPT) $(OTHER)
# CFLAGS = $(DEBUG) $(OTHER)

MODULE = run
SRCS = clock.cpp
OBJS = $(SRCS:.cpp=.o)

include ../Makefile.defs

Makefile.defs:

SYSTEMC = ../../..
SYSTEMC = /cygdrive/c/Systemc
SYSTEMC = /cygdrive/c/Systemc/systemc-2.0.1
SYSTEMC = /cygdrive/d/cygwin/home/makoto/local-src/systemc-2.0.1

INCDIR = -I. -I.. -I$(SYSTEMC)/include
LIBDIR = -L. -L.. -L$(SYSTEMC)/lib-$(TARGET_ARCH)

LIBS   =  -lsystemc -lm $(EXTRA_LIBS)
EXE    = $(MODULE).x

.SUFFIXES: .cc .cpp .o .x

$(EXE): $(OBJS) $(SYSTEMC)/lib-$(TARGET_ARCH)/libsystemc.a
        $(CC) $(CFLAGS) $(INCDIR) $(LIBDIR) -o $@ $(OBJS) $(LIBS) 2>&1 | c++filt

.cpp.o:
        $(CC) $(CFLAGS) $(INCDIR) -c $<

.cc.o:
        $(CC) $(CFLAGS) $(INCDIR) -c $<

clean::
        rm -f $(OBJS) *~ $(EXE) core

ultraclean: clean
        rm -f Makefile.deps

Makefile.deps:
#       $(CC) $(CFLAGS) $(INCDIR) -M $(SRCS) >> Makefile.deps

これで

$ make
$ ./run.x

とすると、次のようなファイルが出来ます

-rw-r--r--    1 makoto   group          570 Aug 23 17:24 clk-trace.vcd

これを gtkwave (winwave.exe)を使って表示してみます。

$ winwave clk-trace.vcd

すると、次のような 波形を見ることが出来ます。

  5. 3. 3 sc_clock  
TOP > 5 SystemC入門 > 5. 3 時間 > 5. 3. 3 sc_clock