使用VScode进行Verilog仿真和波形查看


前言

计组课程官方推荐的Verilog仿真工具是ISE和VCS,评测机使用ISE。

但是在尝试在win11的wslg上安装ISE后,虽然成功了,但是难用的一批,而且还有bug,仿真总是失败等问题。而课程虚拟机里面的VCS按照课程组提供的方法,又无法生成波形文件,查阅资料后也一筹莫展,弄的我一头雾水。于是开始寻求其他工具。

在经过不同关键词检索以后,终于看到了本校学长的知乎专栏,推荐了一个VScode上进行Verilog仿真的方法!安装不仅非常简单,而且使用也很简单,爆杀20G的ISE和安装繁琐的VCS!而且是一个开源的,跨平台的软件,简直就是神一般的存在!

下面的教程参考了学长的专栏

安装VScode

不会吧不会吧,不会有人看这篇文章却没有安装VScode吧。

安装iVerilog

iVerilog全称Icarus Verilog,官方下载方式在这里

安装的时候,基本上都可以随意,直接Next都行,不过记得添加PATH。就是一定要勾选“Add executable folders to the user PATH”

安装VScode插件

你需要安装以下几个插件:

  • Verilog-HDL/SystemVerilog/Bluespec SystemVerilog
  • Verilog HDL
  • Verilog Snippet
  • WaveTrace

前三个插件,提供代码高亮,代码补全,一键运行等功能。

第四个插件,提供波形查看。(下载iVerilog的时候应该有下载GTKWave,你也可以用这个软件查看波形)

插件设置

仅需要设置Verilog-HDL/SystemVerilog/Bluespec SystemVerilog插件

找到插件设置中的Verilog > Linting: Linter

在下拉菜单中选中iverilog即可

使用

写一端.v代码,然后写对应的testbench,然后在testbench里面,点击右上角的绿色的按钮,即可运行。

若想要生成波形文件,请在testbench中加上以下代码:

initial begin
    $dumpfile("*.vcd"); // * 是你希望产生的波形文件的名字
    $dumpvars;
end

注意:你必须在testbench的test运行结束之后,使用$finish;结束代码,否则波形文件不会结束,需要手动前往任务管理器,结束vvp.exe进程。

最后点开*.vcd文件就可以查看波形了(如果你下载了WaveTrace插件的话)

testbench怎么写我就不教了吧,下面给一个测试代码吧。

示例代码

// adder.v
`timescale 1ns/1ps
module adder (
  input clk,
  input [31:0] in1,
  input [31:0] in2,
  output reg [31:0] out
);

  always @(posedge clk) begin
    out <= in1 + in2;
  end

endmodule
// adder_tb.v
`timescale 1ns/1ps
`include "adder.v"
module adder_tb;
  // Dump waveform to file (it would be impossible to view wavefrom without
  // this task)
  initial begin
      $dumpfile("adder_wave.vcd");
    $dumpvars();
  end

  // Generate clock
  reg clk;
  initial clk = 0;
  always #10 clk = ~clk;

  // Input registers
  reg [31:0] a, b;
  wire [31:0] c;

  initial begin
    a = 0;
    b = 0;
    @(negedge clk);
    a = 32'h631;
    b = 341;
    @(negedge clk);
    $display("%d + %d = %d\n", a, b, c);
    a = 32'o1461;
    b = 0;
    @(negedge clk);
    $display("%d + %d = %d\n", a, b, c);

    #20;
    // Exit the simulation
    $finish;
  end

  // Device under test (our adder)
  adder dut(.clk(clk), .in1(a), .in2(b), .out(c));

endmodule

参考资料

  1. https://zhuanlan.zhihu.com/p/414308549

–57ad80b4cdcc5f9fca963214c77b67e7–


评论
  目录