gpt4 book ai didi

verilog - 关于verilog触发器延迟

转载 作者:行者123 更新时间:2023-12-02 10:28:30 25 4
gpt4 key购买 nike

我想用两个单位触发器缓冲单位信号“完成”。在我的设计中,done 信号只会上升一个时钟周期。所以我写了下面的代码。

//first level buffer done signal for one cycle to get ciphertext_reg ready
always @(posedge clk or posedge rst) begin
if(rst)
done_buf_1 = 1'b0;
else
done_buf_1 = done;
end

//second level buffer
always @(posedge clk or posedge rst) begin
if(rst)
done_buf_2 = 1'b0;
else
done_buf_2 = done_buf_1;
end

在功能仿真中,我发现done_buf_1在done后一个周期上升,但done_buf_2与done_buf_1同时上升。

对此有何解释?

谢谢!

最佳答案

您已经得到了解决方案的答案(“使用非阻塞分配”),但这里尝试说明为什么您需要这样做。

两个 always 语句具有相同的事件,因此它们可以按任何顺序运行。似乎发生的情况是第一个先运行。当线路...

done_buf_1 = done;

...被命中,它将阻塞直到分配完成(这是一个“阻塞”分配)。因此done_buf_1立即采用新值。这与非阻塞版本不同...

done_buf_1 <= done;

...这表示“在时间片结束时为done_buf_1提供done的值(我现在将对其进行评估)”。

现在我们继续,done_buf_2 已被分配。

done_buf_2 = done_buf_1;

现在,如果使用阻塞分配更新了 done_buf_1,则它已经具有 done 的当前值,并且您将看到两个信号同时上升。如果是非阻塞赋值,则 done_buf_1 仍具有 done 之前的值,因为直到时间片结束时它才会更新,结果是 done_buf_2 的 2 个周期延迟。

但是还有另一个问题。还记得我说过,always 语句可以按任意顺序运行,因为事件是相同的吗?那么,如果首先执行第二个代码,代码将按预期工作(db2 = db1; db1 = done; 没问题)。因此,值得了解的是,使用这样的阻塞分配会产生不稳定的结果,尤其是在工具之间。这可能会导致一些微妙的错误。

关于verilog - 关于verilog触发器延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11065067/

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