网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> EDA >> HDL >> 文章正文
  [组图]阻塞赋值、非阻塞赋值的差异           ★★★ 【字体:
阻塞赋值、非阻塞赋值的差异
作者:Free    文章来源:Free    点击数:    更新时间:2008-1-4    
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综合后的结果为

点击看大图 

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. 非阻塞式赋值用于时序逻辑建模。

               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    没有相关文章
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号