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

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で波形を見ます。

Verilator インストール

  • 2007/07/11(水) 14:17:28

Verilatorをインストールする前にVerilogPerlとSyatemPerlをインストールします。
まず、VerilogPerl。
cpanを使ってBit::VectorとTest::Podをインストールします。
cpanの設定に必要な、lynxとncftpをインストールします。

$sudo aptitude install lynx

$sudo aptitude install ncftp

インストールが終わったらcpanの設定を行います。

$sudo cpan

cpanの初期設定が始まります。
この設定の詳細については、検索すればいくつかのサイトで説明されています。

Parameters for the 'make install' command?

で、UNINST=1を選択。

cpanのサイト選択で、Asia→Japan→好みのサーバを選択して終了。

cpan>install Bit::Vector

cpan>install Test::Pod

インストールが終了したらexitでcpanからぬけます。

SystemCフォルダに入ってVerilogPerlを展開します。

$tar xvfz ../../Arc/Verilog-Perl-3.001.tar.gz

Verilog-Perl-3.001フォルダができるのでこれに移動します。

$perl Makefile.PL

$make

$make test

$sudo make install

次にSystemPerlをインストールします。
SystemCフォルダに入ってSystemPerlを展開します。

$tar xvfz ../../Arc/SystemPerl-1.280.tar.gz

SystemPerl-1.280フォルダができるのでこれに移動します。

$perl Makefile.PL

$make sc_patch

$make

$make test

$sudo make install

最後にVerilatorをインストールします。
SystemCフォルダに入ってVerilatorを展開します。

$gunzip ../../Arc/verilator-3.652.tgz

$tar xvf ../../Arc/verilator-3.652.tar

verilator-3.652フォルダができるのでこれに移動します。

$./configure

$make

$make test

makeができて、make testでエラーになる場合、test_c,test_scの所有権をユーザーに変えるとうまくいくことがあります。

$sudo chown -R takuo test_sc

make testがパスしたらインストールします。

$sudo make install