Verilog中阻塞与非阻塞式赋值是比较让初学者难以理解的两种赋值方式,今天我就来谈一谈它们之间的区别:
使用过VHDL的朋友都知道,VHDL中信号使用非阻塞式 ,而变量类似于阻塞赋值。 阻塞式过程赋值与非阻塞式过程赋值在Verilog中表示如下:
c = a & b; 阻塞式过程赋值
c <= a & b; 非阻塞式过程赋值
两种赋值不会对语句本身的赋值有影响,但会影响以后对赋值结果的引用。一般的参考书中建议组合逻辑使用阻塞式,时序逻辑使用非阻塞式。且语句块 中如果只有一条赋值语句,是阻塞还是非阻塞都没有任何不一样。 非阻塞式过程赋值的赋值对象是在未来(即当前仿真时刻结束时)被赋值。 下面我们具体分析一下阻塞和非阻塞赋值的语义本质: 阻塞:在本语句中“右式计算”和“左式更新”完全完成之后,才开始执行下一条语句;
非阻塞:当前语句的执行不会阻塞下 一语句的执行。 先看阻塞赋值的情况: 我们来看这段代码:
always语句块对Clk的上升沿敏感,当发生Clk 0~1的跳变时,执行该always语句。 在begin...end语句块中所有语句是顺序执行的,而且最关键的是,阻塞赋值是在本语句中“右式计算”和“左式更新”完全完成之后,才开 始执行下一条语句的。 在本例中,D的值赋给Q1以后,再执行Q2 = Q1;同样在Q2的值更新以后,才执行Q3 = Q2。这样,最终的计算结果就是Q3 = D。 所有的语句执行完以后,该always语句等待Clk的上升沿,从而再一次触发begin...end语句。
|