Verilator Makefile

  • 2007/10/31(水) 15:36:26

コマンドラインより入力するのが面倒なので、VerilatorもMakefileを作ってみました。
テストに使うモジュールは、SystemC Makefileのテストに使った同期リセット付きDフリップフロップです。

まずExampleの下のVerilatorディレクトリににdffrディレクトリを作成します。

/home /takuo /EDA /SystemC /systemc-2.2.0
/Example /Verilator /dffr Makefile
dffr.v
test.cpp

以下に示す、Makefile,dffr.v,test.cppをdffrディレクトリの下に配置します。

Makefile
TARGET_ARCH = linux
CC = g++
SYSTEMC = /home/takuo/EDA/systemc/systemc-2.2.0
OBJDIR = ./obj_dir
#INCDIR = -I. -I$(SYSTEMC)/include
LIBDIR = -L. -L$(SYSTEMC)/lib-$(TARGET_ARCH)
LIBS = -lsystemc -lm

MODULE = dffr
TMODULE = test
VSRCS = $(MODULE).v
TSRCS = $(TMODULE).cpp
OBJS = $(TMODULE).o V$(MODULE)__ALL*.o verilated.o

EXE = $(MODULE).x

all: $(EXE)

exe: $(EXE)
    (cd $(OBJDIR); ./$(EXE))

$(OBJDIR)/V$(MODULE).mk: $(VSRCS) $(TSRCS)
    verilator --sc $(VSRCS) --exe $(TSRCS);

$(EXE): $(OBJS)
    (cd $(OBJDIR); $(CC) $(LIBDIR) $(OBJS) -o $(EXE) $(LIBS))

$(OBJS): $(OBJDIR)/V$(MODULE).mk
    (cd $(OBJDIR); make -f V$(MODULE).mk)

clean:
    rm -rf $(OBJDIR) *~


dffr.v
module dffr(clock, reset, din, dout);
    input clock, reset, din;
    output dout;

    reg dout;

    always @(posedge clock)
    begin
        if (reset)
            dout <= 1'b0;
        else
            dout <= din;
    end
endmodule


test.cpp
#include <stdio.h>
#include <iostream>
#include "systemc.h"
#include "Vdffr.h"
int sc_main(int argc, char *argv[])
{
    int i;
    sc_clock clock("clock", 15, SC_NS, 0.5, 0, SC_NS, false);
    sc_signal<bool> reset;
    sc_signal<bool> din;
    sc_signal<bool> dout;

    Vdffr *Vdffr1;
    Vdffr1 = new Vdffr("Vdffr1");
    (*Vdffr1)(clock, reset, din, dout);

    sc_trace_file *trace_f;

    trace_f = sc_create_vcd_trace_file("dffr");
    ((vcd_trace_file *)trace_f) -> sc_set_vcd_time_unit(-9);
    sc_trace(trace_f,clock, "clock");
    sc_trace(trace_f,reset, "reset");
    sc_trace(trace_f,din, "din");
    sc_trace(trace_f,dout, "dout");
    sc_initialize();
    din = false;
    reset = false;
    sc_start(10,SC_NS);
    reset = true;
    sc_start(30,SC_NS);
    reset = false;
    for(i=0; i<20; i++)
    {
    sc_start(20, SC_NS);
    din = ! din;
    }
    sc_close_vcd_trace_file(trace_f);
    return 0;
}


test.cppは、SystemCでの動作確認に使ったtest.cppの"dffr"を"Vdffr"に変更したものです。
dffrディレクトリに入って、


$make exe

実行まで行われるので、obj_dirディレクトリにVCDファイルdffr.vcdができています。
GTKWaveで波形を見ます。

$gtkwave obj_dir/dffr.vcd

SystemC Makefile

  • 2007/10/24(水) 13:04:32

Makefileの勉強も兼て、Makefileをシンプルにしてみました。
Inverterの動作確認に使ったMakefileは、systemc-2.0.1のexampleフォルダにあったものです。
Makefile.defsはインクルードしていません。
テストに使うモジュールは、SystemC Use's Guideの非同期リセット付きDフリップフロップを参考にして作った同期リセット付きDフリップフロップです。

まずExampleの下のSystemCディレクトリににdffrディレクトリを作成します。。

/home /takuo /EDA /SystemC /systemc-2.2.0
/Example /SystemC /dffr Makefile
dffr.h
dffr.cpp
test.cpp

以下に示す、Makefile,dffr.h,dffr.cpp,test.cppをdffrディレクトリの下に配置します。

Makefile
TARGET_ARCH = linux
CC = g++
SYSTEMC = /home/takuo/EDA/systemc/systemc-2.2.0
INCDIR = -I. -I$(SYSTEMC)/include
LIBDIR = -L. -L$(SYSTEMC)/lib-$(TARGET_ARCH)
LIBS = -lsystemc -lm

MODULE = dffr
SRCS = test.cpp dffr.cpp

EXE = $(MODULE).x

all: $(EXE)

exe: $(EXE)
./$(EXE)

$(EXE): $(SRCS)
$(CC) $(INCDIR) $(LIBDIR) -o $@ $(SRCS) $(LIBS)

clean :
rm -f *~ *.vcd $(EXE)
'07'10'27 修正

dffr.h
SC_MODULE(dffr)
{
sc_in clock;
sc_in reset;
sc_in din;
sc_out dout;

void do_ffr();

SC_CTOR(dffr)
{
SC_METHOD(do_ffr);
sensitive_pos(clock);
}
};


dffr.cpp
#include "systemc.h"
#include "dffr.h"

void dffr::do_ffr()
{
if (clock.event()) {
if (reset) {
dout = false;
} else
dout = din;
}
}


test.cpp
#include
#include
#include "systemc.h"
#include "dffr.h"
int sc_main(int argc, char *argv[])
{
int i;
sc_clock clock("clock", 15, SC_NS, 0.5, 0, SC_NS, false);
sc_signal reset;
sc_signal din;
sc_signal dout;

dffr *dffr1;
dffr1 = new dffr("dffr1");
(*dffr1)(clock, reset, din, dout);

sc_trace_file *trace_f;

trace_f = sc_create_vcd_trace_file("dffr");
((vcd_trace_file *)trace_f) -> sc_set_vcd_time_unit(-9);
sc_trace(trace_f,clock, "clock");
sc_trace(trace_f,reset, "reset");
sc_trace(trace_f,din, "din");
sc_trace(trace_f,dout, "dout");
sc_initialize();
din = false;
reset = false;
sc_start(10,SC_NS);
reset = true;
sc_start(30,SC_NS);
reset = false;
for(i=0; i<20; i++)
{
sc_start(20, SC_NS);
din = ! din;
}
sc_close_vcd_trace_file(trace_f);
return 0;
}


dffrディレクトリに入って、


$make exe

実行まで行われるので、VCDファイルdffr.vcdができています。
GTKWaveで波形を見ます。

$gtkwave dffr.vcd