问题描述
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
解释为中间值。