SystemVerilog : semaphore

SystemVerilog:mailboxmailbox 書いたので、次は「semaphore」書いてみました。

  • サンプルコード
module testbench ();

  semaphore sm_hoge;

  task task_put();
    sm_hoge.put();
  endtask

  task task_get;
    forever begin
      if (sm_hoge.try_get()) begin
        $display("@%0d semaphore get", $time);
      end else  begin
        #30;
      end
    end
  endtask

  initial begin
    sm_hoge = new();
    fork task_get; join_none

    for(int i=0; i<10; i++) begin
      #10; task_put();
      $display("@%0d semaphore put", $time);
    end

    #1000 $finish;
  end

endmodule: testbench
  • 実行結果
# //
# Loading sv_std.std
# Loading work.testbench(fast)
# do ./run.do
# @10 semaphore put
# @20 semaphore put
# @30 semaphore get
# @30 semaphore get
# @30 semaphore put
# @40 semaphore put
# @50 semaphore put
# @60 semaphore get
# @60 semaphore get
# @60 semaphore get
# @60 semaphore put
# @70 semaphore put
# @80 semaphore put
# @90 semaphore get
# @90 semaphore get
# @90 semaphore get
# @90 semaphore put
# @100 semaphore put
# @120 semaphore get
# @120 semaphore get

メンバ関数

  • Create a semaphore with a specified number of keys: new()
  • Obtain one or more keys from the bucket: get()
  • Return one or more keys into the bucket: put()
  • Try to obtain one or more keys without blocking: try_get()

書いている時にアレっ?データってどこにいれるんだっけ???
っと思ってしまったので、他の言語と困惑してた。。。