gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:58:12 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

为了实现“循环”,使得 test在每个时钟边缘检查,您只需要增加计数器的条件(但是,请注意,每个时钟计数器永远不会增加超过一次,这无论如何您的循环都会执行,但我假设您可能想要计数器每个时钟增量可能不止一个,这需要更多的逻辑):

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

但是,在模拟中,如果 test,此代码将锁定是 0,尽管每个人都这么告诉你,但 Verilog 模拟并不是真正并发的。因此,进程将卡在 counter 的非阻塞赋值上。如果 test在其他地方设置为 1,该代码将永远不会运行(或已经运行,在这种情况下 test 应该已经是 1 :P )。因此,要回答您的第二个问题,它不会执行任何操作,而是要么永远停留在该循环中,要么根本不运行该循环。

关于verilog - 在 verilog 中使用 while 循环总是阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29525723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com