Verilator 能够把可综合的(通常不是行为级)的Verilog代码,外加一部分Synthesis,SystemVerilog和一小部分Verilog AMS代码转换成C++或者SystemC代码。Verilator不是一个完整的模拟器(simulator),只是一个编译器(compiler)。
ubuntu16.04系统下面安装verilator非常简单:sudo apt-get install verilator
版本为:
$ verilator --version
Verilator 3.874 2015-06-06 rev verilator_3_872-20-g0d43051
$ 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++ 程序。
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。
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 !!!