使用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
相关产品推荐
相关产品推荐

