简介
在win10环境下,使用iverilog进行简单的verilog编译仿真,使用gtkwave和WaveDrom查看仿真波形。
iverilog for windows提供了iverilog和gtkwave的捆绑安装程序,下载链接:https://bleyer.org/icarus/,下载安装后要配置环境变量。
WaveDrom是一个网页波形编辑器,链接:https://wavedrom.com/
被测试模块
用状态机写一个1101序列检测模块:
module test(
input clk,
input rst_n,
input in,
output out
);
localparam IDLE = 1, H = 2, HH = 3, HHL = 4, HHLH = 5;
reg [2:0] state;
always @(posedge clk, negedge rst_n) begin
if(!rst_n)
state <= IDLE;
else begin
case(state)
IDLE: state <= in ? H : IDLE;
H : state <= in ? HH : IDLE;
HH : state <= in ? HH : HHL;
HHL : state <= in ? HHLH : IDLE;
HHLH: state <= in ? H : IDLE;
default: state <= IDLE;
endcase
end
end
assign out = (state == HHLH);
endmodule
testbench
由于需要查看波形,所以调用系统函数$dumpfile(“wave.vcd”)将波形输出到wave.vcd文件,调用$dumpvars输出所有波形。写一个简单的tb,直接给出1101序列的激励:
`timescale 1ns/1ns
module test_tb;
reg clk = 1;
always #10 clk = ~clk;
reg rst_n = 0;
reg in = 0;
wire out;
initial begin
$dumpfile("wave.vcd"); // 指定用作dumpfile的文件
$dumpvars; // dump all vars
end
initial begin
#20 rst_n <= 1;
#20 in <= 1;
#20 in <= 1;
#20 in <= 0;
#20 in <= 1;
#20 in <= 0;
#40;
$display("it works");
$finish;
end
test inst_test (
.clk (clk),
.rst_n (rst_n),
.in (in),
.out (out)
);
endmodule
编译仿真
使用iverilog命令进行编译,默认输出文件名为a.out:
iverilog test.v test_tb.v
使用vvp命令对a.out执行仿真:
PS E:\WorkSpace\test> vvp a.out
VCD info: dumpfile wave.vcd opened for output.
it works
执行仿真后,波形文件输出到了wave.vcd文件中,可以用gtkwave软件和WaveDrom网页查看波形。
使用gtkwave查看波形
执行gtkwave命令查看波形:
gtkwave wave.vcd
执行后会弹出gtkwave软件,不过没有波形,要手动选择左侧的tb,然后添加想要查看的波形即可:
使用WaveDrom查看波形
使用WaveDrom网页查看波形需要将vcd波形文件转化为wdrom文件,我使用sublime编辑器的verilog-Gadget插件实现该功能。
使用sublime编辑器打开wave.vcd文件,然后鼠标右键,选择VCD to WaveDrom,即可生成wdrom文件:
将这些代码复制到WaveDrom网页中,即可查看波形: