如何在Linux下调试verilog http://pt0079.blog.ubuntu.org.cn/archives/12904月 18th, 2009由于某些原因,原来调fpga的那台机器暂时使用不能,只好四处搜索verilog编译器,
希望能在配置糟糕的第一台机器上完成前仿。
后来就有了这篇文章,希望对于逃不掉linux+verilog的童鞋有点用首先列出找到的两个比较上路子的编译器:
1. Icarus Verilog
2. VeriWell Verilog Simulator
两个项目都还活着,并且2009年都有更新,在sourceforge都能找到

然后列出的是查看波形图的软件:
1. gtkwave

我使用的是Icarus Verilog + gtkwave的组合,它们可以直接通过debian或者
ubuntu的apt-get install安装,简单方便。
//我的Icarus是自己编译的最新的0.91
//因为ubuntu源安装的Icarus Verilog[ sudo apt-get install verilog]
居然不支持lxt文件,会导致仿真文件比较大并且慢Icarus Verilog的主页和wiki分别是:
http://www.icarus.com/eda/verilog/
http://iverilog.wikia.com
不幸的是后者被gfw了,需要×××...

这里给出一个看波形图的示例: Icarus Verilog和gtkwave都是命令行工具,假设你要调一个D触发器的verilog模块,如下 :


kana@wadarochi:~$ cat dff.v

//
// Copyleft (C) 1998 by Rajesh Bawankule
// This model is available for free distribution
//
// file name : dff.v
// last modified : 07/23/98
// function : d flip flop
//


module dff (data, clock, q);
// port list
input data, clock;
output q;

// reg / wire declaration for outputs / inouts
reg q;

// logic begins here
always @(posedge clock)
q <= data;
endmodule

(很弱智吧…… 然后你应该怎么做?当然是写一个testbench,然后测试几个情况,简单起见,如下:


kana@wadarochi:~$ cat test.v
`timescale 10ns/1ns
module TB;
parameter START_DELAY = 5;
parameter SECOND_DELAY= 5;
parameter LAST_DELAY = 5;
// For clock
parameter ON_DELAY = 1;
parameter OFF_DELAY = 1;

// input of dff
reg Clock;
reg iD;
wire oQ;

// Instantial dff
dff D1(iD, Clock, oQ);

initial
begin
$dumpfile("test.vcd");
$dumpvars(0, TB);
$dumpvars(0, D1.data, D1.clock, D1.q);
end

// Clock partition
always
begin
#ON_DELAY;
Clock = 1;
#OFF_DELAY;
Clock = 0;
end

initial
begin
iD = 0;
#START_DELAY;
iD = 1;
#SECOND_DELAY;
iD = 0;
#LAST_DELAY;
iD = 1;
# 100;
$dumpflush;
$stop;
end
endmodule
很简单,在不同的时间点给D传入不同的电平,观察结果。
在test.v中比较重要的内容是:
$dumpfile
$dumpvars
$dumpflush
$stop

这几个系统任务[verilog语言内置],用于向特定VCD文件中写入各个变量值,然后
你才你能通过gtkwave看到波形图。

听起来有点麻烦,演示一下,在命令行下:
kana@wadarochi:~$ iverilog -o my_test dff.v test.v
这个命令行参数给的很像gcc,生成一个名为my_test的文件,可以在vvp这个运行时
环境中运行,很晕吧,别管它,接着往下看: kana@wadarochi:~$ vvp -n my_test -lxt2
kana@wadarochi:~$ mv test.vcd test.lxt
现在,你就得到了一个可以看得见的波形文件,只需要最后一条命令,就解决问题了:
kana@wadarochi:~$ gtkwave test.lxt

结果如图:
screenshot-gtkwave_-_testlxt2
略微有些简陋,不方便随时更改各个引脚的值。但是,这两个软件加起来也没有多大,
跑起来很快,作几个模块的前仿还是没有问题,另外,由于是命令行操作,能够批量
测试,自己定制一下会很强。
如果你不想为了verilog作业装几百M甚至上G的盗版IDE,就试试这个吧。

至于上面涉及到的几个系统任务还有VCD文件的概念,可以参考手头的verilog书,
一般都有讲的。
需要注意的是, $dumpfinish没有被Icarus Verilog支持,使用不了

如果你不需要看波形图,那就更方便了,两条命令解决问题:
kana@wadarochi:~$ iverilog -o xxxx a.v b.v
kana@wadarochi:~$ vvp xxxx

就能观察输出,或者得到包含输出向量的文件。调试的时候,这种方法用的也多,
方便使用大规模数据验证模块的正确性。

如果你真的对linux下使用free software开发verilog感兴趣,不妨把
Icarus Verilog的wiki看看,真的很棒,强烈推荐 对于自己画板子的
同学,这里顺带推荐一下 gEDA;帮老板打工的话,还是听师兄师姐的话比较好... See Also:
man iverilog
man vvp
man gtkwave
其它:
http://www.asic-world.com/verilog/index.html
http://www.faqs.org/faqs/verilog-faq/
http://iverilog.wikia.com/wiki/FAQ
http://www.bawankule.com/verilogfaq/page3.html