Verilogでセマフォ

『SystemVerilogによるLSI設計』に組み込みのセマフォを使わずに、中身を自分で定義している箇所があった(294ページ)。これはちょっと書き換えるとVerilogで使えそう。

module Semaphore;
  parameter initial_keys  = 1;
  integer keys            = initial_keys;

  task get;
    input n;
    begin
      wait(keys >= n);
      keys  = keys - n;
    end
  endtask

  task put;
    input n;
      begin
      keys  = keys + n;
    end
  endtask

endmodule

テストベンチ

module test;
  Semaphore sem();

  initial begin

    $display("%t, keys = %d", $time, sem.keys);

    fork      
      begin
        #100;
        sem.get(1);
        $display("%t, keys = %d", $time, sem.keys);
        #100;
        sem.put(1);
      end

      begin
        #100;
        sem.get(1);
        $display("%t, keys = %d", $time, sem.keys);
        #100;
        sem.put(1);
      end
    join

    $finish;
  end
endmodule

modelsimでの実行結果

#                    0, keys =           1
#                  100, keys =           0
#                  200, keys =           0

VerilogオンリーでSystemVerilogが使えないようなプロジェクトだと役に立つ?