引言

最近刚接触数字逻辑这门课,需要用到Verilog并配套Vivado编程,但是本人觉得Vivado内的操作较为繁琐,并且课上对Verilog涉及不多,容易导致新手在实际编写时遇到各种问题。

故本文将描述在VSCode中配置Verilog仿真的方法,同时补充对TestBench文件的讲解,希望可以通过VSCode更简便的实现Verilog仿真。

本质

利用iVerilogGTKWave两个开源软件。

iVerilog负责编译文件,GTKWave负责查看仿真波形。

故本质上可以通过终端命令操作,插件只是简化了操作步骤。

准备工作

1. 安装iVerilog(附带安装GTKWave)

2. 在VSCode中安装Digital IDE插件

VS仿真STemWin vscode verilog仿真_VS仿真STemWin

3. 在插件设置中,配置iVerilog和GTKWave的路径(电脑已经安装Vivado的,可以顺便配置Vivado的路径,以实现实时的语法纠错)

操作步骤

一、编写Verilog代码

以一位全加器做示例,文件名:full_adder.v

module full_adder(Ai,Bi,Ci,Si,Ciout);
    input        Ai;           //输入端口
    input        Bi;           //输入端口
    input        Ci;           //低位进位,输入端口
    output     Si;             //本位和,输出端口
    output   Ciout;            //向高位进位,输出端口
    assign   Si = Ci^Ai^Bi;
    assign   Ciout = Ai & Bi|(Ai^Bi) & Ci;
endmodule

二、编写简单的TestBench文件

关于TestBench理解

TestBench的直译是“测试台”,我将它理解为一种配置文件,在这个文件里面,我们对之前写好的模块进行实例化,并且编写测试的数据,在其中还可以设置仿真时的频率等等……

所以这个文件本质是为后续的仿真服务的

Digital IDE插件自己也有产生testbench的命令,不过也需要手动添加测试数据,故本文尝试自己编写,这样也可以忽略一些新手暂时用不到的配置。

步骤

        1. 设置timescale

  • 格式: `timescale time_unit / time_precision
  • 反引号 ` 相当于C语言里的#号
  • time_unit表示仿真时间的单位
  • time_precision表示仿真时间的精度

        2. 写出与testbench文件重名的module

        3. 把例化所用到的变量列出来

        4. 例化模块

        5. 编写测试数据

  • dumpfile("name.vcd"); 用于产生相应name.vcd波形文件
  • 注意延时输入以产生方波(#号加时间单位)

注意事项

波形文件要命名为wave.vcd,因为插件的simulate指令默认打开wave.vcd

testbench文件(tb_full_adder.v)

`timescale 1ps/1ps                 // 1.设置timescale,时间单位可设为1ps,精度1ps
`include "full_adder.v"            //   有时候编译提示需要include头文件
                                   //   `include相当于C里的#include

module tb_full_adder;              // 2.写出与testbench重名的module

    reg Ai, Bi, Ci;                // 3.列出例化所用到的变量
    wire Si, Ciout;

    full_adder name(               // 4.例化full_adder.v里的全加器模块
        .Ai(Ai),
        .Bi(Bi),
        .Ci(Ci),
        .Si(Si),
        .Ciout(Ciout));

    initial begin                  // 5.下面开始编写测试数据:

        $dumpfile("wave.vcd");     //   产生波形文件的命令
        $dumpvars;                 //   使所有变量都参与仿真的命令

        Ai=1'b0; Bi=1'b0; Ci=1'b0; // 6.以一个时间单位(#1),本例中即1ps的间隔输入测试数据
        #1  Ai=1'b0; Bi=1'b0; Ci=1'b1;
        #1  Ai=1'b0; Bi=1'b1; Ci=1'b0;
        #1  Ai=1'b0; Bi=1'b1; Ci=1'b1;
        #1  Ai=1'b1; Bi=1'b0; Ci=1'b0;
        #1  Ai=1'b1; Bi=1'b0; Ci=1'b1;
        #1  Ai=1'b1; Bi=1'b1; Ci=1'b0;
        #1  Ai=1'b1; Bi=1'b1; Ci=1'b1;
        #1;
    end
endmodule

三、模拟仿真

右键testbench文件,选择“simulate”

弹出窗口后找到相应的变量,缩放观察波形


simulate操作步骤