轻量版verilog仿真平台:icarus verilog使用简介

作为一名系统软件工程师,需要对verilog语言有一定的了解,学习verilog过程中免不了要进行仿真。工程上常见的verilog仿真软件基本就是国外EDA三大厂的:Mentor公司的ModelSim,cadence公司的NC-Sim/NC-Verilog和Synopsys公司的VCS。
对于个人学习来讲,这些收费的大型软件并不是很适合。在此推荐一款轻量版的verilog仿真平台,很适合初学者及小型化仿真需求者:Icarus Verilog + gtkwave。前者可以认为是个仿真器,后者是个看波形的软件。
Icarus Verilog开源,可支持windows和linux。官网下载地址: http://bleyer.org/icarus/
Icarus Verilog的详细使用教程 如下:

Windows环境

  1. 安装软件: 软件下载地址 http://bleyer.org/icarus/
    新版本中软件带的有gtkwave。安装时,会默认安装。
    安装后,确认iverilog是否已经添加到系统变量中,如果没有,则手动添加一下 C:\iverilog\gtkwave\bin 和 C:\iverilog\bin (此处默认安装在C盘)
    Windows下也可以免安装,直接将别人的安装文件拷贝过来也能用。但也需要在系统变量里添加安装文件的路径。
    在这里插入图片描述

  2. 编写 Verilog代码和testbench。文章最后为一个应用实例。
    注意:testbench中需要以下两句,这两行主要是给gtkwave这个工具使用的,具体含义参考
    https://zhidao.baidu.com/question/13428173.html
    在这里插入图片描述

  3. 编译仿真
    a) Windows系统下,win +R ,输入cmd 打开命令行; cd 进入 .v文件所在的文件夹(此步骤也可以省略,但在b步骤中需要指定 文件路径)
    b) 执行 iverilog -o dsn icarus_example.v得到文件dsn. (此处是将testbench和verilog源代码写在了同一个.v文件中 )
    c) 执行 vvp dsn
    在这里插入图片描述

  4. 用gtkwave打开vcd仿真波形
    a) 执行 gtkwave test.vcd (vcd的名字是在testbench中命名的,此处为 test.vcd) 打开仿真波形
    在这里插入图片描述
    在这里插入图片描述

Ubuntu 环境

  1. 下载并安装软件,需要联网。在root权限下,
    执行 apt-get install Verilog
    执行 apt-get install gtkwave
  2. 编写 Verilog代码和testbench。
  3. 编译仿真 (同window环境)
    a) 执行 iverilog -o dsn icarus_example.v得到文件dsn.
    b) 执行 vvp dsn
  4. 用gtkwave打开vcd仿真波形
    a) 执行 gtkwave test.vcd (vcd的名字是在testbench中命名的,此处为 test.vcd) 打开仿真波形

附例源码 icarus_example.v

module encoder(binary_out,encoder_in,enable);

output [3:0] binary_out;
input enable;
input [15:0] encoder_in;
reg [3:0] binary_out;

always @ (enable or encoder_in)
    begin
        binary_out = 0;
        if(enable) begin
            if(encoder_in == 16'h0002) begin
                binary_out = 1;
            end if(encoder_in == 16'h0004) begin
                binary_out = 2;
            end if(encoder_in == 16'h0008) begin
                binary_out = 3;
            end if(encoder_in == 16'h0010) begin
                binary_out = 4;
            end if(encoder_in == 16'h0020) begin
                binary_out = 5;
            end if(encoder_in == 16'h0040) begin
                binary_out = 6;
            end if(encoder_in == 16'h0080) begin
                binary_out = 7;
            end if(encoder_in == 16'h0100) begin
                binary_out = 8;
            end if(encoder_in == 16'h0200) begin
                binary_out = 9;
            end if(encoder_in == 16'h0400) begin
                binary_out = 10;
            end if(encoder_in == 16'h0800) begin
                binary_out = 11;
            end if(encoder_in == 16'h1000) begin
                binary_out = 12;
            end if(encoder_in == 16'h2000) begin
                binary_out = 13;
            end if(encoder_in == 16'h4000) begin            
                binary_out = 14;
            end if(encoder_in == 16'h8000) begin
                binary_out = 15;
            end
        end
    end
endmodule




module encoder_te();
    
    reg enable;
    reg [15:0] encoder_in; 
    wire [3:0] binary_out;
    
    initial begin
        $dumpfile("test.vcd");  // vcd name   
        $dumpvars(0,encoder_te); // testbench module name
        
        $monitor("%g\t %b %b %b",
                $time,enable,encoder_in,binary_out);
                
        enable = 0;
        #5 enable = 1;
        #5 encoder_in = 16'h0004;
        #6 encoder_in = 16'h0040;
        #7 encoder_in = 16'h0400;
        #8 encoder_in = 16'h1000;
        #10 $finish;        
    end
    
    encoder en(binary_out,encoder_in,enable);
    
endmodule


参考Wiki http://iverilog.wikia.com/wiki/Main_Page

参考 使用方法
http://www.cnblogs.com/zhuangzhuang1988/archive/2012/03/30/2425052.html

发布了8 篇原创文章 · 获赞 0 · 访问量 193

猜你喜欢

转载自blog.csdn.net/zgcjaxj/article/details/104853081