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

安装systemc

$ 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

别忘记设置三个环境变量SYSTEMC_INCLUDE,SYSTEMC_LIBDIR和LD_LIBRARY_PATH,否则后面第二个例子没法编译。

当然最好是把这三个设置放入.profile或者.bashrc启动文件中。下面给出两个简单的例子来展示Verilator的使用方法

工作目录如下: 

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 !!!

 

你可能感兴趣的:(systemc,verilator,verilog)