非阻塞语句的verilog顺序

时间:2013-06-26 06:53:28

标签: verilog nonblocking

我对非阻塞语句的基础知识有疑问,我希望如此 从一个简单的例子开始。

鉴于: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?

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

2 个答案:

答案 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。 这可能会有所帮助。