質問: verilog hdlの[=]と[<=]の使い分け 現在verilog hdlを勉強しており、ひと通り勉強は終わりました。 しかしブロッキング代入[=]とノンブロッキング代入[<=]の使い分けをどこまで暗記すれば良いのか分かりません。 皆様は、[=]と[<=]の使い分け、あるいはネット型、レジスタ型への代入をする際の区別をどのように暗記していますか?「このポイントを理解すれば大丈夫!」みたいなことを教えていただけると助かります。 今思いつく例としては↓のとおりです ・assign文では[=]を使用しなければならない。 ・assign文の左辺は[ネット型]のみ ・case文のhpによって[=]を使用しなければならない。 ・ http://veri.jp/ba_nba.html のhpの最後のほうで『ほかにも「assign 文では nba "<=" が使えません」という誤った注意書き』と書いてありますが、この記述の意味がわかりません。 ・回路記述ではダメなのに、シミュレーション記述では問題がない等等、、、 他にもfunction文やalways文の中で式を書く時にも困っています。
回答: > http://veri.jp/ba_nba.html こんな良い解説ページを見つけたのに、なぜ質問しているのかがよく分かりませんが・・・。 まずassign文は継続的代入であって、ブロッキング代入でもノンブロッキング代入でもないので、 ブロッキング代入とノンブロッキング代入の使い分けという議論の対象外です。 また、ブロッキング代入とノンブロッキング代入はレジスタ型に対して使う、 継続的代入はネット型に対して使う、 となるため、型でブロッキング代入とノンブロッキング代入の使い分けなんて言う議論は最初からできないです。(どちらもレジスタ型が相手だから) 解説ページにも書かれていますが、 ブロッキング代入とノンブロッキング代入の違いは、 "右辺の評価" と "左辺への代入" が同時に行われるか、別々に行われるかの違いです。 たとえば、 a = x; b = a; としたとき普通のプログラミング言語のように、bもxになって欲しいなら、ブロッキング代入を使いますし、 bにxが代入される前のaの値が入って欲しいなら、ノンブロッキング代入を使うことになります。 always文でffを生成するときは、その時刻においては代入前の値を参照したい(実際の回路を考えると代入後の値を参照できるのは次のクロックがやってきたときだから)ので、 ノンブロッキング代入を普通は使いますね。 (ブロッキング代入だとレーシング=記述順序で結果が変わってしまうという問題があるというのもありますが。) それ以外(組み合わせ論理を作るalways、function、シミュレーション記述)は、 特に理由がなければブロッキング代入を使っています(変数を直ちに更新して欲しい場合がほとんどだから)が、 前述のノンブロッキング代入の挙動を理解した上でノンブロッキング代入が必要だと思ったなら 使っていけないわけではないです。