iverilog + gtkwave 简单使用

由于 iverilog + gtkwave 开源小巧, 因此, 在小工程里用这个组合还是很不错的

Windows安装 iverilog

Icarus Verilog for Windows 下载安装
这里安装的iverilog 还内置了GTKWave, 所以不需要额外安装 GTKWave

简单使用

test_counter.sv

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
`timescale 1ns/1ps
module test_counter ();

    localparam TEST_WIDTH = 6;
    localparam TEST_MAX   = 9;
    localparam CLK_PERIOD = 10;

    reg clk = 1'b1; // 时钟

    wire [TEST_WIDTH-1:0] cnt;

    counter #( // 参数例化
        .CNT_WIDTH (TEST_WIDTH),
        .CNT_INIT  (3),
        .CNT_MAX   (TEST_MAX)
    ) uut ( // 端口例化
        .clk       (clk),
        .cnt       (cnt)
    );

    always #(CLK_PERIOD/2) clk = ~clk; // 50MHz

    always @ (posedge clk) begin
        $display("time : %8t , counter = %d", $time, cnt);
        if (cnt == TEST_MAX)
            $display("time : %8t , counter overflow", $time);
        else if (cnt == 0)
            $display("hello world");
    end
    initial begin
        $dumpfile("test_counter.vcd");
        $dumpvars(0, test_counter); // dump所有信号波形
    end 

    initial begin // 第3次计数值为2后退出仿真
        repeat(3) begin
            wait (cnt == 2);
            #(CLK_PERIOD);
        end
        $display("goodbye");
        $finish;
    end

endmodule

module counter #( // 参数
    parameter CNT_WIDTH = 8,
    parameter CNT_INIT = 0,
    parameter CNT_MAX = 11
) ( // 端口
    input clk,
    output reg [CNT_WIDTH-1:0] cnt
);

    initial cnt = CNT_INIT;

    always @ (posedge clk)
        if(cnt < CNT_MAX)
            cnt <= cnt + 1;
        else
            cnt <= 0;

endmodule

Makefile

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
##
# test_counter
#
# @file
# @version 0.1

TARGET = test_counter
SRC_FILES = test_counter.sv
OBJ = $(TARGET).vvp
all: comp run wave
vcd: comp run
comp : $(SRC_FILES)
	@echo Compiling $(SRC_FILES)
	iverilog -o $(TARGET).vvp $(SRC_FILES)

run : $(TARGET).vvp
	@echo Running simulation
	vvp $(TARGET).vvp

wave: $(TARGET).vcd
	@echo Open waveform
	gtkwave $(TARGET).vcd

wave2: $(TARGET).vcd
	@echo Open an exist waveform
	gtkwave $(TARGET).gtkw

clean:
	-rm -f *.vcd *.vvp
# end

编译+仿真+看波形

1
make all

编译+仿真

1
make vcd

一般的工作流

对于没有现成波形的工程

  1. make
  2. 在GTKWave 里面添加好波形, 然后 File => Write Save File As => 输入一个名字, 保存为 .gtkw
  3. 更改设计后, make vcd 重新编译仿真生成波形文件
  4. GTKWave 中 File => Relaod Waveform 即可看到波形的变化

对于己有现成波形的工程

  1. make wave2 打开GTKWave 查看之前保存的波形
  2. 更改设计后, make vcd 重新编译仿真生成波形文件
  3. GTKWave 中 File => Relaod Waveform 即可看到波形的变化

GTKWave 简单使用

添加信号


选择信号后左下角的三个按钮可以批量操作, 如果是直接拖的话, 一次只能拖一个信号到波形窗口

快捷键

  • Zoom Fix
    Ctrl + 0 或者 Shift + Alt + f
  • 放大
    Ctrl + =
    或者 按住Ctrl + 鼠标滚轮
  • 缩小
    Ctrl + -
    或者 按住Ctrl + 鼠标滚轮
  • 上下左右移动
    鼠标滚轮
  • 放置 / 取消Marker
    按下鼠标中键