ブロッキングと非ブロッキングの違い#
ブロッキング代入 “=”#
ブロッキング代入が完了してから、次の文の実行が行われる;代入が完了すると、等号の左側の変数の値が即座に変化する。同じブロック内では、ブロッキング代入式の記述順序が代入の結果に影響を与える。ハードウェアには対応する回路がない。
つまり、直列代入であり、文は上から下へ順に実行され、即座に効果を発揮する
非ブロッキング代入 “<=”#
代入が始まるときに式の右側の値を計算し、今回のシミュレーション周期のクロックの下降エッジで代入された変数を更新する。つまり、代入は即座に効果を発揮しない;非ブロッキング代入はブロック内の他の文が同時に実行されることを許可する。同じブロック内では、非ブロッキング代入式の記述順序が代入の結果に影響を与えない。ハードウェアには対応する回路がある。
並行実行であり、即座に効果を発揮せず、文が同時に実行される
まとめ#
ブロッキング代入に対応するハードウェア回路はクロックのトリガエッジとは関係なく、入力のレベル変化にのみ関係する;ブロッキング代入はフリップフロップに対応し、トリガエッジが発生したときのみ代入が行われる。
- 時系列回路のモデリングには、非ブロッキング代入を使用する
- ラッチのモデリングには、非ブロッキング代入を使用する
- always ブロック内で組み合わせ論理を構築する際には、ブロッキング代入を使用する
- 同じ always ブロック内で時系列と組み合わせ論理を構築する際には、非ブロッキングを使用する
- 同じ always ブロック内でブロッキングと非ブロッキングの両方を使用してはいけない
- 同じ変数に対して複数の always ブロックで代入してはいけない
- 代入時に遅延を持ってはいけない