一、在描述组合逻辑的always块中用阻塞赋值,则综合成组合逻辑的电路结构;编程
二、在描述时序逻辑的always块中用非阻塞赋值,则综合成时序逻辑的电路结构;布局
一、语句的排列有时候是决定了语句的执行顺序。当几个语句在同一时刻执行时,可是因为排列的不一样就会形成前后执行,就会出现竞争冒险。spa
一、阻塞赋值操做符”=“设计
二、为何叫阻塞赋值呢?教程
即阻止其余语句执行的赋值语句。由于在赋值时,先计算等号右边部分的值,此时赋值语句就不容许任何别的语句的执行,直到如今的赋值完成,即左边等于右边的时候,才容许别的语句执行。队列
三、阻塞赋值缺点举例说明:事件
1)always@(posedge clk or posedge rst)同步
if(rst) y1=0;it
else y1=y2;变量
2)always@(posedge clk or posedge rst)
if(rst) y2=1;
else y2=y1;
在同一个时钟沿到来时,咱们二者的两个always块在硬件上是不可能同步的,中间会差个几皮秒的相隔时间。
若是1)先执行,那么y1和y2都是1。
若是2)先执行,那么y1和y2都是0。
这说明这个verilog模块是不稳定的,一定会产生冒险和竞争。
一、为何叫非阻塞赋值?
由于在整个右边语句计算和左边语句被赋值的过程当中,其余语句依然能够运行。
二、非阻塞赋值操做过程:
1)在赋值开始时刻,计算非阻塞赋值右边表达式。
2)在赋值结束时刻,更新非阻塞赋值左边表达式。
记住如下8点,才能在综合布局布线后的方阵中避免出现冒险竞争现象。
一、时序电路建模时,用非阻塞赋值。
二、锁存器电路建模时,用非阻塞赋值。
三、用always块创建组合逻辑模型时,用阻塞赋值。
四、在同一个always块中,创建时序和组合逻辑电路时,用非阻塞赋值。
五、在同一个always块中不要即便用非阻塞赋值又使用阻塞赋值。
六、严禁在多个always块中对同一个变量赋值。易产生竞争冒险。
七、用$strobe系统任务来显示用非阻塞赋值的变量值。
八、在复制时不要使用#0延迟。
这里我没有看懂,就是感受有一个点:非阻塞赋值LHS变量的更新是安排在非阻塞赋值更新事件队列中,而剩余的其余队列是被安排在另外的一个队列事件中。
initial #10 clk=0;//--------------------------(1)
always@(clk) //-----------------------------(2)
#10 clk=~clk;//------------------------(3)
这里使用的是阻塞赋值,在(1)中,咱们的clk变化成0,触发了always块,延迟10ns,clk变成1
注意在由0->1的过分期间,咱们是不容许任何其余程序执行的,因此always块没有检测到变化,也就是always块并无由于第二次的clk变化而被触发。
initial #10 clk=0;//--------------------------(1)
always@(clk) //-----------------------------(2)
#10 clk<=~clk;//-----------------------(3)
这里always块第一次触发后~clk便被计算出来,并赋值给LHS的事件并被安排在更新事件队列中。在非阻塞赋值更新事件队列被激活以前,又遇到@(clk)语句。当clk发生变化时,always块便被触发。这里看来延迟10ns是有必要的。
当阻塞赋值时,在并行的always块中,咱们虽然说是并行的,当是他们开始的时间是有前后的,这样就可能形成竞争现象,因此咱们不建议在用阻塞赋值。可是咱们使用非阻塞赋值时,就不会出现竞争现象,由于他不是阻塞的,也不会当即就会变化的。这样很好,你懂的。。。。
摘自:verilog数字系统设计教程(夏宇闻)