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

Using while loop inside a verilog always block

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

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

我的问题是计数会持续增加直到测试!= 0 在一个姿势触发时还是会增加一次然后在满足测试条件的情况下在下一个姿势再次增加?

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

为了实现 "loop" 以便在每个时钟边沿检查 test,您只需要将其作为递增计数器的条件(但是,请注意计数器永远不会递增每个时钟不止一次这是你的循环无论如何都会做的事情,但我假设你可能希望计数器每个时钟增加一个以上,这需要更多的逻辑):

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

然而,在仿真中,如果 test 为 0,此代码将锁定,尽管每个人都这么告诉你,Verilog 仿真并不是真正的并发。因此,该进程将挂起 counter 的非阻塞分配,如果 test 在其他地方设置为 1,则该代码将永远不会 运行 (或有 运行,在这种情况下 test 应该已经是 1 :P )。因此,要回答您的第二个问题,它不会做任何事情,而是 运行 永远陷入该循环或永远不会 运行 循环。