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;