当前位置:首页 > 工业控制 > 电子设计自动化

阻塞和非阻塞语句作为verilog HDL语言的最大难点之一,一直困扰着FPGA设计者,即使是一个颇富经验的设计工程师,也很容易在这个点上犯下一些不必要的错误。阻塞和非阻塞可以说是血脉相连,但是又有着本质的差别。理解不清或运用不当,都往往会导致设计工程达不到预期的效果,而其中的错误又很隐晦。下面我给大家谈谈阻塞和非阻塞语句的本质区别和在FPGA设计中的不同运用。

阻塞语句
顾名思义,即本条语句具有影响下一条语句的作用,在同一个进程always中,一条阻塞赋值语句的执行是立刻影响着下条语句的执行情况和结果。如果该条语句没有执行完,那么下条语句不可能进入执行状态的,因此,从字面层上理解,该条语句阻塞了下面语句的执行。阻塞语句最能体现verilog HDL和C语言之间的血缘关系,比如,在时钟沿触发的always进程里,若先执行b=c,再执行a=b,那么本质上,在一个时钟沿触发里面,a=c成立,即是说,不要b变量,直接在进程里赋值a=c,结果是一样的。这和c语言中b=c,a=b性质相同。

非阻塞语句
非阻塞语句应该来说,更能体现硬件电路的特点。这正是非阻塞语句广泛应用于时序逻辑电路的原因。接上面的例子,如果在一个时钟沿触发的always进程里面,b<=c,a<=b那么就不可能直接在进程里面赋值a<=c.因为c的值要经过两个时钟延迟才传到a里面,即c若从0变为1,那么要经过两个clk上升沿才传到a,a的值才从0变为1。两次赋值正是体现了两个时钟延迟的特点。这种特点即是非阻塞语句非阻塞的的原因导致的,就是说,a<=b,不会因为b<=c没有执行完毕而不执行,只要时钟触发进程,那么a<=b,b<=c同时执行。所以,如果c为1,b为0,a为1的话,那么在在非阻塞语句的进程里面,一个时钟沿到来,由于他们之间是同时执行的,所以把c的1赋给了b,把b的0赋给了a,但是在阻塞语句里面,c的1先给了b,然后b把新赋值的1又给了a,那么a在一个时钟之后即变成了1。(在一次触发进程里,无论是阻塞和非阻塞语句,每条语句只能执行一次)
所以从上面的介绍里面,可以看出,阻塞语句是顺序执行的,而非阻塞语句是同时执行的,那么,如何在设计里面运用好阻塞语句和非阻塞语句呢,总体上来讲,遵循大体原则:阻塞语句运用在组合逻辑电路设计里面,非阻塞语句运用在时序逻辑电路设计里面。但是一般来讲,一个设计往往包含着组合逻辑和时序逻辑。可以再细分为以下几个情况,并可以用阻塞语句和非阻塞语句不同的设计来区别讨论它们之间的优缺点,进一步理解清楚。。。。。。(最直观的说法就是如下仿真一下:观察out1~out4的变化,就明白了!
`timescale 1ns/100ps
module test1();
reg clk;
reg sigin;
reg out1;
reg out2;
reg out3;
reg out4;
//assign #10 out3 = sigin;
always #10 clk=~clk;
always #70 sigin = ~sigin;
initial
begin
sigin = 1'b0;
clk= 1'b0;
out1 =1'b0;
out2 =1'b0;
end
always @(sigin)
begin
$display('%d',$time);
out1<=sigin;
out2<= out1;
out3 = sigin;
out4 = out3;
$display('%d',$time);
end
endmodule

#1: 当为时序逻辑建模,使用“非阻塞赋值”。
#2: 当为锁存器(latch)建模,使用“非阻塞赋值”。
#3: 当用always块为组合逻辑建模,使用“阻塞赋值”
#4: 当在同一个always块里面既为组合逻辑又为时序逻辑建模,使用“非阻塞赋值”。
#5: 不要在同一个always块里面混合使用“阻塞赋值”和“非阻塞赋值”。
#6: 不要在两个或两个以上always块里面对同一个变量进行赋值。
#7: 使用$strobe以显示已被“非阻塞赋值”的值。
#8: 不要使用#0延迟的赋值。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

定义一个变量,就是在内存中为你定义的这个变量开辟一段内存空间,如果这个变量没有初始化,那么系统会随机给这个变量赋一个值,这个值我一般称它为"垃圾数"。没有初始化的变量我认为它是没有意义的,是在浪费内存,就比如人刚出生的时...

关键字: 变量 初始化 赋值

下面是一个小的真实verilog代码,具有异步set/reset逻辑(低电平有效)的触发器模型。这个verilog模型可以正确地综合,但在一个cornercase情况下仿真结果不正确。这个cornercase是什么?al...

关键字: corner verilog se

设计分2种,一种叫前向设计,另一种叫后向设计。 后向设计就是我们只知道需求,知道要实现什么功能,但是暂时脑子里还没有具体的结构。多数时候都是后向设计。此时,先开始把module的input和output写好。然后从out...

关键字: verilog 电路图

将Systemverilog中的数组和队列拿出来单独讲,是因为相对于其他的数据类型,数组和队列与C语言和Verilog语言的数组有着不同的特性。这些特性不仅体现在完全迥异于C语言的定义方式,也体现在其成员函数上。Syst...

关键字: System verilog

当前最流行的硬件设计语言有两种,即 VHDL 与 Verilog HDL,两者各有优劣,也各有相当多的拥护者。VHDL 语言由美国军方所推出,最早通过国际电机工程师学会(IEEE)的标准,在北美及欧洲应用非常普遍。而 V...

关键字: vhdl verilog

1. 前言如果你只是想检查Verilog文件的语法是否有错误,然后进行一些基本的时序仿真,那么IcarusVerilog就是一个不错的选择。相比于各大FPGA厂商的IDE几个G的大小,IcarusVerilog显得极其小...

关键字: verilog 开源

先简单介绍下同步时序和异步时序逻辑,看下他们的异同点。

关键字: hdl verilog 同步时序

为了应付日益增长的复杂性,必须提高抽象的水平。但当摩尔定律将SoC(系统单芯片)的复杂性加速到逃逸速度时,哪里能找到一种作为RTL(寄存器传输级)补充的新抽象方法?很多观察家注意到,面向硬件的文

关键字: ip SoC verilog

我现在最庆幸的事情就是从进入职场到现在一直是FPGA开发,我感觉,做FPGA开发这行经验是很重要的,入门简单,想提升会越来越难。做FPGA开发不只是会写写verilog和VHDL代码这么简单,我记得刚学习verilog的...

关键字: fpga开发 verilog vhdl代码

分频分为偶分频和奇分频。分频器从某种程度上来讲是计数器有计划的输出。1.偶数倍分频:偶数倍分频应该是大家都比较熟悉的分频,通过计数器计数是完全可以实现的。如进行N倍偶数分频,那么可以通过由待分频的时钟

关键字: verilog 3分频器
关闭
关闭