0

我目前正在尝试弄清楚如何将 Verilator 与 GTKWave 一起使用来验证和调试 System Verilog 设计,但我遇到了一个问题。我设法让 Verilator 输出一个 .vcd 文件(位于 /tmp/trace.vcd),但是当我尝试使用 GTKwave 打开它时出现错误:

$ gtkwave /tmp/trace.vcd

GTKWave Analyzer v3.3.111 (w)1999-2020 BSI

[-1] start time.
[-1] end time.
VCD times range is equal to zero.  Exiting.

这个错误在我看来文件中没有任何数据,并且在文本编辑器中检查其内容并不能阻止这一点:

$ cat /tmp/trace.vcd 
$version Generated by VerilatedVcd $end
$date <timestamp is removed to keep my time zone private>
 $end
$timescale 1ps $end

 $scope module TOP $end
  $var wire  1 # clk $end
  $var wire  1 $ rst $end
  $var wire  5 % value [4:0] $end
  $scope module counter $end
   $var wire  1 # clk $end
   $var wire  1 $ rst $end
   $var wire  5 % value [4:0] $end
  $upscope $end
 $upscope $end
$enddefinitions $end

当我通过 GTKWave GUI 打开 .vcd 文件时,它只显示一个空的 GUI,进一步支持该文件是空的(奇怪的是,它在命令行上给出了一个错误,但不是通过 GUI。)。

我的代码基于通过获取示例的点点滴滴直到它编译来猜测要做什么(如果我直接尝试,来自 Verilator 存储库的跟踪示例会引发大量 C++ 错误),因此这不起作用并不特别令人惊讶,但我找不到任何文章可以更系统地解释跟踪应该如何在 Verilator 中工作,所以这并没有给我一个继续工作的方向。

以下是显示此错误的 MCVE 的文件:CMakeLists.txt

cmake_minimum_required(VERSION 3.8)
project(verilator_harness CXX)

find_package(verilator REQUIRED)

add_executable(countertestbench testbench.cpp)
verilate(countertestbench VERILATOR_ARGS --trace SOURCES counter.sv)

测试台.cpp:

#include <verilated.h>
#include <memory>
#include <iostream>
#include "Vcounter.h"
#include "verilated_vcd_c.h"

vluint64_t main_time = 0;

double sc_time_stamp(){
    return main_time;
}

int main(int argc, char** argv, char** env) {
    Verilated::traceEverOn(true);
    Verilated::commandArgs(argc, argv);

    auto top = std::unique_ptr<Vcounter>(new Vcounter());

    VerilatedVcdC *tfp = new VerilatedVcdC;
    top->trace(tfp, 1);
    tfp->open("/tmp/trace.vcd");

    top->rst = 1;

    while (!Verilated::gotFinish()) {
        if(main_time > 100){
            top->rst = 0;
        }

        top->clk = (main_time % 10) < 5;

        top->eval();

        ++main_time;
    }

    top->final();
    tfp->close();
    delete tfp;
    return 0;
}

计数器.sv:

module counter(
    input logic clk,
    input logic rst,
    output [4:0] value
);
    always_ff @(posedge clk) begin
        if(rst) begin
            value <= 5'b00000;
        end else begin
            value <= value + 1;
        end

        if(value == 5'b11111) $finish;
    end
endmodule

使用这些文件,我只需像普通 C++ 项目一样编译 CMake 项目,然后运行代码:

mkdir build
cd build
cmake ..
make -j8
./countertestbench
./countertestbench +tracing # using this +tracing, as is suggested in one of the example's makefiles, does not produce any change in output

如何检查通过 Verilator 模拟的 System Verilog 代码的波形?我希望 gtkwave 在使用此过程时显示波形,但事实并非如此。

4

0 回答 0