我目前正在尝试弄清楚如何将 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 在使用此过程时显示波形,但事实并非如此。