安装
安装软件: 软件下载地址 http://bleyer.org/icarus/
新版本中软件带的有gtkwave。安装时,会默认安装。
安装后,确认iverilog是否已经添加到系统变量中,如果没有,则手动添加一下
安装完成后可以使用命令行查看iverilog的位置,若有则安装成功
C:\Users\Lenovo>where iverilog
D:\Research\HDLiverilog\iverilog\bin\iverilog.exe
源程序
实现一个简单的编码器
module encoder(binary_out,encoder_in,enable);
output [3:0] binary_out;
input enable;
input [15:0] encoder_in;
reg [3:0] binary_out;
always @ (enable or encoder_in)
begin
binary_out = 0;
if(enable) begin
if(encoder_in == 16'h0002) begin
binary_out = 1;
end if(encoder_in == 16'h0004) begin
binary_out = 2;
end if(encoder_in == 16'h0008) begin
binary_out = 3;
end if(encoder_in == 16'h0010) begin
binary_out = 4;
end if(encoder_in == 16'h0020) begin
binary_out = 5;
end if(encoder_in == 16'h0040) begin
binary_out = 6;
end if(encoder_in == 16'h0080) begin
binary_out = 7;
end if(encoder_in == 16'h0100) begin
binary_out = 8;
end if(encoder_in == 16'h0200) begin
binary_out = 9;
end if(encoder_in == 16'h0400) begin
binary_out = 10;
end if(encoder_in == 16'h0800) begin
binary_out = 11;
end if(encoder_in == 16'h1000) begin
binary_out = 12;
end if(encoder_in == 16'h2000) begin
binary_out = 13;
end if(encoder_in == 16'h4000) begin
binary_out = 14;
end if(encoder_in == 16'h8000) begin
binary_out = 15;
end
end
end
endmodule
测试文件
module encoder_te();
reg enable;
reg [15:0] encoder_in;
wire [3:0] binary_out;
initial begin
$dumpfile("test.vcd"); //这两行主要是给 gtkwave工具使用
$dumpvars(0,encoder_te);
$monitor("%g\t %b %b %b",
$time,enable,encoder_in,binary_out);
enable = 0;
#5 enable = 1;
#5 encoder_in = 16'h0004;
#6 encoder_in = 16'h0040;
#7 encoder_in = 16'h0400;
#8 encoder_in = 16'h1000;
#10 $finish;
end
encoder en(binary_out,encoder_in,enable);
endmodule
解析
在数字电路设计和仿真中,dumpfile
是一个命令或系统任务,用于生成 Value Change Dump(VCD)文件。VCD 文件记录了在数字电路仿真过程中模拟器中各个信号的值变化。
通常的结构
initial begin
// 指定 VCD 文件的名称
$dumpfile("test.vcd");
// 选择要记录的信号
$dumpvars(0, top_module); // 这里的 top_module 是要记录的模块或实例的名称
// 初始化代码,仿真开始
end
这个软件没有界面,只能在cmd窗口里运行。
编译
打开命令行
先跳转到文件所在位置
C:\Users\Lenovo>cd /d F:\VIVADO\cocotb
编译
F:\VIVADO\cocotb>iverilog -o dsn encoder.v encoder_te.v
iverilog -o dsn your_verilog_files.v
这个命令用于编译 Verilog 代码,并生成一个仿真可执行文件,文件名为 dsn
。这个可执行文件仿真器的内部逻辑,包括模块、信号、事件和仿真的控制流。它们通常是仿真器生成的中间表示,用于模拟 Verilog 代码的行为。
举例,下面的代码是仿真可执行文件中的具体代码,展示了一些内部指令和详细解释
T_0.20 ;
%load/vec4 v0000022aaa90c8f0_0;
//这个指令表示从信号 v0000022aaa90c8f0_0 中加载一个 4 位向量。
%cmpi/e 2048, 0, 16;
//这个指令进行比较,检查加载的向量的值是否等于 2048。
%jmp/0xz T_0.22, 4;
//跳转指令。0xz 表示当条件为零时才进行跳转
%pushi/vec4 11, 0, 4;
//将一个 4 位的常数值 11 推送到堆栈上
%store/vec4 v0000022aaa90c7b0_0, 0, 4;
//将推送到堆栈上的值(这里是常数 11)存储到信号 v0000022aaa90c7b0_0 中
运行
F:\VIVADO\cocotb>vvp dsn
vvp
是 Icarus Verilog 提供的用于运行 Verilog 模拟的命令行工具dsn
是仿真模块的文件名
生成结果
VCD info: dumpfile test.vcd opened for output.//表示test.vcd 文件被打开用于输出。
0 0 xxxxxxxxxxxxxxxx 0000
5 1 xxxxxxxxxxxxxxxx 0000
10 1 0000000000000100 0010
16 1 0000000001000000 0110
23 1 0000010000000000 1010
31 1 0001000000000000 1100
encoder_te.v:20: $finish called at 41 (1s) //仿真器执行到了 $finish 语句
仿真波形显示
F:\VIVADO\cocotb>gtkwave test.vcd
使用gtkwave工具