首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EDAPlayground: Verilog代码“达到最大运行时”

EDAPlayground: Verilog代码“达到最大运行时”
EN

Stack Overflow用户
提问于 2021-11-02 11:26:23
回答 1查看 262关注 0票数 2

我有一个用于顺序逻辑网络的简单Verilog代码。它由一个设计和一个testbench文件组成;它编译,但是运行时间太长了。我不知道为什么;除了clk之外,我没有在其中放任何循环。也许我在使用二进制数字时有一些语法错误。我使用在线EDA游乐场软件运行它;我没有在Xilinx上试用它。

模拟器:IcarusVerilog0.9.7,编译选项:-Wall。“执行中断或达到最大运行时。”

这就是日志上写的。

设计档案:

代码语言:javascript
复制
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 

测试文件:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-02 11:35:33

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

代码语言:javascript
复制
initial #1000 $finish;

现在,模拟在操场上完成。您可以将#1000延迟更改为对设计更有意义的内容。

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

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

使用initial添加第二个$finish块将强制模拟结束,而不考虑无限always块。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69809617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档