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

本文详细分析了Verilog HDL中的阻塞赋值与非阻塞赋值的语义差异,通过具体案例揭示了两者在电路综合和设计实践中的不同影响。阻塞赋值会导致立即更新,而非阻塞赋值则会将更新事件放入事件队列,等待所有当前时间的活跃事件执行完毕后才执行。在某些特定场景,如状态机和特定算法实现中,正确选择赋值方式至关重要。
摘要由CSDN通过智能技术生成

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

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

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


1、语义分析

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

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


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

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


其次来分析非阻塞赋值。

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

sum  <=  A+B

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

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

  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值