关于阻塞复制和非阻塞赋值
阻塞赋值和非阻塞赋值的区别
阻塞赋值 =
阻塞性过程赋值在其后所有语句执行前执行,即在下一语句执行前该赋值语句完成执行。
非阻塞赋值 <=
过程赋值中,对目标的赋值是非阻塞的(因为延时),但可预订在将来某个时间步发生(根据时延;如果是0时延,那么在当前时间步结束)。
当非阻塞性过程赋值被执行时,计算右端表达式,右端值被赋予左端目标,并继续执行下一条语句。
预定的最早输出将在当前的时间步结束时,这种情况发生在赋值语句中没有时延时。在当前时间步结束或任意输出被调度时,即对左端目标赋值。
在同一个always/initial块里不要混用两种赋值语句
阻塞式过程赋值与非阻塞式过程赋值(VHDL中使用非阻塞式) c = a & b; 阻塞式过程赋值 c <= a & b; 非阻塞式过程赋值
两种赋值不会对语句本身的赋值有影响,但会影响以后对赋值结果的引用。书中建议组合逻辑使用阻塞式,时序逻辑使用非阻塞式。且语句块中如果只有一条赋值语句,是阻塞还是非阻塞都没有任何不一样。
非阻塞式过程赋值的赋值对象是在未来(即当前仿真时刻结束时)被赋值。 例 always @ (negedge clockB) begin
rightshift = rightshift & strobe; selectfist <= rightshift | xflag; checkstop <= slectfist ^ mask; end endmodule
左边的红线是rightshift,其未经过触发器,右边的是selectfist经过触发器了.