阻塞和非阻塞赋值讨论

一直对这个也不是特别明白
夏语文那本书上有一章将这个,可是说的好像不是很明白。基本没有读懂。
我理解他的意思就是说两种赋值在时间上是有差别的,阻塞是计算等式左边和给右边赋值是同时的,而且是有优先级的(不能被打断)。非阻塞是有一个时间差的。所以,在连续赋值时,比如:a=b;b=c;和b<=c;a<=b;前一个综合成一个寄存器,后一个综合成两个寄存器串联。可是b=c;a=b;综合的结构就是两个寄存器串联。
大家来讨论一下吧!

[ 本帖最后由 salading 于 2008-8-26 17:30 编辑 ]
我也来说两句 查看全部回复

最新回复

  • salading (2008-8-26 17:27:25)

    我觉得对verilog语言标准不同的综合器的理解是有区别的。
    写了两段代码,简单的赋值语句,都是沿触发的always块(如下所示),都综合成了触发器,没有任何区别:
    1。always(posedge clk or negedge rst)
         if(!rst)。。。。。。
         else
                   a<=b;
    2。always(posedge clk or negedge rst)
         if(!rst)。。。。。。
         else
                   a=b;

    [ 本帖最后由 salading 于 2008-8-26 17:28 编辑 ]
  • neosly (2008-8-26 20:04:10)

    从功能上看
    一个是顺序执行的
    一个是并行的执行的
    尤其是加上延迟的时候很明显
    个人感觉
  • salading (2008-8-27 11:16:55)

    这个非阻塞并行因该理解为每个赋值语句的两个过程是并行的,应该这么理解吧!

    [ 本帖最后由 salading 于 2008-8-27 11:21 编辑 ]
  • salading (2008-8-27 11:22:20)

    即右侧等式的计算
    和左侧等式的赋值两个过程
  • yadog (2008-8-27 12:07:02)

    搜索“Nonblocking Assignments in Verilog Synthesis, Coding Styles That Kill!” written by Clifford E. Cummings

    这边文章相信可以解答疑惑
  • cryinrain_cug (2008-8-27 13:28:12)

    嗯.lz可以多写代码综合体验下
    这个东西主要看实践来检验!
  • xiaoyuer38 (2008-8-27 13:39:28)

    ..............
  • salading (2008-8-27 14:41:53)

    QUOTE:

    原帖由 yadog 于 2008-8-27 12:07 发表
    搜索“Nonblocking Assignments in Verilog Synthesis, Coding Styles That Kill!” written by Clifford E. Cummings

    这边文章相信可以解答疑惑
    夏那本书的这一章就是翻译的那篇文章,现在感觉是verilog就是一种单纯的语言,每种综合器对他都会有自己的理解。这二者是不能等价的
  • 番茄 (2008-8-27 14:53:16)

    阻塞是顺序执行
    非阻塞并行执行
  • jiajie0628 (2008-8-27 15:14:19)

    楼上说的对,而且非阻塞赋值是在整个过程模块一次仿真结束后对信号赋值,而阻塞赋值是当即发生的
  • sinob (2008-8-27 16:30:15)

    时钟来后<=才赋值,更类似于c语言中的 c=c+2,时钟过来后,右边C不变,左边变为C+2
  • salading (2008-8-27 17:16:07)

    是不是可以这样解释非阻塞赋值:
    always@(posedge clk)
    a<=a+1;
    always@(posedge clk)
    b<=a;
    这个a,b之间是有一个周期的延时的。是因为两个always块并行执行,每个always赋值时先计算等式右边,再给等式左边。比如说当赋值开始时,a=3,则先计算a+1和a,计算结果a+1是4,a是3,然后再给左边,则b=3而此时a=4。a,b之间是有一个周期的延时。
    而假如后一个模块是下降沿触发的话,即:
    always@(negedge clk)
    b<=a;
    则只有半个周期的延时。因为此时a是稳定的。

    [ 本帖最后由 salading 于 2008-8-27 17:17 编辑 ]
  • salading (2008-8-28 09:49:21)

    kanlaimeirena