




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
从仿真语义的角度看Verilog中的延时、阻塞与非阻塞赋值1 Verilog中的延时Verilog没有和VHDL中类似的最小延时概念,所有的延时都由符号“#”来定义,如果没有这个符号就意味着没有延时,清单1中描述了一个有关延时的简单例子。清单1 简单的延时wire #5 Y = A & B; 清单1 中使用持续赋值语句描述了一个两输入端与门逻辑,并且在表达式前插入了5ns(#5)的延时,意义为Verilog仿真器会在5ns的延时后将A和B相与赋值给Y。通过这个例子可以看出,延时的插入只需要在原本的语句中加入“#”关键字即可,但在实际的使用中却经常产生错误,实际中的延时时间是由具体的硬件电路来决定的。使我们更深入的理解Verilog中的延时,更加关注描述的电路意义而不是描述语句本身,Verilog也是一种机于硬件的语言。1.1 实际中的延时在实际的电路中,只存在着两种延时行为,一个是惯性延时,另一个是传输延时。1.1.1 惯性延时(Inertial Day)惯性延时通常在信号通过逻辑门的时候发生,图1所示是信号通过一个具有5ns延迟的非门时的行为。图1 惯性延时输入信号WireIn有两个高电平脉冲,一个宽度为3ns,另一个宽度为9ns。当第一个3ns的脉冲到达非门时,因为其宽度小于非门的本身延时(5ns),输出还来不及建立低电平,输入脉冲就已经过去,所以在输出信号WireOut上没有体现出第一个3ns脉冲的响应。第二个脉冲宽度为9ns,大于非门的本身延时,所以在脉冲上升沿5ns之后,WireOut输出了一个宽度为9ns的低脉冲,这个脉冲与输入脉冲等宽、反向而且延迟了5ns。这种延时称为惯性延时或惰性延时。如果输入的变化过快,小于逻辑门本身的延时,就不会被体现在输出上。1.1.2 传输延时(Transport Delay)传输延时相对于惯性延时更容易理解,相当于信号通过了一条拥有固定延时的传输线。如图2所示是信号通过一条5ns的延时线地示意图与波形。图2 传输延时容易看出来,WireOut实际上就是被延迟了5ns的WireIn。所以传输延时的意义就是将输入信号延迟一定时间后体现在输出上,而且输入信号上的所有细节都不会丢失。1.2 持续赋值语句中的延时在持续赋值语句只有一种合法的延时描述,如清单2所示:清单2 持续赋值语句中的延时assign #5 WireOut = WireIn;这种描述用语表示电路中的惯性延时,任何小于5ns的输入变化都会被过滤而不会体现在输出上。1.3 过程赋值语句中的延时过程赋值语句中的延时情况比较复杂,但是结论很简单:l 在持续赋值语句中使用正规延时,可以描述惯性延时。l 在非阻塞赋值语句中使用内定延时,可以描述传输延时。1.3.1 正规延时和内定延时正规延时和内定延时的定义见清单3。清单3 正规延时和内定延时#N sum = a+b; /正规延时sum = #N a+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所示。由Quartus II综合后得到时间戳report和RTL图形分别如图3和图4所示,由Modelsim仿真产生的仿真波形如图5所示。清单4阻塞赋值语句中的延时module DelayDemo(A,B,C,D); output A,B,C,D; reg 3:0 A,B,C,D;initial begin A=4d0;B=4d0; #4 A=4d2;B=4d4; #2 A=4d3; #2 A=4d4; #9 A=4d3; #2 A=4d5;B=4d5; #5 B=4d8; end always(A or B)begin C =#3 A+B; /阻塞赋值中的内定延时endalways(A or B)begin #3 D= A+B; /阻塞赋值中的正规延时endendmodule图3清单4的message图4清单4的RTL图5清单4的仿真波形在图5的仿真图中,对于不断变化的输入A和B,C为插入了3ns内定延时的A+B,D为插入了3ns正规延时的A+B。先讨论在阻塞赋值中插入内定延时的效果:l 0ns时刻(Start1):always进程启动,仿真器计算0时刻A+B的值后进程挂起,等待3ns后赋值给C。l 3ns时刻(Display1):C接受赋值更新,由未知出跳变为0。l 4ns时刻(Start2):A和B同时变化,启动进程,仿真器计算A+B的值,并在等待3ns后赋值给C。 l 6ns时刻:由于阻塞赋值的特性,A由2到3的跳变被忽略,不会反应在C上。l 7ns时刻(Start2):C由0跳变为4ns时刻A+B的值6再来讨论在阻塞赋值中插入正规延时的效果:l 0ns时刻(Start1):always进程启动,由于设定了3ns的正规延时,进程被挂起等待3ns后执行。l 3ns时刻(Display1):执行赋值,将该时刻的A+B=0赋值给C。l 4ns时刻(Start2):A和B同时变化,启动进程,仿真器计算A+B的值,并在等待3ns的延时,在7ns时刻再次执行。 l 6ns时刻:由于阻塞赋值的特性,A由2到3的跳变被忽略,不会反应在C上。l 7ns时刻(Start2):执行赋值,将该时刻的A+B=7赋值给C。由上面的分析可知,在阻塞赋值语句中插入延时的效果是;在语句启动后延时的一段时间输出当前时刻(正规延时)或语句启动时刻(内定延时)的逻辑结果,并且会忽略这段时间内所有的输入改变事件。但是这种行为不能模拟实际电路中的惯性延时或者传输延时,因此不适合在阻塞赋值中插入延时。 1.3.3 非阻塞赋值中的延时与阻塞赋值一样,非阻塞赋值也可以插入正规延时和内定延时,示例如清单5,图6和图7分别是Quartus II综合产生的时间戳report和RTL图形,图8是由Modelsim仿真产生的波形。清单5 非阻塞赋值语句中的延时always(A or B)begin C =#3 A+B; /非阻塞赋值中的内定延时endalways(A or B)begin #3 D= A+B; /非阻塞赋值中的正规延时end/*其余部分与清单4相同*/图6清单5的时间戳report图7清单5的RTL图形图8清单5的仿真波形在图8的仿真图中,对于不断变化的输入A和B,C为插入了3ns内定延时的A+B,D为插入了3ns正规延时的A+B。先讨论在非阻塞赋值中插入内定延时的效果:l 0ns时刻(Start1):always进程启动,计算A+B的值,然后进程挂起,等待3ns后赋值给C。l 3ns时刻(Display1):C接受赋值更新,由未知出跳变为0。l 4ns时刻(Start2):A和B同时变化,启动进程,仿真器计算A+B的值,并在等待3ns后赋值给C。 l 6ns时刻:由于非阻塞赋值的左式更新操作在仿真事件中的优先级要低于阻塞赋值的右式计算、左式更新,也低于由于输入改变而启动的非阻塞赋值本身的右式计算,所以在该时刻C的更新操作会被放入执行队列,并在3ns后执行赋值。l 7ns时刻(Display2):C由0跳变为4ns时刻A+B的值6l 8ns时刻(Start3):进程再次启动,并会在3ns以后将C赋值为8ns的A+B值l 9ns时刻:执行6ns时刻放入队列中的赋值操作,C被赋值为7通过上面的分析可以看出在非阻塞赋值中插入内定延时可以很好的描述实际电路行为中的传输延时,这也是在过程赋值中唯一推荐使用的延时描述。而非阻塞赋值中插入正规延时的效果大致与阻塞赋值中相同,会在当前的语句启动以后,延时一段时间输出当前时刻的逻辑结果,并且会忽略这段时间内的所有输入改变事件,不符合惯性延时和内定延时的行为特点。2 阻塞赋值与非阻塞赋值2.1说明阻塞赋值与非阻塞赋值统称为过程赋值。2.2组合逻辑Verilog中使用等号“=”来表示阻塞赋值,被赋值的变量放在等号的左边,计算赋值的表达式置于等号右边。阻塞赋值可以很好的建模电路中的数据流,请考虑清单6中的代码片断。清单6 组合逻辑的阻塞赋值reg temp1,temp2;always (X or Y or CIN)begin temp1 = X Y;temp2 = temp1 & CIN;SUM = temp1 CIN;COUT = temp2 | (X & Y);End清单6是一个全加器的描述,其中所有的赋值语句都是阻塞赋值,特点是: 等号“=”右边表达式的结果计算和将计算结果赋值给左边变量的操作,是一个统一、连续的过程,不允许在其中插入其他动作;阻塞赋值语句会阻塞其后代码中语句的执行,也就是说Verilog仿真器在完成一句阻塞赋值语句前,不会响应其他事件。 由此可见清单6中各语句的意义是:首先将X异或Y的结果赋值给temp1,接着执行第二条语句将temp1和CIN相与的结果赋值给temp2,并最终计算出SUM和COUT。很好的反映了组合逻辑中的数据流动顺序。如果将这里的阻塞赋值替换为非阻塞赋值,如清单7所示。 清单7 组合逻辑的非阻塞赋值1reg temp1,temp2; always (X or Y or CIN) begin temp1 = X Y; temp2 = temp1 & CIN; SUM = temp1 CIN; COUT = temp2 | (X & Y); end Verilog中使用小于等号“=”来表示非阻塞赋值,被赋值的变量放在等号的左边,计算赋值的表达式置于等号的右边。 与阻塞赋值不同,非阻塞赋值不能反映电路的数据流。因为在Verilog仿真语义中规定:非阻塞赋值对于左边赋值变量的更新操作的优先级要低于阻塞赋值,也要低于非阻塞赋值本身等号右边的表达式计算,需要等到当前仿真周期结束时才被执行。所谓的当前仿真周期结束,指的是某一时刻的所有仿真事件全部完成。 在清单7中,某时刻当敏感事件表中的信号发生变化导致always进程启动,进程中的赋值语句在该时刻被依次执行。由于非阻塞赋值的特点,X异或Y首先计算,但是所得的结果并不会立刻赋值给temp1,所以第二句中引用的是temp1的原值,不是第一句中X与上Y的结果。同样,第二句中temp1和CIN相与的结果也不会立刻用于更新temp2。所有的左侧变量在该仿真时刻的事件执行完毕,也就是5条赋值语句的右侧表达式全部计算完毕后才被更新。 这显然不是我们所期望的逻辑结果,不过可以通过将中间变量temp1和temp2放入always语句的敏感事件表中来解决这个问题,如清单7所示。这样在每次temp1或temp2发生变化的时候,always语句都会重新启动,从而将temp1和temp2的更新代入计算得到正确的SUM和COUT。清单8 组合逻辑的非阻塞赋值2reg temp1,temp2; always (X or Y or CIN or temp1 or temp2)begin temp1 = X Y; temp2 = temp1 & CIN; SUM = temp1 CIN; COUT = temp2 | (X & Y); end 通过上面的示例可以看出,非阻塞赋值不能反映组合逻辑中的数据流,除非将所有的中 间变量都列入敏感事件表中。所以建议在对组合逻辑建模时采用阻塞赋值。2.3时序逻辑时序逻辑中也存在变量更新与读取的冲突和顺序问题,当更新与读取分别在两个always进程中时,请考虑清单9中的代码片断。清单9 双进程阻塞更新always (posedge CLK) / 进程A begin temp = X Y; end always (posedge CLK) / 进程B begin XxorY = temp; End从仿真语义的角度来看,这两个always进程置于相同时钟CLK的控制下,进程A更新寄存器变量temp的值,进程B读取temp的值。当CLK的上升沿到来时两个进程被同时启动,习惯性的误认为:由于语句的先后顺序,进程A中的阻塞赋值首先执行。当X异或Y赋值给temp后,才会执行进程B中的读取语句,最后XxorY得到X异或Y的结果(D触发器)。但是如果进程A和进程B的顺序颠倒过来,读取便会阻塞更新,XxorY得到的就不是该时钟上升沿时刻X异或Y的结果,而是上一周期temp的原值(2位移位寄存器)。 实际上,在Verilog的仿真语义中,always进程的执行顺序仅仅和敏感事件表相关,并不取决于代码的先后顺序。在CLK上升沿的控制下,进程A和进程B同时启动,temp的更新与读取操作都作为当前仿真时刻的事件被列入事件队列。由于他们同为阻塞赋值,所以拥有相同的优先级,仿真器的执行顺序是随机的,有的仿真器会按照代码的先后顺序执行,有的则会按照随机顺序执行。 这种仿真语义的不确定性会带来综合结果的不确定性,目前业界还没有Verilog的综合标准,综合的结果取决于综合工具对于仿真语义的理解。虽然对于清单9中的代码,似乎任何一种执行顺序都有一种仿真语义与之对应,但是设计者撰写这段代码所希望得到的硬件结构确是一定的:希望以temp作为中间变量,用CLK时钟将X异或Y的结果同步后再打一拍赋值给XxorY,硬件电路相当于两个D触发器的串联,可以看作是一个2位的移位寄存器,如图9所示。图9 希望得到的硬件电路从硬件结构中可以看出,必须保证中间变量temp先被读取再被赋值。这种保证在实际的电路中是通过触发器的建立延时来实现的,即当CLK同步变化时,虽然两个D触发器被同时启动,但是由于输入到输出的信号建立需要一定的时间,所以触发器XxorY得到的是触发器temp输出的原值,从而使XxorY在两个周期后得到X异或Y的结果。 在仿真语义中需要显式的表明这种顺序可以对temp使用非阻塞赋值。非阻塞赋值的优先级较阻塞赋值低,temp的更新会被安排到仿真时刻的所有事件完成后执行。无论语句的先后顺序如何,作为阻塞赋值的temp读取事件都会先于temp的更新事件执行,保持了仿真语义与综合结果的一致性。 因此,建议当对变量的赋值与读取不在同一个always进程时,使用非阻塞赋值对该变量赋值,如清单10所示。清单10 双进程非阻塞更新always (posedge CLK) / 进程Abegin temp = X Y; end always (posedge CLK) / 进程B begin XxorY = temp; End仿真语义是有顺序的,即使多个事件可能都包含在同一个的仿真时刻下。这是因为硬件电路是并行的,同一时刻可能有多个事件发生,但是仿真工具一般都是运行在通用计算机上的软件程序,CPU的处理机制是顺序的。可以认为仿真语义是为了平衡并行的硬件电路与顺序的仿真工具之间的一种桥梁。 综合结果是综合软件对仿真语义的理解,但是并不局限于仿真语义。实际的综合工具会根据更多的元素来进行综合,比如Synplify Pro对于清单8和9中的代码均可综合出正确的结果,但是有些综合工具对于7中的描述,就会将中间变量temp 当作是冗余逻
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年肿瘤科肺癌分期与治疗方案模拟测试答案及解析
- 2025内蒙古华润万家超市额尔敦路分公司招聘70人笔试备考试题及答案解析
- 2025年神经外科手术并发症的处理策略模拟考试卷答案及解析
- 2025广东广州市生态环境局越秀分局招聘编外辅助人员1人笔试模拟试题及答案解析
- 2025年郑州市管城回族区人民法院招聘特邀调解员20名笔试参考题库附答案解析
- 2025年急症解剖解剖学知识测试模拟考试答案及解析
- 2025年消化内科常见消化道疾病诊疗规范模拟考试卷答案及解析
- 朝阳市中石油2025秋招笔试模拟题含答案数智化与信息工程岗
- 菏泽市中石油2025秋招面试半结构化模拟题及答案财务与审计岗
- 中卫市中石化2025秋招笔试模拟题含答案机械与动力工程岗
- 2025年湖南省高考历史真题(原卷版)
- 老年人脑卒中课件
- 2025年传媒行业编辑记者招聘笔试模拟题及答案全解
- 2025年宪法知识竞赛试题库(含答案)
- 事业法人登记管理办法
- 餐饮服务食品安全常规项目自查记录表
- 膝关节病中医护理查房讲课件
- 后殖民视觉政治-洞察及研究
- 梁家村梁述文果园损失的评估报告【范本模板】
- 骨科规范化培训体系构建与实施
- 电网公司输变电工程施工项目部设置与管理的标准化流程探讨
评论
0/150
提交评论