0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Windows上使用iverilog+gtkwave仿真

FPGA之家 来源:FPGA之家 2023-04-28 14:06 次阅读

使用Verilog编写好了功能模块以及对应的testbench之后,一般需要对其功能进行仿真测试。由于工作场合、必须使用正版软件,然而ModelSim的license又非常有限、经常出现的状况是一方在使用其进行仿真、另一方就不能够进行仿真了。

在这个情况下,可以有的选择包括:

1、继续等待别人用完,然后再使用ModelSim进行仿真;

2、使用集成在VIVADO里的simulation工具(ISE下自带的是ISim),基本可以胜任绝大多数的功能仿真任务;操作也很简单,直接Run Simulation就可以了;

3、使用开源的工具:iverilog+gtkwave工具。

下面对第三种方式的操作流程进行记录。系统环境为Windows7

从官网下载包含iverilog+GTKWave的安装包,地址为http://bleyer.org/icarus/。安装好之后开始逐步执行命令。(或者也可以将命令编写在一个脚本文件中。)

本文所仿真的verilog小实例如下,是一个简单的loadable四位加一计数器:(代码来自在学习testbench期间在网上找到的Lattice公司的“A Verilog HDL Test Bench Primer”手册中的示例代码)

//-------------------------------------------------
// File: count16.v
// Purpose: Verilog Simulation Example
//-------------------------------------------------
`timescale 1 ns / 100 ps
module count16 (count, count_tri, clk, rst_l, load_l, enable_l, cnt_in,
oe_l);
output [3:0] count;
output [3:0] count_tri;
input clk;
input rst_l;
input load_l;
input enable_l;
input [3:0] cnt_in;
input oe_l;
reg [3:0] count;
// tri-state buffers
assign count_tri = (!oe_l) ? count : 4'bZZZZ;
// synchronous 4 bit counter
always @ (posedge clk or negedge rst_l)
    begin
        if (!rst_l) begin
            count <= #1 4'b0000;
        end
        else if (!load_l) begin
            count <= #1 cnt_in;
        end
        else if (!enable_l) begin
            count <= #1 count + 1;
        end
    end
endmodule //of count16

为其编写的testbench文件如下:

//-------------------------------------------------
// File: cnt16_tb.v
// Purpose: Verilog Simulation Example
// Test Bench
//-----------------------------------------------------------
`timescale 1 ns / 100 ps
module cnt16_tb ();
//---------------------------------------------------------
// inputs to the DUT are reg type
reg clk_50;
reg rst_l, load_l, enable_l;
reg [3:0] count_in;
reg oe_l;
//--------------------------------------------------------
// outputs from the DUT are wire type
wire [3:0] cnt_out;
wire [3:0] count_tri;
//---------------------------------------------------------
// instantiate the Device Under Test (DUT)
// using named instantiation
count16 U1 ( .count(cnt_out),
.count_tri(count_tri),
.clk(clk_50),
.rst_l(rst_l),
.load_l(load_l),
.cnt_in(count_in),
.enable_l(enable_l),
.oe_l(oe_l)
);
//----------------------------------------------------------
// create a 50Mhz clock
always
#10 clk_50 = ~clk_50; // every ten nanoseconds invert
//-----------------------------------------------------------
// initial blocks are sequential and start at time 0
initial
        begin            
            $dumpfile("cnt16_tb.vcd");
            $dumpvars(0,cnt16_tb);
        end

initial
begin
$display($time, " << Starting the Simulation >>");
clk_50 = 1'b0;
// at time 0
rst_l = 0;
// reset is active
enable_l = 1'b1;
// disabled
load_l = 1'b1;
// disabled
count_in = 4'h0;
oe_l = 4'b0;
// enabled
#20 rst_l = 1'b1;
// at time 20 release reset
$display($time, " << Coming out of reset >>");
@(negedge clk_50); // wait till the negedge of
// clk_50 then continue
load_count(4'hA);
// call the load_count task
// and pass 4'hA
@(negedge clk_50);
$display($time, " << Turning ON the count enable >>");
enable_l = 1'b0;
// turn ON enable
// let the simulation run,
// the counter should roll
wait (cnt_out == 4'b0001); // wait until the count
// equals 1 then continue
$display($time, " << count = %d - Turning OFF the count enable >>",
cnt_out);
enable_l = 1'b1;
#40;
// let the simulation run for 40ns
// the counter shouldn't count
$display($time, " << Turning OFF the OE >>");
oe_l = 1'b1;
// disable OE, the outputs of
// count_tri should go high Z.
#20;
$display($time, " << Simulation Complete >>");
$stop;
// stop the simulation
end
//--------------------------------------------------------------
// This initial block runs concurrently with the other
// blocks in the design and starts at time 0
/*initial
begin
// $monitor will print whenever a signal changes
// in the design
$monitor($time, " clk_50=%b, rst_l=%b, enable_l=%b, load_l=%b,
count_in=%h, cnt_out=%h, oe_l=%b, count_tri=%h", clk_50, rst_l,
enable_l, load_l, count_in, cnt_out, oe_l, count_tri);
end*/


//--------------------------------------------------------------
// The load_count task loads the counter with the value passed
task load_count;
    input [3:0] load_value;
    begin
        @(negedge clk_50);
        $display($time, " << Loading the counter with %h >>", load_value);
        load_l = 1'b0;
        count_in = load_value;
        @(negedge clk_50);
        load_l = 1'b1;
    end
endtask //of load_count


endmodule //of cnt16_tb

为了方便执行,编写了批处理脚本,如下:

set iverilog_path=C:iverilogin;
set gtkwave_path=C:iveriloggtkwavein;
set path=%iverilog_path%%gtkwave_path%%path%

set source_module=count16
set testbentch_module=cnt16_tb


iverilog -o "%testbentch_module%.vvp" %testbentch_module%.v %source_module%.v
vvp -n "%testbentch_module%.vvp"

set gtkw_file="%testbentch_module%.gtkw"
if exist %gtkw_file% (gtkwave %gtkw_file%) else (gtkwave "%testbentch_module%.vcd")

pause

首先,设置iverilog和GTKWave可执行文件路径到PATH。由于工作场合下、本人只是所使用电脑系统的普通用户权限、而不是管理员权限,所以不方便为本机系统添加环境变量,所以需要在开始执行上述操作。

然后设置两个变量,后面会使用

testbentch_module设置为testbench文件的模块名

source_module设置为DUT模块名

然后使用iverilog编译verilog

-o指定输出文件名,这里使用模块名+.vvp

之后指定源文件

在制定源文件的时候可以用通配符*,如本人用的批处理中通常使用这种方式指定RTL文件:set rtl_file="../rtl/*.v"。

然后使用vvp开始仿真,参数为上面iverilog的输出文件

之后开始仿真数据波形显示

设置了一个变量,为GTKWave保存文件的文件名,这里使用模块名+.gtkw

然后判断GTKWave保存文件是否存在,若存在则直接使用GTKWave打开该.gtkw文件,否则打开刚仿真生成的.vcd文件。

这里有两点需要注意:

1、vvp命令使用了-n选项是为了让testbench在执行完测试流程之后自动结束,也可以不在执行命令这里使用-n、而通过在testbench文件的initial块中添加"$finish"命令来结束。(testbentch中结束仿真推荐用$finish而不用$stop;因为$finish可以直接结束仿真并退出,而不需要手动退出,这样运行类似以上例子批处理后可以直接打开GTKWave窗口)

2、为了让vvp命令有输出,需要在testbench文件中额外添加一个initial块,在上面的代码中为:

initial
        begin            
            $dumpfile("cnt16_tb.vcd");
            $dumpvars(0,cnt16_tb);
        end

dumpfile的内容为输出的vcd文件名,可以随意指定,这里指定为testbench模块名;

dumpvar的参数需要为testbench的模块名。

添加了这两个命令之后就可以将生成的波性文件保存在本地。

在GTKWave中打开的仿真波形结果如下图所示:

b1b12b32-e583-11ed-ab56-dac502259ad0.png

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

Usage: iverilog [-ESvV] [-B base] [-c cmdfile|-f cmdfile]
                [-g1995|-g2001|-g2005|-g2005-sv|-g2009|-g2012] [-g]
                [-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)

此外,如果运行批处理需要在DOS窗口查看verilog中$display的打印,有时iverilog编译打印的信息较多时会导致部分信息无法查看,所以需要加大DOS窗口的高度:在DOS窗口标题栏右键->默认值->布局中设置屏幕缓冲区中高度为较大的值(如1000)即可。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 仿真
    +关注

    关注

    50

    文章

    3872

    浏览量

    132161
  • WINDOWS
    +关注

    关注

    3

    文章

    3440

    浏览量

    87144
  • Verilog
    +关注

    关注

    28

    文章

    1326

    浏览量

    109302
  • 计数器
    +关注

    关注

    32

    文章

    2121

    浏览量

    92983
  • 开源
    +关注

    关注

    3

    文章

    2985

    浏览量

    41718

原文标题:Windows上使用iverilog+gtkwave仿真

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    gtkwave界面每次都更新太麻烦?来个小技巧-v1

    迄今为止,大家都在吐槽gtkwave debug每次弹窗都会覆盖上一次弹窗设置好的排序和参数。下面我们分享一个可以暂时规避该问题的方法,聊以慰藉久被摧残的心~~。 (1)添加debug ,无论手动
    的头像 发表于 04-15 16:36 575次阅读
    <b class='flag-5'>gtkwave</b>界面每次都更新太麻烦?来个小技巧-v1

    E203用iverilog12仿真时,run_test一直卡怎么解决?

    求助!!一直卡在这里进行不下去了,请问大佬们这是为什么呀?每个步骤都是按照教程来的!iverilog用的12,ubuntu 20.04
    发表于 01-10 07:07

    树莓派在windows仿真的方法

    树莓派在windows仿真的方法是一个超简单的方式,其实是QEMU模拟器+树莓派系统的‘傻瓜包’”,压缩文件,500m。解压后,run.bat[hide]下载地址: http://sourceforge.net/project
    发表于 06-29 16:03

    教你怎样一劳永逸解决Windows和MacOS等非Linux操作系统下的Spinal HDL环境安装问题

    /spinal-cocotb:1.6.1这条命令创建的容器里,有Java环境和Python环境,也有Scala的编译工具sbt和mill,还有verilator、iveriloggtkwave这些仿真
    发表于 07-04 15:29

    SpinalHDL是如何让仿真跑起来的

    一些比较贴合具体业务场景的测试条件下往往需要前后很多脚本或调用C模型来进行生成测试数据和最后的数据验证,构建case的便捷性稍显不足(在《FPGA图像处理—老细新说》一文中,这里的仿真测试如果用
    发表于 07-25 15:09

    基于Windows系统的SpinalHDL开发环境搭建步骤

    仿真工具使用verilator+gtkwave,为了便捷安装使用Iverilog软件(此软件集成GTKWave),安装verilator软件在wi
    发表于 10-24 15:40

    如何在ARM使用Clang for Windows进行编译

    Windows on Arm笔记本电脑编译C/C++应用程序。 此原生工具链意味着您可以在该设备为基于Arm的设备开发软件而不是在另一台主机上交叉编译或使用仿真来运行Clang的
    发表于 08-08 06:56

    在/vsim下执行make run_test SIM=iverilog时报错怎么解决?

    Error: VVP input file 10.3 can not be run with run time version 12.0 (stable) 求助大佬,在/vsim下执行make run_test SIM=iverilog时收到上面的报错,尝试重装iverilog
    发表于 08-12 08:29

    基于windows仿真光学遥感微秒实时通信

    介绍并实现了基于windows 仿真光学成像遥感器微秒精度实时通信的方法。描述了卫星有效载荷控制系统与光学成像遥感器实时通信的原理,以及在windows 环境下获取高精度时间的方
    发表于 09-24 10:56 6次下载

    基于Windows平台的分布式实时仿真系统

    提出了解决Windows下分布式仿真的两种方案:基于RTX的反射内存网分布式仿真和基于以太网的令牌环分布式仿真架构。并比较了两种架构与传统Windo
    发表于 03-22 17:30 83次下载
    基于<b class='flag-5'>Windows</b>平台的分布式实时<b class='flag-5'>仿真</b>系统

    Windows平台的分布式实时仿真系统

    Windows平台的分布式实时仿真系统
    发表于 10-31 09:20 10次下载
    <b class='flag-5'>Windows</b>平台的分布式实时<b class='flag-5'>仿真</b>系统

    如何使用Icarus Verilog+GTKWave来进行verilog文件的编译和仿真

    Windows+Linux+MacOS,并且源代码开源。通过tb文件可以生成对应的仿真波形数据文件,通过GTKWave可以查看仿真波形图,支持将Verilog转换为VHDL文件。 1.
    的头像 发表于 07-27 09:16 4664次阅读
    如何使用Icarus Verilog+<b class='flag-5'>GTKWave</b>来进行verilog文件的编译和<b class='flag-5'>仿真</b>

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

    如果你只是想检查Verilog文件的语法是否有错误,然后进行一些基本的时序仿真,那么Icarus Verilog 就是一个不错的选择。相比于各大FPGA...
    发表于 01-26 19:14 5次下载
    全平台轻量开源verilog<b class='flag-5'>仿真</b>工具<b class='flag-5'>iverilog+GTKWave</b>使用教程

    verilog仿真工具编译

    Icarus Verilog(以下简称iverilog )号称“全球第四大”数字芯片仿真器,也是一个完全开源的仿真器。
    的头像 发表于 08-15 09:11 5398次阅读

    利用vcs+verdi仿真工具蜂鸟E200系列处理器仿真分析

    开源RISC-V Hummingbird E203(蜂鸟E203)的仿真工具是开源的iverilog,这里利用vcs+verdi仿真工具进行仿真
    的头像 发表于 11-17 10:28 2120次阅读