ubuntu16.04 verilator+systemcをインストールし、テストプログラムを実行する


Verilatorは、統合可能な(通常は動作レベルではない)Verilogコードに、synthesis、SystemVerilog、およびVerilog AMSコードの一部を加えてC++またはSystemCコードに変換することができる.Verilatorは完全なシミュレータ(simulator)ではなく、コンパイラ(compiler)にすぎない.
verilatorのインストール
ubuntu16.04システムの下にverilatorをインストールするのは簡単です:sudo apt-get install verilator
バージョン:
$ verilator --version Verilator 3.874 2015-06-06 rev verilator_3_872-20-g0d43051
システムcのインストール
$ wget -O systemc-2.3.0a.tar.gz http://www.accellera.org/images/downloads/standards/systemc/systemc-2.3.0a.tar.gz
$ tar -xzvf systemc-2.3.0a.tar.gz
$ cd systemc-2.3.0a
$ sudo mkdir -p /usr/local/systemc-2.3.0/
$ mkdir objdir
$ cd objdir
$ ../configure --prefix=/usr/local/systemc-2.3.0
$ make
$ sudo make install

$ export SYSTEMC_INCLUDE=/usr/local/systemc-2.3.0/include
$ export SYSTEMC_LIBDIR=/usr/local/systemc-2.3.0/lib-linux64
$ export LD_LIBRARY_PATH=/usr/local/systemc-2.3.0/lib-linux64:$LD_LIBRARY_PATH

3つの環境変数SYSTEMCを設定するのを忘れないでください.INCLUDE,SYSTEMC_LIBDIRとLD_LIBRARY_PATH,そうでなければ後の2番目の例はコンパイルできない.
もちろんこの3つの設定を入れたほうがいいです.ファイルかbashrc起動ファイルにあります.以下に、Verilatorの使用方法を示す2つの簡単な例を示します.
作業ディレクトリは次のとおりです.
user@ubuntu1:~/verilator$ tree
.
├── test_our
│   ├── obj_dir
│   ├── our.v
│   └── sim_main.cpp
└── test_our_sc
    ├── obj_dir
    ├── our.v
    ├── sc_main.cpp
    ├── sc_main.d
    └── sc_main.o

例C++プログラム
この例をC++プログラムにコンパイルします.
    mkdir test_our
    cd test_our

    cat <our.v
      module our;
         initial begin $display("Hello World"); $finish; end
      endmodule
    EOF

    cat <sim_main.cpp
      #include "Vour.h"
      #include "verilated.h"
      int main(int argc, char** argv, char** env) {
          Verilated::commandArgs(argc, argv);
          Vour* top = new Vour;
          while (!Verilated::gotFinish()) { top->eval(); }
          delete top;
          exit(0);
      }
    EOF

この小さな例をverilatorでコンパイルし始めます.
    verilator -Wall --cc our.v --exe sim_main.cpp

「obj_dir」ディレクトリの下にソースコードが表示されます.
    ls -l obj_dir

これらのC++ソースコードをコンパイルすることができます
    make -j -C obj_dir -f Vour.mk Vour

(Verilatorにはデフォルトのコンパイルとリンクルールが含まれており、コマンドラインでは--exeを使用して.cppファイルを渡しています.もちろん、次の例で行ったように、独自のコンパイルルールを作成することもできます)
これで実行できます.
    obj_dir/Vour

得られたプログラムの出力は以下の通りである.
    Hello World
    - our.v:2: Verilog $finish

例SYSTEMCプログラム
この例は上の例と同じで、SystemCを使っただけです.
    mkdir test_our_sc
    cd test_our_sc

    cat <our.v
      module our (clk);
         input clk;  // Clock is required to get initial activation
         always @ (posedge clk)
            begin $display("Hello World"); $finish; end
      endmodule
    EOF

    cat <sc_main.cpp
      #include "Vour.h"
      int sc_main(int argc, char **argv) {
          Verilated::commandArgs(argc, argv);
          sc_clock clk ("clk", 10, 0.5, 3, true);
          Vour* top;
          top = new Vour("top");
          top->clk(clk);
          while (!Verilated::gotFinish()) { sc_start(1, SC_NS); }
          delete top;
          exit(0);
      }
    EOF

ここでは、ウィジェットに対してVerilatorを実行します.
    verilator -Wall --sc our.v

次にコンパイルします.
    cd obj_dir
    make -j -f Vour.mk Vour__ALL.a
    make -j -f Vour.mk ../sc_main.o verilated.o

次にSystemCにリンクします.
    export SYSTEMC_LIBDIR=/path/to/where/libsystemc.a/exists
    export LD_LIBRARY_PATH=$SYSTEMC_LIBDIR:$LD_LIBRARY_PATH
    # Might be needed if SystemC 2.3.0
    export SYSTEMC_CXX_FLAGS=-pthread

    g++ -L$SYSTEMC_LIBDIR ../sc_main.o Vour__ALL*.o verilated.o \
              -o Vour -lsystemc

プログラムを実行できます
    cd ..
    obj_dir/Vour

最後に、上記のC++の例と同様の出力を得た.
    Hello World
    - our.v:2: Verilog $finish

Enjoy Verilator !!!