Verilog - 在始终阻止

问题描述

reg A,B,C;
always @(*)begin
//some other computations
C=B;
//some other computations
A=C;
end

always @(posedge clk)begin
B<=A;
end

你好,

在上面的代码中,在 clk reg A 的posedge 改变了 reg B 的值,这开始了第一个 always 块的过程,因为 B 在敏感列表中。我的问题是“C=B”行会发生什么,因为 reg C 也在敏感列表中?那会不会再次启动第一个循环的过程并导致无限循环?

我在模拟中检查过,它工作正常。但我不知道想要会发生在硬件上。

我的猜测是它不会引起问题。由于 Verilog 仅创建一个 LUT 来模拟 always 块内部的算法,因此不会导致硬件问题。但是,我不确定所以我想问一下。

谢谢,

解决方法

请记住,过程代码一次执行一个语句。您的代码被有效地解释为

initial begin
       @(B or C) // wait for a change on B or C
       C = B;
       A = C;
       @(B or C) // wait for a change on B or C
       C = B;
       A = C;
       @(B or C) // wait for a change on B or C
       C = B;
       A = C;
       ...
       end

C 的赋值发生了,但在您进入下一个 @ 之前,对 C 的任何更改都已经发生。 Synthesis 将 C 解释为中间值。