k0b0's record.

Computer Engineering, Arts and Books

Introduction to SystemVerilog. About blocking assignment and non-blocking assignment

ブロッキング代入とノンブロッキング代入

 SystemVerilogにおいてのブロッキング代入、ノンブロッキング代入(並列信号代入)についてメモ。

ブロッキング代入

 一つの代入処理が終了するまで次の処理を行わない(ブロックされる)。記述の順番が回路の動作に影響する

ノンブロッキング代入

 論理式の右辺の評価を行ってから代入処理が行われる(ブロックされない)。記述の順番が回路の動作に影響されにくい。

ブロッキング代入とノンブロッキング代入に関しての注意点

1, 同期型順序回路を記述する際はalways_ffとノンブロッキング代入を使う。

always_ff @(negedge clk)
begin
    q0 <= a;    //ノンブロッキング代入
    q1 <= q0;   //ノンブロッキング代入
end

2, 単純な組合わせ回路を記述する際はassign(継続代入)を使う。

assign o = a & b; //継続代入

3, 複雑な組合わせ回路を記述する際はalways_comb文とブロッキング代入を使う。

always_comb
begin
    p = q ^ b;
    g = a & b;
    s = p ^ cin;
    cout = g | (p & cin);
end

4, 同じ信号に対する代入を複数のalways文やassign文で行わない。

/*error : 信号qに対して信号aと信号reg0を同時に代入*/
always_ff(posedge clk)
    q = a;

always_ff(posedge clk)
    q = reg0;