You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用std::unique_ptr包裹全局VerilatedFstC变量致程序退出崩溃求助

Verilator仿真中全局trace对象引发程序崩溃的问题

使用Verilator进行C++仿真开发时,遇到如下问题:当将VerilatedFstC的智能指针声明为全局变量时,程序运行崩溃;但将该变量移至main()函数内部后,程序运行正常。

崩溃的测试代码

#include "Vmux_2_1.h"
#include <memory>
#include <verilated.h>
#include <verilated_fst_c.h>

std::unique_ptr<VerilatedFstC> trace = std::make_unique<VerilatedFstC>();

int main() {
  std::unique_ptr<VerilatedContext> kContext =
      std::make_unique<VerilatedContext>();
  std::unique_ptr<Vmux_2_1> kTop = std::make_unique<Vmux_2_1>();

  kContext->traceEverOn(true);
  kTop->trace(trace.get(), 99);
  trace->open("waveform.fst");
  trace->close();

  return 0;
}

其中Vmux_2_1是Verilator生成的多路复用器类,代码未执行实际业务逻辑,但程序最终崩溃。

运行正常的代码

将trace变量移至main()函数内后,程序运行正常:

#include "Vmux_2_1.h"
#include <memory>
#include <verilated.h>
#include <verilated_fst_c.h>

int main() {
  std::unique_ptr<VerilatedContext> kContext =
      std::make_unique<VerilatedContext>();
  std::unique_ptr<VerilatedFstC> trace = std::make_unique<VerilatedFstC>();
  std::unique_ptr<Vmux_2_1> kTop = std::make_unique<Vmux_2_1>();

  kContext->traceEverOn(true);
  kTop->trace(trace.get(), 99);
  trace->open("waveform.fst");
  trace->close();

  return 0;
}

调试信息

使用clang和g编译均出现问题,调试时得到以下信息:

[New Thread 0x7ffff7a006c0 (LWP 519617)]
[New Thread 0x7ffff70006c0 (LWP 519618)]
[New Thread 0x7ffff66006c0 (LWP 519619)]
[New Thread 0x7ffff5c006c0 (LWP 519620)]
[New Thread 0x7ffff52006c0 (LWP 519621)]
[New Thread 0x7ffff48006c0 (LWP 519622)]
[New Thread 0x7ffff3e006c0 (LWP 519623)]
[New Thread 0x7ffff34006c0 (LWP 519624)]
[New Thread 0x7ffff2a006c0 (LWP 519625)]
[New Thread 0x7ffff20006c0 (LWP 519627)]
[New Thread 0x7ffff16006c0 (LWP 519628)]
[New Thread 0x7ffff0c006c0 (LWP 519629)]
[New Thread 0x7ffff02006c0 (LWP 519630)]
[New Thread 0x7fffef8006c0 (LWP 519631)]
[New Thread 0x7fffeee006c0 (LWP 519632)]
[Thread 0x7ffff7a006c0 (LWP 519617) exited]
[Thread 0x7ffff66006c0 (LWP 519619) exited]
[Thread 0x7ffff5c006c0 (LWP 519620) exited]
[Thread 0x7ffff70006c0 (LWP 519618) exited]
[Thread 0x7ffff52006c0 (LWP 519621) exited]
[Thread 0x7ffff3e006c0 (LWP 519623) exited]
[Thread 0x7ffff34006c0 (LWP 519624) exited]
[Thread 0x7ffff48006c0 (LWP 519622) exited]
[Thread 0x7ffff2a006c0 (LWP 519625) exited]
[Thread 0x7ffff20006c0 (LWP 519627) exited]
[Thread 0x7ffff0c006c0 (LWP 519629) exited]
[Thread 0x7ffff02006c0 (LWP 519630) exited]
[Thread 0x7ffff16006c0 (LWP 519628) exited]
[Thread 0x7fffef8006c0 (LWP 519631) exited]
[Thread 0x7fffeee006c0 (LWP 519632) exited]

Thread 1 "trace" received signal SIGSEGV, Segmentation fault.
0x00007ffff7ccafc6 in std::__detail::_List_node_base::_M_transfer (this=0x7fffffffd1d0, __first=0x4ef060, __last=0x4ef46f) at ../../../../../libstdc++-v3/src/c++98/list.cc:102
102       __last->_M_prev->_M_next  = this;

最小复现示例

需先搭建Verilator环境:

1. 多路复用器Verilog代码(mux2_1.v)

module mux2_1 (
  a, b, s, y
);
  input a, b, s;
  output y;

  assign y = (~s & a) | (s & b);
endmodule
// A new line is required here

2. 测试C++代码(trace.cpp)

#include "Vmux2_1.h"
#include <memory>
#include <verilated.h>
#include <verilated_fst_c.h>

std::unique_ptr<VerilatedFstC> trace = std::make_unique<VerilatedFstC>();

int main() {
  std::unique_ptr<VerilatedContext> kContext =
      std::make_unique<VerilatedContext>();
  std::unique_ptr<Vmux2_1> kTop = std::make_unique<Vmux2_1>();

  kContext->traceEverOn(true);
  kTop->trace(trace.get(), 99);
  trace->open("waveform.fst");
  trace->close();

  return 0;
}

3. 编译命令

verilator --cc --exe --build --trace-fst -j 4 -Wall trace.cpp mux2_1.v

编译后会生成obj_dir目录及可执行文件Vmux2_1,运行./obj_dir/Vmux2_1即可复现崩溃问题。

内容的提问来源于stack exchange,提问作者Lee Hua

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 07:19:56