轻量级Verilog仿真工具:iVerilog和GTKWave
iVerilog和GTKWave是一套非常轻量的Verilog仿真工具。由于最近将生产力平台迁移到Ubuntu,在此记录Linux下该软件的使用。
安装
在Debian/Ubuntu的apt软件源里已包含该软件,直接使用apt安装即可。
apt-get update && apt-get install iverilog gtkwave
仿真
以一个输出等占空比的10分频器为例(输出时钟频率是输入时钟频率的1/10,输出脉冲占空比50%)。
编写Verilog文件如下,命名为FreqDiv.v:
module FreqDiv(
Clk,
Reset_n,
f_Out);
input Clk;
input Reset_n;
output reg f_Out;
reg [2:0] Counter; //3bit is enough to represent 0~7
always @ (posedge Clk)
begin
if(!Reset_n)
Counter <= 0;
else if(Counter >= 4'd4)
Counter <= 0;
else
Counter <= Counter + 1;
end
always @ (posedge Clk)
begin
if(!Reset_n)
f_Out <= 0;
else if(Counter == 4'd4)
f_Out <= !f_Out;
end
endmodule
该分频器中,计数从0开始计到4,每完成一次计数,输出寄存器翻转一次,从而实现10分频。
编写testbench文件如下,命名为FreqDiv_tb.v:
`timescale 1ns/1ps
module FreqDiv_tb;
// Module Inputs
reg Clk;
reg Reset_n;
// Module Outputs
wire f_Out;
initial
begin
Clk = 1'b0;
Reset_n = 1'b0;
end
initial
begin
#10
Reset_n = 1'b1;
#500
$stop;
end
always @(Clk)
begin
#1
Clk <= !Clk;
end
FreqDiv FreqDiv_ins0 (
// Inputs
.Clk(Clk),
.Reset_n(Reset_n),
// Outputs
.f_Out(f_Out)
);
/*iVerilog */
// This code is only used for iverilog
initial
begin
$dumpfile("wave.vcd"); //filename of generated .vcd which stores the signal waves
$dumpvars(0, FreqDiv_tb); //the same as the filename of testbench
end
/*iVerilog */
endmodule
testbench本身也是一个Verilog文件,Verilog中的语法在这里同样可以使用。在testbench中,被测试模块的输入信号由reg控制,为了观测输出信号,输出由wire引出。针对iVerilog仿真,需要把仿真变量dump出来,便有了dumpfile和dumpvars部分。
编写调用iVerilog和GTKWave的测试脚本如下,该文件命名为build.sh:
#!/bin/bash
iverilog -o wave *.v
ret=$?
if [ $ret -ne 0 ];
then
echo "iVerilog returned error code $ret"
exit 1;
fi
vvp -n wave -lxt2
ret=$?
if [ $ret -ne 0 ];
then
echo "vvp returned error code $ret"
exit 1;
fi
gtkwave wave.vcd
通过chmod +x build.sh以后,每次改动文件就可以通过./build.sh命令进行仿真。如果脚本正常,仿真得到的波形显示窗口会自动跳出。
如果verilog文件有语法错误,该脚本会接收到iverilog和vvp返回的错误码,并中断执行。根据仿真软件返回的提示进行修改即可。