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

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

3天内不再提示

verilog仿真工具编译

FPGA之家 来源:FPGA之家 作者:FPGA之家 2022-08-15 09:11 次阅读

Icarus Verilog(以下简称iverilog )号称“全球第四大”数字芯片仿真器,也是一个完全开源的仿真器。由于Synopsys、CadenceMentor版权的关系,国外很多高校在数字芯片设计的教学中都采用iverilog。 GTKWave是一个开源的波形文件察看工具,支持Verilog VCD/EVCD文件格式。因此,通过“iverilog +gtkwave”的方式,可以很方便地实现商用仿真器的功能。 本文为我的学生整理自 iverilog 和 gtkwave 官方网站。 介绍 iverilog Icarus Verilog是一个verilog仿真工具. 以编译器的形式工作, 将以verilog编写的源代码编译为某种目标格式. 如果要进行仿真的话, 它可以生成一个叫做vvp的中间格式. 这个格式可以由其所附带的vvp命令执行. gtkwave wave viewer. 可以用于查看标准的verilog VCD/EVCD, 以及其他的一些格式的波形文件。 安装 iverilog

linux a. 包管理器安装下载:sudo pacman -S gtkwave b. 从上面的链接下载源码, 然后编译

使用 1. 示例:


1//adder_rtl.v 2moduleadder(clk,rst_n,a,b,c); 3input[3:0]a; 4input[3:0]b; 5output[7:0]c; 6inputclk,rst_n; 7 8wire[3:0]a; 9wire[3:0]b; 10wire[7:0]c; 11 12always@(posedgeclkornegedgerst_m)begin 13if(rst_n==1'b0) 14c<= 8'b0; 15        else 16            c <= a+b; 17    end 18endmodule 2. 编译:

1iverlogadder_rtl.v  8ce86450-1c2f-11ed-ba43-dac502259ad0.png 抄错了. damn.

1moduleadder(clk,rst_n,a,b,c); 2input[3:0]a; 3input[3:0]b; 4output[7:0]c; 5inputclk,rst_n; 6 7wire[3:0]a; 8wire[3:0]b; 9reg[7:0]c; 10 11always@(posedgeclkornegedgerst_n)begin 12if(rst_n==1'b0) 13c<= 8'b0; 14        else 15            c <= a+b; 16    end 17endmodule 3. 编译: 1iverlogadder_rtl.v  8d03c538-1c2f-11ed-ba43-dac502259ad0.png 无事发生. tb:

1//adder_tb.v 2`timescale1ns/1ns 3moduleadder_tb(); 4reg[3:0]a; 5reg[3:0]b; 6wire[7:0]c; 7 8regclk,rst_n; 9 10adderDUT( 11.clk(clk), 12.rst_n(rst_n), 13.a(a), 14.b(b), 15.c(c) 16); 17 18alwaysbegin 19#10clk=0; 20#10clk=1; 21end 22 23initialbegin 24rst_n=1; 25test(4'b1111,4'b1111,5'b11110); 26$finish; 27end 28tasktest; 29input[3:0]in; 30input[3:0]in2; 31input[7:0]e; 32begin 33a=in; 34b=in2; 35@(posedgeclk); 36@(negedgeclk); 37if(c==e)begin 38$display("Itworks"); 39endelsebegin 40$display("opps%d+%d~=%d,expect%d",in,in2,c,e); 41end 42end 43endtask 44endmodule 4. 编译运行:

1iverilogadder_rtl.vadder_tb.v 8d449798-1c2f-11ed-ba43-dac502259ad0.png8d558418-1c2f-11ed-ba43-dac502259ad0.png   5. 使用-o选项指定输出文件的名称

1iverilogadder_rtl.vadder_tb.v-oadder_test 8d69cc70-1c2f-11ed-ba43-dac502259ad0.png   6. 在tb中添加dump:

1initialbegin 2$dumpfile("wave.vcd");//指定用作dumpfile的文件 3$dumpvars;//dumpallvars 4end 7. 重新编译运行一遍, 生成了一个vcd文件, 使用gtkwave查看. 8d7ddac6-1c2f-11ed-ba43-dac502259ad0.png8d92c7ec-1c2f-11ed-ba43-dac502259ad0.png8daf612c-1c2f-11ed-ba43-dac502259ad0.png   iverilog的一些选项:

-D: 定义宏

-P: 覆盖root module中的一个参数的值

-E: 只预处理(进行宏替换), 不编译

-g1995, -g2001, -g2005 ...: 选择支持的verilog语言版本.

-I includedir: 指定(添加)verilog中include指令的搜索路径

-s topmodule : 指定要建立的顶层模块. 默认是没有被实例化的哪些module

VPI: Verilog Prodecure Interface(VPI), 最开始也称作PLI 2.0, 一个主要面向C语言接口. 可以让行为级别的Verilog代码调用C函数, 让C函数调用标准Verilog系统函数.


1//adder.c 2#include 3 4staticintsum_compiletf(char*user_data) 5{ 6fprintf(stderr,"Yes,youcompiledme "); 7return0; 8} 9 10staticintsum(char*user_data) 11{ 12vpiHandlesystfref,args_iter,argh; 13//typedefstructt_vpi_values_vpi_value 14structt_vpi_valueargval; 15unsignedintvalue,value2; 16charres[1024]; 17 18systfref=vpi_handle(vpiSysTfCall,NULL); 19args_iter=vpi_iterate(vpiArgument,systfref);//迭代所有参数. 20 21argh=vpi_scan(args_iter);//获取下一个参数 22argval.format=vpiIntVal;//设定格式为int 23vpi_get_value(argh,&argval);//获取参数值 24value=argval.value.integer;//读取获取到的参数值 25 26argh=vpi_scan(args_iter);//获取下一个参数 27argval.format=vpiHexStrVal;//以hex格式读入 28vpi_get_value(argh,&argval); 29sscanf(argval.value.str,"%x",&value2);//将hexstr格式读入的值转换为int 30 31argh=vpi_scan(args_iter);//获取第三个参数 32argval.format=vpiHexStrVal;//设置格式为hexstr,verilog读取的时候会自动转换的. 33sprintf(res,"%x",value+value2);//在C里计算两个值的和,并将其转换为hex格式的字符串 34 35argval.value.str=res; 36vpi_put_value(argh,&argval,0,vpiNoDelay);//设置第三个参数的值 37 38vpi_put_value(systfref,&argval,0,vpiNoDelay); 39vpi_free_object(args_iter); 40return0; 41} 42 43 44//注册$sum 45voidsum_register(){ 46s_vpi_systf_datatf_data; 47 48tf_data.type=vpiSysTask;//类型.还有一个是SysFunc 49tf_data.tfname="$sum";//在verilog中调用的名称 50tf_data.calltf=sum;//被verilog调用时调用的函数 51tf_data.compiletf=sum_compiletf;//被编译时调用的函数 52tf_data.sizetf=0;//不知道 53tf_data.user_data=0;//不知道 54vpi_register_systf(&tf_data);//注册 55} 56 57 58 59//在这个函数数组里的函数会自动被调用. 60void(*vlog_startup_routines[])()={ 61sum_register, 620 63}; 修改tb来调用$sum:

1//adder_tb.v 2`timescale1ns/1ns 3moduleadder_tb(); 4reg[3:0]a; 5reg[3:0]b; 6wire[7:0]c; 7 8regclk,rst_n; 9 10integeri,n,nf; 11 12adderDUT( 13.clk(clk), 14.rst_n(rst_n), 15.a(a), 16.b(b), 17.c(c) 18); 19 20alwaysbegin 21#10clk=0; 22#10clk=1; 23end 24 25initialbegin 26$display("============================="); 27$display("Tbstartathere"); 28rst_n=1; 29n=0; 30nf=0; 31//$test($random%4,2); 32for(i=0;i< 20; i++) 33                     test($urandom%5'b10000,$urandom%5'b10000); 34              $display("%d total, %dfail", n, nf); 35              $finish; 36       end 37       task test; 38              input [3:0] in; 39              input [3:0] in2; 40              begin: test 41                     reg [7:0] e; 42                     a = in; 43                     b = in2; 44            $sum(a,b,e); // HERE 45                     @(posedge clk); 46                     @(negedge clk); 47                     n = n + 1; 48                     if (c == e) begin 49                            $display("Itworks, %d + %d = %d", in, in2, e); 50                     end else begin 51                            nf = nf + 1; 52                            $display("opps%d + %d ~= %d, expect %d", in, in2, c, e); 53                     end 54              end 55       endtask 56 57       // initial begin 58              //$dumpfile("wave.vcd"); 59              // $dumpvars; 60       // end 61endmodule 编译运行:

1iverilogadder_rtl.vadder_tb.v-oadder.vvp 2iverilog-vpiadder.c 3vvp-M.-madderadder.vvp iverilog-vpi: 自带的帮助生成库的脚本 -M path: 将path加入定位VPI模块的路径, .: 当前路径 -m module: 告诉vvp在执行simulation之前加载指定的module. 8dbbf87e-1c2f-11ed-ba43-dac502259ad0.png 
审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1343

    浏览量

    109970
  • 编译
    +关注

    关注

    0

    文章

    652

    浏览量

    32800
  • 仿真工具
    +关注

    关注

    0

    文章

    34

    浏览量

    10785

原文标题:一文学会使用全球第四大数字芯片仿真器iverilog!

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

收藏 人收藏

    评论

    相关推荐

    FPGA Verilog编译和Syntesi工具怎么使用

    嗨,我是FPGA和FPGA的新手。 HDL(Verilog)也是这里的新论坛。刚从Pargue(捷克共和国)发布我的Hello我希望编译位文件作为练习(由Wirth ETH Zurig大学教授
    发表于 05-20 15:35

    GAL编译工具

    GAL编译工具 Atmel提供的GAL编译工具 4.8a版本
    发表于 04-14 15:42 83次下载

    基于Verilog的顺序状态逻辑FSM的设计与仿真

    基于Verilog的顺序状态逻辑FSM的设计与仿真  硬件描述语言Verilog为数字系统设计人员提供了一种在广泛抽象层次上描述数字系统的方式,同时,为计算机辅助设计工具
    发表于 02-04 09:32 1855次阅读
    基于<b class='flag-5'>Verilog</b>的顺序状态逻辑FSM的设计与<b class='flag-5'>仿真</b>

    北大微电子verilog讲义课件

    介绍Cadence Verilog仿真器, 内容包括: 设计的编译仿真 源库(source libraries)的使用 用Verilog-
    发表于 05-28 15:23 402次下载
    北大微电子<b class='flag-5'>verilog</b>讲义课件

    Android反编译工具

    Android反编译工具
    发表于 12-17 15:59 21次下载

    基于STC-TOOL_STC单片机编译(汇编)编程(烧录)仿真工具说明书

    基于STC-TOOL_STC单片机编译(汇编)编程(烧录)仿真工具说明书
    发表于 10-16 10:11 28次下载
    基于STC-TOOL_STC单片机<b class='flag-5'>编译</b>(汇编)编程(烧录)<b class='flag-5'>仿真</b><b class='flag-5'>工具</b>说明书

    verilog编译指令_verilog编译器指示语句(数字IC)

    以`(反引号)开始的某些标识符是编译器指令。在Verilog 语言编译时,特定的编译器指令在整个编译过程中有效(
    的头像 发表于 03-23 13:40 1.5w次阅读
    <b class='flag-5'>verilog</b><b class='flag-5'>编译</b>指令_<b class='flag-5'>verilog</b><b class='flag-5'>编译</b>器指示语句(数字IC)

    Verilog HDL基础语法入门

    简单介绍Verilog HDL语言和仿真工具
    发表于 05-06 16:17 618次下载

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

    本文将介绍如何使用Icarus Verilog+GTKWave来进行verilog文件的编译仿真。 Icarus Verilog Icar
    的头像 发表于 07-27 09:16 5299次阅读
    如何使用Icarus <b class='flag-5'>Verilog</b>+GTKWave来进行<b class='flag-5'>verilog</b>文件的<b class='flag-5'>编译</b>和<b class='flag-5'>仿真</b>

    Verilog HDL 编译器指令说明

    Verilog HDL 编译器指令 复杂一点的系统在进行设计或者验证时,都会用到一些编译器指令,那么什么是编译器指令?   Verilog
    的头像 发表于 11-03 09:31 3626次阅读
    <b class='flag-5'>Verilog</b> HDL <b class='flag-5'>编译</b>器指令说明

    vcs学习笔记(常用选项/仿真流程/代码覆盖率/综合后仿真/图一乐技巧)

    VCS是编译verilog仿真器,VCS先将verilog/systemverilog文件转化为C文件,在linux下编译生成的可执行文.
    的头像 发表于 05-23 16:04 9252次阅读

    使用开源verilog仿真工具进行文件的编译仿真

    Icarus VerilogIcarus Verilog极其小巧,支持全平台Windows+Linux+MacOS,并且源代码开源。通过tb文件可以生成对应的仿真波形数据文件。
    的头像 发表于 11-21 09:40 3068次阅读

    VCS编译选项:-y及+libext+

    VCS是一款常见的Verilog编译工具,它提供很多编译选项来控制编译过程及其输出。本文主要介绍以下两个
    的头像 发表于 05-29 14:46 1.2w次阅读

    介绍下Verilog系统完整的8种编译指令

    以反引号(`)开始的某些标识符是 Verilog 系统编译指令。编译指令为 Verilog 代码的撰写、编译、调试等提供了极大的便利。
    的头像 发表于 05-29 16:43 1710次阅读

    Verilog仿真激励举例

    Verilog 代码设计完成后,还需要进行重要的步骤,即逻辑功能仿真仿真激励文件称之为 testbench,放在各设计模块的顶层,以便对模块进行系统性的例化调用进行仿真
    的头像 发表于 06-02 11:35 1445次阅读
    <b class='flag-5'>Verilog</b><b class='flag-5'>仿真</b>激励举例