【问题标题】:EDAPlayground: Verilog code "reached maximum runtime"EDAPlayground:Verilog 代码“达到最大运行时间”
【发布时间】:2021-12-16 22:24:15
【问题描述】:

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

模拟器:Icarus Verilog 0.9.7,编译选项:-Wall。 “执行 中断或达到最大运行时间。”

这是日志写的。

设计文件:

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

【问题讨论】:

    标签: verilog infinite-loop system-verilog


    【解决方案1】:

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

    initial #1000 $finish;
    

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


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

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

    使用$finish 添加第二个initial 块会强制模拟结束,而不管always 块是否无限。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-03
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多