Vengineerの妄想(準備期間)

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

semaphoreとmailbox


SystemVerilogでは、何故か?、semaphore と mailbox がクラスとして実装されています。
この2つのクラスは、stdパッケージに含まれていますが、何もしないでも直ぐに使えます。

semaphoreはクラスなので、newにてオブジェクトを生成します。
また、semaphoreクラスには、次の2つのタスクと1つの関数が定義されています。
    function new( int KeyCount = 0 );
    task put( int keyCount = 1 );
    task get( int keyCount = 1 );
    function int try_get( int keyCount = 1 );
それぞれデフォルト引数がありますので、引数を指定していない場合のデフォルト引数が使われます。

mailboxもクラスなので、newにてオブジェクトを生成します。
また、mailbox暮らすには、次の3つのタスクと4つの関数が定義されています。
    function new( int bound = 0 );
    function int num();
    task put( singular message );
    function int try_put( singular message );
    task get( singular message );
    function int try_get( singular message );
    task peek( ref singular message );
    function int try_peek( ref singular message );

mailboxクラスは、いろいろな型を引数が取れるのですが、引数の型を固定したい場合は、
型をパラメータとして指定することができます。
下記の例は、パラメータとしてstringを指定しています。
    サンプルコード(SystemVerilog 3.1aのReferenceから)

   typedef mailbox #(string) s_mbox;

      s_mbox sm = new;
      string s;

      sm.put( "hello" );
      ....
      sm.get( s );  // s <= "hello"

検証、Verification、SystemVerilog