我是verilog的新手,我正在编写这段代码,但我想知道它是如何合成的:
always @(posedge clk)
begin
//do some stuff
while(test == 0) begin
count <= count + 1;
end
end
我的问题是计数是否会持续增加,直到测试!= 0在一个posedge触发器上或者它会递增一次然后在下一个posedge再次递增,如果测试条件满足?
答案 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)。所以要回答你的第二个问题,它既不会这样做,而是要么永远停留在那个循环中,要么根本不运行循环。