verilog 阻塞赋值 vs 非阻塞赋值

阻塞赋值 =

always @ (posedge clk)
    begin
        c = b;
        b = a;
        $display("blocking: a = %d, b = %d, c = %d.", a, b, c);
    end

在clk上升沿到来的时候,把a的值赋给b,再把b的值赋给c,并显示a、b 的值。在把a的值赋给b的这个过程中,其他的语句都“被阻塞”,被迫 停下来,结束之后,进入下一句,直到执行完begin---end中语句。所以相当于把a的值通过b传递给c。

非阻塞赋值 <=

always @ (posedge clk)
    begin
        c <= b;
        b <= a;
        $display("non_blocking: a = %d, b = %d, c = %d.", a, b, c);
    end

在posedge clk到来时,计算所有的右侧值,此 时,a的值为3,b的值为x,这是同时进行的, 没有先后顺序;然后更新左侧值,结束之后, b的值变为3,c的值为前一时刻b的值,即x。

  • 阻塞赋值 “=”:顺序执行。语句的顺序很重要,在本语句中“右式计算”和“左式更新”完全完成之后,才开始执行下一条语句。

  • 非阻塞赋值“<=”:并行执行。同时执行,与顺序无关,当前语句的执行不会阻塞下一语句的执行。

    1. 在开始时,计算所有非阻塞赋值右侧表达式

    2. 在结束时,更新所有非阻塞赋值左侧表达式

使用原则

① 在assign的结构中,必须使用阻塞赋值。

② 用always块建立组合逻辑模型时,用阻塞赋值。

③ 时序电路(锁存器)建模时,用非阻塞赋值。

④ 在同一个always块中建立时序和组合逻辑电路时,用非阻塞赋值。

⑤ 在同一个always块中不要既用非阻塞赋值又用阻塞赋值。

⑥ 不要在一个以上的always块中为同一个变量赋值。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容