木曜日, 6月 28, 2007

blocking代入とnonblocking代入

verilogのblocking代入とnonblocking代入は論理合成対象のRTL記述であれば
順序回路にはnonblocking、組み合わせ回路にはblockingと憶えておけば特に問題はありません。

しかし、シミュレーション記述の場合はその違いをちゃんと理解しておかないと思わぬところで痛い目にあうかもしれません。

ちなみになぜblocking,nonblockingというかご存知でしょうか?

blocking代入はその名のとおり、その代入文が完了するまでステートメントをブロックします。

対して、nonblocking代入の場合は代入のスケジューリングのみが行なわれて、遅延0で次の処理に移ります。


したがって、次のようなコードの場合(blk_nblk.v)、



a,b,cへの代入が行なわれるのはそれぞれ時刻20,50(=20+30),60(=20+30+10)となりますが
x,y,zへの代入が行なわれるのはそれぞれ時刻20,30,10となります。

この結果がどうなるのかというと、

# (a,b,c) = ( 5, 15, 10)
# (x,y,z) = ( 5, 10, 5)


どうですか?
予想と一致していたでしょうか?

特に注意するのはnonblockingの場合ですが、yとzへの代入はそれぞれ時刻30及び10に行なわれますが代入されるxの値は、式が評価された時刻(つまり時刻0)のものが使用されます。

ややこしいですね。

ちなみに波形はこんな感じになります。


0 件のコメント: