Linux 下 iverilog 的自动化仿真


一、介绍

  • iverilog :Icarus Verilog 是一个轻量级的 verilog 仿真工具,以编译器的形式工作,将以 verilog 编写的源代码编译为某种目标格式。如果要进行仿真的话,它可以生成一个叫做 vvp 的中间格式。这个格式可以由其所附带的 vvp 命令执行。
  • GTKwave:一款免费的波形查看器,可以用于查看标准的 verilog VCD/EVCD,以及其他一些格式的波形文件。

二、安装步骤

iverilog 和 GTKwave 的安装非常容易,这里以 Ubuntu 16.04 为演示平台。没有换源的可以换成国内的源,这样会比较快一些。

  • 安装 iverilog 的命令如下
1、  sudo apt-get update
2、  sudo apt-get install iverilog
  • 安装 GTKwave 的命令如下
1、  sudo apt-get install gtkwave

iverilog 工具链主要包含 iverilogvvpgtkwave 三个工具;iverilog 和 gtkwave 的作用已经说过了这里就不再赘述了,vvp 工具的作用主要是依据 iverilog 编译出的可执行文件生成可视化的波形文件。

三、iverilog 使用

这里提供一个仿真测试:test.v 是 testbench 顶层文件,add.v 是 RTL 文件。

test.v

`timescale 1ns/1ps

module test();

reg        clk;
reg        rst_n;
reg  [7:0] data1_i;
reg  [7:0] data2_i;
wire [7:0] data_o;

  initial begin
    $dumpfile("test.vcd");
    $dumpvars;
  end
  
  initial begin 
    clk = 0;
    forever #5 clk = ~clk;
  end

  initial begin
    rst_n = 0;
    data1_i = 0;
    data2_i = 0;
    #100
    rst_n = 1;

    repeat(20) begin
      @(posedge clk) begin
        data1_i <= data1_i + 8'd1;
        data2_i <= data2_i + 8'd2;
      end
    end

    #500
    $stop;
  end

add  u_add(
    .sclk   ( clk ),
    .rst_n  ( rst_n ),
    .data1_i( data1_i ),
    .data2_i( data2_i ),
    .data_o ( data_o )
);

endmodule

add.v

module add (
    input               sclk,
    input               rst_n,
    input       [7:0]   data1_i,
    input       [7:0]   data2_i,
    output  reg [7:0]   data_o
);

always@ (posedge sclk or negedge rst_n) begin
  if(~rst_n)
    data_o <= 8'b0;
  else
    data_o <= data1_i + data2_i;
end

endmodule

其中 test.v 中有两个值得注意的语句;系统函数 dumpfile 用来在运行仿真时生成 .vcd 波形文件;dumpvars 表示选择记录哪些信号,直接加分号结束表示记录设计中所有信号。

initial begin
    $dumpfile("test.vcd");
    $dumpvars;
end

iverilog 的使用和 GCC 比较类似,都可以用 -o 选项来指定输出文件,编译时也需要提供全部相关文件的绝对或相对路径,编译以上测试工程使用的命令如下:

iverilog -o run.out test.v add.v

编译后会生成被指定的目标可执行文件 run.out ,但此文件执行后只会在终端上显示仿真时文字信息,需要使用 vvp 工具将其可视化成 .vcd 文件。命令如下:

vvp -n run.out

其中 -n 选项表示运行完退出,以便进行下一步操作。可见执行了 vvp 命令后生成了 test.vcd 文件,可以用 GTKwave 打开并显示出波形。命令如下,回车后即可查看仿真波形。

gtkwave test.vcd

四、自动化仿真

  • Windows 的好处在于大部分软件都拥有完善的 UI 界面,内部操作过程也对使用者是透明的,比如 Modelsim 只需要编译后点仿真即可。而在 Linux 中,这些操作需要用命令来完成,像上面的测试工程,每次更改完代码,需要输入至少三次命令方才观察到波形,如果 Verilog 文件更多,那么编译命令将会更长。
  • 本例使用 Makefile 来实现自动化仿真。Makefile 是什么就不再赘述了,需要了解的可以百度一下。

Makefile

Makefile 的原理很简单,就是顺序执行上面三个命令,下面先给出代码:

# This is a Makefile
##########################  Parameters  #############################
# Object Verilog Files' catalog
ObjVFile = vfile.txt

# VCD File's name(.vcd)
VcdFile  = test

# elf File's name(.out)
ElfFile  = run
#####################################################################

# read Verilog Files' catalog
FileBuf := $(shell cat $(ObjVFile))

# make all
all:
    compile visual sim

# only make compile
compile:
	iverilog -o run.out $(FileBuf)

# only make visual ( make .elf file to the .vcd file )
visual:
	vvp -n $(ElfFile).out

# only open the wave
sim:
	gtkwave $(VcdFile).vcd

# clear middle files
clean:
	rm -rf *vcd *.out

我们另外使用一个目录文件(本例中为 vfile.txt)来存储一个工程所要用到的所有 Verilog 文件,变量 ObjVFile 对应这个目录文件的路径、VcdFile 对应 testbench 中 dumpfile 命令的 .vcd 文件名称、ElfFile 对应编译预计生成的可执行文件的名称(这里默认使用 .out 的后缀,实际上随意)、变量 FileBuf 将目录文件内容读取并保存下来。

  • all: 对应的语句是 Makefile 的终极目标,即顺序执行编译可视化打开波形
  • compile: 对应的语句表示编译从目录文件中读出来的所有 Verilog 文件。
  • visual: 对应的语句表示使用 vvp 工具依据编译后生成的可执行文件来产生波形文件。
  • sim: 对应的语句表示打开波形文件。
  • clean: 对应的语句表示删除中间文件。

目录文件 vfile.txt 文件需要符合 makefile 的换行符语法,如下所示:

./test.v \
./add.v

其中 \ 为换行符,分割每一行,使其具有可读性。./test.v./add.v 即为本工程相关的 Verilog 文件的相对路径。

执行

在终端中执行 makemake all命令即可实现自动化仿真,直接呈现仿真后的波形。

在这里插入图片描述

如果不需要更改代码并想显示波形时,键入 make sim命令,即可不必重新编译工程便打开波形。

需要删除产生的中间文件则键入 make clean命令即可。


  • 12
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值