Icarus & gtkwave安装和使用
Icarus & gtkwave介绍
Icarus Verilog是一个轻量、免费、开源的Verilog编译器,基于C++实现,开发者是 Stephen Williams ,遵循 GNU GPL license 许可证,安装文件中已经包含 GTKWave支持Verilog/VHDL文件的编译和仿真,命令行操作方式,类似gcc编译器,通过testbench文件可以生成对应的仿真波形数据文件,通过自带的GTKWave可以查看仿真波形图,支持将Verilog转换为VHDL文件1。
Icarus & gtkwave安装
下载地址
官网:Icarus官网
云盘(工具版本:20220611):百度云盘, 提取码:wgqt
安装步骤
安装
一路点Next即可,到这个界面时选择“Full Installation”,这样编译仿真工具iverilog和波形查看工具GTKWave都可以安装上了,点击Next。
到这个界面时,这两个选项都不要去勾选了,首先我们一般是在power shell中用命令行的方式调用的,所以是否在桌面上创建快捷方式意义不大;其次,我们稍后会手动设定iverilog(编译工具), vvp(仿真工具)和gtkwave(波形查看工具)path的系统变量,点击Next,再点击Install即可完成安装。
系统环境变量设置
- 在“此电脑”上右键,点击“属性”,点击最右边的“高级系统设置”,点击下方的“环境变量”,并双击“系统变量”框中的“Path”。
- 点击右上角“新建”,把刚才安装Icarus目录下的bin和gtkwave/bin两个目录的完整路径添加到环境变量中,这样就实现了再power shell中识别iverilog,vvp和gtkwave命令了。
Icarus & gtkwave使用实例
下面以Verilog版“Hello world”的计数器的实现和仿真平台搭建来演示Icarus如何实现Verilog代码的编译,仿真和结果波形查看。
代码
RTL实现:counter.v
`ifndef __COUNTER_V__
`define __COUNTER_V__
module counter(
output reg [3:0] counter,
input clk,
input rst_n
);
always @(posedge clk or negedge rst_n) begin
if(~rst_n) begin
counter <= 4'd0;
end
else begin
counter <= counter + 1;
`ifdef FPGA_SIM
$display("counter = %0d @%0t", counter, $time);
`endif
end
end
endmodule
`endif
TB:tb.v
`timescale 1us/1ns
`include "counter.v"
module tb();
wire [3:0] counter;
reg clk;
reg rst_n;
counter U_counter(
.clk(clk),
.rst_n(rst_n),
.counter(counter)
);
always begin
#0.5;
clk = ~clk;
end
initial begin
clk = 1'b0;
rst_n = 1'b0;
#2.3;
rst_n = 1'b1;
#20;
$finish();
end
initial begin
$dumpfile("tb.vcd");
$dumpvars(0, tb);
end
endmodule
编译
打开Windows的PowerShell,进入对应的实例演示目录:
输入如下命令:
> iverilog -o simv -c iverilog_com_paras.txt -g2012 -s tb
其中simv是编译生成的可执行文件名字,iverilog_com_paras.txt是源文件list外加一系列相关的参数。推荐使用"-c 源文件list"的方式作为编译选项,这样一旦源文件有变动只需要修改源文件list即可而不用修改整个编译命令,同时使用这种方式编译命令看起来更加简洁。
仿真
> vvp -l run.log simv
其中run.log就是仿真过程产生的打印log。
结果波形查看
> gtkwave tb.vcd
类似于Verdi或者Modelsim,可以通过拖拽信号的方式把想要观察的信号拉到“Singals”框中,对应的信号就在“Waves”中显示出来了。同时可以通过“Files->Write Save File”和“Files->Read Save File”保存和导入关心的信号列表文件"*.gtkw"。
简单的参数介绍
iverilog
-o:指定生成文件的名称。如果不指定,默认生成文件名为a.out;
-c:指定输入的编译命令文件,其中包含源文件list,include命令,define命令等
例如本例中的iverilog_com_paras.txt,
+define+FPGA_SIM
+timescale+1ns/1ps
+incdir+./
tb.v
所包含的编译命令有:
- +define+:编译需要的宏定义;
- +timescale+:指定的仿真精度;
- +incdir+: 编译所参考的include目录;
- tb.v:源文件
-gxxx: 所支持的Verilog标准,支持的参数有 -g1995|-g2001|-g2005|-g2005-sv|-g2009|-g2012;
-s: 指定TOP module的名字作为仿真开始执行的入口。
vvp
-l:指定仿真过程中打印信息生成的log名。