美文网首页文学创作中华文学想法
verilog 阻塞赋值 vs 非阻塞赋值

verilog 阻塞赋值 vs 非阻塞赋值

作者: 佩玖吟 | 来源:发表于2021-08-17 22:53 被阅读0次

    阻塞赋值 =

    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块中为同一个变量赋值。

    相关文章

      网友评论

        本文标题:verilog 阻塞赋值 vs 非阻塞赋值

        本文链接:https://www.haomeiwen.com/subject/cvrwbltx.html