Icarus Verilog,简称iVerilog,是比较著名的开源HDL仿真工具。这里简单介绍一下如何使用。
下载地址
安装教程
- 按默认状态安装,一路next
使用教程
编译
- 编写好代码和TestBench
- 代码和TestBench不要放在带中文的目录下
- 如果是在win7平台,在代码目录下,按住Shift+鼠标右键,然后选择“在此处打开命令窗口”
- 在命令行中输入
iverilog -V
如果有大量英文内容出来,则表示iverilog安装成功。
- 编译代码
iverilog -o target_name source1.v source2.v tb.v
target_name 是生成目标的文件名称,.v文件是所有必的源代码
生成波形文件
输入如下代码
vvp target_name
target_name 为上一步生成的目标文件。运行成功后,会生成.vcd的波形文件。
查看波形
输入
gtkwave target.vcd
target.vcd为上一步生成的波形文件
实例
`timescale 1s/1s
module led (
input clk,
input rst_n,
output red,
output green,
output yellow
);
reg[4:0] cnt;
always@(posedge clk or negedge rst_n)
begin
if (!rst_n) begin
cnt <= 8'h00;
end else begin
cnt <= cnt + 1'b1;
end
end
parameter ST_IDLE = 3'b000;
parameter ST_R = 3'b001;
parameter ST_G = 3'b010;
parameter ST_Y = 3'b100;
reg[2:0] status;
always@(posedge clk or negedge rst_n)
begin
if (!rst_n) begin
status <= ST_IDLE;
end else begin
case (cnt)
8'd00: begin status <= ST_G; end
8'd15: begin status <= ST_Y; end
8'd18: begin status <= ST_R; end
endcase
end
end
assign red = (status==ST_R);
assign green = (status==ST_G);
assign yellow = (status==ST_Y);
endmodule
Testbench
module tb();
reg clk;
reg rst_n;
wire red,green,yellow;
led uut(
.clk(clk),
.rst_n(rst_n),
.red(red),
.green(green),
.yellow(yellow)
);
// generate clock
initial begin
clk = 0;
forever begin
#10 clk = ~clk;
end
end
// dump wave
initial begin
$dumpfile("wave.vcd");
$dumpvars(0,tb);
end
initial begin
rst_n = 0;
#25 rst_n = 1;
#1000;
$finish;
end
endmodule