我对非阻塞语句的基础知识有疑问,我希望如此 从一个简单的例子开始。
鉴于:a=1, b=2, c=4, d=4, e=5
示例1:
c <= a + b
d <= c + e
示例2:
d <= c + e
c <= a + b
对于这两个例子,结果将是相同的c = 3和d = 9.
但是这个例子怎么样:
a <= b
b <= a
是的,当我说,我必须分别查看每一行
结果将是a = 2 and b = 1
?
那是怎么回事:
a <= b
b <= c
结果是:a = 2且b = 4或a = 4且b = 4?
当我得到有用的例子时,我会很高兴。 谢谢你转发: - )
答案 0 :(得分:2)
a = 1;
b = 2;
c = 3; //assume this is meant to be 3?
d = 4;
e = 5;
c <= a + b ;// 1 + 2
d <= c + e ;// 3 + 5 (this is the old 3 not the new one)
示例2 :(从初始条件开始)
d <= c + e; //3 + 5
c <= a + b; //1 + 2
但是这个例子呢(从初始条件开始)
a <= b; // 2
b <= a; // 1
你是对的,假设两条线都在同一个进程中执行。
a <= b; //2
b <= c; //3
user2484982是正确的,将其视为创建临时变量,在开始时获取赋值,并在流程结束时赋予实变量。
经验法则是在<=
中使用always @(posedge clk)
这模拟了触发器输出的行为。
在=
中使用always @*
组合逻辑,输入的任何更改都会立即反映出来。
答案 1 :(得分:1)
希望你从摩根所说的那里得到你的答案。非阻塞任务将分两步执行。首先,计算该区块中所有表达式的RHS,然后将它们分配给LHS。 例如
a<=b;
b<=c;
更具说明性,如下所示
step1: temp_a = b和temp_b = c;
step2: a = temp_a和b = temp_b;
temp_a和temp_b实际上并不是为了解释而创建的
所以例如
a<=b;b<=a
a和b的值互换。
Cumming的一篇关于阻止和非阻塞作业的论文http://www.ece.cmu.edu/~ece447/s13/lib/exe/fetch.php?media=synth-verilog-cummins.pdf。 这可能会有所帮助。