炼狱传奇-赋值语句之战

2015年03月22日 10:23    发布者:zxopen09
Verilog HDL语言中存在两种赋值语言:● 非阻塞型赋值语句● 阻塞型赋值语句
1.       非阻塞型语句以赋值操作符“<=”来标识的赋值操作称为“非阻塞型过程赋值(NonblockingAssignment)”。非阻塞型过程赋值语句的特点是:(1) 在begin-end串行语句块中,一条非阻塞过程语句的执行不会阻塞下一条语句的执行,也就是说在本条非阻塞型过程赋值语句对应的赋值操作执行完之前,下一条语句也可以开始执行。
(2) 仿真过程在遇到非阻塞型过程赋值语句后首先计算其右端赋值表达式的值,然后等到仿真时间步结束时再将该计算结果赋值变量。也就是说,这种情况下的赋值操作是在同一仿真时刻上的其他普通操作结束后才得到执行的。
如以下语句的程序1:     Initial          begin             A<=B;//语句S1             B<=A; //语句S2          end
      上述语句中包含了两条非阻塞型过程赋值语句S1和S2,当仿真进程遇到Initial过程块后(0时刻),语句S1首先开始执行,赋值表达式“B”的值得到计算(但是对被赋值变量A的赋值操作要等到当前时间步结束才执行),同时由于S1是一条非阻塞型赋值语句,所以S1的执行不会阻塞S2的执行;由于S2也随即开始执行,其对应的赋值表达式“A”的值得到计算,由于这时S1对A的赋值操作还没有执行,所以此时计算得到的赋值表达式取值是A的初值。由于S2也是一条非阻塞型赋值语句,它对应的为变量B进行赋值操作也要等到当前时间步结束时才会得到执行;所以在当前时间步结束时,S1、S2两条语句对应的赋值操作同时执行,分别将计算得到的A和B初值赋给变量B和A,这样就交换了A与B的取值。
例程1:

仿真图:

从仿真图我们可以看出,使用非阻塞型过程赋值语句,把a的初值给b,b的初值给a。所以,从图可以看出它的结果和前面分析的一样。
1. 阻塞型语句  以赋值操作符“=”来标识的赋值操作称为“阻塞型过程赋值(blocking Assignment)”。非阻塞型过程赋值语句的特点是:(1)串行块(begin-end)中的各条阻塞型过程赋值语句将以它们在顺序块后排列次序依次得到执行。(2)阻塞型过程赋值语句的执行过程是:首先计算右端赋值表达式的值,然后立即将计算结果赋值给“=”左端的被赋值变量。
阻塞型过程赋值语句的这两个特点表明:仿真进程在遇到阻塞型过程赋值语句时将计算表达式的值并立即将其结果赋给等式左边的被赋值变量;在串行语句块中,下一条语句的执行会被本条阻塞型过程赋值语句所阻塞,只有在当前这条阻塞型过程赋值语句所对应的赋值操作执行完后下一条语句才能开始执行。
例如语句程序2:    initial    begin     a=0;//语句S1     a=1;//语句s2    end
   在这段语句中包含两条阻塞型过程赋值语句S1和S2,它们都是在仿真零时刻得到执行的,其对应的赋值操作也都是在0时刻进行的。但由于它们是阻塞型赋值语句,所以在执行S1语句是S2被阻塞而不能得到执行;只有在S1执行完,a被赋值0之后,S2才能开始执行。而S2的执行将使a被重新赋值1,所以上面这个过程块执行后变量a的值终取值为1.

例程2:
仿真图:

可以看出,只是把赋值方式换成了阻塞型,结果就和非阻塞型的不同。