阻塞赋值与非阻塞赋值的再分析

阅读: 评论:0

阻塞赋值与非阻塞赋值的再分析

阻塞赋值与非阻塞赋值的再分析

在Verilog HDL设计中,经常会遇到阻塞赋值与非阻塞赋值,这是学习逻辑设计时最基础的知识点。设计者经常会在书中看到一些建议:什么时候该用阻塞赋值,什么情况下使用非阻塞赋值。可是,如果仅仅按照这样的设计推荐来进行设计的话,经常会碰到一头雾水的情况。本文就对阻塞赋值和非阻塞赋值进行详细的讨论,深入分析这两种赋值语句的区别。

“阻塞”与“非阻塞”疑问的由来,主要体现在always或initial语句中。

在任何书上都会碰到的分析为:阻塞赋值“=”与非阻塞赋值“<=”的区别在于:非阻塞赋值语句右端表达式计算完后并不立即赋值给左端,而是马上启动下一条语句继续执行;而阻塞赋值语句在每个右端表达式计算完后立即赋值给左端变量。


1、语义分析

首先来看阻塞赋值与非阻塞赋值在语义上的含义。

always @ (posedge clk)
beginq1  =  d;q2  =  q1;q3  =  q2;
end


always语句块对clk的上升沿敏感,只有在clk上升沿到来后,才执行always里面的语句。根据HDL语法的基础知识可以知道:d语句块中的所有语句都是顺序执行的。根据上文中“ 右端表达式计算完后立即赋值给左端变量”。即在该语句块中,“右式计算”和“左式更新”完全完成后,才开始执行下一条语句。也就是q1 = d执行完成后,当q1的值更新为d的值后,才开始执行q2 = q1,同理,q3最后的值为d.

在所有的语句执行完以后,该always语句等待clk的上升沿到来,从而再次触发d语句块。


其次来分析非阻塞赋值。

非阻塞赋值,就是指当前语句的执行互惠阻塞下一语句的执行。下面为非阻塞赋值的语句结构:

sum  <=  A+B

上式中左边的A+B称之为右式(RHS)计算事件,SUM称之为左式(LHS)更新事件。无论左式还是右式,都有可能即是变量,又是表达式。

非阻塞赋值的RHS计算属于活跃事件,需要优先执行,因此首先执行A+B,然后产生一个更新事件,把计算结果更新到SUM中,将“更新事件”放入事件队列中,但不会马上执行,即使这个更新事件属于当前时间的事件。因为非阻塞赋值的更新事件优先级较低,

本文发布于:2024-01-28 23:55:50,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170645735111223.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:赋值   与非
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23