原创 阻塞赋值、非阻塞赋值的差异

2007-10-17 14:40 6880 8 11 分类: FPGA/CPLD

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


  Verilog HDL中,有两种过程性赋值方式,即阻塞式(blocking)和非阻塞式(non-blocking)。这两种赋值方式看似差不多,其实在某些情况下却有着根本的区别,如果使用不当,综合出来的结果和你所想得到的结果会相去甚远。


Tip:所谓过程性赋值就是指在initialalways语句内的赋值,它只能对寄存器数据类型的变量赋值。


阻塞式    blocking         的操作符为   =


非阻塞式(non-blocking   的操作符为 <=


首先,我们通过两个例子来看看这两种赋值方式的区别,这里使用的综合工具为Qt ii


1:非阻塞式赋值


module


test_non_blocking


(


input             clk,


input             testa,


input             testb,


input             testc,


input             testd,


output  reg       testout


);


reg testreg;


 


always @ (posedge clk)


begin


  testreg <= testb | testc;


  begin  


    if (testa) begin


      testout <= testreg & testd;


    end 


    else begin


      testout <= testd;


    end


  end


end


endmodule


1综合后的结果为


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />点击看大图 


2:阻塞式赋值


module


test_blocking


(


input             clk,


input             testa,


input             testb,


input             testc,


input             testd,


output  reg       testout


);


reg testreg;


 


always @ (testa,testb.testc,testd)


begin


  testreg = testb | testc;


  begin  


    if (testa) begin


      testout = testreg & testd;


    end 


    else begin


      testout = testd;


    end


  end


end


endmodule


2综合后的结果为:


  点击看大图


 


分析:


可以看到,例1和例2code写法完全一样,只是在always语句块中使用了不同的赋值方式,就导致综合出来的结果不同。


在例1中,是非阻塞式赋值方式,非阻塞式赋值的赋值对象总是在当前仿真时刻结束时被赋值,所以,当在对语句2中的testout赋值这一时刻, testreg 值还没有得到语句1中的新值,而是原来的值(即上一个时刻的值)。


而在例2中,使用了阻塞式赋值方式,就是在always语句块中是一句一句执行的。在执行语句2之前,语句1就已经执行完成,testreg被赋好了新值,所以语句2中的testreg值取的是新值。


建议:


1. 阻塞式赋值用于组合逻辑建模;


2. 非阻塞式赋值用于时序逻辑建模。


 


 (谢谢,偷懒了,害人不浅啊 已更新)


 

PARTNER CONTENT

文章评论6条评论)

登录后参与讨论

用户425250 2013-12-24 19:14

楼主说的很好,3Q

用户199800 2009-4-11 15:18

看了一下!终于明白了一点,还有待于继续学习!

sunke9_998892717 2009-4-10 08:03

可以映射到别的管脚

用户1441579 2009-4-1 17:34

如果JTAG和SPI3有相同的引脚呢?怎么办?

用户1113192 2007-11-25 09:25

VHDL语言我用了三年,没有说他不好。实际上VHDL在算法描述还有系统级的描述上还要更强势。只是在一年前换工作,现在的设计小组用的Verilog,没有办法啦。现在用Verilog和VHDL没有多大的差异。更没有厚此薄彼的意思。完全依个人习惯。

用户123067 2007-11-24 22:11

楼主怎么都是用Verilog HDL语言的啊??VHDL语言不习惯用吗??

用户1071875 2007-10-24 11:48

阻塞和非阻塞例子写的有点问题,都成一样了

还有就是阻塞能用在时序逻辑里?

用户1113192 2007-10-18 18:35

不好意思。各位从我的163的博客里直接摘过来的,图片看不到,不好意思。我重新上传了图片。给大家个直观的印象

相关推荐阅读
用户1113192 2011-02-09 17:26
2011 新的一年 共同进步
空间荒废了一年了,今天打开了 呵呵  还在。 真是对不起各位大侠了。有需求发我邮箱吧。wwh_nuaa@163.com.   明天开始上班了。祝大家心情愉快。大展宏图。...
用户1113192 2009-05-27 15:05
高级加密标准(AES)算法
高级加密标准(AES)算法...
用户1113192 2009-05-27 14:59
分组对称加密模式:ECB/CBC/CFB/OFB缺CTR- -
分组对称加密模式:ECB/CBC/CFB/OFB缺CTR- -                                       【虎.无名】一般的加密通常都是块加密,如果要加密超过块大小的...
用户1113192 2009-05-27 14:57
基于AES算法的WLAN安全机制分析
基于AES算法的WLAN安全机制分析Performance Analysis of AES-Based WLAN Security刘永元,张联峰,刘乃安摘要:高级加密标准(AES)加密算法Rijnda...
用户1113192 2009-05-23 14:27
工作日志
 xilinx 11.1 update pdf ...
用户1113192 2009-05-18 08:33
图文并茂VLAN全接触
https://static.assets-stash.eet-china.com/album/old-resources/2009/5/18/3f8b27e9-5417-46f5-897f-dc13...
EE直播间
更多
我要评论
6
8
关闭 站长推荐上一条 /3 下一条