EDAPlayground:Verilog 代码 "reached maximum runtime"

EDAPlayground: Verilog code "reached maximum runtime"

我有一个简单的时序逻辑网络 Verilog 代码。它由设计和测试台文件组成;它可以编译,但运行时间太长。我不确定为什么;除了 clk,我没有在其中放置任何循环。也许我在使用二进制数时有一些语法错误。我 运行 它使用在线 EDA Playground 软件;我没在 Xilinx 上试过。

Simulator: Icarus Verilog 0.9.7, compile options: -Wall. "Execution interrupted or reached maximum runtime."

日志是这样写的。

设计文件:

module hazimodul(
  input clk,
  input rst,
  input ce,
  input x,
  output z
  
);
  

  reg[1:0] all;
  reg[3:0] y;
  reg[0:0] zout;
  
  always@(posedge clk)
  begin
    if(rst)
      begin
        zout <= 1'b0;
        all <= 2'b00;
        y <= 4'b0111;
      end
    else if(ce)
      begin
        if(all == 2'b00)
          begin
            if(x== 1'b0)
              zout<=1'b0;
            else 
              all <=2'b01;
          end
        if(all==2'b01)
          begin
            zout <= y[3:3];
            y <= {y[2:0],y[3:3]};
            if (y == 4'b0111)
              all <= 2'b10;
          end
        if(all==2'b10)
          begin
            if(x == 1'b0)
             all <= 2'b00;
             
          end
      end
  end
  
  assign z = zout;
  
endmodule 

测试文件:

module test;

    reg clk;
    reg rst;
    reg x;
    reg ce;
  
  
    // Outputs
    wire z;

    // Instantiate the Unit Under Test (UUT)
    hazimodul uut (
        .clk(clk), 
        .rst(rst), 
      .x(x),
      .ce(ce),
      .z(z)
    );

    initial begin
        // Initialize Inputs
        clk = 0;
        rst = 0;
        x=0;
        ce=0;

        #10;
        rst<=1;
        #20;
        rst<=0;
        #30
        ce<=1;
        #40
        x<=1;
        #80
        x<=0;
        #90
        x<=1;
        
        
    end
    always #5
        clk <=~clk;
endmodule

您需要告诉模拟器何时停止 运行ning。一种方法是使用 $finish 系统任务,您可以将其添加到测试台:

initial #1000 $finish;

现在,模拟在 edaplayground 结束。您可以将 #1000 延迟更改为对您的设计更有意义的内容。


这里解释了为什么您的代码会继续 运行。您的测试台有 2 个并行线程:一个 initial 块和一个 always 块。在这两个线程中,您都将事件添加到 Verilog 事件队列中。 initial 块在最后一次分配给 x 之后结束。

但是,always 块继续向事件队列添加事件,因此模拟永远不会结束。

添加第二个 initial 块与 $finish 强制模拟结束,不管无限 always 块。