Vengineerの妄想(準備期間)

人生は短いけど、長いです。人生を楽しみましょう!

mailbox、その2

Verification Engineerの戯言

mailboxの例(http://blogs.yahoo.co.jp/verification_engineer/21166798.html)
のModelSim XE 6.2cでのシミュレーション結果は、以下のようになります。

# put_task : id = 0 at 10
# get_task : id = 0 at 15
# put_task : id = 1 at 20
# get_task : id = 1 at 25
# put_task : id = 2 at 30
# get_task : id = 2 at 35
# put_task : id = 3 at 40
# get_task : id = 3 at 45
# put_task : id = 4 at 50
# get_task : id = 4 at 55
# put_task : id = 5 at 60
# get_task : id = 5 at 65
# put_task : id = 6 at 70
# get_task : id = 6 at 75
# put_task : id = 7 at 80
# get_task : id = 7 at 85
# put_task : id = 8 at 90
# get_task : id = 8 at 95
# put_task : id = 9 at 100
# get_task : id = 9 at 105

mb = new;

でmailboxを生成したとき、new関数に引数を指定していないので、デフォルト値の"1"が使われます。
これにより、mailboxのエントリ数は"1"になり、シミュレーション結果のように
put_task/get_taskが交互に呼ばれることになります。

mailboxのエントリ数を変更するときは、new関数への引数としてエントリ数を指定します。
たとえば、エントリ数を"3"場合は、

mb = new(3);

とします。

put_taskの遅延を#10から#3に変更したときのシミュレーション結果は次のようになります。
put_taskが3回続いた後、get_task/put_taskが交互に呼ばれることになります。
put_taskが3回続いたのは、mailboxのエントリ数を"3"にしたからです。

# put_task : id = 0 at 3
# put_task : id = 1 at 6
# put_task : id = 2 at 9
# get_task : id = 0 at 15
# put_task : id = 3 at 15
# get_task : id = 1 at 25
# put_task : id = 4 at 25
# get_task : id = 2 at 35
# put_task : id = 5 at 35
# get_task : id = 3 at 45
# put_task : id = 6 at 45
# get_task : id = 4 at 55
# put_task : id = 7 at 55
# get_task : id = 5 at 65
# put_task : id = 8 at 65
# get_task : id = 6 at 75
# put_task : id = 9 at 75
# get_task : id = 7 at 85
# get_task : id = 8 at 95
# get_task : id = 9 at 105