欢迎来到天天文库
浏览记录
ID:36006611
大小:30.36 KB
页数:7页
时间:2019-04-29
《阻塞与非阻塞》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、1、阻塞赋值操作符用等号(即=)表示。“阻塞”是指在进程语句(initial和always)中,当前的赋值语句阻断了其后的语句,也就是说后面的语句必须等到当前的赋值语句执行完毕才能执行。而且阻塞赋值可以看成是一步完成的,即:计算等号右边的值并同时赋给左边变量。例如:当执行“x=next_x;”时,x会立即的到next_x的值。而下一句“y=x;”必须等到“x=next_x;”执行完毕才能被执行。由于这两条语句都没有延迟(相当于导线),导致他们的等价语句为“y=next_x;”。赋值是实时的,计算完右面
2、的马上赋值给左边的,然后再执行下一句,操作时串行的,且在一个alway内完成。2、非阻塞赋值操作符用小于等于号(即<=)表示。“非阻塞”是指在进程语句(initial和always)中,当前的赋值语句不会阻断其后的语句。非阻塞语句可以认为是分为两个步骤进行的:①计算等号右边的表达式的值,(我的理解是:在进入进程后,所有的非阻塞语句的右端表达式同时计算,赋值动作只发生在顺序执行到当前非阻塞语句那一刻)。②在本条赋值语句结束时,将等号右边的值赋给等号左边的变量。例如:当执行“x<=next_x;”时,并不
3、会阻断语句“y<=x;”的执行。因此,语句“y<=x;”中的x的值与语句“x<=next_x;”中的x的值不同:语句“y<=x;”中的x是第一个D触发器的初值(Q0)。而语句“x<=next_x;”中的x的值是D触发器经过一个同步脉冲后的输出值(Q1)。基于此这个进程产生了与阻塞赋值进程截然不同的结果,即:产生了移位寄存器的效果,next_xàxày。简单理解就是,阻塞赋值是按需执行,非阻塞赋值是并行执行。为了更好地理解上述要点,我们需要对Verilog语言中的阻塞赋值和非阻塞赋值的功能和执行时间上的
4、差别有深入的了解。为了解释问题方便下面定义两个缩写字:RHS–方程式右手方向的表达式或变量可分别缩写为:RHS表达式或RHS变量。LHS–方程式左手方向的表达式或变量可分别缩写为:LHS表达式或LHS变量。IEEEVerilog标准定义了有些语句有确定的执行时间,有些语句没有确定的执行时间。若有两条或两条以上语句准备在同一时刻执行,但由于语句的排列次序不同(而这种排列次序的不同是IEEEVerilog标准所允许的),却产生了不同的输出结果。这就是造成Verilog模块冒险和竞争现象的原因。为了避免产生
5、竞争,理解阻塞和非阻塞赋值在执行时间上的差别是至关重要的。阻塞赋值阻塞赋值操作符用等号(即=)表示。为什么称这种赋值为阻塞赋值呢?这是因为在赋值时先计算等号右手方向(RHS)部分的值,这时赋值语句不允许任何别的Verilog语句的干扰,直到现行的赋值完成时刻,即把RHS赋值给LHS的时刻,它才允许别的赋值语句的执行。一般可综合的阻塞赋值操作在RHS不能设定有延迟,(即使是零延迟也不允许)。从理论上讲,它与后面的赋值语句只有概念上的先后,而无实质上的延迟。若在RHS加上延迟,则在延迟期间会阻止赋值语句的
6、执行,延迟后才执行赋值,这种赋值语句是不可综合的,在需要综合的模块设计中不可使用这种风格的代码。阻塞赋值的执行可以认为是只有一个步骤的操作:计算RHS并更新LHS,此时不能允许有来自任何其他Verilog语句的干扰。所谓阻塞的概念是指在同一个always块中,其后面的赋值语句从概念上(即使不设定延迟)是在前一句赋值语句结束后再开始执行的。如果在一个过程块中阻塞赋值的RHS变量正好是另一个过程块中阻塞赋值的LHS变量,这两个过程块又用同一个时钟沿触发,这时阻塞赋值操作会出现问题,即如果阻塞赋值的次序安排
7、不好,就会出现竞争。若这两个阻塞赋值操作用同一个时钟沿触发,则执行的次序是无法确定的。下面的例子可以说明这个问题。[例1].用阻塞赋值的反馈振荡器modulefbosc1(y1,y2,clk,rst);outputy1,y2;inputclk,rst;regy1,y2;always@(posedgeclkorposedgerst)if(rst)y1=0;//resetelsey1=y2;always@(posedgeclkorposedgerst)if(rst)y2=1;//presetelsey2=
8、y1;endmodule按照IEEEVerilog的标准,上例中两个always块是并行执行的,与前后次序无关。如果前一个always块的复位信号先到0时刻,则y1和y2都会取1,而如果后一个always块的复位信号先到0时刻,则y1和y2都会取0。这清楚地说明这个Verilog模块是不稳定的会产生冒险和竞争的情况。非阻塞赋值非阻塞赋值操作符用小于等于号(即<=)表示。为什么称这种赋值为非阻塞赋值?这是因为在赋值操作时刻开始时计算非阻塞赋值符的RHS表达
此文档下载收益归作者所有