全平台轻量开源verilog仿真工具iverilog+GTKWave使用教程

原创 电子电路开发学习 2021-08-26 08:30

1. 前言

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

2. 关于 Icarus Verilog

Icarus Verilog是一个轻量、免费、开源的Verilog编译器,基于C++实现,开发者是 Stephen Williams ,遵循 GNU GPL license 许可证,安装文件中已经包含 GTKWave支持Verilog/VHDL文件的编译和仿真,命令行操作方式,类似gcc编译器,通过testbench文件可以生成对应的仿真波形数据文件,通过自带的GTKWave可以查看仿真波形图,支持将Verilog转换为VHDL文件。

3. iverilog的安装

iverilog安装时,默认会把GTKWave一起安装,用于查看生成的波形图。

iverilog支持Windows、Linux和MacOS三大主流平台,截止2019年12月1日,最新版本v11-20190809下载:

http://bleyer.org/icarus/iverilog-v11-20190809-x64_setup.exe

3.1 Windows下的安装

Windows下直接双击上面下载的安装文件即可,安装完成后安装目录如下:

3.2 Linux下的安装

Linux下的安装,以Ubuntu 16.04为例,可以通过apt-get直接安装。

  • 安装iverilog: sudo apt-getinstall iverilog

  • 安装GTKWave: sudo apt-getinstall gtkwave

不能成功安装的,尝试更换镜像地址,我使用的是网易的开源镜像地址。

3.3 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

3.4 查看是否安装成功

安装成功后,可以通过命令窗口来查看命令所在的路径。

Windows环境可以通过where命令查看安装路径

  1. where iverilog

  2. where vvp

  3. where gtkwave

Linux环境可以通过which命令查看安装路径

  1. which iverilog

  2. which vvp

  3. which gtkwave

4. 基本参数介绍

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

  • iverilog:用于编译verilog和vhdl文件,进行语法检查,生成可执行文件

  • vvp:根据可执行文件,生成仿真波形文件

  • gtkwave:用于打开仿真波形文件,图形化显示波形

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

  1. $ iverilog

  2. D:\iverilog\bin\iverilog.exe: no source files.


  3. Usage: iverilog [-EiSuvV] [-B base] [-c cmdfile|-f cmdfile]

  4. [-g1995|-g2001|-g2005|-g2005-sv|-g2009|-g2012] [-g<feature>]

  5. [-D macro[=defn]] [-I includedir]

  6. [-M [mode=]depfile] [-m module]

  7. [-N file] [-o filename] [-p flag=value]

  8. [-s topmodule] [-t target] [-T min|typ|max]

  9. [-W class] [-y dir] [-Y suf] [-l file] source_file(s)


  10. See the man page for details.

下面来详细介绍几个常用参数的使用方法。

4.1 参数-o

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

4.2 参数-y

用于指定包含文件夹,如果top.v中调用了其他的的.v模块,top.v直接编译会提示

  1. led_demo_tb.v:38: error: Unknownmodule type: led_demo

  2. 2 error(s) during elaboration.

  3. *** These modules were missing:

  4. led_demo referenced 1 times.

  5. ***

找不到调用的模块,那么就需要指定调用模块所在文件夹的路径,支持相对路径和绝对路径。

如: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

4.3 参数-I

如果程序使用`include语句包含了头文件路径,可以通过-i参数指定文件路径,使用方法和-y参数一样。

如:iverilog-I D:/test/demo led_demo_tb.v

4.4 参数-tvhdl

iverilog还支持把verilog文件转换为VHDL文件,如 iverilog-tvhdl-o out_file.vhd in_file.v

5. Verilog的编译仿真实际应用

新建led_demo.v源文件,内容如下:

  1. module led_demo(

  2. input clk,

  3. input rst_n,


  4. output reg led

  5. );


  6. reg [7:0] cnt;


  7. always @ (posedge clk)

  8. begin

  9. if(!rst_n)

  10. cnt <= 0;

  11. elseif(cnt >= 10)

  12. cnt <= 0;

  13. else

  14. cnt <= cnt + 1;

  15. end


  16. always @ (posedge clk)

  17. begin

  18. if(!rst_n)

  19. led <= 0;

  20. elseif(cnt == 10)

  21. led <= !led;

  22. end


  23. endmodule

功能非常简单,每10个时钟周期,led翻转一次。

仿真testbench文件leddemotb.v,内容如下:

  1. `timescale 1ns/100ps


  2. module led_demo_tb;


  3. parameter SYSCLK_PERIOD = 10;


  4. reg SYSCLK;

  5. reg NSYSRESET;


  6. initial

  7. begin

  8. SYSCLK = 1'b0;

  9. NSYSRESET = 1'b0;

  10. end


  11. /*iverilog */

  12. initial

  13. begin

  14. $dumpfile("wave.vcd"); //生成的vcd文件名称

  15. $dumpvars(0, led_demo_tb); //tb模块名称

  16. end

  17. /*iverilog */


  18. initial

  19. begin

  20. #(SYSCLK_PERIOD * 10 )

  21. NSYSRESET = 1'b1;

  22. #1000

  23. $stop;

  24. end


  25. always @(SYSCLK)

  26. #(SYSCLK_PERIOD / 2.0) SYSCLK <= !SYSCLK;


  27. led_demo led_demo_ut0 (

  28. // Inputs

  29. .rst_n(NSYSRESET),

  30. .clk(SYSCLK),


  31. // Outputs

  32. .led( led)

  33. );


  34. endmodule

注意testbench文件中有几行iverilog编译器专用的语句,如果不加的话后面不能生成vcd文件。

  1. initial

  2. begin

  3. $dumpfile("wave.vcd"); //生成的vcd文件名称

  4. $dumpvars(0, led_demo_tb); //tb模块名称

  5. end

5.1 编译

通过 iverilog-o wave led_demo_tb.v led_demo.v命令,对源文件和仿真文件,进行语法规则检查和编译。由于本示例比较简单,只有1个文件,如果调用了多个.v的模块,可以通过前面介绍的-y参数指定源文件的路径,否则编译报错。如果源文件都在同同一个目录,可以直接通过 ./绝对路径的方式来指定。

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

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

5.2 生成波形文件

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

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

  1. initial

  2. begin

  3. $dumpfile("wave.vcd"); //生成的vcd文件名称

  4. $dumpvars(0, led_demo_tb); //tb模块名称

  5. end

5.3 打开波形文件

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

6. Verilog转换为VHDL

虽然VHDL和Verilog都诞生于20世纪80年代,而且都属于硬件描述语言(HDL),但是二者的语法特性却不一样。Icarus Verilog 还有一个小功能就是支持把使用Verilog语言编写的.v文件转换为VHDL语言的.vhd文件。

如把leddemo.v文件转换为VHDL文件leddemo.vhd,使用命令 iverilog-tvhdl-o led_demo.vhd led_demo.v

生成的VHDL文件内容如下:

  1. -- This VHDL was converted fromVerilogusing the

  2. -- IcarusVerilog VHDL CodeGenerator11.0(devel) (s20150603-612-ga9388a89)


  3. library ieee;

  4. use ieee.std_logic_1164.all;

  5. use ieee.numeric_std.all;


  6. -- GeneratedfromVerilogmodule led_demo (led_demo.v:1)

  7. entity led_demo is

  8. port (

  9. clk : in std_logic;

  10. led : out std_logic;

  11. rst_n : in std_logic

  12. );

  13. end entity;


  14. -- GeneratedfromVerilogmodule led_demo (led_demo.v:1)

  15. architecture from_verilog of led_demo is

  16. signal led_Reg : std_logic;

  17. signal cnt : unsigned(7 downto 0); -- Declared at led_demo.v:8

  18. begin

  19. led <= led_Reg;


  20. -- Generatedfrom always process in led_demo (led_demo.v:10)

  21. process (clk) is

  22. begin

  23. if rising_edge(clk) then

  24. if(not rst_n) = '1'then

  25. cnt <= X"00";

  26. else

  27. ifResize(cnt, 32) >= X"0000000a"then

  28. cnt <= X"00";

  29. else

  30. cnt <= cnt + X"01";

  31. endif;

  32. endif;

  33. endif;

  34. end process;


  35. -- Generatedfrom always process in led_demo (led_demo.v:20)

  36. process (clk) is

  37. begin

  38. if rising_edge(clk) then

  39. if(not rst_n) = '1'then

  40. led_Reg <= '0';

  41. else

  42. ifResize(cnt, 32) = X"0000000a"then

  43. led_Reg <= not led_Reg;

  44. endif;

  45. endif;

  46. endif;

  47. end process;

  48. end architecture;

7. VHDL文件的编译和仿真

如果你还和编译Verilog一样,使用 iverilog led_dmeo.v来编译VHDL文件的话,那么会提示有语法错误,这是正常的,因为Verilog和VHDL是不同的语法规则,不能使用Verilog的标准来检查VHDL文件的语法。需要添加 -g2012参数来对VHDL文件进行编译,如 iverilog-g2012 led_demo.vhd,和Verilog一样,同样也支持Testbech文件的编译和仿真,当然需要编写对应的VHDL Testbench文件。

8. 批处理文件一键执行

通过批处理文件,可以简化编译仿真的执行过程,直接一键执行编译和仿真。

新建文本文档,输入以下内容:

  1. echo "开始编译"

  2. iverilog -o wave led_demo.v led_demo_tb.v

  3. echo "编译完成"

  4. vvp -n wave -lxt2

  5. echo "生成波形文件"

  6. cp wave.vcd wave.lxt

  7. echo "打开波形文件"

  8. gtkwave wave.lxt

文件扩展名需要更改,Windows系统保存为.bat文件,Linux系统保存为.sh文件。Windows直接双击运行,Linux在终端执行。

9. 总结

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

10. 参考资料

文章部分内容参考自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

  • 电路板上的这些标志你都知道是什么含义吗?

  • 《手把手教你设计CPU——RISC-V处理器》读书笔记

  • 详解串行通信协议及其FPGA实现(一)

  • 详解串行通信协议及其FPGA实现(二)

  • Jlink使用技巧系列教程索引

  • 手把手教你制作Jlink-OB调试器(含原理图、PCB、外壳、固件)


  • 我的博客:www.wangchaochao.top

  • 我的公众号:mcu149

由于微信文章不支持超链接,文中出现的软件、程序等文件下载,可以点击"阅读原文",跳转到我的博客文章进行下载。


原创不易,如果觉得我的文章对你有所帮助,可以随手点“好看”分享,你的支持将是我持续更新的动力。


电子电路开发学习 单片机点灯小能手,电子行业从业者。开发板评测、嵌入式开源项目分享、学习笔记记录。可能不会经常更新,但每一篇都是精心编写。
评论
  • 随着全球向绿色能源转型的加速,对高效、可靠和环保元件的需求从未如此强烈。在这种背景下,国产固态继电器(SSR)在实现太阳能逆变器、风力涡轮机和储能系统等关键技术方面发挥着关键作用。本文探讨了绿色能源系统背景下中国固态继电器行业的前景,并强调了2025年的前景。 1.对绿色能源解决方案日益增长的需求绿色能源系统依靠先进的电源管理技术来最大限度地提高效率并最大限度地减少损失。固态继电器以其耐用性、快速开关速度和抗机械磨损而闻名,正日益成为传统机电继电器的首选。可再生能源(尤其是太阳能和风能
    克里雅半导体科技 2025-01-10 16:18 325浏览
  •   在信号处理过程中,由于信号的时域截断会导致频谱扩展泄露现象。那么导致频谱泄露发生的根本原因是什么?又该采取什么样的改善方法。本文以ADC性能指标的测试场景为例,探讨了对ADC的输出结果进行非周期截断所带来的影响及问题总结。 两个点   为了更好的分析或处理信号,实际应用时需要从频域而非时域的角度观察原信号。但物理意义上只能直接获取信号的时域信息,为了得到信号的频域信息需要利用傅里叶变换这个工具计算出原信号的频谱函数。但对于计算机来说实现这种计算需要面对两个问题: 1.
    TIAN301 2025-01-14 14:15 108浏览
  • 新年伊始,又到了对去年做总结,对今年做展望的时刻 不知道你在2024年初立的Flag都实现了吗? 2025年对自己又有什么新的期待呢? 2024年注定是不平凡的一年, 一年里我测评了50余块开发板, 写出了很多科普文章, 从一个小小的工作室成长为科工公司。 展望2025年, 中国香河英茂科工, 会继续深耕于,具身机器人、飞行器、物联网等方面的研发, 我觉得,要向未来学习未来, 未来是什么? 是掌握在孩子们生活中的发现,和精历, 把最好的技术带给孩子,
    丙丁先生 2025-01-11 11:35 457浏览
  • 01. 什么是过程能力分析?过程能力研究利用生产过程中初始一批产品的数据,预测制造过程是否能够稳定地生产符合规格的产品。可以把它想象成一种预测。通过历史数据的分析,推断未来是否可以依赖该工艺持续生产高质量产品。客户可能会要求将过程能力研究作为生产件批准程序 (PPAP) 的一部分。这是为了确保制造过程能够持续稳定地生产合格的产品。02. 基本概念在定义制造过程时,目标是确保生产的零件符合上下规格限 (USL 和 LSL)。过程能力衡量制造过程能多大程度上稳定地生产符合规格的产品。核心概念很简单:
    优思学院 2025-01-12 15:43 522浏览
  • 数字隔离芯片是现代电气工程师在进行电路设计时所必须考虑的一种电子元件,主要用于保护低压控制电路中敏感电子设备的稳定运行与操作人员的人身安全。其不仅能隔离两个或多个高低压回路之间的电气联系,还能防止漏电流、共模噪声与浪涌等干扰信号的传播,有效增强电路间信号传输的抗干扰能力,同时提升电子系统的电磁兼容性与通信稳定性。容耦隔离芯片的典型应用原理图值得一提的是,在电子电路中引入隔离措施会带来传输延迟、功耗增加、成本增加与尺寸增加等问题,而数字隔离芯片的目标就是尽可能消除这些不利影响,同时满足安全法规的要
    华普微HOPERF 2025-01-15 09:48 78浏览
  • ARMv8-A是ARM公司为满足新需求而重新设计的一个架构,是近20年来ARM架构变动最大的一次。以下是对ARMv8-A的详细介绍: 1. 背景介绍    ARM公司最初并未涉足PC市场,其产品主要针对功耗敏感的移动设备。     随着技术的发展和市场需求的变化,ARM开始扩展到企业设备、服务器等领域,这要求其架构能够支持更大的内存和更复杂的计算任务。 2. 架构特点    ARMv8-A引入了Execution State(执行状
    丙丁先生 2025-01-12 10:30 466浏览
  • 随着数字化的不断推进,LED显示屏行业对4K、8K等超高清画质的需求日益提升。与此同时,Mini及Micro LED技术的日益成熟,推动了间距小于1.2 Pitch的Mini、Micro LED显示屏的快速发展。这类显示屏不仅画质卓越,而且尺寸适中,通常在110至1000英寸之间,非常适合应用于电影院、监控中心、大型会议、以及电影拍摄等多种室内场景。鉴于室内LED显示屏与用户距离较近,因此对于噪音控制、体积小型化、冗余备份能力及电气安全性的要求尤为严格。为满足这一市场需求,开关电源技术推出了专为
    晶台光耦 2025-01-13 10:42 498浏览
  • 食物浪费已成为全球亟待解决的严峻挑战,并对环境和经济造成了重大影响。最新统计数据显示,全球高达三分之一的粮食在生产过程中损失或被无谓浪费,这不仅导致了资源消耗,还加剧了温室气体排放,并带来了巨大经济损失。全球领先的光学解决方案供应商艾迈斯欧司朗(SIX:AMS)近日宣布,艾迈斯欧司朗基于AS7341多光谱传感器开发的创新应用来解决食物浪费这一全球性难题。其多光谱传感解决方案为农业与食品行业带来深远变革,该技术通过精确判定最佳收获时机,提升质量控制水平,并在整个供应链中有效减少浪费。 在2024
    艾迈斯欧司朗 2025-01-14 18:45 59浏览
  • PNT、GNSS、GPS均是卫星定位和导航相关领域中的常见缩写词,他们经常会被用到,且在很多情况下会被等同使用或替换使用。我们会把定位导航功能测试叫做PNT性能测试,也会叫做GNSS性能测试。我们会把定位导航终端叫做GNSS模块,也会叫做GPS模块。但是实际上他们之间是有一些重要的区别。伴随着技术发展与越发深入,我们有必要对这三个词汇做以清晰的区分。一、什么是GPS?GPS是Global Positioning System(全球定位系统)的缩写,它是美国建立的全球卫星定位导航系统,是GNSS概
    德思特测试测量 2025-01-13 15:42 491浏览
  • 随着通信技术的迅速发展,现代通信设备需要更高效、可靠且紧凑的解决方案来应对日益复杂的系统。中国自主研发和制造的国产接口芯片,正逐渐成为通信设备(从5G基站到工业通信模块)中的重要基石。这些芯片凭借卓越性能、成本效益及灵活性,满足了现代通信基础设施的多样化需求。 1. 接口芯片在通信设备中的关键作用接口芯片作为数据交互的桥梁,是通信设备中不可或缺的核心组件。它们在设备内的各种子系统之间实现无缝数据传输,支持高速数据交换、协议转换和信号调节等功能。无论是5G基站中的数据处理,还是物联网网关
    克里雅半导体科技 2025-01-10 16:20 444浏览
  • 流量传感器是实现对燃气、废气、生活用水、污水、冷却液、石油等各种流体流量精准计量的关键手段。但随着工业自动化、数字化、智能化与低碳化进程的不断加速,采用传统机械式检测方式的流量传感器已不能满足当代流体计量行业对于测量精度、测量范围、使用寿命与维护成本等方面的精细需求。流量传感器的应用场景(部分)超声波流量传感器,是一种利用超声波技术测量流体流量的新型传感器,其主要通过发射超声波信号并接收反射回来的信号,根据超声波在流体中传播的时间、幅度或相位变化等参数,间接计算流体的流量,具有非侵入式测量、高精
    华普微HOPERF 2025-01-13 14:18 482浏览
  • 根据Global Info Research(环洋市场咨询)项目团队最新调研,预计2030年全球无人机电池和电源产值达到2834百万美元,2024-2030年期间年复合增长率CAGR为10.1%。 无人机电池是为无人机提供动力并使其飞行的关键。无人机使用的电池类型因无人机的大小和型号而异。一些常见的无人机电池类型包括锂聚合物(LiPo)电池、锂离子电池和镍氢(NiMH)电池。锂聚合物电池是最常用的无人机电池类型,因为其能量密度高、设计轻巧。这些电池以输出功率大、飞行时间长而著称。不过,它们需要
    GIRtina 2025-01-13 10:49 182浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦