如何解决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
解释为中间值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。