1

我对非阻塞语句的基础有疑问,我想从一个简单的例子开始。

鉴于: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 and b = 4 还是 a = 4 and b = 4 ?

当我得到有用的例子时,我会很高兴。谢谢你转发:-)

4

2 回答 2

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 @*,输入的任何变化都会立即反映出来。

于 2013-06-26T08:16:37.547 回答
1

希望你从摩根所说的得到你的答案。非阻塞分配将分两步执行。首先将计算该块中所有表达式的 RHS,然后将它们分配给 LHS。例如

a<=b; b<=c;

为了解释得更清楚一点,它如下

第一步: temp_a=b 和 temp_b=c;
第二步: 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。这可能会有所帮助。

于 2013-06-26T10:59:40.043 回答