本简要介绍Icarus Verilog和GTKwave的使用,使用iverilog(Icarus Verilog)编译仿真verilog而使用GTKWave查看仿真数据波形

  • 下载安装
  • 基本使用
    • iverilog使用
    • GTKWave使用
  • iverilog常用选项
    • 选项-g
    • 选项-o
    • 选项-y
    • 选项-I
    • 选项-D
    • 选项-t
  • 使用库
    • Xilinx

      • vivado
    • Lattice
      • ECP3
      • MachOX2
  • 注意事项
    • verilog源码
    • 编译命令
    • 其它

最近看一本书中有提到GTKwave这个软件,所以就去了解下,发现都是讲iverilog+GTKWave的使用,索性就再解了一下iverilog。这两个软件都是开源软件,而且两个软件安装包总共不足10MB,而且基本的verilog仿真都支持,普通FPGA设计的仿真完全够用。
由于其他文章都只是很简单的介绍了hello world的一个简单的例子,没有对使用各FPGA公司库的使用做介绍,所以才有本文的产生。本文从安装开始介绍;然后基本使用,最终给出包含Xilinx或Lattice IP的verilog设计的仿真方法;最后给出一些注意事项和使用技巧

本文测试文件在windows10和windows7上测试通过,其它平台请参考官方文档

下载安装

由于Icarus Verilog中已经包含了GTKWave所以直接从http://bleyer.org/icarus/下载安装,这里提供的为Windows版,我下载的为当前时间最新版:iverilog-10.1.1-x64_setup.exe,整个安装包才9.77MB,安装后也只有不到50MB。经测试,其实安装后只要把安装所在目录打包复制到其它电脑也可以用,即下载的这个安装类似一个自解压文件,但会增加两个路径到PATH。所以将安装目录打包复制到其它电脑后只要将以下两个目录(iverilog和gtkwave可执行文件所在目录)加入系统PATH环境变量中即可(这里假设放入其它电脑的目录为E:\iverilog):

E:\iverilog\bin
E:\iverilog\gtkwave\bin

或者在运行批处理文件前加入如下代码即可(即使用前将这两个路径临时加入PATH):

set iverilog_path=d:\iverilog\bin;
set gtkwave_path=d:\iverilog\gtkwave\bin;
set path=%iverilog_path%%gtkwave_path%%path%

下面给出可能会用到的网址:

  • iverilog 官网:http://iverilog.icarus.com/
  • iverilog windows版本:http://bleyer.org/icarus/
  • iverilog User Guide:http://iverilog.wikia.com/wiki/User_Guide
  • iverilog GitHub:https://github.com/steveicarus/iverilog
  • GTKWave 官网:http://gtkwave.sourceforge.net/
  • GTKWave 手册:http://gtkwave.sourceforge.net/gtkwave.pdf

基本使用

这里给出一个简单的hello world例程,先对使用方法有一个大概的了解

iverilog使用

仿真当然首先要提供verilog源代码,这里简单的实现了一个打印”hello world!”的例子,由于涉及到GTKWave的使用所以加入了clk和rst_n两个信号,以便介绍GTKWave的使用

/*****
**  文件名称:hello_world_tb.v
**  创 建 人:hsp
**  创建日期:2017-03-05
**  功能描述:一个iverilog和GTKWave使用方式介绍的hello world例子
*****/// synopsys translate_off
`timescale 1 ns / 1 ps
// synopsys translate_onmodule hello_world_tb;parameter PERI = 10;reg clk;reg rst_n;always #(PERI/2) clk = ~clk;initialbegin$dumpfile("hello_world_tb.vcd");$dumpvars(0,hello_world_tb);$display("hello world!");clk = 0;rst_n = 0;repeat(10) @(posedge clk);rst_n = 1;repeat(100) @(posedge clk);$finish;endendmodule

以上verilog:

  • 首先定义了一个参数PERI,用于指定clk输出周期
  • 然后定义了用于观察的两个regclkrst_n
  • 然后一个always给出了时钟信号clk的输出
  • 之后一个initial
    • 通过$dumpfile指定要保存仿真波形数据需要存储到的文件,指定保存在当前目录中hello_world_tb.vcd文件中(GTKWave还支持LXT,LXT2,VZT,FST和GHW等类型文件)
    • 通过$dumpvars指定要保存仿真波形数据的信号,这里指定为hello_world_tb模块(即本模块)之下及其子模块中的所有信号,当然这个例子中没有子模块,所以仿真数据被存储的为本模块中仅有的两个信号:clkrst_n
    • $display打印hello world!
    • 之后就是对clkrst_n的赋值操作
    • 最后结束仿真,这里要注意最好用$finish而不是$stop,因为若使用$stop在iverilog仿真完后需要手动停止,而用$finish则会自动停止

注意:以上代码最好保存为名称为hello_world_tb.v的文件,即模块名和文件名(不包括后缀)相同

之后就是仿真命令的问题,可使用以下批处理使用iverilog执行仿真并最后使用GTKWave打开仿真波形(将以下代码保存为xxx.bat或.cmd后缀的文件并放入以上verilog相同目录即可)

@echo offrem 若没有设置路径到PATH则关闭以下注释
rem set iverilog_path=d:\iverilog\bin;
rem set gtkwave_path=d:\iverilog\gtkwave\bin;
rem set path=%iverilog_path%%gtkwave_path%%path%set testbentch_module=hello_world_tb
set testbentch_file="./%testbentch_module%.v"iverilog -o "%testbentch_module%.vvp" %testbentch_file%
vvp "%testbentch_module%.vvp"set gtkw_file="%testbentch_module%.gtkw"
if exist %gtkw_file% (gtkwave %gtkw_file%) else (gtkwave "%testbentch_module%.vcd")

以上批处理:

  • 第一行关闭显示包括本行,非必须,不要也可以
  • 设置iverilog和GTKWave可执行文件路径到PATH,若没有加入到PATH才需要,这里直接注释
  • 然后设置两个变量,后面会使用
    • testbentch_module设置为前面verilog模块名相同
    • testbentch_file设置为verilog文件名,即模块名+.v
  • 然后使用iverilog编译verilog
    • -o指定输出文件名,这里使用模块名+.vvp
    • 之后指定源文件
  • 然后使用vvp开始仿真,参数为上面iverilog的输出文件
  • 之后开始仿真数据波形显示
    • 设置了一个变量,为GTKWave保存文件的文件名,这里使用模块名+.gtkw
    • 然后判断GTKWave保存文件是否存在,若存在则直接使用GTKWave打开该.gtkw文件,否则打开刚仿真生成的.vcd文件(原因请参考下一节)

GTKWave使用

通过上面批处理最后一条中gtkwave命令即可打开GTKWave软件,同时打开了对应的.gtkw或.vcd文件;首次运行打开的为.vcd文件,此时可以看到GTKWave软件界面的Signals和Waves窗口并没有信号显示,需要:

  • 在左上角的SST窗口选中一个模块,此时在其下面窗口就可以看到对应模块的所有信号
  • 在显示信号的窗口选中要查看的信号(ctrl+a全选,ctrl和shift可多选),然后点击其下面的Append按钮即可将这些信号显示到Signals和Waves窗口
  • 在Signals窗口选中各信号,然后按G可以将信号分组,推荐将不同模块的信号分为不同的组,这样方便查看
  • 这样操作后若不保存(类似modelsim也需要保存),下次再次打开.vcd文件仍然为初次打开一样Signals和Waves窗口都没有信号,所以此时ctrl+s将其保存,保存文件名推荐为模块名+.gtkw(配合上面的批处理),这样下次上面的批处理发现存在.gtkw文件则直接打开这个.gtkw文件,这样上面添加显示的信号和分组都存在,而波形数据也为最新的仿真数据

注:查看.gtkw文件可以发现其保存的内容不包括波形数据而只包括.vcd文件路径和GTKWave的一些设置(如添加的信号和分组等)

iverilog常用选项

直接运行iverilog -helpiverilog则会显示以下帮助信息,显示了iverilog支持的参数

Usage: iverilog [-ESvV] [-B base] [-c cmdfile|-f cmdfile][-g1995|-g2001|-g2005|-g2005-sv|-g2009|-g2012] [-g<feature>][-D macro[=defn]] [-I includedir][-M [mode=]depfile] [-m module][-N file] [-o filename] [-p flag=value][-s topmodule] [-t target] [-T min|typ|max][-W class] [-y dir] [-Y suf] source_file(s)

下面简单列举几个常用的参数的简单说明,详细参数列表请查看http://iverilog.wikia.com/wiki/Iverilog_Flags

选项-g

指定使用verilog的版本,推荐使用最新的-g2012基本的SystemVerilog语法都支持(不完全支持),方便使用SV仿真。如上帮助信息显示支持:

  • -g1995
  • -g2001
  • -g2005
  • -g2005
  • -g2009
  • -g2012

还支持:

  • verilog-ams
  • assertions/no-assertions
  • relative-include/no-relative-include
  • specify/no-specify
  • strict-ca-eval/no-strict-ca-eval
  • strict-expr-width/no-scrict-expr-width
  • xtypes/no-xtypes
  • io-range-error/no-io-range-error

选项-o

指定编译后输出文件,若不指定默认为a.out

选项-y

指定库的目录,编译时发现了一个没有定义的模块时会到这个参数指定的目录中查找,此选项在使用Xilinx和Lattice库时会用到

选项-I

指定verilog中`include包含文件的搜索目录,会按-I出现顺序查找

选项-D

传递一个宏定义,如-DIS_DEF-DIS_DEF=1,则在verilog中就可以用IS_DEF这个宏定义

选项-t

使用-tvhdl可将verilog转换为VHDL,如将上面的例子转换为VHDL:iverilog -tvhdl -o hello_world_tb.vhd hello_world_tb.v

使用库

若要仿真使用了各FPGA公司IP的设计则需要支持对应公司的库,这里简单介绍使用Xilinx和Lattice公司库的方法

Xilinx

vivado

本人安装的为vivado 2015.3,安装在E盘:E:\Xilinx\Vivado\2015.3;则在使用iverilog编译时使用以下命令即可(替换上面例子中iverilog命令那行):

set vivado_dir=E:\Xilinx\Vivado\2015.3\data\verilog\src
set vivado_lib="-y%vivado_dir%" "-y%vivado_dir%\retarget" "-y%vivado_dir%\unifast" "-y%vivado_dir%\unimacro" "-y%vivado_dir%\unisims" "-y%vivado_dir%\xeclib"iverilog -g2012 -o "%testbentch_module%.vvp" %vivado_lib% %rtl_file% %testbentch_file% %vivado_dir%/glbl.v

以上命令:

  • 设置vivado 2015.3仿真库目录
  • 并通过-y选项列出仿真库各子目录:
    • retarget
    • unifast
    • unimacro
    • unisims
    • xeclib
  • 在iverilog命令中增加了%vivado_dir%/glbl.v,否则IP编译出错

注意:以上iverilog中还增加了一个%rtl_file%,为要仿真RTL文件,类似%testbentch_file%的变量需要在之前设置

Lattice

Lattice的库仿真,编译较简单只要指定使用到的芯片的库即可(不同于Xilinx,Lattice各芯片的仿真库不同),只是在仿真测试文件中(如上面例子中的hello_world_tb.v文件)模块中需要例化两个模块:

//  lattice库使用testbentch模块中要加
GSR GSR_INST(.GSR(1'b1));
PUR PUR_INST(.PUR(1'b1));

本机安装Diamond3.5,安装目录在E盘

ECP3

则在使用iverilog编译时使用以下命令即可(替换上面例子中iverilog命令那行)

set lattice_dir=E:\lscc\diamond\3.5_x64\cae_library\simulation\verilog
set ecp3_lib="-y%lattice_dir%\ecp3" "-y%lattice_dir%\pmi"
iverilog -g2012 -o "%testbentch_module%.vvp" %ecp3_lib% %rtl_file% %testbentch_file%

以上命令:

  • diamond 3.5仿真库目录
  • 并通过-y选项列出ECP3芯片仿真库子目录:
    • pmi
    • ecp3

MachOX2

则在使用iverilog编译时使用以下命令即可(替换上面例子中iverilog命令那行)

set lattice_dir=E:\lscc\diamond\3.5_x64\cae_library\simulation\verilog
set machxo2_lib="-y%lattice_dir%\machxo2" "-y%lattice_dir%\pmi"
iverilog -g2012 -o "%testbentch_module%.vvp" %machxo2_lib% %rtl_file% %testbentch_file%

以上命令:

  • diamond 3.5仿真库目录
  • 并通过-y选项列出MachOX2芯片仿真库子目录:
    • pmi(同ECP3)
    • machxo2

注意事项

这里列出我在使用中遇到的一些问题或建议

verilog源码

  • 代码文件名最好为模块名+.v方式,因为通过-y方式指定目录时查找模块时iverilog要求模块名和文件名要相同,否则可能导致无法找到对应模块(这个要求也是平时写verilog应该有的好习惯)
  • testbentch中结束仿真推荐用$finish而不用$stop;因为$finish可以直接结束仿真并退出,而不需要手动退出,这样运行类似以上例子批处理后可以直接打开GTKWave窗口

编译命令

  • iverilog命令中通过-y指定目录时,需要放在源文件参数之前,否则提示有错
  • iverilog命令中通过-D传递宏包含引号的方法:-DIN_FILE="\"xxx.v\"",这在verilog有`include IN_FILE时需要使用;而iverilog命令中使用-DIN_FILE="xxx.v"方式有错误
  • 指定源文件时可以用通配符*,如本人用的批处理中通常使用这种方式指定RTL文件:set rtl_file="../rtl/*.v"

其它

  • 加大DOS窗口高度。由于运行批处理需要在DOS窗口查看verilog中$display的打印,有时iverilog编译打印的信息较多时会导致部分信息无法查看,所以需要加大DOS窗口的高度:在DOS窗口标题栏右键->默认值->布局中设置屏幕缓冲区中高度为较大的值(如1000)即可
  • iverilog即使指定为-g2012也不支持break、static等(测试得到)

Icarus Verilog和GTKwave使用简析相关推荐

  1. Icarus Verilog与GTKWave简介及其下载安装

    一. 简介 当前最流行的Verilog仿真软件分别是Mentor公司的Questasim/ModelSim,Cadence公司的NC-Sim/NC-Verilog 和 Synopsys公司的VCS.这 ...

  2. 轻量版verilog仿真平台:icarus verilog使用简介

    作为一名系统软件工程师,需要对verilog语言有一定的了解,学习verilog过程中免不了要进行仿真.工程上常见的verilog仿真软件基本就是国外EDA三大厂的:Mentor公司的ModelSim ...

  3. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  4. 简析平衡树(三)——浅谈Splay

    前言 原本以为\(Treap\)已经很难了,学习了\(Splay\),我才知道,没有最难,只有更难.(强烈建议先去学一学\(Treap\)再来看这篇博客) 简介 \(Splay\)是平衡树中的一种,除 ...

  5. 基于libmad库的MP3解码简析

    基于libmad库的MP3解码简析  MAD (libmad)是一个开源的高精度 MPEG 音频解码库,支持 MPEG-1(Layer I, Layer II 和 LayerIII(也就是 MP3). ...

  6. 简析 .NET Core 构成体系

    简析 .NET Core 构成体系 Roslyn 编译器 RyuJIT 编译器 CoreCLR & CoreRT CoreFX(.NET Core Libraries) .NET Core 代 ...

  7. Python源码学习:内建类型简析并简析int对象

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 上一篇文章中已经大致分析了下,Python的启动执行流程,现在我们分析一下Pytho ...

  8. Python源码学习:启动流程简析

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> Python简介: python主要是动态语言,虽然Python语言也有编译,生成中 ...

  9. 简析TCP的三次握手与四次分手【转】

    转自 简析TCP的三次握手与四次分手 | 果冻想 http://www.jellythink.com/archives/705 TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇 ...

  10. ceph存储原理_Ceph存储引擎BlueStore简析

    前文我们创建了一个单节点的Ceph集群,并且创建了2个基于BlueStore的OSD.同时,为了便于学习,这两个OSD分别基于不同的布局,也就是一个OSD是基于3中不同的存储介质(这里是模拟的,并非真 ...

最新文章

  1. 人工智能,也许是另一场文艺复兴!
  2. cpci检索为什么那么慢_索引原理与慢查询优化
  3. sql-labs page2(21~38) 解题过程记录
  4. .NET Core + K8S + Apollo 玩转配置中心
  5. linux :vim 实现命令行下输出进度条
  6. cdh中hdfs非ha环境迁移Namenode与secondaryNamenode,从uc机器到阿里;
  7. djano 字段不重复_Java 14 发布了,不使用quot;classquot;也能定义类了?还顺手要干掉Lombok!...
  8. 自定义UISwitch
  9. 永恒之蓝(MS17-010)补丁KB号
  10. (转)Jetty实战之 安装 运行 部署
  11. 双光子荧光成像_有机双光子荧光染料在生物成像中的应用取得新进展
  12. linux - tar压缩解压缩使用,快速记忆方法
  13. github每次push时自动输入用户名密码
  14. html里怎么引用php代码,如何实现在html引用php代码,不是简单的?php ?
  15. 手把手搭建一个完整的javaweb项目(适合新手)
  16. getshell工具下载批量ecshop4.0全版本通杀工具下载
  17. python爬虫——使用selenium爬取qq群的成员信息(全自动实现自动登陆)
  18. 20182319彭淼迪第一周学习总结
  19. IDEA This inspection performs unresolved SQL references check
  20. win7如何看计算机几核,win7系统查看CPU是几核的操作方法

热门文章

  1. “accountsservice:依赖: libaccountsservice0(= 0.6.40-2ubuntu11.3)但是0.6.40-2ubuntu11.6已经安装”解决方法
  2. SNF快速开发平台MVC-集成了百度开源项目echars
  3. 用p5.js绘制创意自画像
  4. 龙门浩职高计算机学校,重庆市龙门浩职业中学校|龙门浩职高是公办还是民办院校/文凭怎么样/是什么性质...
  5. matlab中的Repeating Sequence的用法
  6. 综述(十六)北京智慧城市发展规划的政策分析
  7. 微信公众号模板如何使用?公众号模板教程!
  8. 【重磅综述】记忆系统:神经科学的启示「AI核心算法」
  9. koa2 mysql sequelize_[转]使用nodejs-koa2-mysql-sequelize-jwt 实现项目api接口
  10. 证券行业的数字化转型:金融业务与金融科技的共生发展