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

程序块执行首个$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

问题根源

  1. 时钟生成逻辑错误:顶层模块中时钟生成的forever循环写法错误,#5被放在循环体外,导致循环内没有延时,时钟会以无限快的速度翻转。仿真器陷入死循环,无法执行到后续的$finish,最终被系统强制终止(退出码137通常表示进程因资源耗尽或超时被kill)。
  2. 复位信号未释放:复位信号只被拉高但从未拉低,DUT的ready始终处于复位值0,后续逻辑无法正常响应valid信号,但这不是挂停的直接原因。

修复方案

  1. 修正时钟生成代码:将延时#5移入forever循环内,保证时钟周期为10时间单位:
initial begin
  intf.clk = 0;
  forever #5 intf.clk = ~intf.clk;    
end
  1. 补充复位释放逻辑(推荐):让复位信号在一段时间后拉低,使DUT进入正常工作状态:
initial begin
  intf.rst = 1; #1; 
  intf.rst = 0; #1;   
end

内容的提问来源于stack exchange,提问作者Tang Y

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 20:02:27