Verilator 動作確認

  • 2007/09/27(木) 15:44:47

SystemCの動作確認で行った、インバータ回路の動作確認を行います。
まずExampleディレクトリの下にVerilatorディレクトリを作成しその下にInverterディレクトリを作成します。

/home /takuo /EDA /SystemC /systemc-2.2.0
/Example /SystemC /Inverter
/Verilator /Inverter Inverter.v
Main.cpp

以下に示す、VeriligファイルInverter.vとシミュレーションを行うMain.cppを、Inverterディレクトリの下に配置します。

Inverter.v
module Inverter(In1,Out1);

input In1;
output Out1;

assign Out1 = ~In1;

endmodule


Main.cpp
#include <stdio.h>
#include <iostream>
#include "systemc.h"
#include "VInverter.h"

int sc_main(int argc, char *argv[])
{
    int i;
    sc_signal<bool> InA;
    sc_signal<bool> Dout;
    VInverter *INV;
    INV = new VInverter("INV");
    (*INV)(InA, Dout);
    sc_trace_file *trace_f;
    trace_f = sc_create_vcd_trace_file("inverter");
    ((vcd_trace_file *)trace_f) -> sc_set_vcd_time_unit(-9);
    sc_trace(trace_f, InA, "InA");
    sc_trace(trace_f, Dout, "Dout");

    sc_initialize();
    cout << "InA | Dout" << endl;
    cout << "---------" << endl;
    for(i=0;i<20;i++)
    {
        if(i%2)
            InA = true;
        else
            InA = false;

        sc_start(50,SC_NS);
        cout << InA << " | " << Dout << endl;
    }

    sc_close_vcd_trace_file(trace_f);
    return 0;
}


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

$verilator --sc Inverter.v --exe Main.cpp

オブジェクトディレクトリobj_dirができるのでこのディレクトリへ入ります。
このディレクトリに入ったら、

$make -f VInverter.mk

オブジェクトファイルができるので、

$g++ -L$SYSTEMC/lib-linux *.o -o VInverter -lsystemc

実行ファイルVInverterができるので、

$./VInverter

VCDファイルinverter.vcdができるので、GTKWaveで波形を見ます。

SystemC 動作確認

  • 2007/09/26(水) 15:43:56

簡単なインバータ回路の動作確認を行います。
まずユーザディレクトリにExampleディレクトリを作成し、その下にSystemC,さらにその下にInverterディレクトリを作成します。。

/home/takuo/EDA/SystemC/systemc-2.2.0
/Example/SystemC/InverterMakefile.linux
Makefile.defsInverter.h
Inverter.cpp
Main.cpp

以下に示す、Makefile.defsをSystemCディレクトリの下に、Makefile.inux、Inverter.h,Inverter.cpp,Main.cppをInverterディレクトリの下に配置します。

Makefile.defs
## Variable that points to SystemC installation path
#SYSTEMC = ../../..
SYSTEMC = /home/takuo/EDA/systemc/systemc-2.2.0

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>gt;&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

#include Makefile.deps


Makefile.linux
TARGET_ARCH = linux
CC = g++
OPT = -O3
DEBUG = -g
OTHER = -Wno-deprecated
CFLAGS = $(OPT) $(OTHER)
# CFLAGS = $(DEBUG) $(OTHER)

MODULE = Inverter
SRCS = Main.cpp Inverter.cpp
OBJS = $(SRCS:.cpp=.o)

include ../Makefile.defs


Inverter.h
SC_MODULE(Inverter)
{
    sc_in<bool> InA;
    sc_out<bool> Dout;

    void Inv_Proc(void);

    SC_CTOR(Inverter)
    {
        SC_METHOD(Inv_Proc);
        sensitive << InA;
    }
};


Inverter.cpp
#include "systemc.h"
#include "Inverter.h"

void Inverter::Inv_Proc(void)
{
Dout = ! InA;
}


Main.cpp
#include <stdio.h>
#include <iostream>
#include "systemc.h"
#include "Inverter.h"

int sc_main(int argc, char *argv[])
{
    int i;
    sc_signal<bool> InA;
    sc_signal<bool> Dout;
    Inverter *INV;
    INV = new Inverter("INV");
    (*INV)(InA, Dout);
    sc_trace_file *trace_f;
    trace_f = sc_create_vcd_trace_file("inverter");
    ((vcd_trace_file *)trace_f) -> sc_set_vcd_time_unit(-9);
    sc_trace(trace_f, InA, "InA");
    sc_trace(trace_f, Dout, "Dout");

    sc_initialize();
    cout << "InA | Dout" << endl;
    cout << "---------" << endl;
    for(i=0;i<20;i++)
    {
        if(i%2)
            InA = true;
        else
            InA = false;

        sc_start(50,SC_NS);
        cout << InA << " | " << Dout << endl;
    }

    sc_close_vcd_trace_file(trace_f);
    return 0;
}


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


$make -f make.linux

実行ファイルInverter.xができるので、

$./Inverter.x

VCDファイルinverter.vcdができるので、GTKWaveで波形を見ます。

$gtkwave inverter.vcd