一、介绍

如果你只是想检查Verilog文件的语法是否有错误,然后进行一些基本的时序仿真,那么Icarus Verilog 就是一个不错的选择。相比于各大FPGA厂商的IDE几个G的大小,Icarus Verilog 显得极其小巧,最新版安装包大小仅有17MB,支持全平台:Windows+Linux+MacOS,并且源代码开源。本文将介绍如何使用Icarus Verilog来进行verilog文件的编译和仿真。

1.1、iverilog介绍

Icarus Verilog是一个轻量、免费、开源的Verilog编译器,基于C++实现,开发者是 Stephen Williams ,遵循 GNU GPL license 许可证。简称iVerilog,是比较著名的开源HDL仿真工具。

iVerilog以编译器的形式工作,将以verilog编写的源代码编译为某种目标格式。如果要进行仿真的话,,它可以生成一个叫做vvp的中间格式.,这个格式可以由其所附带的vvp命令执行。

iVerilog的安装文件中已经包含 GTKWave支持Verilog/VHDL文件的编译和仿真,命令行操作方式,类似gcc编译器,通过testbench文件可以生成对应的仿真波形数据文件,通过自带的GTKWave可以查看仿真波形图,支持将Verilog转换为VHDL文件。

1.2、gtkwave介绍

wave viewer,可以用于查看标准的verilog VCD/EVCD,,以及其他的一些格式的波形文件。

二、下载安装

2.1、Windows下载安装

打开iVerilog官网下载链接,点击其中的iverilog-v11-20190809-x64_setup.exe [17.0MB],进行安装包下载

双击打开安装包,按照如下步骤进行安装:








验证是否安装成功,在cmd命令行通过where命令查看安装路径,若显示成功,则表示安装成功,如下图所示

where iverilog
where vvp
where gtkwave

三、基本参数介绍

Icarus Verilog编译器主要包含3个工具:

  • iverilog:用于编译verilog和vhdl文件,进行语法检查,生成可执行文件
  • vvp:根据可执行文件,生成仿真波形文件
  • gtkwave:用于打开仿真波形文件,图形化显示波形

在cmd终端输入iverilog回车,可以看到常用参数使用方法的简单介绍,如下图所示:

  • 参数 -o

这是比较常用的一个参数了,和GCC中-o的使用几乎一样,用于指定生成文件的名称。如果不指定,默认生成文件名为a.out。如:iverilog -o test test.v

  • 参数-y

用于指定包含文件夹,如果top.v中调用了其他的的led_demo_tb.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的编译仿真实际应用,达到快速上手的目的!

4.1、新建源文件

新建led_demo.v源文件,功能非常简单,每10个时钟周期,led翻转一次。

module led_demo(input clk,input rst_n,output reg led
);reg [7:0] cnt;always @ (posedge clk)
beginif(!rst_n)cnt <= 0;else if(cnt >= 10)cnt <= 0;else cnt <= cnt + 1;
endalways @ (posedge clk)
beginif(!rst_n)led <= 0;else if(cnt == 10)led <= !led;
endendmodule 

仿真testbench文件led_demo_tb.v


`timescale 1ns/100psmodule led_demo_tb;parameter SYSCLK_PERIOD = 10;reg SYSCLK;
reg NSYSRESET;initial
beginSYSCLK = 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;
endalways @(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

4.2、编译

通过iverilog -o wave led_demo_tb.v led_demo.v命令,对源文件和仿真文件,进行语法规则检查和编译。

由于本示例比较简单,只有1个文件,如果调用了多个.v的模块,可以通过前面介绍的-y参数指定源文件的路径,否则编译报错。如果源文件都在同同一个目录,可以直接通过./绝对路径的方式来指定。


例如,led_demo_tb.v中调用了led_demo.v模块,就可以直接使用iverilog -o wave -y ./ led_demo.v led_demo_tb.v来进行编译。

如果编译成功,会在当前目录下生成名称为wave的文件,如下图

4.3、生成波形文件

使用vvp -n wave -lxt2命令生成vcd波形文件,运行之后,会在当前目录下生成.vcd文件。

如果没有生成,需要检查testbench文件中是否添加了如下几行:

initial
begin            $dumpfile("wave.vcd");        //生成的vcd文件名称$dumpvars(0, led_demo_tb);    //tb模块名称
end

4.4、打开波形文件

使用命令gtkwave wave.vcd,可以在图形化界面中查看仿真的波形图。


接着依次按下图中步骤操作,在右侧则会出现相应的波形

然后点击工具栏的Zoom fit,可以使波形调整到合适比例,如下图

4.5、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


生成的.vhd文件内容如下

-- This VHDL was converted from Verilog using the
-- Icarus Verilog VHDL Code Generator 11.0 (devel) (s20150603-642-g3bdb50da)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 isport (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 issignal led_Reg : std_logic;signal cnt : unsigned(7 downto 0);  -- Declared at led_demo.v:8
beginled <= led_Reg;-- Generated from always process in led_demo (led_demo.v:10)process (clk) isbeginif rising_edge(clk) thenif (not rst_n) = '1' thencnt <= X"00";elseif Resize(cnt, 32) >= X"0000000a" thencnt <= X"00";elsecnt <= cnt + X"01";end if;end if;end if;end process;-- Generated from always process in led_demo (led_demo.v:20)process (clk) isbeginif rising_edge(clk) thenif (not rst_n) = '1' thenled_Reg <= '0';elseif Resize(cnt, 32) = X"0000000a" thenled_Reg <= not led_Reg;end if;end if;end if;end process;
end architecture;

4.6、制作批处理脚本

通过批处理文件,可以简化编译仿真的执行过程,直接一键执行编译和仿真。新建文本文档,输入以下内容:

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
pause

文件扩展名需要更改,Windows系统保存为.bat格式,然后双击即可运行!

五、总结

从20040706版本,到现在的最新版本20190809,作者还在继续更新,有兴趣的朋友可以研究一下源代码是如何实现语法规则检查的,或者可以尝试编译源码,获得最新的版本。当然,和FPGA厂商的IDE相比,功能还是非常有限,GTKWave界面也比较简陋,如不支持宽度测量等,主要是小巧+全平台支持,可以配合IDE来使用。这个工具还支持主流FPGA厂商的IP核仿真,如Xilinx和Lattice,详细的使用方法可以参考官方使用指南。


参考

  • http://iverilog.icarus.com/
  • http://bleyer.org/icarus/
  • https://iverilog.fandom.com/wiki/User_Guide
  • https://github.com/steveicarus/iverilog
  • http://gtkwave.sourceforge.net/
  • https://www.cnblogs.com/whik/p/11980103.html

【第二届集成电路EDA备赛】一、Icarus Verilog(iverilog)快速上手使用(基于windows)相关推荐

  1. 【第三届集成电路EDA备赛】赛题一:海思-时序逻辑的高性能ATPG技术(1)(赛题概述)

    文章目录 一.赛题背景 1.1.ATPG 流程介绍 1.2.常见的 ATPG 算法的不足与解决思路 二.赛题描述 2.1.赛题描述 2.2.竞赛规则 (1)竞赛流程 (2) 源代码 (3) 竞赛Cas ...

  2. 南京信息工程大学 第二届程序设计大赛团队赛 题解

    南京信息工程大学 第二届程序设计大赛团队赛 试题 难度 标题 通过数 提交数 Easy1 A - Offer 145 264 Easy2 B - 负鼠的工资 144 238 Easy3 C - 选队出 ...

  3. 美赛论文Latex简易模板 | 快速上手(附注释)

    最近又是一年一度的美赛备战期(2019),想必会有许多萌新(包括我)正在积极地备战中.其中重要的一环想必就是上手Latex,照着往年O奖论文打出一份框架模板,掌握经常用到的Latex语法.了解基础用法 ...

  4. 自学Python第二十二天- Django框架(一)创建项目、APP、快速上手、请求和响应流程、模板、数据库操作

    Django 框架是一个基于 python 的重量级的 web 开发框架,现今很多大公司大项目都是使用 Django 框架.采用了 MVC(model view controller) 的框架模式,p ...

  5. 南昌大学航天杯第二届程序设计竞赛校赛网络同步赛题解

    A,C,I签到题,只搞了8题,还一题是神仙做的,我不会 链接:https://www.nowcoder.com/acm/contest/122/B 来源:牛客网 取石子 时间限制:C/C++ 1秒,其 ...

  6. 江西财经大学第二届程序设计竞赛同步赛 H大时钟 (扩展欧几里得)

    链接:https://ac.nowcoder.com/acm/contest/635/H 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  7. 南昌大学航天杯第二届程序设计竞赛校赛网络同步赛 部分题解

    A-ID and password 签到题. #include <iostream> #include <cstdio> #include <bits/stdc++.h& ...

  8. 南京信息工程大学第二届程序设计大赛团队赛:L-三元对

    题目描述 idyllic 现在信仰飞天意面神教,因此他认为数组里的三元对是一个神秘的东西. 现有一数组 A,若 (i,j,k) 满足 A i < A j < A k 且 i<j< ...

  9. 华为杯山东理工大学第二届团体程序设计天梯赛

    7-1 12-24小时制 (15 分) 编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间. 输入格式: 输入在一行中给出带有中间的:符号(半角的冒号)的24小时制的时间,如12:3 ...

  10. 2018西安工业大学第二届萌新线上赛MISC WP

    flag 将文件解压,得到一个flag.doc 打开linux终端 使用:strings flag.doc | grep "flag" 得到flag: sky 打开压缩包,发现一张 ...

最新文章

  1. php关键词分词搜索 最多匹配的排在最前面_百度搜索引擎工作原理,做Seo的建议看一看 - 蜘蛛池博客...
  2. php重载,PHP重载基础知识回顾
  3. C++编译单元 内部链接 外部链接
  4. 如何估算代码量_没有量杯,没有称,如何估算碳水化合物?
  5. 易宝支付碰到 交易签名无效问题
  6. 二叉搜索时与双向链表python_【剑指offer】26 二叉搜索树与双向链表
  7. shell expect的简单实用
  8. TabLayout实现顶部导航(一)
  9. 中国移动国际英国数据中心正式启动
  10. yaml文件解析:c++篇
  11. 第M题 快速幂详解!: 给出3个正整数A B C,求A^B Mod C。
  12. 诺基亚n1系统更新显示无网络_塞班系统曾经的希望,诺基亚 N8-00 发布十周年回顾...
  13. unity点光源消失
  14. [转] 从1个月到2岁半的育儿方案,有了它宝宝都不用去上早教啦
  15. python重命名列名_Pandas对列进行重命名
  16. 书单|互联网企业面试案头书之运营篇
  17. Caused by: java.lang.RuntimeException: Font asset not found fonts/SYFZLTKHJW.TTF
  18. c语言20s计数器,计数器延时程序与级联程序的plc梯形图实现
  19. html 的id指什么,appid是什么?
  20. tsLint环境配置及用法示例

热门文章

  1. excel最大行数各版本介绍
  2. 4种文件扩展名被阻止时发送邮件附件的方法
  3. xxl_job部分源码解读
  4. 带符号整数中负数采用什么编码_转载:二进制编码--负数
  5. 2014年蓝桥杯预赛 C/C++本科B组 解题报告 史丰收速算
  6. js日期加横杆_JS 替换日期的横杠为斜杠
  7. 计算机科学相关的期刊,计算机类期刊汇总(核心期刊,国家级期刊)
  8. 如何用分布式Pollard-Rho法对椭圆曲线离散对数问题(ECDLP)进行攻击(下)
  9. 英雄联盟服务器维护2019.4.5,lol维护公告最新时间 英雄联盟11.9版本4月29日更新内容...
  10. 网站安全防护方案--WEB应用防火墙