全平台轻量开源verilog仿真工具iverilog+GTKWave使用教程
前言
如果你只是想检查Verilog文件的语法是否有错误,然后进行一些基本的时序仿真,那么Icarus Verilog 就是一个不错的选择。相比于各大FPGA厂商的IDE几个G的大小,Icarus Verilog 显得极其小巧,最新版安装包大小仅有17MB,支持全平台:Windows+Linux+MacOS,并且源代码开源。本文将介绍如何使用Icarus Verilog来进行verilog文件的编译和仿真。
关于 Icarus Verilog
Icarus Verilog是一个轻量、免费、开源的Verilog编译器,基于C++实现,开发者是 Stephen Williams ,遵循 GNU GPL license 许可证,安装文件中已经包含 GTKWave支持Verilog/VHDL文件的编译和仿真,命令行操作方式,类似gcc编译器,通过testbench文件可以生成对应的仿真波形数据文件,通过自带的GTKWave可以查看仿真波形图,支持将Verilog转换为VHDL文件。
iverilog的安装
iverilog安装时,默认会把GTKWave一起安装,用于查看生成的波形图。
iverilog支持Windows、Linux和MacOS三大主流平台,截止2019年12月1日,最新版本v11-20190809下载:
http://bleyer.org/icarus/iverilog-v11-20190809-x64_setup.exe
Windows下的安装
Windows下直接双击上面下载的安装文件即可,安装完成后安装目录如下:
Linux下的安装
Linux下的安装,以Ubuntu 16.04为例,可以通过apt-get直接安装。
- 安装iverilog:
sudo apt-get install iverilog
- 安装GTKWave:
sudo apt-get install gtkwave
不能成功安装的,尝试更换镜像地址,我使用的是网易的开源镜像地址。
MacOS下的安装
Mac下的安装可以通过 macports 或者 homebrew 来安装,
通过 Macports 安装:
- 安装iverilog:
sudo ports -d -v install iverilog
- 安装GTKWave:
sudo ports -d -v install gtkwave
通过 homebrew 安装:
- 安装iverilog:
brew install icarus-verilog
- 安装GTKWave:
brew install caskroom/cask/gtkwave
查看是否安装成功
安装成功后,可以通过命令窗口来查看命令所在的路径。
Windows环境可以通过where命令查看安装路径
where iverilog
where vvp
where gtkwave
Linux环境可以通过which命令查看安装路径
which iverilog
which vvp
which gtkwave
基本参数介绍
Icarus Verilog编译器主要包含3个工具:
- iverilog:用于编译verilog和vhdl文件,进行语法检查,生成可执行文件
- vvp:根据可执行文件,生成仿真波形文件
- gtkwave:用于打开仿真波形文件,图形化显示波形
在终端输入iverilog
回车,可以看到常用参数使用方法的简单介绍:
$ iverilog
D:\iverilog\bin\iverilog.exe: no source files.
Usage: iverilog [-EiSuvV] [-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] [-l file] source_file(s)
See the man page for details.
下面来详细介绍几个常用参数的使用方法。
参数-o
这是比较常用的一个参数了,和GCC中-o的使用几乎一样,用于指定生成文件的名称。如果不指定,默认生成文件名为a.out。如:iverilog -o test test.v
参数-y
用于指定包含文件夹,如果top.v中调用了其他的的.v模块,top.v直接编译会提示
led_demo_tb.v:38: error: Unknown module type: led_demo
2 error(s) during elaboration.
*** These modules were missing:
led_demo referenced 1 times.
***
找不到调用的模块,那么就需要指定调用模块所在文件夹的路径,支持相对路径和绝对路径。
如:iverilog -y D:/test/demo led_demo_tb.v
如果是同一目录下:iverilog -y ./ led_demo_tb.v
,另外,iverilog还支持Xilinx、Altera、Lattice等FPGA厂商的仿真库,需要在编译时通过-y参数指定库文件的路径,详细的使用方法可以查看官方用户指南:
https://iverilog.fandom.com/wiki/User_Guide
参数-I
如果程序使用`include语句包含了头文件路径,可以通过-i参数指定文件路径,使用方法和-y参数一样。
如:iverilog -I D:/test/demo led_demo_tb.v
参数-tvhdl
iverilog还支持把verilog文件转换为VHDL文件,如iverilog -tvhdl -o out_file.vhd in_file.v
Verilog的编译仿真实际应用
新建led_demo.v源文件,内容如下:
module led_demo(
input clk,
input rst_n,
output reg led
);
reg [7:0] cnt;
always @ (posedge clk)
begin
if(!rst_n)
cnt <= 0;
else if(cnt >= 10)
cnt <= 0;
else
cnt <= cnt + 1;
end
always @ (posedge clk)
begin
if(!rst_n)
led <= 0;
else if(cnt == 10)
led <= !led;
end
endmodule
功能非常简单,每10个时钟周期,led翻转一次。
仿真testbench文件led_demo_tb.v,内容如下:
`timescale 1ns/100ps
module led_demo_tb;
parameter SYSCLK_PERIOD = 10;
reg SYSCLK;
reg NSYSRESET;
initial
begin
SYSCLK = 1'b0;
NSYSRESET = 1'b0;
end
/*iverilog */
initial
begin
$dumpfile("wave.vcd"); //生成的vcd文件名称
$dumpvars(0, led_demo_tb); //tb模块名称
end
/*iverilog */
initial
begin
#(SYSCLK_PERIOD * 10 )
NSYSRESET = 1'b1;
#1000
$stop;
end
always @(SYSCLK)
#(SYSCLK_PERIOD / 2.0) SYSCLK <= !SYSCLK;
led_demo led_demo_ut0 (
// Inputs
.rst_n(NSYSRESET),
.clk(SYSCLK),
// Outputs
.led( led)
);
endmodule
注意testbench文件中有几行iverilog编译器专用的语句,如果不加的话后面不能生成vcd文件。
initial
begin
$dumpfile("wave.vcd"); //生成的vcd文件名称
$dumpvars(0, led_demo_tb); //tb模块名称
end
1.编译
通过iverilog -o wave led_demo_tb.v led_demo.v
命令,对源文件和仿真文件,进行语法规则检查和编译。由于本示例比较简单,只有1个文件,如果调用了多个.v的模块,可以通过前面介绍的-y参数指定源文件的路径,否则编译报错。如果源文件都在同同一个目录,可以直接通过./
绝对路径的方式来指定。
例如,led_demo_tb.v中调用了led_demo.v模块,就可以直接使用iverilog -o wave -y ./ top.v top_tb.v
来进行编译。
如果编译成功,会在当前目录下生成名称为wave的文件。
2.生成波形文件
使用vvp -n wave -lxt2
命令生成vcd波形文件,运行之后,会在当前目录下生成.vcd文件。
如果没有生成,需要检查testbench文件中是否添加了如下几行:
initial
begin
$dumpfile("wave.vcd"); //生成的vcd文件名称
$dumpvars(0, led_demo_tb); //tb模块名称
end
3.打开波形文件
使用命令gtkwave wave.vcd
,可以在图形化界面中查看仿真的波形图。
Verilog转换为VHDL
虽然VHDL和Verilog都诞生于20世纪80年代,而且都属于硬件描述语言(HDL),但是二者的语法特性却不一样。Icarus Verilog 还有一个小功能就是支持把使用Verilog语言编写的.v文件转换为VHDL语言的.vhd文件。
如把led_demo.v文件转换为VHDL文件led_demo.vhd,使用命令iverilog -tvhdl -o led_demo.vhd led_demo.v
。
生成的VHDL文件内容如下:
-- This VHDL was converted from Verilog using the
-- Icarus Verilog VHDL Code Generator 11.0 (devel) (s20150603-612-ga9388a89)
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
-- Generated from Verilog module led_demo (led_demo.v:1)
entity led_demo is
port (
clk : in std_logic;
led : out std_logic;
rst_n : in std_logic
);
end entity;
-- Generated from Verilog module led_demo (led_demo.v:1)
architecture from_verilog of led_demo is
signal led_Reg : std_logic;
signal cnt : unsigned(7 downto 0); -- Declared at led_demo.v:8
begin
led <= led_Reg;
-- Generated from always process in led_demo (led_demo.v:10)
process (clk) is
begin
if rising_edge(clk) then
if (not rst_n) = '1' then
cnt <= X"00";
else
if Resize(cnt, 32) >= X"0000000a" then
cnt <= X"00";
else
cnt <= cnt + X"01";
end if;
end if;
end if;
end process;
-- Generated from always process in led_demo (led_demo.v:20)
process (clk) is
begin
if rising_edge(clk) then
if (not rst_n) = '1' then
led_Reg <= '0';
else
if Resize(cnt, 32) = X"0000000a" then
led_Reg <= not led_Reg;
end if;
end if;
end if;
end process;
end architecture;
VHDL文件的编译和仿真
如果你还和编译Verilog一样,使用iverilog led_dmeo.v
来编译VHDL文件的话,那么会提示有语法错误,这是正常的,因为Verilog和VHDL是不同的语法规则,不能使用Verilog的标准来检查VHDL文件的语法。需要添加-g2012
参数来对VHDL文件进行编译,如iverilog -g2012 led_demo.vhd
,和Verilog一样,同样也支持Testbech文件的编译和仿真,当然需要编写对应的VHDL Testbench文件。
批处理文件一键执行
通过批处理文件,可以简化编译仿真的执行过程,直接一键执行编译和仿真。
新建文本文档,输入以下内容:
echo "开始编译"
iverilog -o wave led_demo.v led_demo_tb.v
echo "编译完成"
vvp -n wave -lxt2
echo "生成波形文件"
cp wave.vcd wave.lxt
echo "打开波形文件"
gtkwave wave.lxt
文件扩展名需要更改,Windows系统保存为.bat文件,Linux系统保存为.sh文件。Windows直接双击运行,Linux在终端执行。
总结
从20040706版本,到现在的最新版本20190809,作者还在继续更新,有兴趣的朋友可以研究一下源代码是如何实现语法规则检查的,或者可以尝试编译源码,获得最新的版本。当然,和FPGA厂商的IDE相比,功能还是非常有限,GTKWave界面也比较简陋,如不支持宽度测量等,主要是小巧+全平台支持,可以配合IDE来使用。这个工具还支持主流FPGA厂商的IP核仿真,如Xilinx和Lattice,详细的使用方法可以参考官方使用指南。
参考资料
文章部分内容参考自Icarus Verilog官方网站。
- iverilog官网: http://iverilog.icarus.com/
- iverilog下载:http://bleyer.org/icarus/
- iverilog用户指南: https://iverilog.fandom.com/wiki/User_Guide
- Github开源地址: https://github.com/steveicarus/iverilog
- GTKWave下载(iverilog已经包含):http://gtkwave.sourceforge.net/
推荐阅读
- 详解EMC测试国家标准GB/T 17626
- 电路板上的这些标志你都知道是什么含义吗?
- Microsemi Libero使用技巧——FPGA全局网络的设置
- Microsemi Libero系列教程(一)——Libero开发环境介绍、下载、安装与注册
- Microsemi Libero系列教程(二)——新建点灯工程
- 详解串行通信协议及其FPGA实现
- 我的个人博客:www.wangchaochao.top
- 我的公众号:mcu149
全平台轻量开源verilog仿真工具iverilog+GTKWave使用教程的更多相关文章
- ASP.NET Core 修改开源协议为MIT,.NET全平台 MIT协议开源了
2021年7月23日,.NET开发团队完成了所有的.NET平台的相关框架的MIT协议更改,我们可以通过 https://github.com/dotnet/aspnetcore/issues/1887 ...
- 全平台轻量级 Verilog 编译器 & 仿真环境
一直苦于 modelsim 没有Mac版本,且其体量过大,在学习verilog 时不方便使用. 终于找到一组轻量级且全平台 ( Linux+Windows+macOS ) 的编译仿真工具组. Icar ...
- 编写轻量ajax组件01-对比webform平台上的各种实现方式
前言 Asp.net WebForm 和 Asp.net MVC(简称MVC) 都是基于Asp.net的web开发框架,两者有很大的区别,其中一个就是MVC更加注重http本质,而WebForm试图屏 ...
- 轻量高效的开源JavaScript插件和库 【转】
图片 布局 轮播图 弹出层 音频视频 编辑器 字符串 表单 存储 动画 时间 其它 加载器 构建工具 测试 包管理器 CDN 图片 baguetteBox.js - 是一个简单易用的响应式图像灯箱效果 ...
- adhoc-海量数据多维自助即席查询平台-mdrill项目开源啦
adhoc-海量数据多维自助即席查询平台-mdrill项目开源啦 1:mdrill是阿里妈妈-adhoc-海量数据多维自助即席查询平台下的一个子项目. 2:mdrill旨在帮助用户在几秒到几十秒的时间 ...
- verilog之四位全加器的编译及仿真(用开源免费的软件——iverilog+GTKWave)
verilog之四位全加器的编译及仿真(用开源免费的软件——iverilog+GTKWave) 四位全加器的verilog的代码比比皆是,这里上一个比较简单的: /* 4位全加器全加器需要有输入输出, ...
- Crawlab Lite 正式发布,更轻量的爬虫管理平台
Crawlab 是一款基于 Golang 的分布式爬虫管理平台,产品发布已经一年有余,经过开发团队的不断打磨,即将迭代到 v0.5 版本.在这期间我们为 Crawlab 加入了大量社区用户共同期望的功 ...
- 推荐一款轻量小众却高效免费开源windows热键脚本语言Autohotkey
写在前面的话 Autohotkey是一款轻量小众但高效免费开源的windows热键脚本语言,游戏操纵.鼠标操作.键盘快捷重定义,快捷短语等等,只有你想不到,没有它做不到,神器中的神器呀,相见恨晚. 安 ...
- Ninject是一款.Net平台下的开源依赖注入框架
Ninject是一款.Net平台下的开源依赖注入框架.按照官方说法,它快如闪电.超级轻量,且充分利用了.Net的最新语法,使用Lambda表达式代替Xml文件完成类型绑定.Ninject结构精巧,功能 ...
随机推荐
- pyinstaller打包python文件成exe(原理.安装.问题)
py文件打包成exe文件的方式一共有三种:py2exe.PyInstaller和cx_Freeze 本文分四个步骤来详讲如何用PyInstaller将py文件打包成exe文件 1. PyInstall ...
- 【Luogu P2146】软件包管理器
Luogu P2146 由于对于每一个软件包有且只有一个依赖的软件包,且依赖关系不存在环. 很显然这是一个树形的结构. 再看题目要求的操作,安装实际上对应的是覆盖根节点到当前节点的路径,卸载则是覆盖该 ...
- 【Luogu P1164】小A点菜
题目原链接: Luogu 小A点菜 [解题思路] 常规的0-1背包,不过是求装满整个背包的方案数,只要把0-1背包的状态转移方程稍微改一下就行.因为要求方案数,那么把方程中的max换成sum就行. [ ...
- <编译原理 - 函数绘图语言解释器(2)语法分析器 - python>
<编译原理 - 函数绘图语言解释器(2)语法分析器 - python> 背景 编译原理上机实现一个对函数绘图语言的解释器 - 用除C外的不同种语言实现 设计思路: 设计函数绘图语言的文法, ...
- 3sql
-------------------- 三范式-- 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列. -- 第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个 ...
- 02-tornado学习笔记-环境配置
Ubuntu16.04开发环境 1.ubuntu默认root用户没有激活,激活root用户,就要为root用户创建密码 $sudo passwd root 2.修改主机名 $vi /etc ...
- 算法整理(php语言完成),持续更行中......
一下所有实例中,均在同一个方法中,所以算法使用内部函数完成 归并排序 public function test1Action () { $tmp = 0; $al_merge = function($ ...
- python文件高级操作
python文件高级操作和注意事项等等 文件过大保护 由于read是一次性读取文件所有的内容,如果文件100G,内存就会吃不消,所以推荐使用read(size)一次读取指定字节/字符(根据rb,或者r ...
- Block-wise 2D kernel PCA/LDA for face recognition-笔记
In the present work, we propose a framework for kernel-based 2D feature extraction algorithms tailor ...
- ASI和AFN的区别
ASI总结 发送请求的2个对象 1.发送GET请求 ASIHttpRequest 2.发送POST请求 ASIFormDataRequest 二发送请求 1.同步请求 startSynchronous ...