程序块执行首个$display()后挂停的原因排查求助
Verilog代码执行首个$display后挂停报错定位
代码在执行首个$display()输出0后出现挂停,报错信息如下:
*Execution interrupted or reached maximum runtime.
Exit code expected: 0, received: 137*
相关代码如下:
接口定义
interface simple_if; logic clk, rst; logic [7:0] data; logic valid, ready; // 定义DUT侧modport modport dut_mp( input clk, rst, valid, data, output ready); // 定义driver侧modport modport driver_mp ( output data, valid, input clk, rst, ready); endinterface
DUT与测试程序
module dut (simple_if.dut_mp intf); always_ff @( posedge intf.clk or posedge intf.rst) if (intf.rst) intf.ready <= 0; else intf.ready <= intf.valid; endmodule program driver(simple_if.driver_mp intf); initial begin intf.data = 8'hA5; intf.valid = 1; #2; $display("%0d", intf.ready); #8; intf.valid = 0; #2; $display("%0d", intf.ready); end endprogram
顶层模块
module top; // 例化接口 simple_if intf(); initial begin intf.clk = 0; #5; forever intf.clk = ~intf.clk; #5; end initial begin intf.rst = 0; #1; intf.rst = 1; end // 连接DUT与接口 dut dut_inst(.intf(intf)); // 启动测试程序 driver driver_inst(.intf(intf)); initial begin $dumpfile("dump.vcd"); // 生成波形文件 $dumpvars; end initial #50 $finish; endmodule
问题根源
- 时钟生成逻辑错误:顶层模块中时钟生成的
forever循环写法错误,#5被放在循环体外,导致循环内没有延时,时钟会以无限快的速度翻转。仿真器陷入死循环,无法执行到后续的$finish,最终被系统强制终止(退出码137通常表示进程因资源耗尽或超时被kill)。 - 复位信号未释放:复位信号只被拉高但从未拉低,DUT的
ready始终处于复位值0,后续逻辑无法正常响应valid信号,但这不是挂停的直接原因。
修复方案
- 修正时钟生成代码:将延时
#5移入forever循环内,保证时钟周期为10时间单位:
initial begin intf.clk = 0; forever #5 intf.clk = ~intf.clk; end
- 补充复位释放逻辑(推荐):让复位信号在一段时间后拉低,使DUT进入正常工作状态:
initial begin intf.rst = 1; #1; intf.rst = 0; #1; end
内容的提问来源于stack exchange,提问作者Tang Y
相关产品推荐
相关产品推荐

