在第一条 $display() 语句执行后,是什么原因导致程序块停止执行?

编程语言 2026-07-09

以下代码在第一次执行 $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;

  // define modport for DUT
  modport dut_mp(
    input clk, rst, valid, data, 
    output ready);

  // define modport for driver
  modport driver_mp (
    output data, valid,
    input clk, rst, ready);

endinterface
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;
  // instantiate interface
  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

  // connect interface to DUT
  dut dut_inst(.intf(intf));

  // Launch the program bloc as testbench
  driver driver_inst(.intf(intf));

  initial begin
    $dumpfile("dump.vcd"); // to get waveform
    $dumpvars;
  end

  initial #50 $finish;

endmodule

解决方案

导致挂起的原因是在这段代码中存在一个无限循环:

  initial begin
    intf.clk = 0; #5;
    forever intf.clk = ~intf.clk; #5;    
  end

首先,这种编码风格真的很让人困惑。你应该把每条语句放在单独的一行。代码应该像这样:

initial begin
    intf.clk = 0;
    #5;
    forever intf.clk = ~intf.clk;
    #5;    
end

现在就更容易看出 forever 那一行是一个无限循环,因为没有延迟。

这是修复无限循环的一种常见方法:

initial begin
    intf.clk = 0;
    #5;
    forever #5 intf.clk = ~intf.clk;
end
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章