文学创作中华文学想法

verilog 阻塞赋值 vs 非阻塞赋值

2021-08-17  本文已影响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。

使用原则

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

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

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

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

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

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

上一篇 下一篇

猜你喜欢

热点阅读