在verilog always块中使用while循环

在verilog always块中使用while循环,verilog,Verilog,我对verilog有点陌生,我正在写这段代码,但我想知道它是如何合成的: always @(posedge clk) begin //do some stuff while(test == 0) begin count <= count + 1; end end 始终@(posedge clk) 开始 //做点什么 当(测试==0)开始时 count由于无法在编译时确定循环数,因此此代码无法合成。为了使循环可合成,合成工具需要能够展开循环。但是,由于您提供的循环可能

我对verilog有点陌生,我正在写这段代码,但我想知道它是如何合成的:

always @(posedge clk)
begin
  //do some stuff
  while(test == 0) begin
     count <= count + 1;
  end
end
始终@(posedge clk)
开始
//做点什么
当(测试==0)开始时

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

为了实现“循环”,以便在每个时钟边缘检查
test
,您只需要具备递增计数器的条件(然而,请注意,计数器在每个时钟上的增量永远不会超过一次,这是您的循环无论如何都要做的,但我假设您可能希望计数器在每个时钟上的增量可能超过一次,这将需要更多的逻辑):

始终@(posedge clk)开始
如果(测试==0)开始

反击你为什么要使用循环?谢谢!那么while循环通常是不可合成的?通常是不可合成的;但它们在测试台和验证代码的模拟中是一个有用的构造。我认为它们在可能可合成的函数中也可能有用,但我不太确定,因为我在可合成代码中没有使用过很多while循环。Ty通常,当您使用while循环时,您希望在多个时钟周期内发生一些事情,因此在可合成代码中实际上不会出现while循环
always @(posedge clk) begin
  if (test == 0) begin
    counter <= counter + 1;
  end
end