Verilog HDL阻塞属性探究及其应用_第1页
免费预览已结束,剩余1页可下载查看

下载本文档

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

文档简介

1、verilog hdl阻塞属性探究及其应用摘 要:堵塞赋值与非堵塞赋值语句作为verilog hdl语言的最大难点之一,向来困扰着设计者,而其中的错误又隐晦莫测,理解不透彻会挺直导致运用不当,使设计工程达不到预期效果,而排错又相当棘手。堵塞赋值与非堵塞赋值语句既血脉相连,又有本质的区分。透过原理和实际应用,从不同侧面向堵塞赋值与非堵塞赋值举行剖析,并阐述了堵塞赋值与非堵塞赋值的各自特点及其应用。hdl中,有两种过程赋值方式,即堵塞赋值(blocking)和非堵塞赋值(nonblocking)。堵塞赋值执行时,rhs(right hand statement)估值与更新lhs(left hand

2、 statement)值一次执行完成,计算完毕,立刻更新。在执行时堵塞同块中的其他语句的执行。堵塞式(blocking)的操作符为 “ = ”。它的执行很像传统程序设计语言。非堵塞赋值rhs估值与更新lhs值分两步执行。在单位周期开头时rhs估值,在同一单位仿真周期末更新lhs值,不堵塞同块中其他语句的执行。非堵塞式(non-blocking)的操作符为 “ 1 verilog 大事处理机制层积大事列(the stratified event queue)是一个大事管理概念模型,而非硬件规律。模型内大事的详细实现与软件生产商的算法策略有关。在ieee-2001中,verilog把大事分为5个不

3、同部分,根据时光挨次1所示。触发的任何大事可以加入到这5个大事列中的任何大事列中,但只能从活跃大事列中移出。即上面的5个大事列中的大事最后都将被激活而放入活跃大事列中。层积大事列是层次模型,层积大事列的执行挨次是按优先级罗列的。任何eda软件都只能执行活跃大事。其他大事列都按优先级级别依次激活本列大事以供执行。1.1 活跃大事列由图1可见,大部分大事都被放入活跃大事列。活跃大事列里包括非堵塞赋值rhs估值。但是,非堵塞赋值的更新不是在活跃大事列,它被列成自立的非堵塞更新大事列。活跃大事列是仿真的执行源,从一开头执行活跃大事列到活跃大事列执行完毕称为一个仿真周期。活跃大事列中的大事可以触发活跃或

4、非活跃等其他大事。当活跃大事列中的全部大事执行完后,eda软件会按优先级依次触发其余大事列以供仿真执行。但在当前活跃大事列中的大事执行挨次是不确定的。1.2 非活跃大事列发生在当前仿真时光里并且在活跃大事列执行完后执行的大事列,即非活跃大事列执行优先级仅次于活跃大事列。如带pli例程的回调过程(tf_synchronize()、vpi_register_cb(cb_readwrite))。非活跃大事列中的大事亦可以触发其他大事。假如触发了优先级更高的活跃大事,非活跃大事列中的其余大事执行后移。1.3 非堵塞赋值更新大事列活跃大事列中的每个非堵塞赋值rhs估值,都会触发一个与之对应的非堵塞赋值更

5、新大事,这些大事被放在非堵塞赋值更新大事列中,执行优先级次于活跃与非活跃大事列。非堵塞赋值更新大事亦可以触发其他大事。若在非堵塞赋值更新大事列中,存在多个对同一变量的先后赋值,惟独最后一个有效,其余值将被笼罩。1.4 监控大事列监控大事列被放在非堵塞赋值更新大事列后。由此可见,用监控大事列中的监控指令监控得到的值都是赋值后的值,活跃大事列display系统指令则可以查看非堵塞更新前的值。1.5 将来大事列在执行大事时,假如大事含有延时,为不妨碍仿真的继续执行,该大事将被挂起而放入将来大事列。将来大事包含将来非活跃大事和将来非堵塞赋值更新大事。理解堵塞与非堵塞赋值就需要深化理解层积大事列,层积大

6、事列反应了verilog大事处理机制。2 应用及分析通常非堵塞赋值产生寄存器等存储元件,对应的物理器件是带存贮功能的元件,如寄存器、触发器等。堵塞赋值则对应网线(wire)类型,通常与物理连线对应。这是两种赋值方式的最显然的差异,也是时序规律用非堵塞、组合规律用堵塞的重要缘由。但这并不是肯定的,实际上堵塞赋值对应网线(wire)型,亦可对应寄存器(reg)型;堵塞赋值也能生成存贮元件,因此不能片面理解。在组合规律里,锁存器可能引发测试问题,带来隐患。解释在建模时,首先要从硬件动身来考虑问题,应先在头脑中形成结构,因为赋值方式的不同,综合结果差异甚大,运用不当很可能会导致建模失败。堵塞赋值在时序

7、规律中亦有着重要应用,在需要实时更新的组合规律中惟独堵塞赋值能满足要求。以下示例代码的功能是计算传送过来的data中1和0的个数。reg 5:0count0,count1;always (posedge clk,negedge rst_n)beginif(!rst_n).elsebegincount0 = 0; /语句1count1 = 0; /语句2for(i = 0;i beginif(data = 1)count1 = count1 + 1; /语句3else if(data = 0)count0 = count0 - 1; /语句4elsecount0 = count0 + 0; /防

8、止生成锁存器endendend在这段代码里,count0、count1的值必需在每次计数之前被清零,count0、count1必需实时更新。明显,惟独堵塞赋值能满足要求。非堵塞赋值分两步完成,全部的更新大事在单位仿真周期末同时执行,惟独最后一个值有效,所以非堵塞赋值无法完成计数任务。堵塞赋值却能很好地胜任,由于堵塞赋值估值和更新一次性完成。大事上,在时序规律中常常遇到上述实时更新问题,非堵塞赋值往往无法实现,如用堵塞赋值则可很好地解决问题。正如堵塞赋值在时序规律中有重要应用一样,非堵塞赋值在组合规律中亦有不行替代的应用。在组合规律中用非堵塞赋值可以把组合规律改造成流水线。可执行如下所示纯组合规

9、律代码,将生成纯组合规律,综合结果2所示。input a,b,c,clk,sel;output out;reg out,temp;always (posedge clk)begintemp = a /语句1if(sel)out = temp | c; /语句2elseout = c; /语句3end若把上面代码中语句1、语句2、语句3堵塞赋值(" = ")改为非堵塞赋值("流水线设计办法在高性能、需常常举行大规模运算的组合规律中可以到广泛运用。在组合规律中,如在begin、end块中同时有许多非堵塞赋值,则它们的赋值挨次是并发的。事实上它们给予的都是上一个时钟送入寄存器的值。这与用法同一时钟沿触发的许多在同一个使能控制信号下赋值彻低全都,并且这种赋值由于数据保存在寄存器中,当初钟沿到来时都已稳定,所以存入的数值是牢靠的。用这种办法可以避开由组合规律产生的竞争冒险2。在相关应用中,非堵塞赋值能较好地解决零时刻竞争冒险问题。由于非堵塞赋值分两步完成,非堵塞赋值更新大事是在全部活跃与非活跃大事执行完之后执行,能确保全部敏感变量值在零时刻都被触发3。在同一always块混合用法堵塞赋值与非堵塞赋值,利弊共存,混合用法的结果可能事半功倍,亦可能功败垂成。惟独了解其处理机制,深刻理解堵塞与非堵塞赋值底层

温馨提示

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

评论

0/150

提交评论