应该用非阻塞语句。为什么?
首先,阻塞语句是 a=b+c;
非阻塞语句是 a<=b+c。
阻塞语句是:
右值算完,就立即赋给左值;
并且,前一条语句执行完,再执行下一条语句。举个例子:
a=b+c;
d=b+a;
假设初始状态时 a=1,b=2,c=3,d=4 ,那么:
先执行 a = b+c = 2+3 = 5;
再执行 d = b+a = 2+5 = 7;
非阻塞语句是:
先计算所有右值,暂时不赋给左值;
进程结束后,再同时将所有右值赋给左值
同样的例子:
a<=b+c;
d<=b+a;
同样假设初始状态时a=1,b=2,c=3,d=4,那么同时计算两式:
a = b+c = 2+3 = 5
d = b+a = 2+1 = 3;
所以总结:
时序逻辑要求,在时钟到来时执行赋值操作,在时钟没有到来时所有输出保持不变。
也就是说,它要求:
如果输入在这个时钟变化,输出不会立刻变化;
但输出会在下个时钟变化(输入的改变过了一个时钟周期,才让输出改变)。
输出的改变,不会被一个周期内输入改变的顺序影响。
这正好满足非阻塞语句的特性:
一个变量的旧值不会立刻被新值覆盖,
而是完成这个变量参与的所有的右值计算后,旧值才被覆盖。
它的结果不会被指令的先后顺序影响。