iVerilog和GTKWave是一套非常轻量的Verilog仿真工具。由于最近将生产力平台迁移到Ubuntu,在此记录Linux下该软件的使用。

安装

在Debian/Ubuntu的apt软件源里已包含该软件,直接使用apt安装即可。

apt-get update && apt-get install iverilog gtkwave

仿真

以一个输出等占空比的10分频器为例(输出时钟频率是输入时钟频率的1/10,输出脉冲占空比50%)。
编写Verilog文件如下,命名为FreqDiv.v:

module FreqDiv(
    Clk,
    Reset_n,
    f_Out);

    input Clk;
    input Reset_n;
    output reg f_Out;

    reg [2:0] Counter; //3bit is enough to represent 0~7

    always @ (posedge Clk)
    begin
        if(!Reset_n)
            Counter <= 0;
        else if(Counter >= 4'd4)
            Counter <= 0;
        else
            Counter <= Counter + 1;
    end

    always @ (posedge Clk)
    begin
        if(!Reset_n)
            f_Out <= 0;
        else if(Counter == 4'd4)
            f_Out <= !f_Out;
    end

endmodule

该分频器中,计数从0开始计到4,每完成一次计数,输出寄存器翻转一次,从而实现10分频。
编写testbench文件如下,命名为FreqDiv_tb.v:

`timescale 1ns/1ps

module FreqDiv_tb;

// Module Inputs
reg Clk;
reg Reset_n;

// Module Outputs
wire f_Out;

initial
begin
    Clk = 1'b0;
    Reset_n = 1'b0;
end

initial
begin
    #10
    Reset_n = 1'b1;
    #500
    $stop;
end

always @(Clk)
begin
    #1
    Clk <= !Clk;
end

FreqDiv FreqDiv_ins0 (
    // Inputs
    .Clk(Clk),
    .Reset_n(Reset_n),
    
    // Outputs
    .f_Out(f_Out)
);

/*iVerilog */
// This code is only used for iverilog
initial
begin
    $dumpfile("wave.vcd");        //filename of generated .vcd which stores the signal waves
    $dumpvars(0, FreqDiv_tb);     //the same as the filename of testbench
end
/*iVerilog */

endmodule

testbench本身也是一个Verilog文件,Verilog中的语法在这里同样可以使用。在testbench中,被测试模块的输入信号由reg控制,为了观测输出信号,输出由wire引出。针对iVerilog仿真,需要把仿真变量dump出来,便有了dumpfile和dumpvars部分。
编写调用iVerilog和GTKWave的测试脚本如下,该文件命名为build.sh:

#!/bin/bash
iverilog -o wave *.v
ret=$?
if [ $ret -ne 0 ];
then
    echo "iVerilog returned error code $ret"
    exit 1;
fi
vvp -n wave -lxt2
ret=$?
if [ $ret -ne 0 ];
then
    echo "vvp returned error code $ret"
    exit 1;
fi
gtkwave wave.vcd

通过chmod +x build.sh以后,每次改动文件就可以通过./build.sh命令进行仿真。如果脚本正常,仿真得到的波形显示窗口会自动跳出。
如果verilog文件有语法错误,该脚本会接收到iverilog和vvp返回的错误码,并中断执行。根据仿真软件返回的提示进行修改即可。

标签: Linux, Verilog

添加新评论