Verilog中的延时阻塞与非阻塞赋值仿真_第1页
Verilog中的延时阻塞与非阻塞赋值仿真_第2页
Verilog中的延时阻塞与非阻塞赋值仿真_第3页
Verilog中的延时阻塞与非阻塞赋值仿真_第4页
Verilog中的延时阻塞与非阻塞赋值仿真_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——Verilog中的延时阻塞与非阻塞赋值仿真从仿真语义的角度看Verilog中的延

时、阻塞与非阻塞赋值

1Verilog中的延时

Verilog没有和VHDL中类似的最小延时概念,所有的延时都由符号“#〞来定义,假使没有这个符号就意味着没有延时,清单1中描述了一个有关延时的简单例子。

清单1简单的延时

wire#5Y=A

清单1中使用持续赋值语句描述了一个两输入端与门规律,并且在表达式前插入了5ns(#5)的延时,意义为Verilog仿真器会在5ns的延时后将A和B相与赋值给Y。通过这个例子可以看出,延时的插入只需要在原本的语句中参与“#〞关键字即可,但在实际的使用中却经常产生错误,实际中的延时时间是由具体的硬件电路来决定的。使我们更深入的理解Verilog中的延时,更加关注描述的电路意义而不是描述语句本身,Verilog也是一种机于硬件的语言。

1.1实际中的延时

在实际的电路中,只存在着两种延时行为,一个是惯性延时,另一个是传输延时。

1.1.1惯性延时(InertialDay)

惯性延时寻常在信号通过规律门的时候发生,图1所示是信号通过一个具有5ns延迟的非门时的行为。

图1惯性延时

输入信号WireIn有两个高电平脉冲,一个宽度为3ns,另一个宽度为9ns。当第一个3ns的脉冲到达非门时,由于其宽度小于非门的本身延时(5ns),输出还来不及建立低电平,输入脉冲就已经过去,所以在输出信号WireOut上没有表达出第一个3ns脉冲的响应。其次个脉冲宽度为9ns,大于非门的本身延时,所以在脉冲上升沿5ns之后,WireOut输出了一个宽度为9ns的低脉冲,这个脉冲与输入脉冲等宽、反向而且延迟了5ns。

这种延时称为惯性延时或惰性延时。假使输入的变化过快,小于规律门本身的延时,就不会被表达在输出上。

1.1.2传输延时(TransportDelay)

传输延时相对于惯性延时更简单理解,相当于信号通过了一条拥有固定延时的传输线。如图2所示是信号通过一条5ns的延时线地示意图与波形。

2/12

图2传输延时

简单看出来,WireOut实际上就是被延迟了5ns的WireIn。所以传输延时的意义就是将输入信号延迟一定时间后表达在输出上,而且输入信号上的所有细节都不会丢失。

1.2持续赋值语句中的延时

在持续赋值语句只有一种合法的延时描述,如清单2所示:

清单2持续赋值语句中的延时

assign#5WireOut=~WireIn;

这种描述用语表示电路中的惯性延时,任何小于5ns的输入变化都会被过滤而不会表达在输出上。

1.3过程赋值语句中的延时

过程赋值语句中的延时状况比较繁杂,但是结论很简单:?在持续赋值语句中使用正规延时,可以描述惯性延时。?在非阻塞赋值语句中使用内定延时,可以描述传输延时。

1.3.1正规延时和内定延时

正规延时和内定延时的定义见清单3。

清单3正规延时和内定延时

#Nsum=a+b;//正规延时sum=#Na+b;//内定延时

定义于赋值语句前面的延时称为正规延时,其意义是:若赋值语句的执行条件在T时刻得到满足,该语句并不会马上执行,而是在延时N时间后,也就是在T+N时刻将T+N时刻的a+b赋值给sum。

内定延时定义于赋值语句的右式之前,其意义是:若赋值语句的执行条件在T时刻得到满足,马上将T时刻的a与b相加,并不是马上赋值给sum,而是在延时N时间后,也就是在延时N时间后将a+b赋值给sum。

了解了正规延时和内定延时的概念,不难想象出,对应Verilog中的持续性赋值、阻塞性赋值和非阻塞赋值这三种赋值形式,一共有六种插入延时的方法。但是在持续赋值中插入内定延时是非法的,这是由于内定延时需要将T时刻的结果保持到T+N时刻进行赋值,表现出记忆特性,与持续赋值的意义相冲突。

下文介绍阻塞赋值和非阻塞赋值中的延时。

1.3.2阻塞赋值中的延时

在阻塞赋值中可以插入正规延时和内定延时,例如如清单4所示。由QuartusII综合后得到时间戳report和RTL图形分别如图3和图4所示,由Modelsim仿真产生的仿真波形如图5所示。

3/12

清单4阻塞赋值语句中的延时

moduleDelayDemo(A,B,C,D);outputA,B,C,D;reg[3:0]A,B,C,D;initialbegin

A=4'd0;B=4'd0;#4A=4'd2;B=4'd4;#2A=4'd3;#2A=4'd4;#9A=4'd3;

#2A=4'd5;B=4'd5;#5B=4'd8;end

always@(AorB)begin

C=#3A+B;//阻塞赋值中的内定延时end

always@(AorB)begin

#3D=A+B;//阻塞赋值中的正规延时endendmodule

图3清单4的message

4/12

图4清单4的RTL

图5清单4的仿真波形

在图5的仿真图中,对于不断变化的输入A和B,C为插入了3ns内定延时的A+B,D为插入了3ns正规延时的A+B。

先探讨在阻塞赋值中插入内定延时的效果:?0ns时刻(Start1):always进程启动,仿真器计算0时刻A+B的值后进程挂起,等待

3ns后赋值给C。?3ns时刻(Display1):C接受赋值更新,由未知出跳变为0。?4ns时刻(Start2):A和B同时变化,启动进程,仿真器计算A+B的值,并在等待3ns

后赋值给C。

?6ns时刻:由于阻塞赋值的特性,A由2到3的跳变被忽略,不会反应在C上。?7ns时刻(Start2):C由0跳变为4ns时刻A+B的值6

5/12

再来探讨在阻塞赋值中插入正规延时的效果:?0ns时刻(Start1):always进程启动,由于设定了3ns的正规延时,进程被挂起等待3ns

后执行。

?3ns时刻(Display1):执行赋值,将该时刻的A+B=0赋值给C。?4ns时刻(Start2):A和B同时变化,启动进程,仿真器计算A+B的值,并在等待3ns

的延时,在7ns时刻再次执行。

?6ns时刻:由于阻塞赋值的特性,A由2到3的跳变被忽略,不会反应在C上。?7ns时刻(Start2):执行赋值,将该时刻的A+B=7赋值给C。

由上面的分析可知,在阻塞赋值语句中插入延时的效果是;在语句启动后延时的一段时间输出当前时刻(正规延时)或语句启动时刻(内定延时)的规律结果,并且会忽略这段时间内所有的输入改变事件。但是这种行为不能模拟实际电路中的惯性延时或者传输延时,因此不适合在阻塞赋值中插入延时。

1.3.3非阻塞赋值中的延时

与阻塞赋值一样,非阻塞赋值也可以插入正规延时和内定延时,例如如清单5,图6和图7分别是QuartusII综合产生的时间戳report和RTL图形,图8是由Modelsim仿真产生的波形。

清单5非阻塞赋值语句中的延时

always@(AorB)begin

C

图9希望得到的硬件电路

从硬件结构中可以看出,必需保证中间变量temp先被读取再被赋值。这种保证在实际的电路中是通过触发器的建立延时来实现的,即当CLK同步变化时,虽然两个D触发器被同时启动,但是由于输入到输出的信号建立需要一定的时间,所以触发器XxorY得到的是触发器temp输出的原值,从而使XxorY在两个周期后得到X异或Y的结果。

在仿真语义中需要显式的说明这种顺序可以对temp使用非阻塞赋值。非阻塞赋值的优先级较阻塞赋值低,temp的更新会被安排到仿真时刻的所有事件完成后

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论