在verilog中使用while循环总是阻塞

时间:2015-04-08 21:30:44

标签: verilog

我是verilog的新手,我正在编写这段代码,但我想知道它是如何合成的:

always @(posedge clk)
begin
  //do some stuff
  while(test == 0) begin
     count <= count + 1;
  end
end

我的问题是计数是否会持续增加,直到测试!= 0在一个posedge触发器上或者它会递增一次然后在下一个posedge再次递增,如果测试条件满足?

1 个答案:

答案 0 :(得分:0)

此代码无法合成,因为在编译时无法确定循环数。为了使循环可合成,综合工具需要能够展开循环。但是,由于您提供的循环可能会运行一次,或者根本不运行,因此综合工具无法展开循环以生成正确的硬件,因此无法合成循环。

为了实现&#34;循环&#34;这样在每个时钟边沿检查test,你只需要增加计数器的条件(但是,请注意,计数器每个时钟的增量不会超过一次,这是你的循环无论如何都要做的,但是我假设您可能希望计数器每个时钟增加一个以上,这需要更多逻辑):

always @(posedge clk) begin
  if (test == 0) begin
    counter <= counter + 1;
  end
end

但是,在模拟中,如果test为0,则此代码将锁定,尽管每个人都告诉您,但Verilog模拟并非真正并发。因此,该过程将依赖于counter的非阻塞分配,如果test在其他地方设置为1,则该代码将永远不会运行(或已运行,在这种情况下test应该已经是1:P)。所以要回答你的第二个问题,它既不会这样做,而是要么永远停留在那个循环中,要么根本不运行循环。