姓名:徐铭伟 学号:21011210001 学院:通信工程学院
【嵌牛导读】Linux下使用iverilog进行自动化仿真
【嵌牛鼻子】Linux下使用iverilog进行自动化仿真
【嵌牛提问】如何在linux下使用iverilog进行自动化仿真
【嵌牛正文】
文章目录
一、介绍
二、安装步骤
三、iverilog 使用
test.v
add.v
四、自动化仿真
Makefile
执行
一、介绍
iverilog :Icarus Verilog 是一个轻量级的 verilog 仿真工具,以编译器的形式工作,将以 verilog 编写的源代码编译为某种目标格式。如果要进行仿真的话,它可以生成一个叫做 vvp 的中间格式。这个格式可以由其所附带的 vvp 命令执行。
GTKwave:一款免费的波形查看器,可以用于查看标准的 verilog VCD/EVCD,以及其他一些格式的波形文件。
二、安装步骤
iverilog 和 GTKwave 的安装非常容易,这里以 Ubuntu 16.04 为演示平台。没有换源的可以换成国内的源,这样会比较快一些。
安装 iverilog 的命令如下:
1、 sudo apt-get update
2、 sudo apt-get install iverilog
安装 GTKwave 的命令如下:
1、 sudo apt-get install gtkwave
iverilog 工具链主要包含 iverilog、vvp、gtkwave 三个工具;iverilog 和 gtkwave 的作用已经说过了这里就不再赘述了,vvp 工具的作用主要是依据 iverilog 编译出的可执行文件生成可视化的波形文件。
三、iverilog 使用
这里提供一个仿真测试:test.v 是 testbench 顶层文件,add.v 是 RTL 文件。
test.v
`timescale 1ns/1ps
module test();
reg clk;
reg rst_n;
reg [7:0] data1_i;
reg [7:0] data2_i;
wire [7:0] data_o;
initial begin
$dumpfile("test.vcd");
$dumpvars;
end
initial begin
clk = 0;
forever #5 clk = ~clk;
end
initial begin
rst_n = 0;
data1_i = 0;
data2_i = 0;
#100
rst_n = 1;
repeat(20) begin
@(posedge clk) begin
data1_i <= data1_i + 8'd1;
data2_i <= data2_i + 8'd2;
end
end
#500
$stop;
end
add u_add(
.sclk ( clk ),
.rst_n ( rst_n ),
.data1_i( data1_i ),
.data2_i( data2_i ),
.data_o ( data_o )
);
endmodule
add.v
module add (
input sclk,
input rst_n,
input [7:0] data1_i,
input [7:0] data2_i,
output reg [7:0] data_o
);
always@ (posedge sclk or negedge rst_n) begin
if(~rst_n)
data_o <= 8'b0;
else
data_o <= data1_i + data2_i;
end
endmodule
其中 test.v 中有两个值得注意的语句;系统函数 dumpfile 用来在运行仿真时生成 .vcd 波形文件;dumpvars 表示选择记录哪些信号,直接加分号结束表示记录设计中所有信号。
initial begin
$dumpfile("test.vcd");
$dumpvars;
end
iverilog 的使用和 GCC 比较类似,都可以用 -o 选项来指定输出文件,编译时也需要提供全部相关文件的绝对或相对路径,编译以上测试工程使用的命令如下:
iverilog -o run.out test.v add.v
编译后会生成被指定的目标可执行文件 run.out ,但此文件执行后只会在终端上显示仿真时文字信息,需要使用 vvp 工具将其可视化成 .vcd 文件。命令如下:
vvp -n run.out
其中 -n 选项表示运行完退出,以便进行下一步操作。可见执行了 vvp 命令后生成了 test.vcd 文件,可以用 GTKwave 打开并显示出波形。命令如下,回车后即可查看仿真波形。
gtkwave test.vcd
四、自动化仿真
Windows 的好处在于大部分软件都拥有完善的 UI 界面,内部操作过程也对使用者是透明的,比如 Modelsim 只需要编译后点仿真即可。而在 Linux 中,这些操作需要用命令来完成,像上面的测试工程,每次更改完代码,需要输入至少三次命令方才观察到波形,如果 Verilog 文件更多,那么编译命令将会更长。
本例使用 Makefile 来实现自动化仿真。Makefile 是什么就不再赘述了,需要了解的可以百度一下。
Makefile
Makefile 的原理很简单,就是顺序执行上面三个命令,下面先给出代码:
# This is a Makefile
########################## Parameters #############################
# Object Verilog Files' catalog
ObjVFile = vfile.txt
# VCD File's name(.vcd)
VcdFile = test
# elf File's name(.out)
ElfFile = run
#####################################################################
# read Verilog Files' catalog
FileBuf := $(shell cat $(ObjVFile))
# make all
all:
compile visual sim
# only make compile
compile:
iverilog -o run.out $(FileBuf)
# only make visual ( make .elf file to the .vcd file )
visual:
vvp -n $(ElfFile).out
# only open the wave
sim:
gtkwave $(VcdFile).vcd
# clear middle files
clean:
rm -rf *vcd *.out
我们另外使用一个目录文件(本例中为 vfile.txt)来存储一个工程所要用到的所有 Verilog 文件,变量 ObjVFile 对应这个目录文件的路径、VcdFile 对应 testbench 中 dumpfile 命令的 .vcd 文件名称、ElfFile 对应编译预计生成的可执行文件的名称(这里默认使用 .out 的后缀,实际上随意)、变量 FileBuf 将目录文件内容读取并保存下来。
all: 对应的语句是 Makefile 的终极目标,即顺序执行编译、可视化和打开波形。
compile: 对应的语句表示编译从目录文件中读出来的所有 Verilog 文件。
visual: 对应的语句表示使用 vvp 工具依据编译后生成的可执行文件来产生波形文件。
sim: 对应的语句表示打开波形文件。
clean: 对应的语句表示删除中间文件。
目录文件 vfile.txt 文件需要符合 makefile 的换行符语法,如下所示:
./test.v \
./add.v
其中 \ 为换行符,分割每一行,使其具有可读性。./test.v 和 ./add.v 即为本工程相关的 Verilog 文件的相对路径。
执行
在终端中执行 make或 make all命令即可实现自动化仿真,直接呈现仿真后的波形。
如果不需要更改代码并想显示波形时,键入 make sim命令,即可不必重新编译工程便打开波形。
需要删除产生的中间文件则键入 make clean命令即可。