1.Icarus Verilog 2.VeriWell Verilog Simulator

来源:互联网 发布:sql sever select as 编辑:程序博客网 时间:2024/06/05 02:43
由于某些原因,原来调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,附件中是自己打的deb包... 
//因为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 


结果如图: 
[img]Screenshot-GTKWave_-_test.lxt.png[/img] 
略微有些简陋,不方便随时更改各个引脚的值。但是,这两个软件加起来也没有多大,跑起来很快,作几个模块的前仿还是没有问题,另外,由于是命令行操作,能够批量测试,自己定制一下会很强。如果你不想为了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 


-- 
memento mori 
Cogito,ergo sum 
sub specie aeternitatis

原创粉丝点击