Verilog - 在 Always 块中更改敏感列表中的注册
Verilog - Changing a reg in sensitivity list in Always block
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 更改了 reg B 的值,这开始了第一个始终阻止的过程,因为 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
解释为中间值。
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 更改了 reg B 的值,这开始了第一个始终阻止的过程,因为 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
解释为中间值。